Mod笔记-抢救版
本帖最后由 qweytr_1 于 2024-1-8 22:39 编辑这是用dnSpy修改的修改笔记
是19年老帖子的抢救版
这个游戏好几年没玩了,手头没有,别问我怎么改。
我只负责把老帖子消失的代码恢复一遍
看上去或许是page命令的锅
我把page删了
理应会好
---
抢救出的正文:
Flash插件坏了,没法上传dll文件
只好写笔记了
这是用dnSpy修改的修改笔记,dnSpy可以从https://github.com/0xd4d/dnSpy/releases下载,比如这是6.1.0版本的dnSpy:https://github.com/0xd4d/dnSpy/r ... y-netcore-win64.zip
由于代码众多,这里用翻页符号对不同代码进行分割
已知问题:
1、人物速度属性太高会造成卡顿
2、人物力量属性太高会在投掷手雷的时候卡顿
3、电脑有时会用CharacterProgression新建随机人物,所以修改时候最好不要直接对CharacterProgression下手这个是除移动与心灵控制外其他行动不消耗AP/意志点数
protected virtual void ApplyCosts(object parameter)
{
if (!this.ShouldApplyCosts(parameter))
{
return;
}
if (!this.IsTacticalActor)
{
return;
}
if ((base.Actor as TacticalActor).IsFromViewerFaction)
{
return;
}
if (this.UsesActionPoints)
{
this.TacticalActor.CharacterStats.ActionPoints.Subtract(this.ActionPointCost);
}
if (this.UsesWillPoints)
{
this.TacticalActor.CharacterStats.WillPoints.Subtract(this.WillPointCost);
}
}
和平外交模式(需要改两处,一处保证正常外交关系都是向着有利于双方的方向进行,另一处保证如果外交的一方是玩家,保留扣分项免得大家没办法把结盟改成敌对——然而修改并没对派系之间的好感度生效,该敌对还是敌对) public void ModifyDiplomacy(IDiplomaticParty withParty, int diplomacyChange)
{
PartyDiplomacy.Relation relation = this.GetRelation(withParty);
if (relation == null)
{
throw new Exception(string.Format("{0} does not have diplomatic relations with {1}", this.Party, withParty));
}
relation.Diplomacy += ((diplomacyChange < 400) ? 200 : ((diplomacyChange < 600) ? (diplomacyChange - 600) : 200));
}
private void ApplyDiplomacy(GeoFaction faction)
{
List<RewardSetDiplomaticObjective> setDiplomaticObjectives = this.SetDiplomaticObjectives;
if (setDiplomaticObjectives != null && setDiplomaticObjectives.Count > 0)
{
GeoLevelController component = GameUtl.CurrentLevel().GetComponent<GeoLevelController>();
foreach (RewardSetDiplomaticObjective rewardSetDiplomaticObjective in this.SetDiplomaticObjectives)
{
GeoFaction faction2 = component.GetFaction(rewardSetDiplomaticObjective.WithFaction);
GeoSite pointOfInterest = rewardSetDiplomaticObjective.PointOfInterest;
if (pointOfInterest != null)
{
pointOfInterest.RevealSite(faction);
this.ApplyResult.RevealedSites.Add(pointOfInterest);
}
faction2.Diplomacy.SetDiplomacyObjective(faction, rewardSetDiplomaticObjective.Title, rewardSetDiplomaticObjective.Description, pointOfInterest);
if (faction2 != faction)
{
this.ApplyResult.FactionDiplomacyObjectiveChanged.AddNotContained(faction2);
}
}
}
List<RewardMaxDiplomacyStateChange> setMaxDiplomacyState = this.SetMaxDiplomacyState;
if (setMaxDiplomacyState != null && setMaxDiplomacyState.Count > 0)
{
foreach (RewardMaxDiplomacyStateChange rewardMaxDiplomacyStateChange in this.SetMaxDiplomacyState)
{
rewardMaxDiplomacyStateChange.Faction.Diplomacy.SetMaxDiplomacyState(faction, rewardMaxDiplomacyStateChange.State, true);
}
this.ApplyResult.ChangeMaxDiplomacyState.AddRange(this.SetMaxDiplomacyState);
}
List<RewardDiplomacyChange> diplomacy = this.Diplomacy;
if (diplomacy != null && diplomacy.Count > 0)
{
foreach (RewardDiplomacyChange rewardDiplomacyChange in this.Diplomacy)
{
IDiplomaticParty diplomaticParty = rewardDiplomacyChange.Target ?? faction;
rewardDiplomacyChange.Party.Diplomacy.ModifyDiplomacy(diplomaticParty, (faction.IsViewerFaction ? 600 : 0) + rewardDiplomacyChange.Value);
this.ApplyResult.Diplomacy.Add(rewardDiplomacyChange);
if (this.ApplySecondaryDiplomacyEffects && diplomaticParty is GeoFaction && rewardDiplomacyChange.Party is GeoFaction && diplomaticParty is GeoFaction)
{
this.ApplySecondaryDiplomcy(rewardDiplomacyChange.Value, (GeoFaction)rewardDiplomacyChange.Party, (GeoFaction)diplomaticParty);
}
}
}
}科研速度加快 private int GetResearchProduction(ResearchDef def)
{
float num = (float)this.Faction.ResourceIncome.GetTotalResouce(ResourceType.Research).RoundedValue;
if (this.Faction.IsViewerFaction)
{
num *= 100f;
}
GeoFactionStatModifiers factionStatModifiers = this.Faction.FactionStatModifiers;
return (int)((num * ((factionStatModifiers != null) ? new float?(factionStatModifiers.GetResearchModifier(def)) : null)) ?? 1f);
}飞船加强(似乎无效)
public void UpdateBaseVehicleStats(GeoVehicle vehicle)
{
if (vehicle.VehicleDef.BaseStats.SpaceForUnits != 6)
{
vehicle.Stats.MaximumRange = vehicle.VehicleDef.BaseStats.MaximumRange * (1f + this.ModData.RangeMultiplier);
vehicle.Stats.SpaceForUnits = vehicle.VehicleDef.BaseStats.SpaceForUnits + this.ModData.SpaceForUnits;
vehicle.Stats.Speed = vehicle.VehicleDef.BaseStats.Speed * (1f + this.ModData.SpeedMultiplier);
vehicle.Stats.MaxMaintenancePoints = (int)((float)vehicle.VehicleDef.BaseStats.MaxMaintenancePoints * (1f + this.ModData.MaxMaintenancePointsMultiplier));
vehicle.Range.Range = vehicle.Stats.MaximumRange;
return;
}
vehicle.Stats.MaximumRange = vehicle.VehicleDef.BaseStats.MaximumRange * (3f + this.ModData.RangeMultiplier);
vehicle.Stats.SpaceForUnits = 12;
vehicle.Stats.Speed = vehicle.VehicleDef.BaseStats.Speed * (5f + this.ModData.SpeedMultiplier);
vehicle.Stats.MaxMaintenancePoints = (int)((float)vehicle.VehicleDef.BaseStats.MaxMaintenancePoints * (6f + this.ModData.MaxMaintenancePointsMultiplier));
vehicle.Range.Range = vehicle.Stats.MaximumRange;
}学习技能不消耗点数
public void BuyAbility()
{
if (this._boughtAbility != null)
{
this.ConsumeAbilityCost(0);
this.CommitStatChanges();
this._character.Progression.LearnAbility(this._boughtAbility);
this.ClearBoughtAbility();
this.RefreshStatPanel();
this.SetAbilityTracks();
}
}生产速度加快 public class ItemManufacturing
......
// Token: 0x06006161 RID: 24929 RVA: 0x0019512C File Offset: 0x0019332C
public void Update()
{
if (this.Current == null)
{
return;
}
ItemManufacturing.ManufactureQueueItem manufactureQueueItem = this.Current;
int production = Mathf.RoundToInt(this._faction.ResourceIncome.GetTotalResouce(ResourceType.Production).Value);
if (this._faction.IsViewerFaction)
{
production *= 100;
}
this.AddProduction(production, true);
if (this.Current != null && manufactureQueueItem != this.Current)
{
ItemManufacturing.ManufactureQueueEventHandler onItemStarted = this.OnItemStarted;
if (onItemStarted == null)
{
return;
}
onItemStarted(this.Current);
}
}增加基础属性不消耗点数,且增加属性的步长改成1000private int ChangeCharacterStat(CharacterBaseAttribute baseStat, int currentStatValue, int startingStatValue, bool increase)
{
if (increase)
{
int num = 0;
if (this._currentSkillPoints - num >= 0)
{
this._currentSkillPoints -= num;
return 1000;
}
if (this._currentSkillPoints + this._currentFactionPoints - num >= 0)
{
int num2 = this._currentSkillPoints - num;
this._currentSkillPoints = 0;
this._currentFactionPoints += num2;
return 1000;
}
}
else if (currentStatValue - 1 >= startingStatValue)
{
int baseStatCost = this._character.Progression.GetBaseStatCost(baseStat, currentStatValue);
if (this._currentFactionPoints + baseStatCost <= this._startingFactionPoints)
{
this._currentFactionPoints += baseStatCost;
return -1;
}
if (this._currentFactionPoints == this._startingFactionPoints)
{
this._currentSkillPoints += baseStatCost;
return -1;
}
if (this._currentFactionPoints + baseStatCost > this._startingFactionPoints)
{
int num3 = this._currentFactionPoints + baseStatCost - this._startingFactionPoints;
this._currentFactionPoints = this._startingFactionPoints;
this._currentSkillPoints += num3;
return -1;
}
}
return 0;
}修改最大属性限制 public int GetMaxAttribute(CharacterBaseAttribute stat)
{
switch (stat)
{
case CharacterBaseAttribute.Strength:
return this.MaxStrength + 1000;
case CharacterBaseAttribute.Will:
return this.MaxWill + 1000;
case CharacterBaseAttribute.Speed:
return this.MaxSpeed;
default:
return 0;
}
}一次任务满级 public bool AddExperience(int experience)
{
this.ExperienceEarned += experience;
if (this.Level == this.Def.MaxLevel)
{
return false;
}
int level = this.Level;
this.Experience = this.Def.XPCap;
int num = this.Level - level;
for (int i = 1; i <= num; i++)
{
LevelProgression.LevelUpHandler levelUpCallback = this.LevelUpCallback;
if (levelUpCallback != null)
{
levelUpCallback(i + level);
}
this.HasNewLevel = true;
}
return num > 0;
}制造物品时候获得资源而非消耗资源public ItemManufacturing.ManufactureQueueItem ManufactureItem(IManufacturable item, Action<ItemManufacturing.ManufactureQueueItem, bool> itemAddedCallback = null)
{
if (!this.UseFactoryManufacturing)
{
this._faction.Wallet.Give(item.ManufacturePrice, OperationReason.Purchase);
AmplitudeWebClient instance = AmplitudeWebClient.Instance;
if (instance.Enabled)
{
instance.OnResourcesTaken(item.ManufacturePrice, "Manufacture");
}
}
bool flag = item.GetCostInManufacturePoints(this._faction) == 0f;
if (GameUtl.BuildInstant && this._faction.IsViewerFaction)
{
flag = true;
}
ItemManufacturing.ManufactureQueueItem manufactureQueueItem = new ItemManufacturing.ManufactureQueueItem(item, 0);
if (flag)
{
this.FinishManufactureItem(manufactureQueueItem);
}
else
{
if (this.Current == null)
{
ItemManufacturing.ManufactureQueueEventHandler onItemStarted = this.OnItemStarted;
if (onItemStarted != null)
{
onItemStarted(manufactureQueueItem);
}
}
this._queue.Add(manufactureQueueItem);
ItemManufacturing.ManufactureOrderEventHandler onItemAdded = this.OnItemAdded;
if (onItemAdded != null)
{
onItemAdded(manufactureQueueItem, this._queue.Count - 1);
}
}
if (itemAddedCallback != null)
{
itemAddedCallback(manufactureQueueItem, flag);
}
return manufactureQueueItem;
}经@十八文化 提醒,还有这个,新人随机7个技能,由于改这个的时候会dnSpy报错,修改时候或许需要改IL指令,看上去是删掉83行callvirt .........::get_MaxLevel后面的两行之后在83行之后新建一个指令dup
修改时候或许需要改IL指令,看上去是删掉83行callvirt .........::get_MaxLevel后面的两行,之后在83行之后新建一个指令dup
public CharacterProgression(SpecializationDef specializationDef, LevelProgressionDef levelProgression, BaseStatSheetDef baseStatSheetDef, CharacterGenerationParams generationParams = null)
..............................................................................
AbilityTrack track2 = AbilityTrack.CreatePersonalAbilityTrack(new GameTagDef, levelProgression.MaxLevel, levelProgression.MaxLevel);
有空的可以研究一下怎么用AbilityTrack函数创建7个有用的技能(猛冲/吸雾恢复意志/鱼人的放雾/杀人恢复行动力/子弹带病毒/心灵冲击/自动显示15格内敌人位置)这个技术比较复杂,我只包教不包会 public CharacterProgression(SpecializationDef specializationDef, LevelProgressionDef levelProgression, BaseStatSheetDef baseStatSheetDef, CharacterGenerationParams generationParams = null)
{
this._abilityTracks = new List<AbilityTrack>();
this._abilities = new List<TacticalAbilityDef>();
this._baseStats = new List<int>();
this._baseStats.Clear();
int num = (generationParams != null) ? generationParams.EnduranceBonus : 0;
this._baseStats.Add(baseStatSheetDef.Strength + num);
int num2 = (generationParams != null) ? generationParams.WillBonus : 0;
this._baseStats.Add(baseStatSheetDef.Will + num2);
int num3 = (generationParams != null) ? generationParams.SpeedBonus : 0;
this._baseStats.Add(baseStatSheetDef.Speed + num3);
this.BaseStatSheet = baseStatSheetDef;
this.SkillPoints = levelProgression.InitialSkillpoints;
this.LevelProgression = new LevelProgression(levelProgression, 0);
this.MainSpecDef = specializationDef;
AbilityTrack track = new AbilityTrack(specializationDef.AbilityTrack, AbilityTrackSource.PrimaryClass);
this.AddNewAbilityTrack(track, true);
IEnumerable<GameTagDef> abilityFilter = new GameTagDef;
int maxLevel = levelProgression.MaxLevel;
AbilityTrack track2 = AbilityTrack.CreatePersonalAbilityTrack(abilityFilter, maxLevel, maxLevel);
this.AddNewAbilityTrack(track2, false);
List<AbilityTrackSlot> list = new List<AbilityTrackSlot>();
DefRepository defRepository = GameUtl.GameComponent<DefRepository>();
AbilityTrackSlot abilityTrackSlot = new AbilityTrackSlot();
TacticalAbilityDef ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindCrush_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindSense_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("BioChemist_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExtraMove_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Heavy_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Infiltrator_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
abilityTrackSlot = new AbilityTrackSlot();
ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Priest_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
abilityTrackSlot.Ability = ability;
list.Add(abilityTrackSlot);
this.AddNewAbilityTrack(new AbilityTrack(list.ToArray(), AbilityTrackSource.Personal), false);
this.Init();
}代码如此,很可惜,这段代码并不能通过编译。
你需要在改这段代码的最开始(Ctrl+Home跳转到的第一行)粘贴这几行using Base.Defs;
using Base.Core;
using System.Linq;请注意,并不是每个技能都可以写进ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GrenadesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase));里面的
另外,建议在贴好3个using之后用这种方式(或者第二页34#的方式)在(没记错是)AddSecondaryClass这个函数下添加技能:
DefRepository defRepository = GameUtl.GameComponent<DefRepository>();
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindCrush_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindSense_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MotionDetection_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SenseLocate_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExtraMove_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Thief_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("BioChemist_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("AssaultRiflesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GrenadesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("HandgunsTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("HeavyWeaponsTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MeleeWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MountedWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PDWTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ShotgunTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SilencedWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SniperTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("IgnorePain_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertHealer_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertHeavyWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertLightWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertMelee_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertMountedWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertPacker_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertRunner_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertShooter_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EnhancedVision_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EagleEye_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EagleEyed_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("DoublePerception_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Fishman_Regeneration_Passive_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Regeneration_Torso_Passive_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("FastUse_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("AcidImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("FireImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GooImmunity_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PoisonImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PsychicImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SonicImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("StunStatusImmunity_AbilityDef", StringComparison.OrdinalIgnoreCase)));
this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("VirusImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));BTW,第二页@ltcszk 给出了一个更漂亮的解法
(我并不会写C#,我都是胡乱玩的,专业解法参考这个是很不错的)
然而请注意,其实我们不能在.ctor那里改这些设置
电脑生成的NPC士兵也会调用这个.ctor
建议学双职业的时候加这些新技能
AI从来没有学双职业的。扫描到站点时候揭露站点内容(或许能借此避开“伏击”这种情况) private void DetectSite(GeoSite site, GeoFaction owner)
{
if (this.ScanDef.RevealSites && !site.GetVisible(this.Owner))
{
if (site.Type == GeoSiteType.AlienBase)
{
GeoAlienBase component = site.GetComponent<GeoAlienBase>();
if (component != null && component.IsPalace)
{
return;
}
}
site.SetVisible(owner, true);
site.GeoLevel.View.OnScannerSiteReveal(site);
Action<GeoSite> onSiteRevealed = this.OnSiteRevealed;
if (onSiteRevealed != null)
{
onSiteRevealed(site);
}
}
if ((this.ScanDef.InspectSites || owner.IsViewerFaction) && !site.GetInspected(this.Owner))
{
site.SetInspected(owner, true);
}
}顺便附上扫描次数修改// PhoenixPoint.Geoscape.Entities.PhoenixBases.FacilityComponents.SatelliteUplinkFacilityComponent
// Token: 0x06005543 RID: 21827
public override void UpdateOutput()
{
this.ScannerCapacity = 100 + (int)this.GetValueAfterAppliedModifiers((float)this.Def.ScannerCapacity, 0f, 1f);
base.UpdateOutput();
}类似地,我们也可以修改能源——处于不明原因,基地经常会拉闸限电把总电量限制在20/30的样子——既然这么喜欢限电干脆把它改掉好了// PhoenixPoint.Geoscape.Entities.PhoenixBases.FacilityComponents.PowerFacilityComponent
// Token: 0x06005528 RID: 21800
public override void UpdateOutput()
{
this.PowerOuput = (int)this.GetValueAfterAppliedModifiers((float)this.Def.PowerOutput, 0f, 1f) << 1;
base.UpdateOutput();
}
先写这么多好了
其中不少代码我还没有测试
本来有部分代码昨天就能发出来的
结果flash插件把浏览器干掉了
而我没从其他地方记笔记…… 66666666,谢谢大佬恢复
页:
[1]