您的位置:首页 > 其它

love2d教程22--金庸群侠资源格式解析1

2013-03-25 16:01 190 查看
昨天折腾了大半天参考了铁血丹心论坛里各位前辈的经验,还只是完成了一点,先记录一下,以后再补充。

大家可以下载金庸群侠的dosbox版(以下简称“金”),资源文件在game目录下。

一、文件纵览

“金”的文件命名很有规律,图片文件分为“.idx、.grp、.col”,分别是图片索引、图片数据、调色板。

图片索引里保存着对应图片在图片数据里的地址。若我们要载入第5幅图片,则先到.idx里其地址,软后

到对应的.grp里取数据,取出后再按调色板显示。

文件列表:
1.所有人物头像hdgrp.grphdgrp.idx
2.所有武功效果eft.grpeft.idx
3.所有武功动作fight???.grpfight???.idx
4.所有场景地图块fmap.grpfmap.idx
5.所有外景地图块mmap.grpmmap.idx
6.云cloud.grpcloud.idx
7.片尾动画kend.grpkend.idx
8.制作群信息endword.grpendword.idx
9.256色调色板mmap.col

二、调色板解析

把调色板Mmap.col用十六进制编辑工具(linux可以用ghexedit,windows用winhex)打开,可以看到

一共有768字节(一个字节是8个比特,即8位二进制数/2位十六进制数)。按照前辈的说法,它表示了

256种颜色,768/256=3即3个字节代表一种颜色,正是我们熟悉的rgb颜色,不过它的顺序是bgr,我

估计是大端模式的体现。而且“金”的颜色值是6位进制,要乘以4才行。

既然这个文件那么小,我便想干脆把它转换为lua的table算了。

下面是转换代码:make-color-table.lua

localf=assert(io.open(arg[1],"rb"))
localblock=3
localnum
whiletruedo
--每次读取3个字节
localbytes=f:read(block)

ifnotbytesthenbreakend

io.write("{")
forbinstring.gfind(bytes,".")do
num=tonumber(string.byte(b))*4--把每个字节转化为number*4
io.write(tostring(num)..",")
end
io.write("},")

end

f:close()



打开终端/cmd,输入luamake-color-table.luaMMAP.COL>>mmapcol.lua就可以生成颜色表的luatable了。

然后使用查找替换把",},",替换为",}",去掉多余的逗号。

三、idx解析

这个文件比较坑人,它的第一个地址居然是对应grp文件里的第二个图片,而且最后一个地址在grp里不存在。

它里面的地址是四个字节,也是大端模式,比如"0fac01bc",实际表示的是"bc01ac0f"。

解析idx就只需要逆序一下地址,并转化为十进制数。

代码暂时不贴了,等完成了grp文件的解析后一起贴出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: