千古校长 发表于 2023-3-1 18:11

分享一下萌新发现的有效修改

本帖最后由 千古校长 于 2023-3-1 18:11 编辑

1.经验系数修改
OwnedByGravity.Game.Logic.XPManagement中的类名public class XPSystem里面有单位获取经验值的公式,位于方法名ApplyXPChange,它的代码是这样的
      public IEnumerator ApplyXPChange(LogicUnit unit, FactionId factionId, int delta, bool isLoading, bool isAiUpgrade = false)
      {
            if (unit.Properties.CannotGainExp)
            {
                yield break;
            }
            if (delta > 0)
            {
                if (isAiUpgrade)
                {
                  delta = Mathf.RoundToInt((float)delta * this.mDifficulty.Setup.Economy.XpGainMultiplier);
                }
                else
                {
                  delta = Mathf.RoundToInt((float)delta * (1f + unit.Properties.XPBonus) * this.mDifficulty.Setup.Economy.XpGainMultiplier * 3f);
                }
            }
            (ref unit.Level.XP).Set(Mathf.Min(unit.Level.MaxXP(), Mathf.Max(unit.Level.XP + delta, 0)));
            yield return this.ModifyLevelToMatchXP(unit, factionId, isLoading);
            XPSystem.XPChangedCallback unitXPChanged = this.UnitXPChanged;
            if (unitXPChanged != null)
            {
                unitXPChanged(unit, factionId, delta);
            }
            yield break;
      }
其中
                else
                {
                  delta = Mathf.RoundToInt((float)delta * (1f + unit.Properties.XPBonus) * this.mDifficulty.Setup.Economy.XpGainMultiplier * 3f);
                }是我自己用的修改后的三倍经验系数(只限玩家),想要修改的话把里面的3换成你想要的数字就行(最好在1和10之间,不然我也不知道会发生什么事情)


2.战利品中金币和法力的系数(不影响材料掉落)
类ChangeCurrencyEffect方法Apply中的公式是
      public IEnumerator Apply(WorldEffectContext context)
      {
            float num = 1f;
            LootRollData lootRollData;
            if (context.TryGet<LootRollData>(out lootRollData))
            {
                num += lootRollData.AdditionalLootDrop;
            }
            Faction faction;
            if (context.WorldInstance.Factions.TryGetPlayerFaction(out faction))
            {
                CurrencyRewardDefinition reward = context.WorldInstance.ContentManager.LoadAsset<CurrencyRewardDefinition>(this.CurrencyReward, "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Effects\\Effects\\ChangeCurrencyEffect.cs", 68);
                if (this.Subtract)
                {
                  context.WorldInstance.CurrencySystem.Take(faction.Id, reward, HexPosition.Invalid);
                }
                else
                {
                  context.WorldInstance.CurrencySystem.Reward(faction.Id, reward, context.WorldInstance.DifficultyProvider.Setup.Economy.LootIncomeMultiplier * num * 6f, HexPosition.Invalid);
                }
            }
            else
            {
                Log.Error("Unkown PlayerFaction", null, "Apply", "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Effects\\Effects\\ChangeCurrencyEffect.cs", 80);
            }
            yield break;
      }
其中修改
            float num = 1f;
或者
                else
                {
                  context.WorldInstance.CurrencySystem.Reward(faction.Id, reward, context.WorldInstance.DifficultyProvider.Setup.Economy.LootIncomeMultiplier * num * 6f, HexPosition.Invalid);
                }都是可以的
