标题: DOS版三国志英杰传的研究心得——肆, 另一块记录人物数据的地址
本主题由 阿尔法孝直 于 2025-7-23 01:43 设置高亮
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 79
编号 545816
注册 2023-12-25


发表于 2025-11-25 20:10 资料 短消息 只看该作者
回复 #30 Tolerare0131 的帖子

我也看到了他的dos改版,如果是通过修改MAIN.EXE实现敌军等级随着刘备等级上涨,这肯定不是什么难事,如果把他的MAIN.EXE的文件给我,也能很快分析出这个实现方法。但是他让人关注微信公众号并要付费下载,本质上是把这个实现方法当成自己的“专利”,也没有必要硬来破解他的“专利”。
话说到这其实想提一下,英杰传的研究到今天虽然不算是大功告成,但其实也是战棋游戏中研究得较为透彻并且热度持续不断,如果不是那么多前辈爱好者持续不断“为爱发电”,是很难不断吸引少众游戏爱好者关注的,实际上如果那些极限练级玩家的攻略没有共享出来,没有人深度研究游戏,恐怕早就无人问津了,而且对于研究游戏技术并写练级攻略和游戏总结的人,比起那些做MOD的人付出的汗水也少不了,甚至更热爱这个游戏,那为什么只有后者在向普通玩家收费?
godtype前辈的文章英杰传经验获得的代码分析就完整分析过攻击经验的代码的具体细节,你可以去学习一下,比方说如果想修改seg002: D56A处的防守方等级小于攻击方等级的基础经验为4,就可以修改MAIN.EXE中地址0x30E8D的04这一个字节,既然已经找到了击退主将的基础经验值处,相信找到这个地址以及其他有关经验值部分的地址也不是什么难事。


顶部
性别:未知-离线 Tolerare0131

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 3
编号 549479
注册 2025-11-20


发表于 2025-11-29 10:43 资料 短消息 只看该作者
回复 #31 漫漫苦短 的帖子

他的改版我买了啊,通过复制文件发现是由main来实现的。他的改版其实挺不错的,就是数值的改动太崩了……那篇经验获得的代码分析,从头我就没看懂……


顶部
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 79
编号 545816
注册 2023-12-25


发表于 2025-11-29 19:19 资料 短消息 只看该作者
回复 #32 Tolerare0131 的帖子

那就看你目前想根据他的版本将他的数值改动部分修改为正常数值,还是分析出实现敌方等级跟随我方等级动态变化的MAIN.EXE代码部分,在原版的基础上再作修改了。
我给你简单分析一下计算攻击经验的部分,顺便教一下应该如何修改。前辈的分析其实已经很到位了,只是他没有把IDA中的字节码放出来,你可能看不出其中的对应关系。

