下面进入这个三层循环的具体过程
seg002:BD52 loc_38C72: ; CODE XREF: sub_38AD2+19B↑j sub_38AD2+34E↓j
seg002:BD52 A0 68 CF mov al, byte_4D738
seg002:BD55 2A E4 sub ah, ah
seg002:BD57 F7 E7 mul di
seg002:BD59 8B D8 mov bx, ax
seg002:BD5B 03 5E DE add bx, [bp+var_22]
seg002:BD5E 8E 46 E0 mov es, [bp+var_20]
seg002:BD61 26 8A 00 mov al, es:[bx+si]
seg002:BD64 88 46 F9 mov [bp+var_7], al
取出ES{5508}:[W*Y+X+18BC]的值,存在var_7中
seg002:BD67 3A 46 F5 cmp al, [bp+var_B]
seg002:BD6A 74 03 jz short loc_38C8F
seg002:BD6C E9 87 01 jmp loc_38E16
比较循环移动力与从(X0,Y0) 到 (X,Y)的移动力,相等跳到loc_38C8F,不相等跳到loc_38E16
seg002:BD6F loc_38C8F: ; CODE XREF: sub_38AD2+1B8↑j
seg002:BD6F 8B C6 mov ax, si
seg002:BD71 88 46 E8 mov [bp+var_18], al
seg002:BD74 8B C7 mov ax, di
seg002:BD76 88 46 E9 mov [bp+var_17], al
seg002:BD79 8B 5E 10 mov bx, [bp+arg_A]
seg002:BD7C 8D 46 E8 lea ax, [bp+var_18]
seg002:BD7F 9A FE 6A F2 2C call sub_33A1E
seg002:BD84 0B C0 or ax, ax
seg002:BD86 75 1F jnz short loc_38CC7
判断(X, Y)与(X0, Y0)是不是相同的坐标,相等跳转到loc_38CC7。
seg002:BD88 F6 46 0C 03 test [bp+arg_6], 3
seg002:BD8C 75 19 jnz short loc_38CC7
若arg_6传入的值的不带1和2(带4和8),继续执行下面代码,否则跳转到loc_38CC7。
这里的test作用和seg002:BC66处只是写法不同,作用几乎一样
seg002:BD93 8A 46 F3 mov al, [bp+var_D]
seg002:BD96 2A E4 sub ah, ah
seg002:BD98 8D 5E E8 lea bx, [bp+var_18]
seg002:BD9B 9A 04 AF F2 2C call sub_37E24
seg002:BDA0 0B C0 or ax, ax
seg002:BDA2 74 03 jz short loc_38CC7
seg002:BDA4 E9 4F 01 jmp loc_38E16
判断四周是否有不同阵营的部队,有跳到loc_38E16,没有跳到loc_38CC7
seg002:BDA7 loc_38CC7:
seg002:BDA7 89 76 F0 mov [bp+var_10], si
seg002:BDAA 89 7E EE mov [bp+var_12], di
seg002:BEF0 8B 76 F0 mov si, [bp+var_10]
seg002:BEF3 8B 7E EE mov di, [bp+var_12]
用var_12和var_10暂存SI, DI,然后到seg002:BEF0还原SI, DI
seg002:BDAD C7 46 F6 00 00 mov [bp+var_A], 0
seg002:BEE4 loc_38E04:
seg002:BEE4 FF 46 F6 inc [bp+var_A]
seg002:BEE7 83 7E F6 04 cmp [bp+var_A], 4
seg002:BEEB 73 03 jnb short loc_38E10
seg002:BEED E9 C2 FE jmp loc_38CD2
这里有个小循环var_A=0...3,=4则跳出循环
seg002:BDB2 loc_38CD2: ; CODE XREF: sub_38AD2+33B↓j
seg002:BDB2 8A 46 F6 mov al, byte ptr [bp+var_A]
seg002:BDB5 8D 5E E8 lea bx, [bp+var_18]
seg002:BDB8 9A F0 AF F2 2C call sub_37F10
seg002:BDBD 50 push ax
seg002:BDBE 8D 46 E6 lea ax, [bp+var_1A]
seg002:BDC1 50 push ax
seg002:BDC2 9A 2A 93 F6 1C call sub_2628A
var_1A获取var_18{上 右 下 左}的坐标Xt,Yt,越界返回FF
seg002:BDC7 80 7E E6 FF cmp [bp+var_1A], 0FFh
seg002:BDCB 74 70 jz short loc_38D5D
判断(Xt,Yt)是否越界
seg002:BDCD 8A 46 E7 mov al, [bp+var_19]
seg002:BDD0 F6 26 68 CF mul byte_4D738
seg002:BDD4 8B F8 mov di, ax
seg002:BDD6 8A 46 E6 mov al, [bp+var_1A]
seg002:BDD9 2A E4 sub ah, ah
seg002:BDDB 03 F8 add di, ax
seg002:BDDD 8B C7 mov ax, di
seg002:BDDF 03 46 DE add ax, [bp+var_22]
seg002:BDE2 8B 56 E0 mov dx, [bp+var_20]
seg002:BDE5 8B F0 mov si, ax
seg002:BDE7 89 56 EC mov [bp+var_14], dx
DI=W*Yt+Xt SI=W*Yt+Xt+18BC
var_20(ES{5508})的值传入var_14,从后文来看根本没这必要。
seg002:BDEA 68 08 55 push 5508h
seg002:BDED 9A 08 1D F6 1C call sub_1EC68
seg002:BDF2 5B pop bx
seg002:BDF3 03 C7 add ax, di
seg002:BDF5 05 C0 12 add ax, 12C0h
seg002:BDF8 89 46 FC mov [bp+var_4], ax
seg002:BDFB 89 56 FE mov [bp+var_2], dx
var_4保存ES{5508},var_2保存W*Yt+Xt+12C0
seg002:BDFE 68 0E 55 push 550Eh
seg002:BE01 9A 08 1D F6 1C call sub_1EC68
seg002:BE06 5B pop bx
此段无意义
seg002:BE07 8E 46 EC mov es, [bp+var_14]
seg002:BE0A 26 80 3C FF cmp byte ptr es:[si], 0FFh
seg002:BE0E 75 2D jnz short loc_38D5D
seg002:BE3D loc_38D5D:
seg002:BE3D E9 A4 00 jmp loc_38E04
var_14此处等于var_20,可以用var_20替换。
判断ES{5508}:[W*Yt+Xt+18BC]是否为FF
seg002:BE10 8D 5E E6 lea bx, [bp+var_1A]
seg002:BE13 9A B2 AF F2 2C call sub_37ED2
seg002:BE18 8A D8 mov bl, al
seg002:BE1A 88 46 FA mov byte ptr [bp+var_6], al
seg002:BE1D 2A FF sub bh, bh
seg002:BE1F 03 5E D8 add bx, [bp+var_28]
seg002:BE22 8A 87 6A 32 mov al, [bx+326Ah]
seg002:BE26 88 46 FB mov byte ptr [bp+var_5], al
根据兵种行动等级的来计算移到(Xt,Yt)的消耗步数,保存在var_5
seg002:BE29 3C FF cmp al, 0FFh
seg002:BE2B 74 10 jz short loc_38D5D
判断部队能不能到达(Xt,Yt)地形,FF为不能到达,则跳转到loc_38D5D
seg002:BE2D 2A E4 sub ah, ah
seg002:BE2F 8A 4E F9 mov cl, byte ptr [bp+var_7]
seg002:BE32 2A ED sub ch, ch
seg002:BE34 03 C1 add ax, cx
seg002:BE36 8A 4E 0E mov cl, [bp+arg_8]
seg002:BE39 3B C1 cmp ax, cx
seg002:BE3B 7E 03 jle short loc_38D60
seg002:BE3D E9 A4 00 jmp loc_38E04
比较var_7+var_5与arg_8,超出最大移动力跳转到loc_38E04
seg002:BE40 loc_38D60: ; CODE XREF: sub_38AD2+289↑j
seg002:BE40 C4 5E FC les bx, [bp+var_4]
seg002:BE43 26 80 3F FF cmp byte ptr es:[bx], 0FFh
seg002:BE47 74 1A jz short loc_38D83
判断ES{5508}:[W*Yt+Xt+12C0]是否为FF,FF跳转到loc_38D83
以ES{5508}:12C0开头,这是个部队代码矩阵,为FF的代表无部队
seg002:BE49 B0 0E mov al, 0Eh
seg002:BE4B 26 F6 27 mul byte ptr es:[bx]
seg002:BE4E 05 76 D0 add ax, 0D076h
seg002:BE51 50 push ax
seg002:BE52 9A F6 40 F2 2C call sub_31016
seg002:BE57 8A 4E F3 mov cl, [bp+var_D]
seg002:BE5A 2A ED sub ch, ch
seg002:BE5C 3B C1 cmp ax, cx
seg002:BE5E 74 03 jz short loc_38D83
seg002:BE60 E9 81 00 jmp loc_38E04
若该点有部队,判断两只部队是否为同一阵营,同一阵营跳转到loc_38D83,不同阵营跳转到loc_38E04
seg002:BE63 loc_38D83: ; CODE XREF: sub_38AD2+295↑j sub_38AD2+2AC↑j
seg002:BE63 8A 46 FB mov al, [bp+var_5]
seg002:BE66 02 46 F9 add al, [bp+var_7]
seg002:BE69 8E 46 EC mov es, [bp+var_14]
seg002:BE6C 26 88 04 mov es:[si], al
seg002:BE6F C7 46 E2 01 00 mov [bp+var_1E], 1
seg002:BE74 3A 46 F8 cmp al, [bp+var_8]
seg002:BE77 73 09 jnb short loc_38DA2
seg002:BE79 8E 46 EC mov es, [bp+var_14]
seg002:BE7C 26 8A 04 mov al, es:[si]
seg002:BE7F 88 46 F8 mov [bp+var_8], al
到了loc_38D83,说明搜索到新的位置,var_1E改为1,而且var_14此处依然等于var_20,var_14只有上述三处使用
重新计算var_7+var_5,(X0, Y0) 到 (Xt, Yt)的移动力保存在ES{5508}:[W*Yt+Xt+18BC]
判断var_7+var_5是否小于var_8,小于则var_8缩小为var_7+var_5
seg002:BE79和seg002:BE7C又是两句废话
最终var_8为在所有var_7移动力下加上最小新移动消耗,而且如果var_8有更新(小于FF),var_1E必是1
seg002:BE82 loc_38DA2: ; CODE XREF: sub_38AD2+2C5↑j
seg002:BE82 F6 46 0C 08 test [bp+arg_6], 8
seg002:BE86 74 34 jz short loc_38DDC
判断arg_6传入的值带8,不带8跳到loc_38DDC
seg002:BE88 68 0E 55 push 550Eh
seg002:BE8B 9A 08 1D F6 1C call sub_1EC68
seg002:BE90 5B pop bx
seg002:BE91 8E C2 mov es, dx
seg002:BE93 8B D8 mov bx, ax
seg002:BE95 26 80 39 FF cmp byte ptr es:[bx+di], 0FFh
seg002:BE99 74 21 jz short loc_38DDC
判断是不ES{550E}:[W*Yt+Xt]的值,是FF,是FF跳到loc_38DDC
以ES{550E}:0开头,这也是个部队代码矩阵,为FF的代表无部队
seg002:BE9B 6A 20 push 20h
seg002:BE9D 68 0E 55 push 550Eh
seg002:BEA0 9A 08 1D F6 1C call sub_1EC68
seg002:BEA5 5B pop bx
seg002:BEA6 8E C2 mov es, dx
seg002:BEA8 8B D8 mov bx, ax
seg002:BEAA B0 0E mov al, 0Eh
seg002:BEAC 26 F6 21 mul byte ptr es:[bx+di]
seg002:BEAF 05 76 D0 add ax, 0D076h
seg002:BEB2 50 push ax
seg002:BEB3 9A BC 40 F2 2C call sub_30FDC
seg002:BEB8 0B C0 or ax, ax
seg002:BEBA 75 65 jnz short loc_38E41
判断目标部队是不是已出场部队(不是伏兵),不是伏兵跳转loc_38E41
seg002:BF21 loc_38E41: ; CODE XREF: sub_38AD2+308↑j
seg002:BF21 68 0E 55 push 550Eh
seg002:BF24 9A 08 1D F6 1C call sub_1EC68
seg002:BF29 5B pop bx
seg002:BF2A 8B D8 mov bx, ax
seg002:BF2C 8E C2 mov es, dx
seg002:BF2E 26 8A 01 mov al, es:[bx+di]
seg002:BF31 EB 06 jmp short loc_38E59
有没有发现有段代码重复了多次?
取出ES{550E}:[W*Yt+Xt]的值,作为函数的返回值
seg002:BEBC loc_38DDC: ; CODE XREF: sub_38AD2+2D4↑j sub_38AD2+2E7↑j
seg002:BEBC F6 46 0C 02 test [bp+arg_6], 2
seg002:BEC0 74 0F jz short loc_38DF1
判断arg_6传入的值带2,不带2跳到loc_38DF1
seg002:BEC2 8D 5E E6 lea bx, [bp+var_1A]
seg002:BEC5 8D 46 E4 lea ax, [bp+var_1C]
seg002:BEC8 9A FE 6A F2 2C call sub_33A1E
seg002:BECD 0B C0 or ax, ax
seg002:BECF 75 62 jnz short loc_38E53
seg002:BF33 loc_38E53: ; CODE XREF: sub_38AD2+31D↑j
seg002:BF33 B0 01 mov al, 1
seg002:BF35 EB 02 jmp short loc_38E59
判断(Xt, Yt)和(XB,YB )是否相等,相等返回1,结束函数
seg002:BED1 loc_38DF1: ; CODE XREF: sub_38AD2+30E↑j
seg002:BED1 8A 46 0C mov al, [bp+arg_6]
seg002:BED4 24 04 and al, 4
seg002:BED6 74 0C jz short loc_38E04
seg002:BED8 8D 46 E6 lea ax, [bp+var_1A]
seg002:BEDB 50 push ax
seg002:BEDC FF 76 06 push [bp+arg_0]
seg002:BEDF 9A EE C8 F2 2C call sub_3980E
判断arg_6传入的值带4,带4则获取(Xt,Yt)处的行动价值
[ 本帖最后由 漫漫苦短 于 2025-2-7 20:58 编辑 ]