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 编辑 ]