3.战利品中材料掉落的系数
OwnedByGravity.Game.Logic.LootTables中,类名public abstract class ALootItemEntry里面的方法Execute,它的代码是这样的
      public IEnumerator Execute(WorldEffectContext context)
      {
            SourceEntity sourceEntity;
            if (!context.TryGet<SourceEntity>(out sourceEntity))
            {
                yield break;
            }
            AWorldEntity aworldEntity = sourceEntity;
            Faction faction;
            if (!context.WorldInstance.Factions.TryGet(aworldEntity.FactionId, out faction))
            {
                yield break;
            }
            float num = 5f;
            LootRollData lootRollData;
            if (this.UseLootChance && context.TryGet<LootRollData>(out lootRollData))
            {
                num += lootRollData.AdditionalLootDrop;
            }
            while (num > 0f && context.WorldInstance.Random.value <= num)
            {
                if (!context.WorldInstance.InventorySystem.TryChangeItem(faction.Id, faction.Inventory, this.SourceItem, 1))
                {
                  Log.Error(string.Format("Something went wrong in {0} for {1} with amount {2}!", "ALootItemEntry", this.SourceItem, 1), null, "Execute", "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\LootTables\\ALootItemEntry.cs", 63);
                }
                num -= 1f;
            }
            yield break;
      }
其中
            float num = 5f;
是我自己用的修改后的五倍材料获取,但是修改这一项请慎重!因为





然后是我从大佬@liyun_1981那里听来的内容,在此鸣谢





巭还行 发表于 2023-3-2 08:56

研究出成果了啊,恭喜

顺爷 发表于 2023-3-3 21:49

等级上限跟 升级的特殊技能有没有研究出来呢{:3_153:}

zc8526 发表于 2023-3-5 14:38

只能用IL指令修改吗 dnspy编译都失败了{:3_107:}

千古校长 发表于 2023-3-11 22:25

zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了

是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱

zyzerg 发表于 2023-3-22 01:34

千古校长 发表于 2023-3-11 22:25
是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱
...

大佬有升级时获得技能数量的代码吗?找半天没找到...或像坛子里大佬那个升级可反复刷技能该怎么改~Thanks♪(・ω・)ノ

千古校长 发表于 2023-3-25 23:20

zyzerg 发表于 2023-3-22 01:34
大佬有升级时获得技能数量的代码吗?找半天没找到...或像坛子里大佬那个升级可反复刷技能该怎么改~Thanks ...

在OwnedByGravity.Game.Logic.XPManagement.XPSystem.RollNextLevel这个方法内给state赋值成一个随机数,比如state = IntToUint.ConvertInt(UnityEngine.Random.Range(1, 100000));
升级的时候就可以重选技能了,如果要改升级时获得的技能数量,在同一个类的RollLevelUpChoices方法里面,把
    List<ValueTuple<ALevelUpEntry, int>> list3 = first.Concat(second).ToList<ValueTuple<ALevelUpEntry, int>>();
    for (int i = 0; i < context.SourceLogic.Level.Progression.Asset.NumberOfProvidedRewards + additionalLevelUps; i++)
    {
      ValueTuple<ALevelUpEntry, int> valueTuple = context.Random.WeightedRandom(list3, (ValueTuple<ALevelUpEntry, int> e) => e.Item2);
      if (!(valueTuple.Item1 == null))
      {
            list.Add(valueTuple.Item1);
            list3.Remove(valueTuple);
      }
    }
    return list;
改成
List<ValueTuple<ALevelUpEntry, int>> list3 = first.Concat(second).ToList<ValueTuple<ALevelUpEntry, int>>();
    for (int i = 0; i < 你想要的数字; i++)
    {
      ValueTuple<ALevelUpEntry, int> valueTuple = context.Random.WeightedRandom(list3, (ValueTuple<ALevelUpEntry, int> e) => e.Item2);
      if (!(valueTuple.Item1 == null))
      {
            list.Add(valueTuple.Item1);
            list3.Remove(valueTuple);
      }
    }
    return list;
推荐两个修改一起用,这样刷技能的时候方便一些,可以更快刷到想要的技能

千古校长 发表于 2023-3-25 23:30

顺爷 发表于 2023-3-3 21:49
等级上限跟 升级的特殊技能有没有研究出来呢

等级上限跟升级特殊技能应该都是在XPsystem里面的,里面的代码不多,可以拿游戏原代码和论坛里面两个大佬的mod对照,你就知道怎么改了,但是这一块大家都没有做完善,会有各种奇奇怪怪的小bug(比如哥布林斗士可能会学到学徒小屋领域范围扩大,这个问题现在倒是解决了),还有会卡技能之类的(能学的技能都学完了,然后每个回合一直有让你去升级的提示),实现难度太大了,个人不太推荐修改这一块,等大佬做比较好

