2012-1-19 13:25
龙吟
三国志英杰传战场地图文件分析
三国志英杰传的战场地图文件存放于 HEXZMAP.R3 文件中,该文件是一个LS11压缩文件。经过解压缩后才能阅读地图格式。下面以解压缩后的文件为例,说明地图文件格式(解压缩后的文件可以在附件中下载)。
HEXZMAP.R3文件由五个部分构成
第一部分:文件头(长度16字节)(0X0~0X0F)
表示这是一个LS11压缩文件
第二部分:压缩用字典(长度256字节)(0X10~0X10F)
压缩用的字典
第三部分:战场索引(长度为(战场总数+1)×12+4字节)
原版的战场总数为58个,所以索引长度为59×12+4=712字节(0X110~0X3D7)
每个战场的索引为12字节,前4字节是压缩后的战场地图数据长度,中间4字节是未压缩的战场地图数据长度,最后4个字节是战场地图索引的位置
例如在解压缩后的第一关汜水关之战的战场地图文件索引中,前4字节和中间4字节都是00 00 08 C2,表示战场数据长度为0X08C2(2242)字节长,最后4字节是 00 00 03 D8 表示战场地图数据从文件偏移0X03D8(984)处开始。
最后一个战场索引指向的不是战场地图,而是战场的名称,参见第五部分。
第四部分:战场地图
战场地图是按战场索引找到的,例如汜水关的战场地图数据文件从0X03D8(984)字节开始,长度0X08C2(2242)字节,表示其数据存放在0X03D8~0X0C99(984~3225)处。
战场地图分为三个子部分:
第一子部分:地图宽度和高度
头两个字节是地图的大小。第一个字节是地图的横宽度×2,第二个字节是地图的纵高度×2
例如:汜水关之战的地图数据头两个字节(0X3D8~0X3D9或984~985)是 38 20,表示地图的宽度是28(0X38=56=28×2),高度是16(0X20=32=16×2)
根据地图的宽度和高度可以计算出地图的大小,如汜水关之战的地图大小就是28×16=448=0X1C0格
第二子部分:地图的显示数据
长度为地图大小×4,例如汜水关之战的地图显示数据长度为0X1C0×4=0X700=1792字节,位于0X3DA~0XAD9(986~2777)字节处。
英杰传的战场地图中,每格的大小是32×32像素,但在显示中,为了使地图的显示更加平滑,光荣公司将每格分成了四个小格,每小格16×16像素。例如汜水关之战,其按小格算的宽度和高度就是56×32,和头两个字节的内容完全吻合。
第二子部分的显示数据中每一个字节对应一个小格的显示内容,从上往下,从左往右排列。例如第1行第1列的小格的显示内容就是第1字节,第1行第2列是第2字节,第1行最后一列是第56字节(汜水关),第2行第1列是第57字节。
我们可以看到汜水关之战第1行第1列的值是A9,这是一个悬崖的图案,要找到这样的图案,请参考附件中的截图。
这个截图是一个256×256的图像文件。我们知道每个小格是16×16大小,所以这个BMP文件包含了所有的256种地形显示,分成16行16列。第一行从左到右是代码00-0F的图像,第二行是10-1F的图像,依此类推。例如A9就是第11行第10列的图像(一个悬崖)。
第三子部分:地图的战术数据
第二部分是地图的显示数据。事实上,我们都知道,在游戏中实际判断地形的是按照地图的战术数据。例如汜水关的地图实际上有28×16大小,只不过分成了56×32个小格显示而已。
所以这一个子不饿烦恼就是地图的战术数据。以汜水关为例,其地图大小是28×16=448格,所以其战术数据存放在2778~3225字节处。
地图数据从上向下,从左向右排列。一汜水关为例,头28字节是第1行的1~28列,然后是第2行、第3行,依此类推。
具体每一个地图的意义可以参考下面的说明:
00 平原 01 森林 02 山地 03 河流 04 桥梁 05 城墙 06 城池 07 草原
08 村庄 09 悬崖 0A 城门 0B 荒地 0C 栅栏 0D 鹿砦 0E 兵营 0F 粮仓
10 宝物库 11 房舍 12 火焰 13 浊流
第五部分:战场名称
战场索引中的最后一个索引(第59个索引)指向的是战场名称。在附件的HEXZMAP.R3中,偏移是0x2A102。
战场名称由58个战场名字构成,每个战场名字后用换行(0X0A)或者回车换行(0X0D,0X0A)分隔。最后附加一个文件结束符(0X1A)。
[color=Silver][[i] 本帖最后由 龙吟 于 2012-1-20 00:19 编辑 [/i]][/color]
2012-1-20 00:20
龙吟
龙吟犯了错误,最后一组数据不是战场地图,而是战场名称。现在已经修正了帖子和附件。
2012-1-20 01:47
周瑜
以前我也分析出来的,做了一个地图导出器,但是具体的算法却忘记了。
只记得地图分为两类,荒地和城池。两种地图对于相同代码的显示图形不同。
[color=Silver][[i] 本帖最后由 周瑜 于 2012-1-19 09:49 编辑 [/i]][/color]
2012-1-20 05:40
龙吟
我的目标不是制作地图导出程序,而是将地图编辑功能增加到剧本编辑器中,让下一个版本的剧本编辑器可以对战场地图进行编辑。目前的剧本编辑器开发计划是:
1.0 最初版
1.1 追加战场地图编辑功能
1.X 增加城市场景编辑功能
2.X 允许新增战斗,扩充剧情
3.X 允许加强版,增加新人物、新天赋、新道具、新兵种和新事件
不过3.X是太远期的目标,希望今年上半年能实现到2.X,可以让大家基于原始游戏设定设计英杰传的MOD
2012-1-23 15:19
WHITESHIP
龙吟研究英杰传有很多年了吧,如果把这些功能(3.X的其实还并不必要,不用着急)加进去,就剧本来说已经基本完善了。
已经可以做三国为主题的MOD了…………
如果FACEDAT.R3那个鬼畜文件能研究出来的话,那说不定就能突破三国题材的限制了。
2012-1-23 15:25
WHITESHIP
回复 #3 周瑜 的帖子
好像不是荒地和城池啊……徐州之战的荒地和城池就是共存的。
倒是“山地”和“荒地、山崖”似乎从来没共存过。地图的确可能是分为两类。
2012-2-2 02:07
龙吟
大悲剧!电脑坏了,正在送修中。可怜我的战场编辑器就快要做好了,不知道还能不能修回来。如果不能修回来,就得从相当早的一个程序备份重新开始了。郁闷中,发个帖子抱怨一下。
2012-2-2 02:09
阿尔法孝直
如果是最坏的情况,那只能拆硬盘移到别的机了。
2012-2-2 17:29
WHITESHIP
伤不起,我有次重装系统也是文件没了,然后用EasyRecovery恢复过,如果不是图像文件的话,应该可以完全恢复的。
不知对修好的电脑是否适用。
2012-2-21 18:35
az19870504
回复 #1 龙吟 的帖子
发不了帖子....:hz1021:
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.