第一节说明了在D076到D2EB之间的14*45字节的内容保存了其中部队在战场上的一些数据,并且通过各自的战场代码可以找到其占用地址以及连续的14字节,而龙吟前辈已经将这14字节对应的含义列举出来了,那么先看看这些数据是怎么被使用的,也就是它们的一些方法。
首先最简单的,就是每一项数据需要拿到(Get)和设置(Set),下列介绍部分数据的这两个方法。
以下未说明,arg_0的值都是以D076为首项,D(14)为公差,2D(45)为项数的一个十六进制下的等差数列中的一个地址值,就是说arg_0的值并不是唯一的,不像前一章介绍的CF6A,它的值可以有变动,但是这些函数的意义都是类似的。
部队仇人代码的两个方法
seg002:93A6 sub_362C6 proc far
seg002:93A6 arg_0 = word ptr 6
seg002:93A6
seg002:93A6 55 push bp
seg002:93A7 8B EC mov bp, sp
seg002:93A9 8B 5E 06 mov bx, [bp+arg_0]
seg002:93AC 8A 47 05 mov al, [bx+5]
seg002:93AF C9 leave
seg002:93B0 CA 02 00 retf 2
seg002:93B0 sub_362C6 endp
seg002:93B4 sub_362D4 proc far
seg002:93B4
seg002:93B4 arg_0 = word ptr 6
seg002:93B4 arg_2 = byte ptr 8
seg002:93B4
seg002:93B4 55 push bp
seg002:93B5 8B EC mov bp, sp
seg002:93B7 8B 5E 06 mov bx, [bp+arg_0]
seg002:93BA 8A 46 08 mov al, [bp+arg_2]
seg002:93BD 88 47 05 mov [bx+5], al
seg002:93C0 C9 leave
seg002:93C1 CA 04 00 retf 4
seg002:93C1 sub_362D4 endp
部队撤退标志的两个方法
seg002:40D8 sub_30FF8 proc far
seg002:40D8
seg002:40D8 arg_0 = word ptr 6
seg002:40D8 arg_2 = byte ptr 8
seg002:40D8
seg002:40D8 55 push bp
seg002:40D9 8B EC mov bp, sp
seg002:40DB 8B 5E 06 mov bx, [bp+arg_0]
seg002:40DE 8A 46 08 mov al, [bp+arg_2]
seg002:40E1 88 47 09 mov [bx+9], al
seg002:40E4 C9 leave
seg002:40E5 CA 04 00 retf 4
seg002:40E5 sub_30FF8 endp
seg002:40E8 sub_31008 proc far
seg002:40E8 arg_0 = word ptr 6
seg002:40E8
seg002:40E8 55 push bp
seg002:40E9 8B EC mov bp, sp
seg002:40EB 8B 5E 06 mov bx, [bp+arg_0]
seg002:40EE 8A 47 09 mov al, [bx+9]
seg002:40F1 C9 leave
seg002:40F2 CA 02 00 retf 2
seg002:40F2 sub_31008 endp
部队AI类型的两个方法
seg002:410E sub_3102E proc far
seg002:410E
seg002:410E arg_0 = word ptr 6
seg002:410E
seg002:410E 55 push bp
seg002:410F 8B EC mov bp, sp
seg002:4111 8B 5E 06 mov bx, [bp+arg_0]
seg002:4114 8A 47 0B mov al, [bx+0Bh]
seg002:4117 C9 leave
seg002:4118 CA 02 00 retf 2
seg002:4118 sub_3102E endp
seg002:7C4A sub_34B6A proc far
seg002:7C4A
seg002:7C4A arg_0= word ptr 6
seg002:7C4A arg_2= byte ptr 8 ;部队AI类型
seg002:7C4A
seg002:7C4A 55 push bp
seg002:7C4B 8B EC mov bp, sp
seg002:7C4D 80 7E 08 07 cmp [bp+arg_2], 7
seg002:7C51 77 09 ja short locret_34B7C ;arg_2大于7,是不合法的AI类型,跳出函数
seg002:7C53 8B 5E 06 mov bx, [bp+arg_0]
seg002:7C56 8A 46 08 mov al, [bp+arg_2]
seg002:7C59 88 47 0B mov [bx+0Bh], al
seg002:7C5C
seg002:7C5C locret_34B7C: ; CODE XREF: sub_34B6A+7↑j
seg002:7C5C C9 leave
seg002:7C5D CA 04 00 retf 4
seg002:7C5D sub_34B6A endp
部队策略值一个方法,还有两个方法,一个是计算最大策略值,就是导致94智力值的部队到99级策略值为0的那个,还有一个是补充策略值的方法,这两个方法到时候再介绍。
[code]
seg002:406E sub_30F8E proc far
seg002:406E
seg002:406E arg_0 = word ptr 6
seg002:406E arg_2 = byte ptr 8
seg002:406E
seg002:406E 55 push bp
seg002:406F 8B EC mov bp, sp
seg002:4071 8B 5E 06 mov bx, [bp+arg_0]
seg002:4074 8A 46 08 mov al, [bp+arg_2]
seg002:4077 88 47 0D mov [bx+0Dh], al
seg002:407A C9 leave
seg002:407B CA 04 00 retf 4
seg002:407B sub_30F8E endp
很神奇的一点是,我暂时没有找到并没有部队策略值的Get方法,因为在程序的代码中都是直接获取的,并没有单独构造出一个函数,见以下两个例子。
seg002:8FF2 8B 5E 06 mov bx, [bp+arg_0]
seg002:8FF5 8A 47 0D mov al, [bx+0Dh]
seg002:A4D2 8B 76 06 mov si, [bp+arg_0]
...
seg002:A510 8A 44 0D mov al, [_部队战场数据的首地址_si+0Dh]
部队战场坐标的Get方法,准确来说是取一个偏移地址。
seg002:409C sub_30FBC proc far ; CODE XREF: _InitBattle_sub_2FB7A+25B↑P ...
seg002:409C
seg002:409C arg_0 = word ptr 6
seg002:409C
seg002:409C 55 push bp
seg002:409D 8B EC mov bp, sp
seg002:409F 8B 46 06 mov ax, [bp+arg_0]
seg002:40A2 05 03 00 add ax, 3
seg002:40A5 C9 leave
seg002:40A6 CA 02 00 retf 2
seg002:40A6 sub_30FBC endp
然后在函数外获得这个地址保存的具体坐标值数据,见以下两个例子
seg002:2EB2 68 76 D0 push 0D076h
seg002:2EB5 9A 9C 40 F2 2C call sub_30FBC ; 获取我军主将战场坐标偏移地址
seg002:2EBA 8B D8 mov bx, ax
seg002:2EBC 8B 07 mov ax, [bx]
seg002:3008 B0 0E mov al, 14
seg002:300A F6 66 FF mul [bp+var_1] ; 部队战场代码
seg002:300D 05 76 D0 add ax, 0D076h
seg002:3010 89 46 F8 mov [bp+var_8], ax
seg002:3013 50 push ax
seg002:3014 9A 9C 40 F2 2C call sub_30FBC ; 获取部队横纵坐标偏移地址
seg002:3019 8B D8 mov bx, ax
seg002:301B 8B 07 mov ax, [bx]
注意D076地址放的不一定是劉備的数据,虽然这个地址战场代码是0,但是劉備也不是每一战都出,不过劉備出的每一战战场代码都是0。
[ 本帖最后由 漫漫苦短 于 2025-2-25 19:34 编辑 ]