《失落城堡》物品掉落修改教程
本帖最后由 心愿兰影 于 2021-8-25 23:50 编辑最近《失落城堡》更新了2.1补丁,然后就发现CE不能使用,在网上找了一圈也没有合适的修改器,可能是我太菜了……
于是乎就想着分析一下游戏文件,看看能不能通过简单的逆向修改,在打开游戏目录后发现是Unity引擎的游戏(玩的时候没注意是什么引擎开发的)。
我玩的游戏不说太多但也经常在网上逛论坛,尤其是和游戏相关的,也就是这时候知道Unity引擎开发的游戏如果没有加密dll文件的话,就可以被工具给逆向出来。(这里我不推荐大家在未经允许的情况下随便逆向其他人的文件)
我非常不推荐大家在未经允许的情况下随便逆向其他人的文件,我这也没有经过允许,所以仅提供我自己在娱乐时的思路,不提供工具。
正文开始
在玩的过程中我是想修改金币和灵魂,在使用工具逆向“Assembly-CSharp.dll”文件后,我就去找了金币和灵魂的单词以及拼音(毕竟是国内开发的不排除懒省事的用拼音,这里不是在抱怨拼音不好)发现金币有脚本“Coin”,灵魂“Soul”,宝箱“Chest”。
在金币脚本中没有找到我想要的,却发现有个“CoinDropSys”脚本,这脚本中通过分析发现“EnemyKilled”方法执行了“怪物被杀死”的掉落处理
红框圈起来的部分就是随机掉落,删掉后就成了必掉,这时候保存文件进游戏后发现,杀死怪物后必然会掉下三枚金币,我的目的达成了一部分,因为金币掉的太少了,通过方法查找引用,发现“EnemyKilled”这个方法是在“ItemDropSys”脚本中被调用的,进入“ItemDropSys”脚本查看
这个方法画红框部分执行金币的掉落,三个金币,也发现是一个for循环在控制,简单的通过修改数值可以发现游戏中掉落的金币数量也修改了,至此我想要的金币修改已经达成了。
而我准备用同样方式去修改怪物死亡时灵魂掉落数量时,发现这个物品掉落中没有包含灵魂数据也就是不存在“SoulDropSys”脚本。有点难受,因为不存在就相当于我要重新分析灵魂掉落的操作。
不过,没怎么犯难,我发现了这个物品掉落的“MonsterKilled”怪物死亡方法中,参数是一个“MonsterValue”怪物数值类,通过这个类名或者通过查找死亡“Die”方法可以找到怪物“Monster”类。
在“Monster”类中搜索灵魂“Soul”,很快发现有个方法“SoulDrop”灵魂掉落
其中获取当前怪物掉落的灵魂值
this.GetDiscountDropSoulNum(this.m_dropSoulNum);
this.GetDiscountDropSoulNum(this.m_dropBigSoulNum);
以及 if ((float)num < this.m_dropSoulProb) 来控制是否掉落
通过简单修改比如:
int discountDropSoulNum = this.GetDiscountDropSoulNum(this.m_dropSoulNum);
改为:int discountDropSoulNum =(this.GetDiscountDropSoulNum(this.m_dropSoulNum) + 1) * 2 ;
这样子灵魂数值永远不会等于零
以及 if ((float)num < this.m_dropSoulProb) 中的条件直接改为if (true) 或者删除if条件,只保留if条件满足下的结果代码块
这样修改后,保存运行,发现目的达成。杀死怪物必然掉落可观的金币和灵魂。
本来这样子就没了,但每次通关时会掉落宝箱,心想要不试试看能不能让宝箱中的金币翻倍。
通过搜索箱子“Chest”找到开箱方法“OpenChest”
发现画红框这两个地方做了金币数量的修改,果断的将if删除,保存运行测试,发现金币翻倍。
准备关闭工具时注意到了有个方法“dropThings”,进来发现方法中有个“ChangeItemNum”改变物品数量方法???这说啥,再找找看吧!
进入“ChangeItemNum”方法后发现
金币数量又在这里被改了一次,那我肯定也要再改一下
通过查看,得出 金币数量 = Mathf.Ceil(金币数量 * 0.33f) * (当前难度 - 1)
修改公式:金币数量 = Mathf.Ceil(金币数量 * 1.33f) * (当前难度 * 2 - 1)
保存,运行游戏,发现金币数量达到预期,本次修改结束。
教程说明结束,查找金币,灵魂和宝箱浪费了不少时间。简单赶了一下教程,继续肝我的城堡了……
拜拜~
大佬牛逼!!! 大佬能解决下成就修改吗,全成就 请问是用什么软件 豬仔東 发表于 2021-10-22 18:29
请问是用什么软件
GitHub开源软件:dnspy
感谢大佬,受益匪浅! 楼主,coin脚本在哪里啊 牛逼,感谢 大佬,金币成功了,但是在处理soul时,修改这段红框代码后,编译就报错了,请问怎么解决。。。(哪怕我编辑方法打开后,啥也不动,编译也是报错) f81570083 发表于 2024-2-12 20:40
大佬,金币成功了,但是在处理soul时,修改这段红框代码后,编译就报错了,请问怎么解决。。。(哪怕我编辑 ...
这个报错的含义是:“不知道Random函数是使用UnityEngine.Random 还是 System.Random”你看这个第26行、32行、...都有Random.Range(xxx) 这样的使用方式,所以修改让编译器明确使用的是那个类的Random就可以;
修改方法,将Random.Range(xxx) 修改成 UnityEngine.Random.Range(xxx) , 就是前面加上"UnityEngine."
将所有报错的行数都明确了就可以了
outo 发表于 2024-2-13 16:18
这个报错的含义是:“不知道Random函数是使用UnityEngine.Random 还是 System.Random”你看这个第26行、3 ...
感谢大佬。
6666666666 感谢分享这些信息,看起来对游戏玩法有很大帮助。逆向工程需要谨慎,希望大家遵守规则和道德。
页:
[1]