seg002:D520                sub_3A440 proc far                                     ; CODE XREF: sub_3AA64+302↓P
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 C8 06 00 00                    enter   6, 0
seg002:D524 57                             push    di
seg002:D525 56                             push    si
seg002:D526 8B 76 06                       mov     si, [bp+arg_0]
seg002:D529 2A FF                          sub     bh, bh
seg002:D52B 8A 5C 08                       mov     bl, [si+8]
seg002:D52E 03 DB                          add     bx, bx
seg002:D530 FF 70 04                       push    word ptr [bx+si+4]
seg002:D533 9A DA 6A F6 1C                 call    sub_23A3A                      ; 获取攻击方等级
seg002:D538 2A E4                          sub     ah, ah
seg002:D53A 8B F8                          mov     di, ax
seg002:D53C 8A 5C 09                       mov     bl, [si+9]
seg002:D53F 2A FF                          sub     bh, bh
seg002:D541 03 DB                          add     bx, bx
seg002:D543 FF 70 04                       push    word ptr [bx+si+4]
seg002:D546 9A DA 6A F6 1C                 call    sub_23A3A                      ; 获取防御方等级
seg002:D54B 2A E4                          sub     ah, ah
seg002:D54D 89 46 FA                       mov     [bp+var_6], ax
seg002:D550 8A 5C 08                       mov     bl, [si+8]
seg002:D553 2A FF                          sub     bh, bh
seg002:D555 03 DB                          add     bx, bx
seg002:D557 FF 30                          push    word ptr [bx+si]
seg002:D559 9A F6 40 F2 2C                 call    sub_31016                     ; 判断攻击方属于我军还是敌军
seg002:D55E 0B C0                          or      ax, ax
seg002:D560 75 03                          jnz     short loc_3A485
seg002:D562 E9 87 00                       jmp     loc_3A50C
seg002:D565                loc_3A485:                                                ; CODE XREF: sub_3A440+40↑j
seg002:D565 39 7E FA                       cmp     [bp+var_6], di                   ; 比较防御方等级与攻击方等级
seg002:D568 73 07                          jnb     short loc_3A491                         ; 无符号不小于跳转
seg002:D56A C7 46 FC 04 00                 mov     [bp+var_4], 4
seg002:D56F EB 0D                          jmp     short loc_3A49E
seg002:D571                loc_3A491:                                                      ; CODE XREF: sub_3A440+48↑j
seg002:D571 8B 46 FA                       mov     ax, [bp+var_6]
seg002:D574 2B C7                          sub     ax, di
seg002:D576 05 03 00                       add     ax, 3
seg002:D579 03 C0                          add     ax, ax
seg002:D57B 89 46 FC                       mov     [bp+var_4], ax                      ; 基础经验 = (防御方等级-攻击方等级+3)*2
seg002:D57E                loc_3A49E:                                                      ; CODE XREF: sub_3A440+4F↑j
seg002:D57E C7 46 FE 00 00                 mov     [bp+var_2], 0
seg002:D583 83 7E FE 00                    cmp     [bp+var_2], 0
seg002:D587 7C 0D                          jl      short loc_3A4B6
seg002:D589 7F 06                          jg      short loc_3A4B1
seg002:D58B 83 7E FC 10                    cmp     [bp+var_4], 16
seg002:D58F 72 05                          jb      short loc_3A4B6
seg002:D591                loc_3A4B1:                                                      ; CODE XREF: sub_3A440+69↑j
seg002:D591 C7 46 FC 10 00                 mov     [bp+var_4], 16
seg002:D596                loc_3A4B6:                                                      ; CODE XREF: sub_3A440+67↑j ; sub_3A440+6F↑j                                                                              ;
seg002:D596 8B 46 FC                       mov     ax, [bp+var_4]
seg002:D599 89 44 25                       mov     [si+25h], ax
seg002:D59C 2B C0                          sub     ax, ax
seg002:D59E 89 46 FC                       mov     [bp+var_4], ax
seg002:D5A1 8A 5C 09                       mov     bl, [si+9]
seg002:D5A4 2A FF                          sub     bh, bh
seg002:D5A6 03 DB                          add     bx, bx
seg002:D5A8 8B 44 1F                       mov     ax, [si+1Fh]
seg002:D5AB 39 40 0F                       cmp     [bx+si+0Fh], ax                   ; 检查防御方当前兵力与攻击伤害是否相等,不相等就是未击退
seg002:D5AE 75 36                          jnz     short loc_3A506
seg002:D5B0 8A 5C 09                       mov     bl, [si+9]
seg002:D5B3 2A FF                          sub     bh, bh
seg002:D5B5 03 DB                          add     bx, bx
seg002:D5B7 FF 30                          push    word ptr [bx+si]
seg002:D5B9 9A 9A AE F2 2C                 call    sub_37DBA                    ; 获取防御方战场代码
seg002:D5BE 3C 0F                          cmp     al, 0Fh                                 ; 判断防守方是否为战场代码是否为0F敌军主将
seg002:D5C0 75 07                          jnz     short loc_3A4E9
seg002:D5C2 C7 46 FC 30 00                 mov     [bp+var_4], 48
seg002:D5C7 EB 1D                          jmp     short loc_3A506
seg002:D5C9                loc_3A4E9:                                                      ; CODE XREF: sub_3A440+A0↑j
seg002:D5C9 39 7E FA                       cmp     [bp+var_6], di
seg002:D5CC 76 07                          jbe     short loc_3A4F5
seg002:D5CE C7 46 FC 20 00                 mov     [bp+var_4], 32                      ; 击退经验=32
seg002:D5D3 EB 11                          jmp     short loc_3A506
seg002:D5D5                loc_3A4F5:                                                      ; CODE XREF: _Cal经验获得_sub_3A440+AC↑j
seg002:D5D5 B8 40 00                       mov     ax, 64
seg002:D5D8 8B CF                          mov     cx, di
seg002:D5DA 2B 4E FA                       sub     cx, [bp+var_6]
seg002:D5DD 41                             inc     cx
seg002:D5DE 41                             inc     cx
seg002:D5DF 2B D2                          sub     dx, dx
seg002:D5E1 F7 F1                          div     cx                                      ; 击退经验=64÷(攻击方等级-防御方等级+2)
seg002:D5E3 89 46 FC                       mov     [bp+var_4], ax
seg002:D5E6                loc_3A506:                                           ; CODE XREF:  ...
seg002:D5E6 8B 46 FC                       mov     ax, [bp+var_4]
seg002:D5E9 89 44 27                       mov     [si+27h], ax
seg002:D5EC                loc_3A50C:                                                 ; CODE XREF: sub_3A440+42↑j
seg002:D5EC 5E                             pop     si
seg002:D5ED 5F                             pop     di
seg002:D5EE C9                             leave
seg002:D5EF CA 02 00                       retf    2
seg002:D5EF                sub_3A440 endp



图片附件: UE中经验代码.png (2025-11-29 19:49, 333 K)


你可以对比图片和代码左侧的字节码至上而下的顺序,基本是一致的,不一致的地方你也不用管。

那么可以看到你之前找到的主将的固定经验,也就是seg002: D5C2这一行,对应着UE中30ee0h这一行的5个字节码C7 46 FC 30 00,那么修改哪个字节码可以实现改动主将的固定经验(48),显然是其中的30因为48的十六进制就是0x30,那么同样的修改击杀等级超过攻击方的普通敌军的击退经验(32),就是对应这UE中30ef0h这一行的20,将其修改为相应的十六进制数。

再举几个例子,如修改UE中30e80h这一行的04,就可以修改当攻击方等级大于防御方等级的固定经验(4);同时修改UE中30ea0h和30eb0h两行的10,就可以修改当攻击方等级小于防御方等级的最高加成经验;修改UE中30ef0h这一行的40,就可以修改当攻击方等级大于防御方等级的击退经验公式的被除数。

[ 本帖最后由 漫漫苦短 于 2025-11-29 20:05 编辑 ]
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-12-12 11:39
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.011397 second(s), 10 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP