红色警戒2修改器原理百科(八)

(十五)科技全开2——问题终结

    上一篇留下的问题,进行修改后为什么没有效果。试图让游戏添加所有可能的建造项,但是游戏中尝试刷新建造项(建造新单位)后却没出现我们期望的。这是一个很简单,却难住我一段时间的问题。最初我以为是指令写错了,对比好几遍终于确信没有错误。这么解释这个问题,游戏会在合适的时候(通常是建造了新单位后)会刷新你的建造选项,刷新包括添加和删除。很不幸的是,游戏刷新建造项的流程是:添加当前可建造的->删除当前不可建造的,这是我发现的”证据”,先发出来:

kj5

    所以,当我们试图刷新建造项来验证我们修改的成果时,刚添加上的东西,立马被删除了恼怒,也就看不到效果了。怎么找到删除建造项的地方呢,当初我们找到添加建造选项的地方是不经意间带来的惊喜。现在没有惊喜了,留给笔者的是问题!

    好在,笔者有新发现——ConstructionOptions[0].nCount,查找谁修改了它就得到指令:0068071B mov [ebp+50],edx,然而当我试图发现一个删除建造选项的CALL时,却没能发现。。。研究半天,我才意识到我们所在的位置就是删除所有不能建造的选项的CALL内部,好比拿着手机打电话突然发现手机不见了——————其实你还可以通过这个nCount定位到添加建造选项的地方,那么可以有这么一条线索:找CD->快速建造+建造项结构->添加/删除建造项->科技全开->科技加强->…

    既然这个CALL是删除不满足条件的建造项,一定有判断跳过满足条件的咯。往上找,惊喜地发现我们之前做的标签注释(随手注释总是没错的):

kj6

    结果不用说了,困扰多年的难题终于解决了。而且红警修改大师也是修改的这个地方。(话说我是先想办法找到了这个地方,然后寻找思路定位到附近,我承认我作弊了,我站在了别人肩膀上……原谅我也只是修改游戏的新手)

    我试图NOP掉调用这个CALL的上一层的指令,结果发现基地都没了,建造选项还在,不优雅,所以还是选择了改跳转。

    有了上图的分析,可以填上上一篇挖的坑了,ConsturctionOption和ConstructionDescriptor在没有指针的情况下是如何联系起来的,答案就是CALL< 00482C00=获取建造描述对象>。

(十六)科技加强——可怜的总统只值$10

    你现在已经几乎已经有足够的资料去实现科技加强了,真的。现在你从上篇中有了以下资料:

1.(建筑物)建造描述对象数组,你可以在附近代码找到步兵的、战车的、飞行器的;

类型编号      类型名       ContructionDecriptor数组基址
0x03          飞机          00A3D27C
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=0x16=奶牛,那么启用奶牛,就将地址[[00A40354]+16*4]+55C设置为1。

你现在除了启用隐藏的兵种,还应该想到可以修改单位造价和售价。

 

这篇就很尴尬,再加一小节就太长,不加就太短。但是该睡觉了,所以选择不加!亚当

留个小彩蛋吧,第三篇中提到有的修改器通过围墙建造超级武器,通过电厂建造复制中心,现在你可以做到了,试着去修改ConstructionOption.nID~

Tip:不要尝试用电厂改超级武器,用围墙改复制中心,用工程师改V3火箭……因为类型不一样,也不要去修改nType,因为就算你改了类型,建造选项还是在原来选项卡下,程序还是把它当成原来的流程处理,结果就是造不出来,也取消不掉。

To be continued…

署名许可转载请注明来源,http://www.cnblogs.com/viewll/p/4777068.html

posted @ 2015-09-01 23:40  vIewll  阅读(2275)  评论(0编辑  收藏  举报