kojing622 发表于 2023-5-30 23:46

就想改升级选项数量和刷技能,在你这完美解决,感谢

傻傻的野兔 发表于 2023-11-4 23:55

改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载不能进入地图

feiyu_wind 发表于 2023-12-16 13:22

测了一下,楼主的都有效。感谢

feiyu_wind 发表于 2023-12-23 19:58

AlchemyProductionEntry;HireUnitProductionEntry;NecromancyProductionEntry;        RoomExtensionProductionEntry;        RunesmithingProductionEntry

这几个方法里面的GetDuration里面改为return1就能将制造时间全部改为1

feiyu_wind 发表于 2023-12-25 22:57

收获倍数的修改在:Game.Logic.Effects.Effects下的HarvestLocationEffect里面的Apply里面有个lootRolls,原始值应该是2,然后10倍就是+8

wang19941110 发表于 2023-12-25 23:59

feiyu_wind 发表于 2023-12-25 22:57
收获倍数的修改在:Game.Logic.Effects.Effects下的HarvestLocationEffect里面的Apply里面有个lootRolls, ...

    int lootRolls = this.NumberOfRolls;
    ALogicEntity permanentEntity = context.WorldInstance.WorldGrid[stack.Position.PermanentEntity;
    WorldEffectContext effectContext = new WorldEffectContext(context.WorldInstance, null)
    {
      new SourceEntity(stack),
      new TargetPosition(stack.Position)
    };
    LogicLocationEntity logicLocationEntity = permanentEntity as LogicLocationEntity;
    if (logicLocationEntity != null)
    {
      WorldLocationEntity worldLocationEntity;
      if (!context.WorldInstance.VisualEntityRepository.TryGetVisual(logicLocationEntity, out worldLocationEntity))
      {
            yield break;
      }
      effectContext.Add(new LocationEntity(worldLocationEntity));
      if (context.WorldInstance.FactionProvider.IsLocalPlayer(stack.FactionId))
      {
            context.WorldInstance.Research.Trigger<HarvestResearchEvent>(new HarvestResearchEvent(worldHarvestSkill.ValidProperty, logicLocationEntity.DefinitionReference));
      }
      yield return context.WorldInstance.ForgetEntity(worldLocationEntity);
    }
    if (this.LootTags.Any())
    {
      int num;
      if (stack.Units.Any((LogicUnit u) => u.Properties.IncreasedHarvestYields.Any((IUnitModification.Modifiers.IncreasedHarvestYield y) => y.ApplyToLoottags.ContainsAny(this.LootTags))))
      {
            num = lootRolls;
            lootRolls = num + 1;
      }
      for (int i = 0; i < lootRolls; i = num + 1)
      {
            yield return context.WorldInstance.Loot.RollLoot(effectContext, this.LootTags, faction.Definition.Asset.FactionTags, null);
            num = i;
      }
    }
    yield break;
}



大佬请问是把num+1改为num+10的意思么

feiyu_wind 发表于 2024-1-1 13:22

本帖最后由 feiyu_wind 于 2024-1-1 15:39 编辑

再做个备忘:Game.Logic.Locations里面的,下面的修改敌我都有效
ILocationModification类的operator方法
LocationProperties类的Update方法
可以修改全局的数据,可修改的有;
AdditionalInfluenceRange :领域距离,在ILocationModification里修改,+1=+1倍范围,在LocationProperties里修改+1=+1,下同
AdditionalLocationMiningTicks:资源持续时间
ReputationIncome:所有资源自带声望(原本没有的也会带)



feiyu_wind 发表于 2024-1-1 15:43

本帖最后由 feiyu_wind 于 2024-11-17 10:28 编辑

