接下来几节的主要内容是关于伤害的计算,关于第一节通过分析得出的var_3和var_7的值在这一节就派上用场了。
和道具的使用类似,首先都要通过一个函数sub_3AA64,其实这个函数,总的来说这是个结算系统,这个结算系统后续的一章会专门来介绍,关于这个结算系统的整体框架分析,目前没有看到相关资料。
策略:
seg002:A630 8A 44 02 mov al, [si+2]
seg002:A633 50 push ax
seg002:A634 8A 46 FE mov al, [bp+var_2]
seg002:A637 50 push ax
seg002:A638 6A 02 push 2
seg002:A63A 8A 46 FD mov al, [bp+var_3] ; 火水石策略的类型
seg002:A63D C0 E0 04 shl al, 4
seg002:A640 0A 46 F9 or al, [bp+var_7] ; 火水石策略的指向范围
seg002:A643 88 46 EA mov [bp+var_16], al
seg002:A646 50 push ax
seg002:A647 68 02 D3 push 0D302h
seg002:A64A 9A 44 DB F2 2C call sub_3AA64
道具:
seg002:9F9C 8A 44 02 mov al, [si+2]
seg002:9F9F 50 push ax
seg002:9FA0 FF 76 FA push word ptr [bp+var_6]
seg002:9FA3 9A 9A AE F2 2C call sub_37DBA
seg002:9FA8 50 push ax
seg002:9FA9 6A 03 push 3
seg002:9FAB 8A 46 FF mov al, [bp+var_1] ; 火水石类道具的类型
seg002:9FAE C0 E0 04 shl al, 4
seg002:9FB1 0A 46 FD or al, [bp+var_3] ; 火水石类道具的指向范围
seg002:9FB4 50 push ax
seg002:9FB5 68 02 D3 push 0D302h
seg002:9FB8 9A 44 DB F2 2C call sub_3AA64
seg002:9FBD E9 DF FE jmp loc_36DBF
要调用sub_3AA64函数,需要传入5个值。seg002:9F9F与seg002:A633传入的值,对应sub_3AA64的arg_8,也就是行动方的战场代码;seg002:9FA8与seg002:A637传入的值,对应sub_3AA64的arg_6,也就是目标方的战场代码,seg002:9FA9与seg002:A638不同,策略是2,道具是3;seg002:9FB4与seg002:A646传入的值,对应sub_3AA644的arg_2,就是根据var_1和var_3的值的计算结果。
设策略的类型即var_1为x,策略指向范围的即var_3为y,最终传入arg_2的值为z,可以得出公式 z = 16x + y。
也就是说焦热的计算结果为0,海啸的计算结果为0x12(18),山崩的计算结果为0x21(33)。这个结果与策略基本威力目前还看不到什么相关联的地方。
焦热 200 火龙 600 猛火 1000
漩涡 300 浊流 700 海啸 1100
落石 400 山崩 800 山洪 1200
然后是sub_3AA64的开头部分,可以看到arg_2值保存在si+0B中,可以看到arg_4值保存在si+0A中。
seg002:DB44 sub_3AA64 proc far
seg002:DB44
seg002:DB44 arg_0 = word ptr 6
seg002:DB44 arg_2 = byte ptr 8
seg002:DB44 arg_4 = byte ptr 0Ah
seg002:DB44 arg_6= byte ptr 0Ch
seg002:DB44 arg_8= byte ptr 0Eh
seg002:DB44
seg002:DB44 C8 1A 00 00 enter 1Ah, 0
seg002:DB48 57 push di
seg002:DB49 56 push si
seg002:DB4A 8B 76 06 mov si, [bp+arg_0]
seg002:DB4D 8A 46 0A mov al, [bp+arg_4]
seg002:DB50 88 44 0A mov [si+0Ah], al
seg002:DB53 8A 46 08 mov al, [bp+arg_2]
seg002:DB56 88 44 0B mov [si+0Bh], al
接下来的代码是策略伤害的行动方策略命中和目标方策略闪避的计算。这里的sub_23A3A函数和sub_294F0函数都已经在第肆章介绍过了,这里有个比较奇怪的地方就是智力算了两次,并且结果都是一样的,不知道为啥在转换成汇编代码时出现了重复。最终行动方策略命中的结果保存在var_6,目标方策略闪避的结果保存在var_2。
行动方:
seg002:D2B9 8A 5C 08 mov bl, [si+8]
seg002:D2BC 2A FF sub bh, bh
seg002:D2BE 03 DB add bx, bx
seg002:D2C0 FF 70 04 push word ptr [bx+si+4]
seg002:D2C3 8B FB mov di, bx
seg002:D2C5 9A DA 6A F6 1C call sub_23A3A ; 获取行动方的等级
seg002:D2CA 03 FE add di, si
seg002:D2CC FF 75 04 push word ptr [di+4]
seg002:D2CF 89 46 EC mov [bp+var_14], ax
seg002:D2D2 9A 90 C5 F6 1C call sub_294F0 ; 获取行动方的智力
seg002:D2D7 FF 75 04 push word ptr [di+4]
seg002:D2DA 89 46 EA mov [bp+var_16], ax
seg002:D2DD 9A 90 C5 F6 1C call sub_294F0 ; 获取行动方的智力
seg002:D2E2 2A E4 sub ah, ah
seg002:D2E4 8B C8 mov cx, ax
seg002:D2E6 8A 46 EC mov al, byte ptr [bp+var_14]
seg002:D2E9 F6 66 EA mul byte ptr [bp+var_16]
seg002:D2EC BA 64 00 mov dx, 100
seg002:D2EF 8B DA mov bx, dx
seg002:D2F1 2B D2 sub dx, dx
seg002:D2F3 F7 F3 div bx
seg002:D2F5 03 C8 add cx, ax ; 等级*智力÷100+智力
seg002:D2F7 89 4E FA mov word ptr [bp+var_6], cx
目标方:
seg002:D2FA 8A 5C 09 mov bl, [si+9]
seg002:D2FD 03 DB add bx, bx
seg002:D2FF FF 70 04 push word ptr [bx+si+4]
seg002:D302 8B FB mov di, bx
seg002:D304 9A DA 6A F6 1C call sub_23A3A ; 获取目标方的等级
seg002:D309 03 FE add di, si
seg002:D30B FF 75 04 push word ptr [di+4]
seg002:D30E 89 46 E8 mov [bp+var_18], ax
seg002:D311 9A 90 C5 F6 1C call sub_294F0 ; 获取目标方的智力
seg002:D316 FF 75 04 push word ptr [di+4]
seg002:D319 89 46 E6 mov [bp+var_1A], ax
seg002:D31C 9A 90 C5 F6 1C call sub_294F0 ; 获取目标方的智力
seg002:D321 2A E4 sub ah, ah
seg002:D323 8B C8 mov cx, ax
seg002:D325 8A 46 E8 mov al, byte ptr [bp+var_18]
seg002:D328 F6 66 E6 mul byte ptr [bp+var_1A]
seg002:D32B BA 64 00 mov dx, 100
seg002:D32E 8B DA mov bx, dx
seg002:D330 2B D2 sub dx, dx
seg002:D332 F7 F3 div bx
seg002:D334 03 C8 add cx, ax ; 等级*智力÷100+智力
seg002:D336 C1 E9 02 shr cx, 2 ; (等级*智力÷100+智力)/4
seg002:D339 89 4E FE mov word ptr [bp+var_2], cx
对比龙吟前辈的分析,第五步的内容基本的一致的,但目前只是计算了策略闪避、策略命中,没有进行比较,而且如果目标方是文官(军乐队/运输队/妖术师),策略闪避要×2,后续会介绍这个比较。
三、策略攻击全分析
策略攻击指使用焦热系策略、漩涡系策略、落石系策略对敌人进行攻击
1.攻击伤害
5)第五步
计算策略闪避
策略闪避=(智力×等级÷100+智力)÷4
计算策略命中
策略命中是一个随机整数,该值大于等于0,小于(智力×等级÷100+智力)
[ 本帖最后由 漫漫苦短 于 2026-5-9 21:09 编辑 ]