底层 - 直读官方 - 旧地图中的JPEG解析

大话2的地图文件分为新地图和旧地图,分别在newscene和scene文件夹下。

新旧两种地图格式有很大的不同。

地图的相关资料首先要感谢王大理Wangdali前辈,没有他的帮助,我自己不可能解开map数据包。

此处引用wangdali对大话2旧地图数据格式的整理

Map File Old Format
Dali Wang <wdl@sina.com>
2004-05-09 起稿 @Changchun
2004-05-10 修改 @Changchun
2006-02-19 修改 @Haikou

=======================MAP HEAD===============================
4字节 XPAM(MAPX)
4字节 地图的宽度
4字节 地图的高度

4*n字节 地图单元的引索 n=地图的宽度/640*2 * 地图高度/480*2
4字节 多出的一个地图单元引索,即结束引索,也就是文件的大小。

4字节 HGPJ (JPGH)
4字节 JPG头的大小
n字节 数据内容 n=JPG头的大小,不包括前面8字节。

==============================================================

4字节 地图单元引索的开始位置,也是KSAM的数量。

4字节 GAMI (IMAG)
4字节 大小(153600),正好是320x240x2。
n字节 数据,不包括前面8字节。

4字节 GEPJ (JPEG)
4字节 JPEG单元大小,不包括这8字节。
2字节 单元地图的宽度
2字节 单元地图的高度
n字节 地图数据

4字节 KSAM (MASK)
4字节 大小(不定)
n字节 数据,不包括前面8字节。
:
4字节 KSAM (MASK)
4字节 大小(不定)
n字节 数据,不包括前面8字节。


4字节 KOLB (BLOK)
4字节 大小(9600)
n字节 数据,不包括前面8字节。

4字节 LLEC (CELL)
4字节 大小(192)
n字节 数据,不包括前面8字节。

4字节 GIRB (BRIG)
4字节 大小(不定)
n字节 数据,不包括前面8字节。

8字节 结束单元。

==============================================================

XPAM (MAPX) 地图文件头
Index       图象单元引索
HGPJ (JPGH) 图象JPEG Head

GAMI (IMAG) 只有1028.map地图含有这个单元。
GEPJ (JPEG) 图象数据
KSAM (MASK)
:
KSAM (MASK)
KOLB (BLOK) 遮掩规则,一比特代表一个地图像素。
LLEC (CELL) 地图规则,一字节代表一个游戏坐标。
GIRB (BRIG) 光亮规则
:
:
:
GAMI (IMAG) 只有1028.map地图含有这个单元。
GEPJ (JPEG) 图象数据
KSAM (MASK)
:
KSAM (MASK)
KOLB (BLOK) 遮掩规则,一比特代表一个地图像素。
LLEC (CELL) 地图规则,一字节代表一个游戏坐标。
GIRB (BRIG) 光亮规则
***********************************************************************

旧地图

网上的现有程序大多只能解析出新地图,是因为云风对旧地图的JPEG数据进行了特殊的处理,普通的JPEG DECODER无法解析。

在解析旧地图时,需要首先提取出JPEG HEAD,然后分别和各单元的JPEG BODY结合。

在旧地图中,JPEG在解析每一个MCU前,需要提前读取YCbCr的DC数据,而不是像普通的JPEG文件那样,继承上个MCU单元的处理后的DC值,云风把每个MCU的所需的DC值,提取到了MCU数据之前,因此在普通JPEG DECODER看来,本该是下一个MCU数据的起始位置的地方,多了7字节的数据(包含3个DC值和一个bit坐标),也因此导致普通的JPEG DECODER无法解析旧地图的JPEG。
云风的JPEG文档

for (i=0;i<VDU;i+=16) {
    jpeg_stream+=(jpeg_bit+7)/8;
    jpeg_DC[0]=*jpeg_stream_short++;  // 关键
    jpeg_DC[1]=*jpeg_stream_short++;  // 关键
    jpeg_DC[2]=*jpeg_stream_short++;  // 关键
    jpeg_bit=*jpeg_stream++;                 // 关键  一字节bit坐标

    for (j=0;j<HDU;j+=16) {
        if (*(jpeg_stream+(jpeg_bit+7)/8)==0xff) {
            jpeg_stream+=(jpeg_bit+7)/8;
            jpeg_bit=0;
            while (*jpeg_stream!=0xff) ++jpeg_stream;
                ++jpeg_stream;
                jpeg_DC[0]=jpeg_DC[1]=jpeg_DC[2]=0;
        }
        jpeg_decode_DU(jpeg_ybuf,0);
        jpeg_decode_DU(jpeg_ybuf+64,0);
        jpeg_decode_DU(jpeg_ybuf+128,0);
        jpeg_decode_DU(jpeg_ybuf+192,0);
        jpeg_decode_DU(jpeg_cbbuf,1);
        jpeg_decode_DU(jpeg_crbuf,2);
        YCbCr411((unsigned short*)(output_buffer+i*pitch)+j,pitch);
    }
}

把这段程序移植到云风的JPEG Decoder上,就可以解析了旧地图的JPEG了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359