与道具的使用中的代码类似,对策略的使用前的判断也是通过策略的代码来将每个策略区分开。arg_2为策略代码。
seg002:A556 loc_37476: ; CODE XREF: sub_373EC+64↑j
seg002:A556 80 7E 08 0E cmp [bp+arg_2], 0Eh
seg002:A55A 76 03 jbe short loc_3747F
seg002:A55C E9 8C 01 jmp loc_3760B
seg002:A55F loc_3747F: ; CODE XREF: sub_373EC+8E↑j
seg002:A55F 8A 46 08 mov al, [bp+arg_2]
seg002:A562 B1 05 mov cl, 5
seg002:A564 2A E4 sub ah, ah
seg002:A566 F6 F1 div cl
seg002:A568 88 46 FD mov [bp+var_3], al
seg002:A56B 8A 46 08 mov al, [bp+arg_2]
seg002:A56E 2A E4 sub ah, ah
seg002:A570 F6 F1 div cl
seg002:A572 80 FC 03 cmp ah, 3 ; 判断是不是单体策略
seg002:A575 72 04 jb short loc_3749B
seg002:A577 B0 01 mov al, 1
seg002:A579 EB 02 jmp short loc_3749D
seg002:A57B loc_3749B: ; CODE XREF: sub_373EC+A9↑j
seg002:A57B 32 C0 xor al, al
由于从00-0E道具代码都是火水石类策略,因此只需要seg002:A556一个判断就行。然后就是seg002:A566除以cl(5),ah结果为除法运算的余数,al为除法运算的商,因此seg002:A568ah和al的结果如下表:
策略 00焦熱 01火龍 02猛火 03大焦熱 04大火龍 05漩渦 06濁流 07海嘯 08大漩渦 09大濁流 0A落石 0B山崩 0C山洪 0D大落石 0E大山崩
ah 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
al 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2
seg002:A568在var_3中保存策略分类al的值,seg002:A572判断这个策略是否是单体策略(即ah是否小于3)。
接下来的代码就是判断是不是在雨天使用火类策略。
seg002:A580 80 7E FD 00 cmp [bp+var_3], 0 ; 判断是不是火类策略
seg002:A584 75 1D jnz short loc_374C3
seg002:A586 68 6A CF push 0CF6Ah
seg002:A589 9A D8 3F F2 2C call sub_30EF8 ; 获取天气信息 0晴 1雲 2雨
seg002:A58E 3C 02 cmp al, 2 ; 判断是不是雨
seg002:A590 75 11 jnz short loc_374C3
seg002:A592 1E push ds
seg002:A593 68 DE 3B push 3B3Eh ; "雨天不能使用火攻."
下面的是第伍章道具中同样功能的代码,可以看到这个功能的实现方法机会一模一样,而且有一个不易察觉的细节,就是雨天使用火类策略的提示句seg002:A593"雨天不能使用火攻."最后的标点符号是句号,而雨天使用火类道具的提示句seg002:9EF7"雨天不能使用火攻!"最后的标点符号是感叹号。
seg002:9EE6 0A C0 or al, al ; 判断是不是火类道具
seg002:9EE8 75 13 jnz short loc_36E1D
seg002:9EEA 68 6A CF push 0CF6Ah
seg002:9EED 9A D8 3F F2 2C call sub_30EF8 ; 获取天气信息 0晴 1雲 2雨
seg002:9EF2 3C 02 cmp al, 2 ; 判断是不是雨
seg002:9EF4 75 07 jnz short loc_36E1D
seg002:9EF6 1E push ds
seg002:9EF7 68 30 3B push 3B30h ; "雨天不能使用火攻!"
接着先跳过一些代码,当使用策略选择好一个部队后,seg002:A5D4会将部队代码保存在var_2中,然后seg002:A5D7-A607判断是不是一个可以攻击的部队。
seg002:A5D4 88 46 FE mov [bp+var_2], al
seg002:A5D7 3C FF cmp al, 0FFh
seg002:A5D9 74 30 jz short loc_3752B
seg002:A5DB B0 0E mov al, 0Eh
seg002:A5DD F6 66 FE mul [bp+var_2]
seg002:A5E0 05 76 D0 add ax, 0D076h
seg002:A5E3 89 46 EC mov [bp+var_14], ax
seg002:A5E6 50 push ax
seg002:A5E7 9A 9C 40 F2 2C call sub_30FBC ; 获取部队横纵坐标偏移地址
seg002:A5EC 8B D8 mov bx, ax
seg002:A5EE 8B 07 mov ax, [bx]
seg002:A5F0 89 46 F2 mov [bp+var_E], ax
seg002:A5F3 8D 5E F2 lea bx, [bp+var_E]
seg002:A5F6 9A B2 AF F2 2C call sub_37ED2 ; 获取部队地形代码
seg002:A5FB 8A D0 mov dl, al
seg002:A5FD 8A 46 FD mov al, [bp+var_3]
seg002:A600 32 DB xor bl, bl
seg002:A602 9A 84 95 F2 2C call sub_364A4 ; 判断目标部队是否可以被策略攻击
seg002:A607 0B C0 or ax, ax
同样还是对比道具使用中的类似代码。
seg002:9F2A 88 46 FE mov [bp+var_2], al
seg002:9F2D 3C FF cmp al, 0FFh
seg002:9F2F 75 03 jnz short loc_36E54
seg002:9F31 E9 69 05 jmp loc_373BD
seg002:9F34 loc_36E54:
seg002:9F34 B0 0E mov al, 0Eh
seg002:9F36 F6 66 FE mul [bp+var_2]
seg002:9F39 05 76 D0 add ax, 0D076h
seg002:9F3C 89 46 E0 mov [bp+var_20], ax
seg002:9F3F 50 push ax
seg002:9F40 9A F6 40 F2 2C call sub_31016 ; 判断属于我军1还是敌军0
seg002:9F45 56 push si
seg002:9F46 8B F8 mov di, ax
seg002:9F48 9A F6 40 F2 2C call sub_31016 ; 判断属于我军1还是敌军0
seg002:9F4D 3B F8 cmp di, ax
seg002:9F4F 74 2B jz short loc_36E9C
seg002:9F51 8B 46 E0 mov ax, [bp+var_20]
seg002:9F54 89 46 FA mov word ptr [bp+var_6], ax
seg002:9F57 50 push ax
seg002:9F58 9A 9C 40 F2 2C call sub_30FBC ; 获取部队横纵坐标偏移地址
seg002:9F5D 8B D8 mov bx, ax
seg002:9F5F 8B 07 mov ax, [bx]
seg002:9F61 89 46 F8 mov word ptr [bp+var_8], ax
seg002:9F64 8D 5E F8 lea bx, [bp+var_8]
seg002:9F67 9A B2 AF F2 2C call sub_37ED2 ; 获取部队地形代码
seg002:9F6C 8A D0 mov dl, al
seg002:9F6E 8A 46 FF mov al, [bp+var_1]
seg002:9F71 32 DB xor bl, bl
seg002:9F73 9A 84 95 F2 2C call sub_364A4 ; 判断目标部队是否可以被道具攻击
seg002:9F78 0B C0 or ax, ax
[ 本帖最后由 漫漫苦短 于 2026-3-31 20:31 编辑 ]