接下来开始从头梳理一下恢复类策略的相关代码
seg002:A827 80 7E 08 14 cmp [bp+arg_2], 14h
seg002:A82B 76 03 jbe short loc_37750
seg002:A82D E9 27 01 jmp loc_37877
首先筛选出所有恢复类策略,策略代码都大于14,跳转到`loc_37877`。
seg002:A957 loc_37877: ; CODE XREF: sub_373EC+361↑j
seg002:A957 80 7E 08 1D cmp [bp+arg_2], 1Dh
seg002:A95B 76 03 jbe short loc_37880
seg002:A95D E9 BD 00 jmp loc_3793D
seg002:A960 loc_37880: ; CODE XREF: sub_373EC+48F↑j
seg002:A960 80 7E 08 1B cmp [bp+arg_2], 1Bh
seg002:A964 72 06 jb short loc_3788C
seg002:A966 C6 46 FF 03 mov [bp+var_1], 3
seg002:A96A EB 0F jmp short loc_3789B
这样的判断已经屡见不鲜了,首先群体的恢复类策略跳转到`loc_3793D`,接着筛选出来3个妖术师专用策略:1B看護, 1C治癒, 1D救命。并且`var_1`变量设为3。
seg002:A96C loc_3788C: ; CODE XREF: sub_373EC+498↑j
seg002:A96C 80 7E 08 18 cmp [bp+_策略代码_arg_2], 18h
seg002:A970 72 04 jb short loc_37896
seg002:A972 15激勵 16支援 17鼓舞
seg002:A972 B0 01 mov al, 1
seg002:A974 EB 02 jmp short loc_37898
seg002:A976 18援助 19補給 1A救濟
seg002:A976
seg002:A976 loc_37896: ; CODE XREF: sub_373EC+4A4↑j
seg002:A976 B0 02 mov al, 2
seg002:A978
seg002:A978 loc_37898: ; CODE XREF: sub_373EC+4A8↑j
seg002:A978 88 46 FF mov [bp+var_1], al
单体的策略15激勵, 16支援, 17鼓舞,var_1设为1;18援助 19補給 1A救濟,var_1设为2。
seg002:A97B 0B D2 or dx, dx
seg002:A97D 74 19 jz short loc_378B8
seg002:A97F 8A 5E FF mov bl, [bp+var_1]
seg002:A982 2A FF sub bh, bh
seg002:A984 03 DB add bx, bx
seg002:A986 FF B7 92 39 push word ptr [bx+3992h]
seg002:A98A 1E push ds
seg002:A98B 68 38 3C push 3C38h ; "恢復%s."
seg002:A98E 6A 00 push 0
seg002:A990 9A 42 32 F6 1C call sub_201A2
seg002:A995 83 C4 08 add sp, 8
显示文字,根据`var_1`的分类,显示"恢復兵力""恢復士氣值""恢復兵力和士氣值",那么是如何动态做到这个的,可以看一下`desg`段中的文字数据。
dseg:3978 A7 4C A4 4F 00 asc_44148 text "BIG5", '兵力',0 ; DATA XREF: dseg:3994↓o
dseg:397D A4 68 AE F0 AD C8 00 asc_4414D text "BIG5", '士氣值',0 ; DATA XREF: dseg:3996↓o
dseg:3984 A7 4C A4 4F A9 4D A4 68 AE F0 AD C8 00 asc_44154 text "BIG5", '兵力和士氣值',0 ; DATA XREF: dseg:3998↓o
dseg:3994 78 39 dw offset asc_44148 ; "兵力"
dseg:3996 7D 39 dw offset asc_4414D ; "士氣值"
dseg:3998 84 39 dw offset asc_44154 ; "兵力和士氣值"
`seg002:A986`的`push word ptr [bx+3992h]`代码就是动态显示的关键显示,可以看到前面的`var_1`变量起了作用。
seg002:A998
seg002:A998 loc_378B8: ; CODE XREF: sub_373EC+4B1↑j
seg002:A998 8B 5E 06 mov bx, [bp+arg_0]
seg002:A99B 8A 47 02 mov al, [bx+2]
seg002:A99E 50 push ax
seg002:A99F 8A 46 F9 mov al, [bp+var_7]
seg002:A9A2 0C 80 or al, 80h
seg002:A9A4 50 push ax
seg002:A9A5 6A 01 push 1 ; 我方部队
seg002:A9A7 68 90 CF push 0CF90h
seg002:A9AA 9A B4 57 F2 2C call sub_326D4
seg002:A9AF 88 46 FE mov [bp+var_2], al
seg002:A9B2 3C FF cmp al, 0FFh
seg002:A9B4 74 15 jz short loc_378EB
选择一个部队,将部队的战场代码保存到AL中,如果点了鼠标右键`sub_326D4`返回FF到`AL`寄存器中。
seg002:A9B6 2A E4 sub ah, ah
seg002:A9B8 6B F8 0E imul di, ax, 14
seg002:A9BB 81 C7 76 D0 add di, 0D076h
seg002:A9BF 8A 56 FF mov dl, [bp+var_1]
seg002:A9C2 9A F2 93 F2 2C call sub_36312
seg002:A9C7 0B C0 or ax, ax
seg002:A9C9 75 02 jnz short loc_378ED
seg002:A9CB loc_378EB: ; CODE XREF: sub_373EC+4E8↑j
seg002:A9CB EB 7D jmp short loc_3796A
其中的`sub_36312`函数,其作用就是上一节提到的判断目标部队是否是合理目标。
seg002:A9CD loc_378ED: ; CODE XREF: sub_373EC+4FD↑j
seg002:A9CD 89 7E E6 mov [bp+var_1A], di
seg002:A9D0 80 7E F9 02 cmp [bp+var_7], 2
seg002:A9D4 75 05 jnz short loc_378FB
seg002:A9D6 B8 41 3C mov ax, offset asc_44411 ; "恢復"
seg002:A9D9 EB 03 jmp short loc_378FE
seg002:A9DB loc_378FB: ; CODE XREF: sub_373EC+508↑j
seg002:A9DB B8 46 3C mov ax, offset asc_44416 ; "上升"
seg002:A9DE loc_378FE: ; CODE XREF: sub_373EC+50D↑j
seg002:A9DE 50 push ax
seg002:A9DF 8A 5E FF mov bl, [bp+var_1]
seg002:A9E2 2A FF sub bh, bh
seg002:A9E4 03 DB add bx, bx
seg002:A9E6 FF B7 92 39 push word ptr [bx+3992h]
seg002:A9EA 57 push di
seg002:A9EB 9A 82 93 F2 2C call sub_362A2
seg002:A9F0 50 push ax
seg002:A9F1 1E push ds
seg002:A9F2 68 4B 3C push 3C4Bh ; "%s的%s%s"
seg002:A9F5 6A 00 push 0
seg002:A9F7 9A 42 32 F6 1C call sub_201A2
seg002:A9FC 83 C4 0C add sp, 0Ch
如果选择好了目标部队,又显示一次文字,具体就是哪只部队的{“兵力” , “士氣值” , “兵力和士氣值” } {“恢復” , “上升”},不知道有没有玩家注意到其中的排列现象。
seg002:A9FF 8A 46 F9 mov al, [bp+var_7]
seg002:AA02 C0 E0 04 shl al, 4
seg002:AA05 0A 46 FF or al, [bp+var_1]
seg002:AA08 50 push ax
seg002:AA09 8B 5E 06 mov bx, [bp+arg_0]
seg002:AA0C 8A 47 02 mov al, [bx+2]
seg002:AA0F 50 push ax
seg002:AA10 6A 00 push 0
seg002:AA12 FF 76 E6 push [bp+var_1A]
seg002:AA15 9A B6 AA F2 2C call sub_379D6
seg002:AA1A E9 C6 FC jmp loc_37603
最后`sub_379D6`函数就是一个结算恢复类道具或策略的函数,以后会介绍这个函数。
这节把单体恢复类策略的使用流程的相关代码介绍了,下一节继续介绍群体恢复类策略。
[ 本帖最后由 漫漫苦短 于 2026-8-19 19:49 编辑 ]