分享一下萌新发现的有效修改
本帖最后由 千古校长 于 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那里听来的内容,在此鸣谢
研究出成果了啊,恭喜
等级上限跟 升级的特殊技能有没有研究出来呢{:3_153:} 只能用IL指令修改吗 dnspy编译都失败了{:3_107:} zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了
是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱
千古校长 发表于 2023-3-11 22:25
是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱
...
大佬有升级时获得技能数量的代码吗?找半天没找到...或像坛子里大佬那个升级可反复刷技能该怎么改~Thanks♪(・ω・)ノ
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-3 21:49
等级上限跟 升级的特殊技能有没有研究出来呢
等级上限跟升级特殊技能应该都是在XPsystem里面的,里面的代码不多,可以拿游戏原代码和论坛里面两个大佬的mod对照,你就知道怎么改了,但是这一块大家都没有做完善,会有各种奇奇怪怪的小bug(比如哥布林斗士可能会学到学徒小屋领域范围扩大,这个问题现在倒是解决了),还有会卡技能之类的(能学的技能都学完了,然后每个回合一直有让你去升级的提示),实现难度太大了,个人不太推荐修改这一块,等大佬做比较好
就想改升级选项数量和刷技能,在你这完美解决,感谢 改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载不能进入地图 测了一下,楼主的都有效。感谢 AlchemyProductionEntry;HireUnitProductionEntry;NecromancyProductionEntry; RoomExtensionProductionEntry; RunesmithingProductionEntry
这几个方法里面的GetDuration里面改为return1就能将制造时间全部改为1 收获倍数的修改在:Game.Logic.Effects.Effects下的HarvestLocationEffect里面的Apply里面有个lootRolls,原始值应该是2,然后10倍就是+8 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 15:39 编辑
再做个备忘:Game.Logic.Locations里面的,下面的修改敌我都有效
ILocationModification类的operator方法
LocationProperties类的Update方法
可以修改全局的数据,可修改的有;
AdditionalInfluenceRange :领域距离,在ILocationModification里修改,+1=+1倍范围,在LocationProperties里修改+1=+1,下同
AdditionalLocationMiningTicks:资源持续时间
ReputationIncome:所有资源自带声望(原本没有的也会带)
本帖最后由 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
傻傻的野兔 发表于 2023-11-4 23:55
改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载 ...
谁会整战利品掉落了和我说说吧,改了后直接无限加载了啊啊啊
千古校长 发表于 2023-3-25 23:20
在OwnedByGravity.Game.Logic.XPManagement.XPSystem.RollNextLevel这个方法内给state赋值成一个随机数, ...
感谢,有用
zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了
我是直接打开了Managed下的所有dll,然后再编辑那个GAME.dll后,编译就没问题,只打开GAME.dll编译就会失败
用的github下的dnSpy-net-win64 6.1.8版本
wang19941110 发表于 2023-12-25 23:59
int lootRolls = this.NumberOfRolls;
ALogicEntity permanentEntity = context.WorldInstance.W ...
是的,这里+N就等于N个
页:
[1]