曹操传策略伤害种类增加方法,《精忠报国岳飞传》制作组,精忠报国岳飞传,轩辕春秋文化论坛">


标题: 曹操传策略伤害种类增加方法, 东施效颦之作。初步试验成功,尚需进一步测试
性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-7-5 09:59 资料 个人空间 短消息 只看该作者 QQ
Exe文件中

3B7D0开始66个字节 取值范围0-1CH 法术威力

在策略伤害公式中,[(攻击方精神力-防御方精神力)*1/3+攻击方等级+25]*K,取值0~1C对应的系数K如下所示:

0.2:0D、18
0.4:0B、16
0.5:02、07、09、0C、14、17
0.7:00、03、05、08、0A、0E、10、13、15、1A
0.9:01、04、06、0F、11
1.0:1B
1.2:12、19
0.0:1C

可以看到,这里有29种取值,而对应的K的取值却只有8种。实际上浪费了21种取值。我们可以把这21种取值占用的空间腾出来,实现更多的K的取值。

3B75C开始是这些取值的跳转表,每个取值对应跳转表中的4个字节。
这4个字节是跳转表对应的虚拟地址(RVA),减去400C00即为实际地址,可以找到实际地址从3B4AA开始,共70个字节。8组代码。前7组代码每组9个字节,是

C7 45 F8 XX 00 00 00 EB YY(XX,YY数值不固定)

最后一组是7个字节,没有后面的EB YY

借助反汇编可以看出,前7组代码由两条指令组成,分别是(以第一组为例,左侧为机器码,右侧为反汇编结果)

C7 45 F8 02 00 00 00     mov[ebp-08],00000002
EB 3D                   jmp 0043C0F0  
                                          

可以看出[ebp-08]中存放的就是系数K*10,机器码中的XX就是K*10
第二条指令则是跳转。第8组代码只有一条指令,不需要跳转。

也就是说,要增加一个新的K值,需要9个字节的指令,以及4个字节的跳转表,总共13个字节。84/13=6。可以增加6个K值。

把K值和3B7D0开始的取值重新安排一下:
0.0:00    0.2:02    0.3:02
0.4:03    0.5:04    0.6:05
0.7:06    0.8:07    0.9:08
1.0:09    1.1:0A    1.2:0B
1.3:0C    1.4:0D   
(把0.0安排在00还有其他意义,后面会看到)

具体修改方法:

1 将3B4F0开始的620字节向后移动54个字节,并将其后的6个字节改为00

2 修改从3B4AA开始的描述,一共14组代码,前13组每组9个字节,为

C7 45 F8 XX 00 00 00 EB YY

其中,XX依次为00,02,03,04,05,06,07,08,09,0A,0B,0C,0D

YY则为
73,6A,61,58,4F,46,3D,34,2B,22,19,10,07(还好不需要长跳转)

最有一组只有C7 45 F8 0E 00 00 00

3 修改跳转表,从3B798开始,
AAC04300 B3C04300 BCC04300 C5C04300
CEC04300 D7C04300 E0C04300 E9C04300
F2C04300 FBC04300 04C14300 0DC14300
16C14300 14C14300


4 通过反汇编可以看出有相当多的相关跳转和调用需要修改:

跳转:
3B4A6为跳转表的入口,原为5CC343,现改为98C343
3B497处的51改成12(这里是跳转到K=0的代码)
3B456的FC02改为3203
3B3FE的54改为8A
3B427的2B改为61
3B3DA的75改为AB

调用:
3B55C的74改为3E
3B57D的C5改为8F
3B5E2的C0改为8A
3B60B的47改为11
3B629的12B8改为DCB7
3B642的E2改为AC
3B675的DD改为A7
3B694的A7改为71
3B6AD的77改为41
3B6D3的68改为32
3B6E1的43改为0D
3B70A的3B改为05
3B732的9E改为68
3B75B的1765改为E164
3B768的0A65改为D464
3B775的4D改为17
3B782的40改为0A


顶部
性别:男-离线 peacockwang

Rank: 7Rank: 7Rank: 7Rank: 7
组别 羽林都尉
级别 破虏将军
好贴 1
功绩 75
帖子 776
编号 30530
注册 2005-1-18
来自 秦——长安
家族 轩辕学院


发表于 2005-7-5 15:13 资料 文集 短消息 只看该作者
怎么张生说话的腔调变得和周郎一样了,呵呵

好东西,慢慢研究~


顶部
性别:男-离线 van

平曲侯泸川军节度使

Rank: 13Rank: 13Rank: 13Rank: 13
柱国(正二品) 工神
组别 节度使
级别 军师将军
好贴 3
功绩 475
帖子 984
编号 25461
注册 2004-11-24


发表于 2005-7-5 18:53 资料 主页 文集 短消息 只看该作者
其实不需要这么麻烦的,使用类似的指令即可

xor     ecx, ecx
mov     cl, ds:byte_43C3D0[edx]
jmp     ds:off_43C35C[ecx*4]
改成(在新建的段中找个地方放全局变量gMagicCof)
mov     ecx, gMagicCof[edx]
mov     [ebp+var_8], ecx
jmp     short loc_43C0F0
即可
这样即能省下一些的代码空间,没有数量限制,也方便以后统一修改

或者干脆直接写成这样好了
xor   ecx, ecx
mov   cl, ds:byte_43C3D0[edx](将43C3D0中的值改成你需要的系数即可)
mov   [ebp+var_8], ecx
jmp   short loc_43C0F0
顶部
性别:男-离线 小行者

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 讨逆将军
功绩 32
帖子 698
编号 41928
注册 2005-6-29


