性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2024-6-27 21:47 资料 短消息 看全部作者
转换代码在这附近,都是硬编码
找空地,改硬编码是有可能的

seg002:A373 C6 46 F8 0F                    mov     [bp+var_8], 0Fh ; 这几个变量存的是部队兵种代码
seg002:A377 C6 46 F9 12                    mov     [bp+var_7], 12h
seg002:A37B C6 46 FA 0C                    mov     [bp+var_6], 0Ch
seg002:A37F C6 46 FB 03                    mov     [bp+var_5], 3
seg002:A383 C6 46 FC 06                    mov     [bp+var_4], 6
seg002:A387 C6 46 FD 00                    mov     [bp+var_3], 0
seg002:A38B 80 7E 08 10                    cmp     [bp+_arg_ArtorItem], 10h
seg002:A38F 72 07                          jb      short loc_272B8
seg002:A391 8A 46 08                       mov     al, [bp+_arg_ArtorItem]
seg002:A394 2C 0D                          sub     al, 0Dh         ; 转换的,减一下代码



顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2024-6-27 23:13 资料 短消息 看全部作者
这附近是取章节,到对应的数据区去取道具

seg003:268E 03 F0                          add     si, ax
seg003:2690 C1 E6 03                       shl     si, 3
seg003:2693 81 C6 44 44                    add     si, offset tb_34C14_ItemofSections
seg003:2697 89 36 E0 D3                    mov     word_3DBB0, si
seg003:269B C6 06 56 43 00                 mov     byte_34B26, 0
seg003:26A0
seg003:26A0                loc_2F5A0:                              ; CODE XREF: s_BuySellthings+37j
seg003:26A0 80 3C FF                       cmp     byte ptr [si], 0FFh
seg003:26A3 74 0C                          jz      short loc_2F5B1
seg003:26A5 46                             inc     si
seg003:26A6 FE 06 56 43                    inc     byte_34B26
seg003:26AA
seg003:26AA                loc_2F5AA:
seg003:26AA 80 3E 56 43 08                 cmp     byte_34B26, 8
seg003:26AF 72 EF                          jb      short loc_2F5A0



顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2024-7-1 21:59 资料 短消息 看全部作者
宝物库恢复不太好改,代码空间太少了

反击改这里
为0的表示被攻击时可反击
为0, 2, 5表示攻击0时可能被反击, 改为其他就不会被反击

dseg:322E FF             tb_AttackBack   db 0FFh        ; 文件偏移3a3fe      
dseg:322E                                                      
dseg:322E                                                        ; 为0是反击兵种
dseg:322E                                                        ; 贼兵 武术家
dseg:322F FF                             db 0FFh
dseg:3230 FF                             db 0FFh
dseg:3231 01                             db    1
dseg:3232 01                             db    1
dseg:3233 01                             db    1
dseg:3234 02                             db    2    骑
dseg:3235 02                             db    2
dseg:3236 02                             db    2    近卫
dseg:3237 00                             db    0    贼
dseg:3238 00                             db    0
dseg:3239 00                             db    0
dseg:323A FF                             db 0FFh
dseg:323B 05                             db    5   猛兽
dseg:323C 00                             db    0   武术
dseg:323D 06                             db    6   
dseg:323E 02                             db    2   异民
dseg:323F FF                             db 0FFh
dseg:3240 FF                             db 0FFh



QUOTE:
原帖由 heyou 于 2024-6-30 18:21 发表
借帖问一下
请问哪边可以修改地形的恢复兵力、士气能力,比如要让宝物库也能恢复兵力、士气?
请问哪边可以修改兵种的反击、被反击,比如要增加异民族的反击能力、取消近卫队的被反击属性
谢谢 ...

[ 本帖最后由 likelove 于 2024-7-7 18:30 编辑 ]
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-11 23:50 资料 短消息 看全部作者
ippan0是对话消息索引文件,ippan0m是对话消息内容文件。改对话的话同时要动这两个文件。

用到这个call来调用

seg001:A38A                s_GetReadfileName proc far              ; CODE XREF: s_SaveMSAVEX+DDP
seg001:A38A                                                        ; s_SaveMSAVEX+12EP ...
seg001:A38A
seg001:A38A                var_2           = byte ptr -2
seg001:A38A
seg001:A38A 55                             push    bp
seg001:A38B 8B EC                          mov     bp, sp

这个call里面计算并显示对话:

seg001:BA34                s_18994_ShowNPCMsg proc far             ; CODE XREF: sub_1F4EE+190P
seg001:BA34
seg001:BA34                var_24          = word ptr -24h
seg001:BA34                filename        = word ptr -22h
seg001:BA34                handle          = word ptr -0Eh
seg001:BA34                var_8           = word ptr -8
seg001:BA34                seg             = word ptr -4
seg001:BA34                var_2           = word ptr -2
seg001:BA34
seg001:BA34 C8 22 00 00                    enter   22h, 0
seg001:BA38 53                             push    bx
seg001:BA39 57                             push    di
seg001:BA3A 56                             push    si
seg001:BA3B 53                             push    bx
seg001:BA3C 9A C2 4A F6 0C                 call    sub_11A22

