简单介绍一下群体恢复类道具的使用,群体恢复类道具就没有单体恢复类道具那么复杂了。
seg002:A1E9 loc_37109: ; CODE XREF: sub_36C9C:loc_3703D↑j
seg002:A1E9 80 7E 08 2E cmp byte ptr [bp+arg_2], 2Eh
seg002:A1ED 72 30 jb short loc_3713F
seg002:A1EF 80 7E 08 33 cmp byte ptr [bp+arg_2], 33h
seg002:A1F3 77 2A ja short loc_3713F
seg002:A1F5 8A 46 08 mov al, byte ptr [bp+arg_2]
seg002:A1F8 2A E4 sub ah, ah
seg002:A1FA 2D 2E 00 sub ax, 2Eh
seg002:A1FD B9 03 00 mov cx, 3
seg002:A200 99 cwd
seg002:A201 F7 F9 idiv cx
seg002:A203 52 push dx
seg002:A204 80 7E 08 31 cmp byte ptr [bp+arg_2], 31h
seg002:A208 72 04 jb short loc_3712E
seg002:A20A B0 02 mov al, 2
seg002:A20C EB 02 jmp short loc_37130
seg002:A20E loc_3712E: ; CODE XREF: sub_36C9C+48C↑j
seg002:A20E B0 01 mov al, 1
seg002:A210 loc_37130: ; CODE XREF: sub_36C9C+490↑j
seg002:A210 50 push ax
seg002:A211 6A 00 push 0
seg002:A213 56 push si
seg002:A214 9A EC AC F2 2C call sub_37C0C
seg002:A219 89 46 F4 mov word ptr [bp+var_C], ax
seg002:A21C E9 7E 02 jmp loc_373BD
`seg002:A1E9-A1F3`还是一样熟悉的道具分类代码,`seg002:A1FA-A201`则是根据道具的代码减去0x2E后,除以3,余数保存在`DX`寄存器中,`seg002:A204-A20E`就是`2E`援隊書, `2F`援部書, `30`援軍書三个兵力大恢复设为1,`31`平氣書, `32`活氣書, `33`勇氣書三个士气值大恢复设为2。 `sub_37C0C`是群体恢复类道具和策略结算函数。
有个道具忘记介绍了就是炸彈,我称它为最特殊的道具。简单介绍一下。不仅仅是因为它是单独结算的,后续还有它的特殊点。
seg002:A21F loc_3713F: ; CODE XREF: sub_36C9C+471↑j
seg002:A21F ; sub_36C9C+477↑j
seg002:A21F 80 7E 08 21 cmp byte ptr [bp+arg_2], 21h
seg002:A223 74 03 jz short loc_37148
seg002:A225 E9 44 01 jmp loc_3728C
seg002:A228 loc_37148: ; CODE XREF: sub_36C9C+4A7↑j
seg002:A228 1E push ds
seg002:A229 68 97 3B push offset asc_44367 ; "用炸彈攻擊敵人."
seg002:A22C 6A 00 push 0
seg002:A22E 9A 42 32 F6 1C call sub_201A2
seg002:A233 8B 5E 06 mov bx, [bp+arg_0]
seg002:A236 83 C4 06 add sp, 6
seg002:A239 8A 47 02 mov al, [bx+2]
seg002:A23C 50 push ax
seg002:A23D 68 81 00 push 81h
seg002:A240 6A 00 push 0
seg002:A242 68 90 CF push 0CF90h
seg002:A245 9A B4 57 F2 2C call sub_326D4
seg002:A24A 88 46 FE mov [bp+var_2], al
seg002:A24D 3C FF cmp al, 0FFh
seg002:A24F 75 03 jnz short loc_37174
seg002:A251 E9 49 02 jmp loc_373BDseg002:A254 loc_37174: ; CODE XREF: sub_36C9C+4D3↑j
seg002:A254 1E push ds
seg002:A255 68 A8 3B push offset asc_44378 ; "投擲炸彈."
seg002:A258 6A 00 push 0
seg002:A25A 9A 42 32 F6 1C call sub_201A2
seg002:A25F 83 C4 06 add sp, 6
先显示文字"用炸彈攻擊敵人.",等玩家选好炸弹的对象后,再显示文字 "投擲炸彈."。接下来也简单说一下这段代码的关键部分。
七、道具使用全分析:
3.特殊攻击类道具
该类道具只有一个:炸弹。
1)攻击伤害
<1>计算出一个0-14之间的随机数
<2>攻击伤害=(随机数+90)×15
龙吟前辈曾在七、道具使用全分析中关于炸彈道具的分析曾经引起了一阵讨论:
原帖由 慕容血 于 2004-11-14 22:50 发表
血大胆估计,使用炸弹的随机数应该是0~20!
血用襄阳I刘备带赤兔第一回合炸一次以及瓦口第一回合炸了四十次,出现的最小值为1350,最大值1650!
原帖由 阿尔法孝直 于 2004-11-15 07:39 发表
龙吟说的是1~14,而你认为是1~20
我认为是1~19!
原帖由 慕容血 于 2004-11-15 10:34 发表
临界值问题,血遇到过1350和1650,那么0~20应该是没错的了!
你可以用瓦口测试一下,第一回合就能炸到,炸完就全军撤退再炸!
seg002:A273 6B F8 2C imul di, ax, 44
seg002:A276 81 C7 16 68 add di, 6816h
seg002:A27A B8 15 00 mov ax, 15h
seg002:A27D 9A E0 3D F6 1C call sub_20D40 ; 0~20炸弹随机数
seg002:A282 05 5A 00 add ax, 5Ah
seg002:A285 6B F0 0F imul si, ax, 0Fh
seg002:A288 57 push di
seg002:A289 9A A4 C5 F6 1C call sub_29504 ; 获取部队兵力
seg002:A28E 6A 00 push 0
seg002:A290 50 push ax
seg002:A291 8B C6 mov ax, si
seg002:A293 2B D2 sub dx, dx
seg002:A295 9A 44 3C F6 1C call sub_20BA4
seg002:A29A 89 46 FA mov word ptr [bp+var_6], ax
可以看到很明显十进制的15不等于十六进制的0x15,所以炸弹的随机数就是0~20,这里龙吟前辈`seg002:A282`和`seg002:A285`的数字都没有看错,然而看错了`seg002:A27A`的数字,如果当时把反汇编代码放出来就很明显了。`seg002:A288-A295`这是确保炸弹杀害没有不超过目标部队当前兵力。
seg002:A2B3 0B C0 or ax, ax
seg002:A2B5 74 40 jz short loc_37217
seg002:A2B7 B8 0A 00 mov ax, 0Ah
seg002:A2BA 9A E0 3D F6 1C call sub_20D40 ; 0-9炸弹随机数
seg002:A2BF 8B F0 mov si, ax
seg002:A2C1 83 C6 1E add si, 1Eh
seg002:A2C4 FF 76 E0 push [bp+var_20]
seg002:A2C7 9A 98 93 F2 2C call sub_362B8 ; 获取部队士气值
seg002:A2CC 2A E4 sub ah, ah
seg002:A2CE 6A 00 push 0
seg002:A2D0 50 push ax
seg002:A2D1 8B C6 mov ax, si
seg002:A2D3 2B D2 sub dx, dx
seg002:A2D5 9A 44 3C F6 1C call sub_20BA4
seg002:A2DA 8B F8 mov di, ax
seg002:A2DC FF 76 E0 push [bp+var_20]
seg002:A2DF 9A 98 93 F2 2C call sub_362B8 ; 获取部队士气值
seg002:A2E4 2A E4 sub ah, ah
seg002:A2E6 8B CF mov cx, di
seg002:A2E8 2A ED sub ch, ch
seg002:A2EA 2B C1 sub ax, cx
seg002:A2EC 50 push ax
seg002:A2ED FF 76 E0 push [bp+var_20]
seg002:A2F0 9A 7E 7B F2 2C call sub_34A9E ; 修改士气值
seg002:A2F5 EB 0C jmp short loc_37223
士气值的部分龙吟前辈的分析没有问题,他的这些分析实属百密一疏。
seg002:A2F7 loc_37217: ; CODE XREF: sub_36C9C+539↑j
seg002:A2F7 FF 76 E0 push [bp+var_20]
seg002:A2FA 9A 98 93 F2 2C call sub_362B8 ; 获取部队士气值
seg002:A2FF 2A E4 sub ah, ah
seg002:A301 8B F8 mov di, ax
超过目标部队当前兵力,士气值当然也归零。
seg002:A303 loc_37223: ; CODE XREF: sub_36C9C+579↑j
seg002:A303 FF 76 E0 push [bp+var_20]
seg002:A306 9A 9C 40 F2 2C call sub_30FBC
seg002:A30B 8B D8 mov bx, ax
seg002:A30D 8B 07 mov ax, [bx]
seg002:A30F 89 46 F6 mov word ptr [bp+var_A], ax
seg002:A312 8A 46 F6 mov al, [bp+var_A] ; 横坐标
seg002:A315 02 C0 add al, al
seg002:A317 50 push ax
seg002:A318 8A 46 F7 mov al, [bp+var_9] ; 纵坐标
seg002:A31B 02 C0 add al, al
seg002:A31D 50 push ax
seg002:A31E 6A 09 push 9 ; 9炸彈
seg002:A320 68 90 CF push 0CF90h
seg002:A323 9A 14 68 F2 2C call sub_33734
seg002:A328 BE 02 00 mov si, 2
seg002:A32B 89 7E F8 mov word ptr [bp+var_8], di
seg002:A32E 89 76 FC mov word ptr [bp+var_4], si
seg002:A331 8B FE mov di, si
seg002:A333 8B 76 FA mov si, word ptr [bp+var_6]
seg002:A336 loc_37256: ; CODE XREF: sub_36C9C+5D4↓j
seg002:A336 8A 46 FE mov al, [bp+var_2]
seg002:A339 8B D6 mov dx, si
seg002:A33B B3 07 mov bl, 7 ; 7白色
seg002:A33D 9A FA 41 F2 2C call sub_3111A
seg002:A342 8A 46 FE mov al, [bp+var_2]
seg002:A345 8B 56 F8 mov dx, word ptr [bp+var_8]
seg002:A348 B3 06 mov bl, 6 ; 6黄色
seg002:A34A 9A FA 41 F2 2C call sub_3111A
seg002:A34F 4F dec di
seg002:A350 75 E4 jnz short loc_37256
另外,讲一个炸弹这个道具的特殊点,不知道有多少玩家注意到,炸弹这个道具使用后会不仅显示兵力的伤害(前面保存在`var_6`),白色的数字,还会显示士气值的伤害(前面保存在`var_8`),黄色的数字,可以`seg002:A336-A350`是个循环,当`DI`寄存器减为0时跳出循环,因此会显示两次数字效果,如果想多显示几次炸弹的效果,可以修改`seg002:A328`的02。
而炸弹之所以没有经验值,因为它压根没有结算函数。
[ 本帖最后由 漫漫苦短 于 2026-8-29 19:59 编辑 ]