发表于 2005-7-5 20:22 资料 文集 短消息 只看该作者 QQ Yahoo!
正在学习 编译原理  参考中
顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4714
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2005-7-11 10:55 资料 主页 文集 短消息 只看该作者
张生的这项改动不错,思想方法和我增加战场形象的首帖类似。一般来说,写程序时只要尽量节省,字节数还是有富余的。这时候需要根据实际需求设定跳转表等参数,而并不是利用所有的空闲区域。省下来的地方可以留作下次改动使用。
van的改进基本还是看懂了,不过可能是由于汇编语言格式的差异,看起来有点吃力,我按照w32dsm生成的格式重写了一下:
:0043C09B 33C9                    xor ecx, ecx
:0043C09D 8A8AD0C34300            mov cl, byte ptr [edx+0043C3D0]
:0043C0A3 894DF8                  mov dword ptr [ebp-08], ecx
:0043C0A6 EB48                    jmp 0043C0F0


这样改进之后,0043C3D0~0043C42D存放的不再是策略伤害系数的分类号,而直接是策略伤害的系数,如果乐意,可以把每个策略的伤害系数都设置为不同。
空闲区域有两部分:一部分是0043C0A8~0043C0EF,总计0x48字节,即上面jmp跳过的部分;令一部分是0043C35C~0043C3CF,总计0x74字节,即原来存放跳转表项的部分。

注:并非所有的跳转表都可以这样化简,仅限于这种直接赋值的跳转表才行。
顶部
性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-7-12 13:54 资料 个人空间 短消息 只看该作者 QQ
To 周瑜:

按照你的这种改法

:0043C096  7751        ja 0043C0E9

这里应该怎么改?

是不是这里不用改,而

:0043C0E9 C745F800000000    mov[ebp-08], 00000000

这一句保留就行了?
顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4714
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2005-7-12 15:42 资料 主页 文集 短消息 只看该作者


QUOTE:
原帖由博雅张生于2005-07-12, 13:54:51发表
To 周瑜:

按照你的这种改法

:0043C096  7751        ja 0043C0E9

这里应该怎么改?

是不是这里不用改,而

:0043C0E9 C745F800000000    mov[ebp-08], 00000000

这一句保留就行了?

:0043C08F 8945E4                  mov dword ptr [ebp-1C], eax
:0043C092 837DE441                cmp dword ptr [ebp-1C], 00000041

这两句是为了判断策略编号是否超过上限,如果是,则执行下面mov [ebp-08], 00000000这句。虽然在正常的游戏中,永远无法执行到这个分支,但还是建议保留,这样更加安全。
于是三句都不用动,实际空闲区域为0043C0A8~0043C0E8的0x41字节。
顶部
性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-7-13 16:47 资料 个人空间 短消息 只看该作者 QQ
继续效颦……

我想利用这里空闲的区域,增加策略对兵种伤害加成的种类。先说说思路:

3B822开始12个字节是策略对从西凉骑兵开始的12个兵种的伤害加成。

利用反汇编,可以看到相关指令。其中有几条比较关键:

:0043C156    sub edx,27   

这个27就是西凉骑兵的序号,若改为0就是从轻步兵开始了。

:0043C157    cmp dword ptr[ebp-20],0000000B

检查兵种序号是否超过上限。如果需要全部兵种,则上面改成0,这里改成34

:0043C167    mov al,byte ptr[ecx+0043c422]

从[ecx+0043c422]读取策略伤害加成种类,可以考虑改为从[ecx+0043c35c]直接读取伤害系数。那么从这一句开始后面改动就比较大了:

xor ebx,ebx
mov bl,byte ptr[ecx+0043c35c]
mov eax,dword ptr [ebp-04]
imul eax,ebx
xor edx,edx
mov ecx,0000000a
div ecx
mov dword ptr [ebp-04], eax
jmp 0043c19a

从这之后到0043c19a就成为空闲区域了。

请周瑜检查一下。另外是否有必要从轻步兵就开始设置策略伤害加成我还没有想好……
顶部
性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-7-13 23:54 资料 个人空间 短消息 只看该作者 QQ
最终决定从铁华车到铁锤骑兵安排策略伤害加成,系数从3B81A开始。相关指令修改如下:

:0043C156 83EA21                  sub edx, 00000021
:0043C159 8955E0                  mov dword ptr [ebp-20], edx
:0043C15C 837DE013                cmp dword ptr [ebp-20], 00000013
:0043C160 7738                    ja 0043C19A
:0043C162 8B4DE0                  mov ecx, dword ptr [ebp-20]
:0043C165 33C0                    xor eax, eax
:0043C167 31DB                    xor ebx, ebx
:0043C169 8A991AC44300            mov bl, byte ptr [ecx+0043C41A]
:0043C16F 8B45FC                  mov eax, dword ptr [ebp-04]
:0043C172 0FAFC3                  imul eax, ebx
:0043C175 31D2                    xor edx, edx
:0043C177 B90A000000              mov ecx, 0000000A
:0043C17C F7F1                    div ecx
:0043C17E 8945FC                  mov dword ptr [ebp-04], eax
:0043C181 EB17                    jmp 0043C19A


注意系数0A表示正常伤害,0B表示110%伤害……

测试中……
顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4714
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2005-7-14 09:55 资料 主页 文集 短消息 只看该作者
:0043C165 33C0          xor eax, eax
这句没有必要,因为后面是对整个eax赋值,不是对al赋值,先把eax清零就没什么必要了。

既然做到这份上了,不如更精确设定攻击策略伤害加成系数,精确到1%。也就是把除数改为0x64,如何?
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2024-9-17 13:56
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.013216 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP