2025-2-7 20:29
漫漫苦短
[code]seg002:BBB2 sub_38AD2 proc far
seg002:BBB2
seg002:BBB2 var_28 = word ptr -28h
seg002:BBB2 var_26 = word ptr -26h
seg002:BBB2 var_24 = word ptr -24h
seg002:BBB2 var_22 = word ptr -22h
seg002:BBB2 var_20 = word ptr -20h
seg002:BBB2 var_1E = word ptr -1Eh
seg002:BBB2 var_1C = byte ptr -1Ch
seg002:BBB2 var_1A = byte ptr -1Ah
seg002:BBB2 var_19 = byte ptr -19h
seg002:BBB2 var_18 = byte ptr -18h
seg002:BBB2 var_17 = byte ptr -17h
seg002:BBB2 var_14 = word ptr -14h
seg002:BBB2 var_12 = word ptr -12h
seg002:BBB2 var_10 = word ptr -10h
seg002:BBB2 var_D = byte ptr -0Dh
seg002:BBB2 var_C = byte ptr -0Ch
seg002:BBB2 var_B = byte ptr -0Bh
seg002:BBB2 var_A = word ptr -0Ah
seg002:BBB2 var_8 = word ptr -8
seg002:BBB2 var_6 = word ptr -6
seg002:BBB2 var_4 = dword ptr -4
seg002:BBB2 arg_0 = word ptr 6
seg002:BBB2 arg_2 = byte ptr 8
seg002:BBB2 arg_4 = byte ptr 0Ah
seg002:BBB2 arg_6 = byte ptr 0Ch
seg002:BBB2 arg_8 = byte ptr 0Eh
seg002:BBB2 arg_A = word ptr 10h
seg002:BBB2
seg002:BBB2 C8 28 00 00 enter 28h, 0
seg002:BBB6 57 push di
seg002:BBB7 56 push si
seg002:BBB8 8B 76 06 mov si, [bp+arg_0][/code]
函数开始部分
arg开头的为函数传入的参数,var开头的为函数用enter神奇的局部变量,大小为28h。
arg_2和arg_4记为XB, YB,ss:[arg_A]是个指针,指向(X0, Y0)。
arg_8为最大移动力。
[code]seg002:BBBB 68 08 55 push 5508h
seg002:BBBE 9A 08 1D F6 1C call sub_1EC68
seg002:BBC3 5B pop bx
seg002:BBC4 05 BC 18 add ax, 18BCh
seg002:BBC7 8B F8 mov di, ax
seg002:BBC9 89 56 E0 mov [bp+var_20], dx[/code]
程序申请了内存空间,将其中一部分的空间的初始地址的段地址保存在了DS:5508处,也可以理解DS:5508处有一个指针。
这部分是取出ds:5508处的段地址保存在var_20,偏移地址(AX为0,实际就是18BC)保存在di(实际上可以直接保存在var_22)。
后面会用这个段地址的时候记成ES{5508}
[code]seg002:BBDE 8A 46 0A mov al, [bp+arg_4]
seg002:BBE1 50 push ax
seg002:BBE2 8A 46 08 mov al, [bp+arg_2]
seg002:BBE5 50 push ax
seg002:BBE6 8D 46 E4 lea ax, [bp+var_1C]
seg002:BBE9 50 push ax
seg002:BBEA 9A 10 93 F6 1C call sub_26270[/code]
这个函数是将arg_2和arg_4的值传入var_1C(XB, YB )
[code]seg002:BBEF 56 push si
seg002:BBF0 9A 94 73 F2 2C call sub_342B4
seg002:BBF5 88 46 F4 mov [bp+var_C], al[/code]
兵种行动等级
[code]seg002:BBF8 56 push si
seg002:BBF9 9A F6 40 F2 2C call sub_31016
seg002:BBFE 88 46 F3 mov [bp+var_D], al[/code]
判断属于我军1还是敌军0
[code]seg002:BC0C 8B 5E 10 mov bx, [bp+arg_A]
seg002:BC0F 8D 46 E4 lea ax, [bp+var_1C]
seg002:BC12 9A FE 6A F2 2C call sub_33A1E
seg002:BC17 0B C0 or ax, ax
seg002:BC19 74 03 jz short loc_38B3E
seg002:BC1B E9 19 03 jmp loc_38E57[/code]
判断(X0, Y0)与(XB, YB )是不是相同的坐标
[code]seg002:BC1E loc_38B3E: ; CODE XREF: sub_38AD2+67↑j
seg002:BC1E 89 7E DE mov [bp+var_22], di
seg002:BC21 8B F7 mov si, di
seg002:BC23 8B 7E 10 mov di, [bp+arg_A]
seg002:BC26 FF 76 E0 push [bp+var_20]
seg002:BC29 56 push si
seg002:BC2A A0 69 CF mov al, byte_4D739
seg002:BC2D F6 26 68 CF mul byte_4D738
seg002:BC31 B2 FF mov dl, 0FFh
seg002:BC33 9A 7C 4C F6 1C call sub_21BDC[/code]
观察seg002:BBC7 mov di, ax和seg002:BC1E mov [bp+var_22], di这两句,DI完全是个中间寄存器,两句中间并没有操作DI
byte_4D738是地形图的宽W,byte_4D739是地形图的高H,这部分的意思是要将从es{5508}:18BC处开始的一块大小等于AL(W*H)字节的内存全部变成DL(FF)。
[code]seg002:BC38 68 08 55 push 5508h
seg002:BC3B 9A 08 1D F6 1C call sub_1EC68
seg002:BC40 5B pop bx
seg002:BC41 8B D8 mov bx, ax
seg002:BC43 8E C2 mov es, dx
seg002:BC45 26 C6 87 7C 1C FF mov byte ptr es:[bx+1C7Ch], 0FFh[/code]
es{5508}:1C7C设为FF,由此看出要实现内存不冲突,18BC+W*H<=1C7C,也就是说地图的大小不能大于960(3C0h)。
[code]seg002:BC4B 8A 05 mov al, [di]
seg002:BC4D 2A E4 sub ah, ah
seg002:BC4F 8B C8 mov cx, ax
seg002:BC51 8A 45 01 mov al, [di+1]
seg002:BC54 F6 26 68 CF mul byte_4D738
seg002:BC58 8B D8 mov bx, ax
seg002:BC5A 8B 46 E0 mov ax, [bp+var_20]
seg002:BC5D 8E C0 mov es, ax
seg002:BC5F 03 DE add bx, si
seg002:BC61 03 D9 add bx, cx
seg002:BC63 26 88 2F mov es:[bx], ch[/code]
有人可能有疑惑为什么mov ax, [bp+var_20]和mov es, ax不能直接写成mov es, [bp+var_20],因为ES只能接受AX, DX, CX, BX给它传值。
部队起始点es{5508}:[W*Y0+X0+18BCh]设为0
[code]seg002:BC66 8A 46 0C mov al, [bp+arg_6]
seg002:BC69 24 04 and al, 4
seg002:BC6B 75 03 jnz short loc_38B90
seg002:BC6D E9 90 00 jmp loc_38C20[/code]
判断arg_6 and 4是否为0(后文简写,结果不为0 带4,为0 不带4)
从seg002:BC70-seg002:BD00这段是查询部队会的策略,暂时不解释,当然要求arg_6传入的值的带4才会执行这段代码。
[code]seg002:BCF7 57 push di
seg002:BCF8 FF 76 06 push [bp+arg_0]
seg002:BCFB 9A EE C8 F2 2C call sub_3980E[/code]
在seg002:BD00前面的这段代码是(Xt,Yt)原地行动价值,包括物理攻击和策略攻击并加上了地形加成,AI=2的敌军因为没有寻路过程,直接调用了arg_6带4就会进行正确的价值判断。
[code]seg002:BD00 loc_38C20: ; CODE XREF: sub_38AD2+BB↑j sub_38AD2+143↑j
seg002:BD00 8A 46 F4 mov al, [bp+var_C]
seg002:BD03 2A E4 sub ah, ah
seg002:BD05 6B D8 14 imul bx, ax, 14h
seg002:BD08 89 5E D8 mov [bp+var_28], bx
seg002:BD0B 8B DF mov bx, di
seg002:BD0D 9A B2 AF F2 2C call sub_37ED2
seg002:BD12 8B 5E D8 mov bx, [bp+var_28]
seg002:BD15 2A E4 sub ah, ah
seg002:BD17 8B F0 mov si, ax
seg002:BD19 80 B8 6A 32 FF cmp byte ptr [bx+si+326Ah], 0FFh
seg002:BD1E 75 03 jnz short loc_38C43
seg002:BD20 E9 14 02 jmp loc_38E57[/code]
这部分是根据兵种行动等级的来计算移到(X0,Y0)的消耗步数,暂时不解释是如何计算的。
[color=Silver][[i] 本帖最后由 漫漫苦短 于 2025-2-7 20:31 编辑 [/i]][/color]
2025-2-7 20:34
漫漫苦短
寻路过程是[b]三重循环[/b]的,现在先把三重循环的条件放在这里。
[code]seg002:BD23 loc_38C43: ; CODE XREF: sub_38AD2+16C↑j
seg002:BD23 88 66 F5 mov [bp+var_B], ah
seg002:BD26 loc_38C46: ; CODE XREF: sub_38AD2+36A↓j
seg002:BD26 8A 46 0E mov al, [bp+arg_8]
seg002:BD29 38 46 F5 cmp [bp+var_B], al
seg002:BD2C 72 03 jb short loc_38C51
seg002:BD2E E9 06 02 jmp loc_38E57
[/code]
[strike]seg002:BF10[/strike] loc_38E30: ; CODE XREF: sub_38AD2+191↑j sub_38AD2+359↑j
[strike]seg002:BF10[/strike] 8A 46 F8 mov al, byte ptr [bp+var_8]
[strike]seg002:BF13[/strike] 88 46 F5 mov [bp+var_B], al
[strike]seg002:BF16[/strike] 83 7E E2 00 cmp [bp+var_1E], 0
[strike]seg002:BF1A[/strike] 74 03 jz short loc_38E3F
[strike]seg002:BF1C[/strike] E9 07 FE jmp loc_38C46
[strike]seg002:BF1F[/strike] loc_38E3F: ; CODE XREF: sub_38AD2+368↑j
[strike]seg002:BF1F[/strike] EB 16 jmp short loc_38E57
[strike]seg002:BF37[/strike] loc_38E57:
[strike]seg002:BF37[/strike] B0 FF mov al, 0FFh
比较循环移动力(var_B初始是0)与arg_8(传入的最大移动力,可能是部队本身的,也可能是255(FF))
var_B<arg_8,跳到(loc_38C51),否则跳出寻路过程(loc_38E57)。
var_8(不一定是seg002:BD36处的FF值)更新var_B,判断var_1E是不是0,是0跳出循环,返回FF。
[code]seg002:BD31 loc_38C51: ; CODE XREF: sub_38AD2+17A↑j
seg002:BD31 C7 46 E2 00 00 mov [bp+var_1E], 0
seg002:BD36 C6 46 F8 FF mov [bp+var_8], 0FFh
seg002:BD3A 33 FF xor di, di
seg002:BD3C 80 3E 69 CF 00 cmp byte_4D739, 0
seg002:BD41 75 03 jnz short loc_38C66
seg002:BD43 E9 CA 01 jmp loc_38E30
[/code]
[strike]seg002:BF03[/strike] loc_38E23: ; CODE XREF: sub_38AD2+19D↑j sub_38AD2+34C↑j
[strike]seg002:BF03[/strike] A0 69 CF mov al, byte_4D739
[strike]seg002:BF06[/strike] 2A E4 sub ah, ah
[strike]seg002:BF08[/strike] 47 inc di
[strike]seg002:BF09[/strike] 3B C7 cmp ax, di
[strike]seg002:BF0B[/strike] 76 03 jbe short loc_38E30
[strike]seg002:BF0D[/strike] E9 36 FE jmp loc_38C66
初始化var_1E和var_B,循环过程中会有变动。
DI代表循环横坐标Y,判断H是不是0,是0跳到loc_38E30
DI=0...H-1,=H则跳出DI循环
[code]seg002:BD46 loc_38C66: ; CODE XREF: sub_38AD2+18F↑j sub_38AD2+35B↓j
seg002:BD46 33 F6 xor si, si
seg002:BD48 80 3E 68 CF 00 cmp byte_4D738, 0
seg002:BD4D 75 03 jnz short loc_38C72
seg002:BD4F E9 B1 01 jmp loc_38E23
[/code]
[strike]seg002:BEF6[/strike] loc_38E16: ; CODE XREF: sub_38AD2+1BA↑j sub_38AD2+1F2↑j
[strike]seg002:BEF6[/strike] A0 68 CF mov al, byte_4D738
[strike]seg002:BEF9[/strike] 2A E4 sub ah, ah
[strike]seg002:BEFB[/strike] 46 inc si
[strike]seg002:BEFC[/strike] 3B C6 cmp ax, si
[strike]seg002:BEFE[/strike] 76 03 jbe short loc_38E23
[strike]seg002:BF00[/strike] E9 4F FE jmp loc_38C72
SI代表循环横坐标X,判断V是不是0,是0跳到loc_38E23
SI=0...W-1,=W则跳出SI循环
[color=Silver][[i] 本帖最后由 漫漫苦短 于 2025-2-7 20:59 编辑 [/i]][/color]
2025-2-7 20:39
漫漫苦短
下面进入这个三层循环的具体过程
[code]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[/code]
取出ES{5508}:[W*Y+X+18BC]的值,存在var_7中
[code]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[/code]
比较循环移动力与从(X0,Y0) 到 (X,Y)的移动力,相等跳到loc_38C8F,不相等跳到loc_38E16
[code]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[/code]
判断(X, Y)与(X0, Y0)是不是相同的坐标,相等跳转到loc_38CC7。
[code]seg002:BD88 F6 46 0C 03 test [bp+arg_6], 3
seg002:BD8C 75 19 jnz short loc_38CC7[/code]
若arg_6传入的值的不带1和2(带4和8),继续执行下面代码,否则跳转到loc_38CC7。
这里的test作用和seg002:BC66处只是写法不同,作用几乎一样
[code]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[/code]
判断四周是否有不同阵营的部队,有跳到loc_38E16,没有跳到loc_38CC7
[code]seg002:BDA7 loc_38CC7:
seg002:BDA7 89 76 F0 mov [bp+var_10], si
seg002:BDAA 89 7E EE mov [bp+var_12], di
[/code]
[strike]seg002:BEF0[/strike] 8B 76 F0 mov si, [bp+var_10]
[strike]seg002:BEF3[/strike] 8B 7E EE mov di, [bp+var_12]
用var_12和var_10暂存SI, DI,然后到seg002:BEF0还原SI, DI
[code]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[/code]
这里有个小循环var_A=0...3,=4则跳出循环
[code]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[/code]
var_1A获取var_18{上 右 下 左}的坐标Xt,Yt,越界返回FF
[code]seg002:BDC7 80 7E E6 FF cmp [bp+var_1A], 0FFh
seg002:BDCB 74 70 jz short loc_38D5D[/code]
判断(Xt,Yt)是否越界
[code]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[/code]
DI=W*Yt+Xt SI=W*Yt+Xt+18BC
var_20(ES{5508})的值传入var_14,从后文来看根本没这必要。
[code]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[/code]
var_4保存ES{5508},var_2保存W*Yt+Xt+12C0
[code]seg002:BDFE 68 0E 55 push 550Eh
seg002:BE01 9A 08 1D F6 1C call sub_1EC68
seg002:BE06 5B pop bx[/code]
此段无意义
[code]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[/code]
var_14此处等于var_20,可以用var_20替换。
判断ES{5508}:[W*Yt+Xt+18BC]是否为FF
[code]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[/code]
根据兵种行动等级的来计算移到(Xt,Yt)的消耗步数,保存在var_5
[code]seg002:BE29 3C FF cmp al, 0FFh
seg002:BE2B 74 10 jz short loc_38D5D[/code]
判断部队能不能到达(Xt,Yt)地形,FF为不能到达,则跳转到loc_38D5D
[code]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[/code]
比较var_7+var_5与arg_8,超出最大移动力跳转到loc_38E04
[code]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[/code]
判断ES{5508}:[W*Yt+Xt+12C0]是否为FF,FF跳转到loc_38D83
以ES{5508}:12C0开头,这是个部队代码矩阵,为FF的代表无部队
[code]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[/code]
若该点有部队,判断两只部队是否为同一阵营,同一阵营跳转到loc_38D83,不同阵营跳转到loc_38E04
[code]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[/code]
到了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
[code]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[/code]
判断arg_6传入的值带8,不带8跳到loc_38DDC
[code]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[/code]
判断是不ES{550E}:[W*Yt+Xt]的值,是FF,是FF跳到loc_38DDC
以ES{550E}:0开头,这也是个部队代码矩阵,为FF的代表无部队
[code]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[/code]
判断目标部队是不是已出场部队(不是伏兵),不是伏兵跳转loc_38E41
[code]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[/code]
有没有发现有段代码重复了多次?
取出ES{550E}:[W*Yt+Xt]的值,作为函数的返回值
[code]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[/code]
判断arg_6传入的值带2,不带2跳到loc_38DF1
[code]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[/code]
判断(Xt, Yt)和(XB,YB )是否相等,相等返回1,结束函数
[code]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[/code]
判断arg_6传入的值带4,带4则获取(Xt,Yt)处的行动价值
[color=Silver][[i] 本帖最后由 漫漫苦短 于 2025-2-7 20:58 编辑 [/i]][/color]
2025-2-7 20:44
漫漫苦短
[code]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
seg002:BEF0 loc_38E10: ; CODE XREF: sub_38AD2+339↑j
seg002:BEF0 8B 76 F0 mov si, [bp+var_10]
seg002:BEF3 8B 7E EE mov di, [bp+var_12]
seg002:BEF6 loc_38E16: ; CODE XREF: sub_38AD2+1BA↑j sub_38AD2+1F2↑j
seg002:BEF6 A0 68 CF mov al, byte_4D738
seg002:BEF9 2A E4 sub ah, ah
seg002:BEFB 46 inc si
seg002:BEFC 3B C6 cmp ax, si
seg002:BEFE 76 03 jbe short loc_38E23
seg002:BF00 E9 4F FE jmp loc_38C72
seg002:BF03 loc_38E23: ; CODE XREF: sub_38AD2+19D↑j sub_38AD2+34C↑j
seg002:BF03 A0 69 CF mov al, byte_4D739
seg002:BF06 2A E4 sub ah, ah
seg002:BF08 47 inc di
seg002:BF09 3B C7 cmp ax, di
seg002:BF0B 76 03 jbe short loc_38E30
seg002:BF0D E9 36 FE jmp loc_38C66
seg002:BF10 loc_38E30: ; CODE XREF: sub_38AD2+191↑j sub_38AD2+359↑j
seg002:BF10 8A 46 F8 mov al, byte ptr [bp+var_8]
seg002:BF13 88 46 F5 mov [bp+var_B], al
seg002:BF16 83 7E E2 00 cmp [bp+var_1E], 0
seg002:BF1A 74 03 jz short loc_38E3F
seg002:BF1C E9 07 FE jmp loc_38C46[/code]
循环结束部分,看前文的介绍。
[code]seg002:BF1F loc_38E3F: ; CODE XREF: sub_38AD2+368↑j
seg002:BF1F EB 16 jmp short loc_38E57
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
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
seg002:BF37 loc_38E57:
seg002:BF37 B0 FF mov al, 0FFh[/code]
返回结果部分,看前文的介绍。
[code]seg002:BF39 loc_38E59: ; CODE XREF: sub_38AD2+37F↑j sub_38AD2+383↑j
seg002:BF39 5E pop si
seg002:BF3A 5F pop di
seg002:BF3B C9 leave
seg002:BF3C CA 0C 00 retf 0Ch
seg002:BF3C sub_38AD2 endp[/code]
函数结束部分,reft 0Ch,是因为函数有0Ch大小的传入参数,见开头。