(十五)科技全开2——问题终结
上一篇留下的问题,进行修改后为什么没有效果。试图让游戏添加所有可能的建造项,但是游戏中试图刷新建造项(建造新单位)后却没出现我们期望的。这是一个很简单,却难住我一段时间的问题。最初我以为是指令写错了,对比好几遍终于确信没有错误。这么解释这个问题,游戏会在合适的时候(通常是建造了新单位后)会刷新你的建造选项,刷新包括添加和删除。很不幸的是,游戏刷新建造项的流程是:添加当前可建造的->删除当前不可建造的,这是我发现的”证据”,先发出来:
所以,当我们试图刷新建造项来验证我们修改的成果时,刚添加上的东西,立马被删除了,也就看不到效果了。怎么找到删除建造项的地方呢,当初我们找到添加建造项的地方是不经意间带来的惊喜。现在没有惊喜了,留给笔者的是问题!
好在,笔者有新发现——ConstructionOption.nCount,查找谁修改了它就得到指令:0068071B mov [ebp+50],edx,然而当我试图发现一个删除建造选项的CALL时,却没能发现。。。研究半天,我才意识到我们所在的位置就是删除所有不能建造的选项的CALL内部,好比拿着手机打电话突然发现手机不见了——————其实你还可以通过这个nCount定位到添加建造选项的地方,那么可以有这么一条线索:找CD->快速建造+建造项结构->添加/删除建造项->科技全开->科技加强->…
既然这个CALL是删除不满足条件的建造项,一定有判断跳过满足条件的咯。往上找,惊喜地发现我们之前做的标签注释(随手注释总是没错的):
结果不用说了,困扰多年的难题终于解决了。而且红警修改大师也是修改的这个之前我没发现的地方。(话说我是先想办法找到了这个地方,然后想办法定位到附近,我承认我作弊了,我站在了别人肩膀上……原谅我也只是修改游戏的新手)
我试图NOP掉调用这个CALL的上一层的指令,结果发现基地都没了,建造选项还在,不优雅,所以还是选择了改跳转。
有了上图的分析,可以填上上一篇挖的坑了,ConsturctionOption和ConstructionDescriptor在没有指针的情况下是如何联系起来的,答案就是CALL< 00482C00=获取建造描述对象>。
(十六)科技加强——可怜的总统只值$10
你现在已经几乎已经有足够的资料去实现科技加强了,真的。现在你从上篇中有了以下资料:
1.(建筑物)建造描述对象(指针)数组,你可以在附近代码找到步兵的、战车的、飞行器的;
类型编号 类型名 Contruction对象基址
0x03 飞行器 00A3D288
0x07 建筑物 00A35CDC
0x10 步兵 00A40354
0x28 战车 00A35D4C
2.建造描述对象ConstructionDescriptor的成员变量的偏移;
你缺少的是:
3.你想启用的兵种的编号,即在数组中的索引(十进制):
0=E1;美国大兵
1=E2;苏联动员兵
2=SHK;磁爆步兵
3=ENGINEER;盟军工程师
4=JUMPJET;火箭飞行兵
5=GHOST;海豹部队
6=YURI;尤里
7=IVAN;疯狂伊万
8=DESO;生化步兵
9=DOG;苏联军犬
...
更详细的可以百度,或去本系列结尾下载所有相关资料。
例如:22=奶牛,那么启用奶牛,就将地址[[00A40354]+22*4]+55C设置为1。
你现在除了启用隐藏的兵种,还应该想到可以修改单位造价和售价。
这篇就很尴尬,再加一小节就太长,不加就太短。但是该睡觉了,所以选择不加!
留个小彩蛋吧,第三篇中提到有的修改器通过围墙建造超级武器,通过电厂建造复制中心,现在你可以做到了,试着去修改ConstructionOption.nID~
Tip:不要尝试用电厂改超级武器,用围墙改复制中心,用工程师改V3火箭……因为类型不一样,也不要去修改nType,因为就算你改了类型,建造选项还是在原来选项卡下,程序还是把它当成原来的类型处理,结果就是造不出来,也取消不掉。
To be continued…
转载请注明来源,http://www.cnblogs.com/viewll/p/4777068.html