天佛降世吧 关注:3,451贴子:34,604

天龙八部单机游戏文件格式解析及重制思路

只看楼主收藏回复

我是名程序员,对老游戏有些兴趣。想具体解析一下天龙八部这个游戏的资源文件。所有游戏文件格式解析出来,对游戏修改、Mod制作很有帮助,进而开发出可以新建原创剧情、道具、武功的Mod工具,甚至最后可以利用原有美术资源进行重制游戏程序。这种重制在《剑侠情缘》贴吧里有成熟案例。


IP属地:湖北1楼2021-02-19 00:56回复
    最近几天大致分析了下游戏资源的结构。以flags.dat、item.dat、Monsters.dat、npcdata为代表的数据文件,为游戏定义的二进制文件,分别存储了剧情(包含对话、动画播放、人物剧情演出、人物控制等等)、物品(道具及武功)、怪物、NPC数据。贴吧里有部分帖子对其进行了解析,大多以修改为目的,没有特别系统地介绍各个文件格式如何定义的。吧里找了有个“天龙八部剧情修改器”,可以读取不少信息,说明之前有大佬作过解析。


    IP属地:湖北2楼2021-02-19 00:57
    回复
      着重对flags.dat进行了研究,参考吧里的部分帖子可以的出:
      第一行(前16个字节)勉强算是文件头,存储了GFrogsCmbLnkV100这串字符串,没什么实际意义。
      接下来是数据部分,数值以小端模式存储,低位在先高位在后,第一个4字节,代表剧情块的索引编号,紧跟的4字节指明了该剧情中剧情指令的数量和文本的数量,两个字节是该剧情快中剧情指令的数量,后两个字节是该剧情块中文本的数量。

      接下来就是剧情指令的数据区,每个剧情指令由16字节构成,可以大致分为4部分,第一个4字节存储的是指令名称,后三个4字节则可以理解为该指令需要的参数param1,param2,param3。参数可以是人物代码、武功代码、剧情块代码、战斗场景代码、或者是直接给的数值(金钱值、经验、时间)。其中二维坐标参数格式稍有区别,用一个4字节的高位2字节低位2字节分别存储了(x,y)。

      剧情指令完毕之后,文件中就是以字符串存储的文本了,单个文本以00结束,文本总数量和之前存储的数量相同。所有文本读完之后,该剧情块完毕。接下来4字节为下一个剧情块的索引,格式于前相同。


      IP属地:湖北3楼2021-02-19 00:59
      回复
        我从flags.dat中读取到1385个剧情块,少于“天龙八部剧情修改器”的1387个,后面还有几百字节的数据没能识别出来是什么。从flags.dat中的剧情块里提取剧情指令,汇总得到不重复指令120个。我分析了一下剧情指令的功能,只有30-40个大概明确是什么用途。列表如下

        贴吧中应该有大佬梳理过所有剧情指令功能,但由于贴吧抽风等原因,我现在已经找不到很完备的介绍。希望有大佬能提供一份完整的剧情指令列表,或者有天龙Mod制作的群可以拉一下。
        @dp2858517 @来掉61肥的


        IP属地:湖北4楼2021-02-19 01:03
        回复
          游戏中的图片资源、动画帧资源在游戏目录中
          ANM为人物动画
          MapSprites为地图的Sprite图
          BattleSprites为以人物角色为单位的多帧动画图片和战斗时用的Sprite图(一般为武功特效的Sprite)
          Bitmap中为UI的图形资源
          以上资源都可以在RPGViewer中预览得到。
          下一步解析的重点可能是Dragon.map文件。
          需要弄清楚地图上的阻挡物是如何设置的,触发器是如何设置的,如何与MapSprites中的图片匹配上的


          IP属地:湖北5楼2021-02-19 01:05
          回复
            先弄清楚文件格式都是如何定义的,解析出每个文件中数据的意义,理解了整个游戏如何运行的,那离重新实现这个游戏又迈进了一步。


            IP属地:湖北6楼2021-02-19 01:06
            回复
              支持!想不到还有人研究这个,我现在最想研究的是 如何3个人一起战斗 战斗经验还不用平分 三者都得到相应的经验 ,还有就是如何能正常采用中文字体 并且把买东西时候的字体增大


              IP属地:广东7楼2021-02-19 14:03
              回复
                我把我整理的一些数据贴出来,这些大多是前人的研究成果


                IP属地:广东8楼2021-02-19 14:04
                回复
                  EA 07 00 00 XX XX 00 00 01 00 其中XX XX为物品代码,表示给某种物品。
                  F8 07 00 00 01 00 00 00 YY YY 其中YY YY为武功代码,表示习得某种武功。
                  02 04 00 00 ZZ ZZ 01 00 01 00 获得ZZ ZZ两银子。
                  03 04 00 00 JJ JJ 00 00 01 00 获得JJ JJ 经验。
                  0C 04 00 00 XX XX 展开战斗,XXXX为调用drgon.map文件里战斗代号
                  8D 13 00 XX 0 0 0 YY,意思是若声望高于XX的话就执行下方FE03-YY之前的剧情,否则执行之后的剧情。
                  8E 13 00 XX 0 0 0 YY,意思是若声望低于XX的话就执行下方FE03-YY之前的剧情,否则执行之后的剧情。
                  a2 13 00 00 xx xx 00 00 00 00 00 00 00 00 00 00
                  减声望函数,其中的xx就是要减去声望的数值
                  a3 13 00 00 xx xx 00 00 00 00 00 00 00 00 00 00
                  加声望函数,其中的xx就是要增加声望的数值
                  剧情修改器466、467是飞飞升降声望数值,原值为2
                  ED 07、EC 07是关于开启关闭事件的代码
                  EE 07 00 00 00 00 01 80 CB 00,计时器,01表示一分钟,80是固定搭配,CB00是计时结束开启的事件代码
                  ------其他:
                  xx 00 00 00类:
                  01 00 00 00代表分支事件(类似if……then中then后面的处理)
                  02 00 00 00代表恢复原画面中心(将画面中心从主角移至其他人物后用这恢复)
                  04 00 00 00未知
                  06 00 00 00代表剧情事件开始(后面接01 00 00 00代表有分支处理)
                  07 00 00 00代表正常剧情结束
                  09 00 00 00代表分支剧情结束
                  0b 00 00 00代表人物属性恢复
                  xx 03 00 00类:
                  e9 03 00 00代表延迟(许多对话尤其是无对话框浮动文字都用这函数控制文字显示时间)
                  ea 03 00 00-ec 03 00 00未知
                  ed 03 00 00代表放弃以某人为画面中心
                  后面的大部分都在吧内有提过,不重复。
                  fe 03 00 00代表满足判断条件的执行分支
                  ff 03 00 00代表未满足判断条件的执行分支
                  注意:这一类出现过的从e9 03 00 00一直到ff 03 00 00,推测e9 03 00 00前面存在函数,是一套完整的函数库。有可能从01 03 00 00一直到ff 03 00 00都存在。
                  xx 0b 00 00类:
                  b8 0b 00 00人物自动移动
                  b9 0b 00 00显示无对话框文字
                  ba 0b 00 00未知
                  bb 0b 00 00显示无对话框文字
                  bc 0b 00 00人物移动(注:人物转向多用其他函数,极少用这个函数,在xx 07 00类函数中有多个人物转向函数,后面会发)
                  bd 0b 00 00播放动画
                  be 0b 00 00自动移动,自动动作
                  bf 0b 00 00似为在指定座标显示指定图片
                  c0 0b 00 00有选择人物移动
                  c1 0b 00 00屏幕调色
                  c2 0b 00 00播放动画(似是以dc 07 00 00函数结束)
                  c3 0b 00 00A人物自动转向B人物
                  c5 0b 00 00未知
                  e9 0b 00 00未知
                  bc 0b 的确是人物移动,不过通常是人物离开或进来,比如走出门口或走进门口等通常需要这个函数,如果表示人物离开,有时候后面会跟着EF 03这个函数,例如:
                  bc 0b 00 00 00 02
                  ef 03 00 00 00 02
                  表示阿水离开。
                  b8 0b 也是表示人物离开,但又淡出效果,后面通常要跟着BC OB语句。比如,
                  b8 0b 00 00 00 02
                  bc 0b 00 00 00 02
                  上面这段,就表示阿水离开了,如果把B8 0B这句用00 00替换,则阿水听到贼人从后门走了以后,他不会离开,而是留在原地。
                  d3 07 00 00 xx 00 00 00 yy 表示人物xx对着yy说话,例如,
                  d3 07 00 00 f9 01 00 00 01 就表示圆圆对着雷震说话。
                  f9 03 表示场景的位置,比如,
                  f9 03 00 00 46
                  就表示,现在的场景在雷震的房间,假如46换成47,就表示镜头移到雷府院外。
                  d4 07 表示带有彩色字体的对话内容,比如
                  d4 07 00 00 42 就表示雷员外说的话有彩色字体
                  f3 07 表示角色自动进入画面,比如
                  f3 07 00 00 31 02 就表示菊香自动走进画面
                  其他常用并大家都知道的,我就不列出来了。


                  IP属地:广东9楼2021-02-19 14:05
                  回复
                    1、flags里的战斗命令
                    传送命令:
                    F9 03 00 00 XX XX 00 00 00 00 00 00 00 00 00 00
                    FB 03 00 00 01 00 00 00 YY 00 YY 00 00 00 00 00
                    F9 03的XXXX表示打开XXXX地图(地图代码在drangon.map)
                    FB 03的YY YY表示传送到的横纵坐标
                    战斗命令:
                    0C 04 00 00 XX XX... 展开战斗,XXXX表示调用drgon.map文件里战斗代号
                    2、drangon.map里的战斗参数
                    以打高升泰事件为例,在drangon.map里面,查找“昭明殿外”,往下拉右边可读代码可以看到parT的字眼
                    000108d0h: 70 61 72 54 26 00 00 00 7D 00 00 00 0F 00 28 00 ; parT&...}.....(.
                    000108e0h: 04 00 00 00 01 00 01 00 00 00 EF 14 00 00 F0 14 ; ..........?..?
                    000108f0h: 00 00 01 00 01 00 54 00 00 00 01 00 E3 01 ; ......T.....?
                    第一行:7D就是这场战斗的战斗代号,0C 04 00 00 XX XX 的XXXX便是调用此代码
                    第二行:04表示正常战斗,05是暴击设定。
                    EF 14为胜利后执行的flags代码、F0 14是失败后。改成00 00是游戏结束,27 00是休息
                    第三行:54 00 00 00 01 00中,
                    54 00是高升泰人物代码,
                    第二个00是等级
                    E3 01是战斗背景图


                    IP属地:广东10楼2021-02-19 14:07
                    收起回复
                      喜欢这游戏能做成跟之前的金庸群侠传一样 发光广大 什么天赋 武功组合 各种套路


                      IP属地:福建11楼2021-07-27 20:28
                      回复
                        兄弟,我有天龙方面的问题想跟你请教,你看我们可以沟通下吗?拜托你了,我有给你发私信,可以回我下吗


                        IP属地:黑龙江来自Android客户端13楼2022-06-12 22:15
                        收起回复
                          大哥能把npc的武功动画修改成主角的么,方向不要打自己的


                          IP属地:山西来自手机贴吧14楼2022-07-26 22:47
                          收起回复
                            插眼


                            IP属地:浙江15楼2022-08-14 19:13
                            回复
                              我记得有剧情修改器 不过功能不全


                              IP属地:浙江16楼2022-08-14 19:19
                              回复