ps:增加上对话消息的内容:

索引文件ippan0按章分为4段,各章信息的偏移分别为

dseg:2C0E 00 00          word_333DE      dw 0                    ; DATA XREF: s_ReadSaveMsgFileX+31r
dseg:2C12 BD 03                          dw 3BDh
dseg:2C16 CE 06                          dw 6CEh
dseg:2C1A E5 0A                          dw 0AE5h

每章信息分三部分:
第一部分是3字节的章节头
第二部分是每章的城市数信息,每城市占一word
各章城市数

dseg:0DB0 16             byte_31580      db 16h                  ; DATA XREF: s_13C6C_GetAvalibleCitysInSection+9r
dseg:0DB1 10                             db  10h
dseg:0DB2 1A                             db  1Ah
dseg:0DB3 0E                             db  0Eh

第三部分是根据人物代码来索引的对话偏移,每人物占一word。
假设张三的代码是0401(均为16进制),把高位的4去掉,剩下1,这个就作为索引值,也就是查找第三部分的第2个word(因为下标是从0开始计算),假设找到的是020fh,这就作为在消息文件中对应章的偏移处文本


消息文件ippan0m较简单,就是文本,每个对话消息以00结束。但是按章查找内容的,消息文件的分章偏移

dseg:21E0 00 00          word_329B0      dw 0                    ; DATA XREF: s_18994_ShowNPCMsg+96r
dseg:21E4 10 1F                          dw 1F10h
dseg:21E8 F3 36                          dw 36F3h
dseg:21EC 79 51                          dw 5179h

比如前面张三是第四章中的,就从5179h开始,加上前面查找到的020fh,得到对应的消息。

消息文件可以直接改内容,0a表示显示时的手动换行,不超过原文本长度,并且要以00结尾。
如果需加长消息,将影响后续消息的偏移值,那还需要同步调整索引文件,以及改写exe文件中偏移值(因为我们改大了,分章偏移要增加)


除了上述用于索引路人对话消息的内容外,索引文件还用于设定场景路人信息,在s_1EDFC函数中。
以第一章为例,其偏移为0,前几行数据如下(均为16进制):

16 F10100000000000000005D03000000
0000004B02AF028102DB0200000D0300
00000097031702000000000000E10000
0022004A006C00B400D9000D015001A1
01D1010D0231026902

第1字节16为本章城市数,与byte_31580处一致
其后跟的每城市数据的偏移值,为0的表示没有数据,即

F101 0000 0000 0000 0000 5D03 0000
0000 0000 4B02 AF02 8102 DB02 0000
0D03 0000 0000 9703 1702 0000 0000
0000

后面跟的数据E100会被跳过(e1貌似是本城市场景总人数或者说对话数),接下来 0000 2200 4A00。。。就是前面所说的对话消息偏移值

以第0个城市为例,其值为01F1,将其加上章节头的1字节占位,得到1F2,再加上本章的偏移0,仍为1f2,此处存放的路人信息。查看该处的数值:

037D0500000100020003000400080605
0006000700080009000A0006040B000C
000D000E00 12 057D060F001000110012

拆解一下:
一字节03表示有三个场景,含城内。
其后为场景信息,先看第一处场景
7D 05 0000 0100 0200 0300 0400
7D表示城内,05表示有5人,后面跟的人物代码

下一场景:
08 06 0500 0600 0700 0800 0900 0A00
08表示某建筑,06表示6人,后面是人物代码

下一场景同样:
06 04 0B00 0C00 0D00 0E00

如果将其中的人物代码改了,则场景内人物形象将调换。

此城市场景结束。后面跟的1字节数据,此处是12,作用不明。

[ 本帖最后由 likelove 于 2025-2-12 21:48 编辑 ]
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-12 22:07 资料 短消息 看全部作者
解压的部分R3文件


附件: r3unpack.zip (2025-2-12 22:07, 533.84 K)
该附件被下载次数 87
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-14 22:15 资料 短消息 看全部作者
道具屋的对话要改exe

我方战场撤退对话在hexgrp中,由sub_23B4E调用。

“全軍,撤退!
兄長,我對不起您…….
大哥,對不起,沒想到會被……”
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-20 23:56 资料 短消息 看全部作者


QUOTE:
原帖由 神雕小侠 于 2025-2-15 23:40 发表



感谢,道具屋的对话我已经在exe中找到并成功修改,但撤退对话在hexgrp中一个都没有查到