备忘:
1、主城移动速度
Game.Logic.Locations里
ILocationModification类的operator方法
LocationProperties类的Update方法
AdditionalSearchRange:移动速度,下回合生效
2、学徒小屋领域范围
Game.Logic里面
Lodge.Memory里的                private void LodgeLevelChanged(LogicLocationEntity lodge, int previousLevel, int newLevel)
updater.AddModification(lodgeLevel.Modifer);拷贝多做几次,做一次额外+3。已经生效的技能,不需要重建小屋(不需要重新升级)
3、特殊物品获取(1个那种)
Game.Logic.Inventory方法中,InventorySystem中TryChangeItem
if (content.Asset.IsStackable)
    {
      item = content.Asset.Create(content, quality, amount * 1);//这里用* N,可以翻倍,需要用IL语言,largi4n;mul两行
      inventory.Items.Add(item);
      InventorySystem.ItemChangedCallback onItemChanged = this.OnItemChanged;
      if (onItemChanged != null)
      {
            onItemChanged(factionId, inventory, item, amount);
      }
      return true;
    }
4、梦通过战斗升级,次数加倍的地方:
Game.Logic.Inventory.Levelable.Conditions中的AcounterIncrementCondition方法中的
protected override void ModifyAmount(in TMessage message, ref int counter)
      {
            if (this.ShouldCount(message))
            {
                counter ++;//这里改成+n就是战斗胜利加多少次,其他的计算条件类同
            }
      }


5、对于类似恶魔皮等唯一装备类的修改
Game.Logic.Inventory方法中,InventorySystem中TryChangeItem
    for (int i = 0; i < amount; i++)
    {
      item = content.Asset.Create(content, quality, amount);
      inventory.Items.Add(item);
      InventorySystem.ItemChangedCallback onItemChanged2 = this.OnItemChanged;
      if (onItemChanged2 != null)
      {
            onItemChanged2(factionId, inventory, item, amount);
      }
    }
这里直接修改amount的,IL编辑如下方
112      0125      ldloc.3
113      0126      ldarg.s      amount (4)
114      0128      blt.s      86 (00EF) ldloc.0
修改为,可以把唯一装备复制80次
112      0125      ldloc.3
113      0126      ldarg.s      amount (4)
114      0128      add
115      0129      ldc.i4      80
116      012E      blt.s      86 (00EF) ldloc.0

6、无限招募学徒
Game.World.WorldHeroesSystem方法下PlayerCanEmployMoreHeroes方法和HasFreeApprenticeSlots方法改成下面的内容


      public bool PlayerCanEmployMoreHeroes(int progession)
      {
            return this.mFactionProvider.GetPlayerFaction() != null;
      }
      public bool HasFreeApprenticeSlots()
      {
            return this.mFactionProvider.GetPlayerFaction() != null;
      }
IL指令为
0        0000        ldarg.0
1        0001        ldfld        class OwnedByGravity.Game.World.WorldControlledFactionProvider OwnedByGravity.Game.World.WorldHeroesSystem::mFactionProvider
2        0006        callvirt        instance class OwnedByGravity.Game.Logic.Factions.Faction OwnedByGravity.Game.World.WorldControlledFactionProvider::GetPlayerFaction()
3        000B        ldnull
4        000C        cgt.un
5        000E        ret



傻傻的野兔 发表于 2024-2-21 17:31

傻傻的野兔 发表于 2023-11-4 23:55
改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载 ...

谁会整战利品掉落了和我说说吧,改了后直接无限加载了啊啊啊

月澤淵 发表于 2024-6-8 18:06

千古校长 发表于 2023-3-25 23:20
在OwnedByGravity.Game.Logic.XPManagement.XPSystem.RollNextLevel这个方法内给state赋值成一个随机数, ...

感谢,有用


月澤淵 发表于 2024-6-8 18:09

zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了

我是直接打开了Managed下的所有dll,然后再编辑那个GAME.dll后,编译就没问题,只打开GAME.dll编译就会失败
用的github下的dnSpy-net-win64 6.1.8版本

feiyu_wind 发表于 2024-10-22 20:53

wang19941110 发表于 2023-12-25 23:59
int lootRolls = this.NumberOfRolls;
    ALogicEntity permanentEntity = context.WorldInstance.W ...

是的,这里+N就等于N个
页: [1]
查看完整版本: 分享一下萌新发现的有效修改