英杰传经验获得的代码分析
感谢一下skyhyperion提供的地址。
攻击部分(包括物理攻击和伤害系的策略攻击)
seg002: D520 ; =============== S U B R O U T I N E =======================================
seg002: D520
seg002: D520 ; Attributes: bp-based frame
seg002: D520
seg002: D520 sub_3A440 proc far ; CODE XREF: sub_3AA64+302
seg002: D520
seg002: D520 var_6 = word ptr -6
seg002: D520 var_4 = word ptr -4
seg002: D520 var_2 = word ptr -2
seg002: D520 arg_0 = word ptr 6
seg002: D520
seg002: D520 enter 6, 0
seg002: D524 push di
seg002: D525 push si
seg002: D526 mov si, [bp+arg_0]
[bp+arg_0]是战斗信息的开始,保存到si里面
seg002: D529 sub bh, bh
seg002: D52B mov bl, [si+8]
seg002: D52E add bx, bx
seg002: D530 push word ptr [bx+si+4]
seg002: D533 call sub_23A3A
seg002: D538 sub ah, ah
seg002: D53A mov di, ax
从23A3A中取出攻击方的等级,保存到di里面
seg002: D53C mov bl, [si+9]
seg002: D53F sub bh, bh
seg002: D541 add bx, bx
seg002: D543 push word ptr [bx+si+4]
seg002: D546 call sub_23A3A
seg002: D54B sub ah, ah
seg002: D54D mov [bp+var_6], ax
从23A3A中取出防守方的等级,保存到[bp+var_6]里面
seg002: D550 mov bl, [si+8]
seg002: D553 sub bh, bh
seg002: D555 add bx, bx
seg002: D557 push word ptr [bx+si]
seg002: D559 call sub_31016
seg002: D55E or ax, ax
seg002: D560 jnz short loc_3A485
seg002: D562 jmp loc_3A50C
检查攻击方是否我军成员,不是跳到最后面。(问题:敌军也有经验啊,为什么会有这个设置,难道敌军的经验获得是放在另外的代码里面?)
以下部分是基础经验,跟孔明传一样(因为我是先分析孔明传的)
seg002: D565 ; ---------------------------------------------------------------------------
seg002: D565
seg002: D565 loc_3A485: ; CODE XREF: sub_3A440+40
seg002: D565 cmp [bp+var_6], di
seg002: D568 jnb short loc_3A491
比较防守方的等级是否大于等于攻击方等级。
seg002: D56A mov [bp+var_4], 4 [UE:0x30E8AH--C7 46 FC 04]
seg002: D56F jmp short loc_3A49E
防守方等级小于攻击方等级的时候,基础经验固定为4。
seg002: D571 ; ---------------------------------------------------------------------------
seg002: D571
seg002: D571 loc_3A491: ; CODE XREF: sub_3A440+48
seg002: D571 mov ax, [bp+var_6]
seg002: D574 sub ax, di
seg002: D576 add ax, 3
seg002: D579 add ax, ax
seg002: D57B mov [bp+var_4], ax
防守方等级大于等于攻击方等级的时候,基础经验 = (防方等级 - 攻方等级 + 3) * 2
seg002: D57E
seg002: D57E loc_3A49E: ; CODE XREF: sub_3A440+4F
seg002: D57E mov [bp+var_2], 0
seg002: D583 cmp [bp+var_2], 0
seg002: D587 jl short loc_3A4B6
seg002: D589 jg short loc_3A4B1
这段分析过,有点多余。
seg002: D58B cmp [bp+var_4], 10h [UE:0x30EABH--83 7E FC 10]
seg002: D58F jb short loc_3A4B6
seg002: D591
seg002: D591 loc_3A4B1: ; CODE XREF: sub_3A440+69
seg002: D591 mov [bp+var_4], 10h [UE:0x30EB1H--C7 46 FC 10 00]
seg002: D596
seg002: D596 loc_3A4B6: ; CODE XREF: sub_3A440+67
seg002: D596 ; sub_3A440+6F
seg002: D596 mov ax, [bp+var_4]
seg002: D599 mov [si+25h], ax
基础经验最大为16,然后保存在si+25H的内存里面。
以下部分是击退经验
seg002: D59C sub ax, ax
seg002: D59E mov [bp+var_4], ax
seg002: D5A1 mov bl, [si+9]
seg002: D5A4 sub bh, bh
seg002: D5A6 add bx, bx
seg002: D5A8 mov ax, [si+1Fh]
seg002: D5AB cmp [bx+si+0Fh], ax
seg002: D5AE jnz short loc_3A506
检查当前HP与攻击伤害是否相等,不相等就是未击退。
seg002: D5B0 mov bl, [si+9]
seg002: D5B3 sub bh, bh
seg002: D5B5 add bx, bx
seg002: D5B7 push word ptr [bx+si]
seg002: D5B9 call sub_37DBA
seg002: D5BE cmp al, 0Fh
seg002: D5C0 jnz short loc_3A4E9
检查防守方是否为战场编号0FH,即是否敌军主将。
seg002: D5C2 mov [bp+var_4], 30h ; '0' [UE:0x30EE2H--C7 46 FC 30 00]
seg002: D5C7 jmp short loc_3A506
是主将,击退经验固定为48
seg002: D5C9 ; ---------------------------------------------------------------------------
seg002: D5C9
seg002: D5C9 loc_3A4E9: ; CODE XREF: sub_3A440+A0
seg002: D5C9 cmp [bp+var_6], di
seg002: D5CC jbe short loc_3A4F5
不是主将,比较防守方等级是否小于等于攻击方等级。
seg002: D5CE mov [bp+var_4], 20h ; ' ' [UE:0x30EEEH--C7 46 FC 20 00]
seg002: D5D3 jmp short loc_3A506
防守方等级大于攻击方等级,击退经验固定为32。
seg002: D5D5 ; ---------------------------------------------------------------------------
seg002: D5D5
seg002: D5D5 loc_3A4F5: ; CODE XREF: sub_3A440+AC
seg002: D5D5 mov ax, 40h ; '@'
seg002: D5D8 mov cx, di
seg002: D5DA sub cx, [bp+var_6]
seg002: D5DD inc cx
seg002: D5DE inc cx
seg002: D5DF sub dx, dx
seg002: D5E1 div cx
seg002: D5E3 mov [bp+var_4], ax
防守方等级小于等于攻击方等级,击退经验 = 64 / (攻方等级 - 防方等级 + 2)
seg002: D5E6
seg002: D5E6 loc_3A506: ; CODE XREF: sub_3A440+8E
seg002: D5E6 ; sub_3A440+A7
seg002: D5E6 mov ax, [bp+var_4]
seg002: D5E9 mov [si+27h], ax
最后将击退经验保存到si+27H的内存里面。
seg002: D5EC
seg002: D5EC loc_3A50C: ; CODE XREF: sub_3A440+42j
seg002: D5EC pop si
seg002: D5ED pop di
seg002: D5EE leave
seg002: D5EF retf 2
seg002: D5EF sub_3A440 endp
seg002: D5EF
上面的代码中,绿色部分是UE地址。
=============
固定经验的策略部分:
等一下写。。。。。。
[ 本帖最后由 godtype 于 2010-8-5 11:08 编辑 ]
|