上面有解压版R3文件
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-22 23:32 资料 短消息 看全部作者
ls的解压本坛有工具,但压缩的没有。github上也能搜到解压的代码

又看了一下主程序代码和他人的文档,可以使用解压后的文件,需要对r3文件作拼接和修改。

读取资源、解压缩在这里

seg001:2080                ; 从文件读资源
seg001:2080                ; Attributes: bp-based frame
seg001:2080
seg001:2080                ; int __stdcall __far s_ReadFileByIndex(int handle, int buff, int seg, int index)
seg001:2080                s_ReadFileByIndex proc far              ; CODE XREF: sub_10F74+30P
seg001:2080                                                        ; sub_111D8+44P ...

ls文件由10字节(以下均为16进制)文件头,100字节压缩字典,压缩节表C * N,分节的压缩数据构成

压缩节表在110这个位置,每个节由C字节构成,最后以2字节00收尾

每节表的信息:

seg001:20B8 8D 86 F8 FB                    lea     ax, [bp+var_408] ; 之前猜测有误,这个是压缩的节表
seg001:20B8                                                        ; 每节信息是数组变量,长度C,存读出来的数据
seg001:20B8                                                        ; 前4个为压缩后长度,如0000 20e4表示压缩后长度20e4
seg001:20B8                                                        ; 中4个为压缩前长度,如0000 3900,表示压缩前长度3900
seg001:20B8                                                        ; 后4个为资源偏移,如0000 0138表示从文件0138处解压
seg001:20BC 16                             push    ss              ; seg
seg001:20BD 50                             push    ax              ; buff
seg001:20BE 6A 0C                          push    0Ch             ; bytestoRead
seg001:20C0 FF 76 06                       push    [bp+handle]     ; handle
seg001:20C3 9A D4 4F F6 0C                 call    s_ReadFile_1

主程序是写死的,默认就是ls文件,所以解压后的他不认

seg001:219A 8B 46 FC                       mov     ax, [bp+var_4_beforpacked]
seg001:219D 8B 56 FE                       mov     dx, [bp+var_2]
seg001:21A0 39 46 F8                       cmp     [bp+var_8_afterpacked], ax
seg001:21A3 75 16                          jnz     short l_F11B_need_unpack
seg001:21A5 39 56 FA                       cmp     [bp+var_6], dx
seg001:21A8 75 11                          jnz     short l_F11B_need_unpack
seg001:21AA FF 76 0A                       push    [bp+seg]        ; seg
seg001:21AD FF 76 08                       push    [bp+buff]       ; buff
seg001:21B0 50                             push    ax              ; bytestoRead
seg001:21B1 FF 76 06                       push    [bp+handle]     ; handle
seg001:21B4 9A D4 4F F6 0C                 call    s_ReadFile_1
seg001:21B9 EB 0F                          jmp     short loc_F12A
seg001:21BB                ; ---------------------------------------------------------------------------
seg001:21BB
seg001:21BB                l_F11B_need_unpack:                     ; CODE XREF: s_ReadFileByIndex+123j
seg001:21BB                                                        ; s_ReadFileByIndex+128j
seg001:21BB FF 76 0A                       push    [bp+seg]
seg001:21BE FF 76 08                       push    [bp+buff]
seg001:21C1 50                             push    ax              ; length
seg001:21C2 FF 76 06                       push    [bp+handle]
seg001:21C5 9A 08 20 F6 0C                 call    s_EF68_unpack?

21A0处有比较,看节表中压缩后、压缩前数据是否相等,不等则去解压,相等则直接读。

既然是写死的,只能拼接文件了
R3文件解压缩后,原始R3文件节表之后的数据全部删除(最后一项0000之后),然后把解压后的数据拼过来。这时要改几个数据,把每一项节表的压缩后数据都改为压缩前,使21A0处比较相等,再把偏移改成解压后的
比如hexgrp原始节表

before                after                off

20e4                3900                0138
02a5                032f                221c
027d                04d2                24c1

改成

before                after                off

3900                3900                0138
032f                032f                3a38
04d2                04d2                3d67

附上修改后的hexgrp,测试是可用的。


附件: HEXGRP.unpacked.zip (2025-2-22 23:32, 7.98 K)
该附件被下载次数 95
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-23 00:01 资料 短消息 看全部作者
end1grp等不能解压的原因也找到了,节表的数据存储方式变了

main读取节表信息是比较古老的,高位的word放在前,低位word放在后,是大端模式,所以可以看到逐字节拼出来

可能是end1grp等换了程序员,是正常的小端,低地址在前。
顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 59
编号 56074
注册 2005-12-27


发表于 2025-2-27 22:07 资料 短消息 看全部作者
部分解压过的R3文件可用了。可直接替换原始文件。


附件: unpacked.r3.zip (2025-2-27 22:07, 407.71 K)
该附件被下载次数 79
顶部

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




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

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

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