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

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

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

一、文件纵览

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

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

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

文件列表:
1.所有人物头像 hdgrp.grp hdgrp.idx
2.所有武功效果 eft.grp eft.idx
3.所有武功动作 fight???.grp fight???.idx
4.所有场景地图块 fmap.grp fmap.idx
5.所有外景地图块 mmap.grp mmap.idx
6.云 cloud.grp cloud.idx
7.片尾动画 kend.grp kend.idx
8.制作群信息 endword.grp endword.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

local f = assert(io.open(arg[1], "rb"))
local block = 3
local num
while true do
    --每次读取3个字节
    local bytes = f:read(block)
    
    if not bytes then break end
    
    io.write("{")
    for b in string.gfind(bytes, ".") do
        num=tonumber(string.byte(b))*4 --把每个字节转化为number*4
      io.write(tostring(num)..",")
    end
    io.write("},")
    
end
f:close()
 

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

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

三、idx解析

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

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

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

代码暂时不贴了,等完成了grp文件的解析后一起贴出来。

posted @ 2013-03-25 16:01  半山th  阅读(2576)  评论(2编辑  收藏  举报