这两种游戏使用的是同一种压缩方式,都是RLE压缩方式,具体的压缩编码如下:
0a xx xx xx
a 个单独的颜色点

1a bb xx xx xx
abb 个单独的颜色点

Da bb
abb 个透明色

Ca
a 个透明色

8a xx
a 个颜色是XX的点

9a xx bb
abb 个颜色为xx的点

Aa xx bb cc
abbcc 个颜色为xx的点

其他情况,没有压缩

基本上超过3个点一样就用8a xx 了

然后,以魔力宝贝为例,graphics_10.bin是图像压缩数据文件,一幅图像的结构如下:

typedef  struct
... {
    WORD fmtflag;       //全部为"RD"
    WORD unknow;        //不知道什么用
    DWORD width;
    DWORD height;
    DWORD size;         // 整个结构大小,就是头+压缩数据
    unsigned char * pdata; // 大小为(size - 16)
} st_RDHeader;

另外还有一个GraphicInfo_10.bin的文件,里面是图片信息的数据,具体结构如下:

typedef  struct
... {
    int idx;            //索引号,基本上是按照顺序排列的
    DWORD fileptr;      //在数据文件中的偏移量
    DWORD size;         //大小,整个图像结构的大小,同上一个结构的SIZE
    int ofs_x;          //x偏移量
    int ofs_y;          //y偏移量,就是对齐点离坐上角的y 轴距离
    DWORD width;
    DWORD height; 
    DWORD colorkey;     //随便猜得,不一定正确
    DWORD unuse1;
    DWORD unuse2;
} st_GrpInfo;             //  40 bytes

有了这3样资料,就可以从他们的数据文件里面解出我们需要的图片了。

一般来说,他们的图片都是256色的,调色板存储在相应的目录下,只要读出来就能够把颜色调整好。

但是魔力宝贝3。0增加了16位色的新资源,其实,压缩方法还是按照字节的方式来得。只不过,输出的缓存不再是高度* 宽度,而是高度* 宽度的2倍。
而且是两个字节描述一个点的16位色位图。具体是555,还是565模式的,我没有试验。

下面是我的8位解压函数,不过一些情况没有处理,比如说没有压缩的数据。而且写得很烂。。。。。-_-b

如果需要改成16位,需要送进的out_len 是 w * h *2。

int  _core_uncompress_rle8(  char   *  instream,  int  in_len,  char   *  outstream,  int  out_len )
... {
    char rle_code;
    int ptr_instream = 0, ptr_outstream = 0;
    int i = 0,loopcnt = 0;;

    if( instream == NULL || in_len == 0 || outstream == NULL || out_len == 0 || in_len > out_len )
        return 0;

    while( ptr_instream < in_len )
    ...{
        rle_code = instream[ptr_instream];
        ptr_instream ++;
        switch( rle_code & 0xf0 )
        ...{
        case 0x00:
            loopcnt = rle_code;
            for( i = 0;i < loopcnt;i ++ )
            ...{
                outstream[ptr_outstream] = instream[ptr_instream];
                ptr_instream ++;
                ptr_outstream ++;
            }
            break;

        case 0x10:
                loopcnt = (rle_code & 0xf) * 0x100 + instream[ptr_instream];
                ptr_instream ++;
                for( i = 0;i < loopcnt;i ++ )
                ...{
                    outstream[ptr_outstream] = instream[ptr_instream];
                    ptr_instream ++;
                    ptr_outstream ++;
                }
            break;

        case 0x80:
            loopcnt = rle_code & 0xf;
            rle_code = instream[ptr_instream];
            ptr_instream ++;
            for( i = 0;i < loopcnt;i ++ )
            ...{
                outstream[ptr_outstream] = rle_code;
                ptr_outstream ++;
            }
            break;

        case 0x90:
            loopcnt = (rle_code & 0xf) * 0x100 + instream[ptr_instream + 1];
            rle_code = instream[ptr_instream];
            ptr_instream += 2;
            for( i = 0;i < loopcnt;i++)
            ...{
                outstream[ptr_outstream] = rle_code;
                ptr_outstream ++;
            }
            break;

        case 0xa0:
            loopcnt = (rle_code & 0xf) * 0x10000 + instream[ptr_instream + 1] * 0x100 + instream[ptr_instream + 2];
            rle_code = instream[ptr_instream];
            ptr_instream += 3;
            for( i = 0;i < loopcnt;i ++ )
            ...{
                outstream[ptr_outstream] = rle_code;
                ptr_outstream ++;
            }
            break;

        case 0xc0:
            loopcnt = rle_code & 0xf;
            for( i = 0;i < loopcnt;i ++)
            ...{
                outstream[ptr_outstream] = (char)0xff;
                ptr_outstream ++;
            }
            break;

        case 0xd0:
            loopcnt = (rle_code & 0xf) * 0x100 + instream[ptr_instream];
            ptr_instream ++;
            for( i = 0;i < loopcnt;i ++ )
            ...{
                outstream[ptr_outstream] = (char)0xff;
                ptr_outstream ++;
            }
            break;
        }
        ptr_instream ++;
    }

    return 1;
}

终于写完了,希望能对别人有用。。。

《魔力宝贝》 《石器时代》 图片破解 补遗

上次分析得不够完善,一些情况没有分析出来,抱歉。下面是补充。

RLE压缩的地方多了几个:

0a xx xx xx
a 个单独的颜色点

1a bb xx xx xx
abb 个单独的颜色点
(添加)
2a bb cc xx xx xx
abbcc个单独的点

Ca
a 个透明色

Da bb
abb 个透明色
(添加)
Ea bb cc
abbcc个透明色

8a xx
a 个颜色是XX的点

9a xx bb
abb 个颜色为xx的点

Aa xx bb cc
abbcc 个颜色为xx的点

所有的a ,b ,c 都是表示单个十六进制数字

关于3。0的魔力宝贝添加的图片其实还是8位色的图片。按照8位色的图片解出来就是了,她不过是用了16位色的显示模式(其实是任何显示模式都可以)。

还有,《石器时代》的INFO的结构和魔力宝贝一样,不过,需要在后面添加一个40字节的数组,什么用都没有。只是结构增大为80字节。

另外,他们的调色板把前面的16个位置丢掉了,就是说实际上调色板是存储了后236个颜色的数值。所使用的时候要注意。

暂时就补充这些了。如果需要软件或者原码,请请联系我 johndragon@sohu.com。

《石器时代》《魔力宝贝》图像压缩格式的破解相关推荐

  1. 魔力宝贝/石器时代 图档格式压缩算法

    下文分析了CrossGate(魔力宝贝)的文件格式,因为StoneAge(石器时代)和它差不多(最初均为同一小组作品),所以一并介绍. 原文作者为梦见草,由野风信子整理和完善. 一.图片数据图片地址文 ...

  2. 《石器时代》移动平台单机版制作中...

    Process: 2011 10.9:  看了2天的代码,发现还是有必要debug服务端的代码.但是由于我想研究相对简单的2.5版本,所以一直在搭2.5的linux服务端,最终虽然代码编译没问题,但是 ...

  3. 魔力宝贝服务器列表修改,魔力宝贝修改代码一览表GM.docx

    .. 魔力宝贝GM代码 宠物 nr additemmax 19505] [nr additemmax 19077] 打开crossgate\gmsv\setup.cf.XXX 打开这个文件 为1指定G ...

  4. 魔力宝贝高清单机计划(一) 图库提取

    文章目录 资源分类bin目录 调色板格式 索引格式 图库格式 取图步骤 最终效果 20来年前很喜欢魔力宝贝,最高才到达过40多级.后来陆陆续续玩过怀旧.毕竟游戏过于古老,很多不方便的地方. 4年前想着 ...

  5. 石器时代文件格式分析

    石器时代文件格式分析 希望广大外挂制作者能参与到石器服务端的架设及其研究中来. 目前我们提供了服务端的源代码和一些资料.架设环境是Linux+Orcle ? or Linux + mysql 我们的论 ...

  6. linux版本石器时代,石器时代 架设教程Linux版linux服务器应用 -电脑资料

    本文只作学习研究之用,任何人不得非法使用, Linux系统架设石器 概述 首要条件,安装Linux版系统,建议CentOS 4 或者5 工具:SSH vnc for Linux and win xam ...

  7. 石器时代单机版GM修改数据

    石器时代单机版GM修改数据 2013年02月26日 ⁄ 与游戏的那些事 ⁄ 评论数 35 ⁄ 被围观 8,179+ 注意事项 本文提到的GM修改数据方法仅在游软轨迹提供的石器单机版里测试过且正常运行. ...

  8. 游戏外挂原理和技术分析(关于魔力宝贝)

    先是顺移外挂:         石器和魔力会出现顺移外挂,是因为它的移动消息机制是客户端直接向服务器报告自己新坐标和人物方向,客户端又不是每走一步汇报一次,而是达到一定时间汇报一次,可能是一秒一次吧. ...

  9. 从“石器时代”到“超越时代”,阿里 OTT 大屏前端建设之路

    作者 | 阿里文娱前端技术专家-默吉 责编 | 郑丽媛 头图 | CSDN 下载自视觉中国 转眼间2020年已过半,我投身到OTT端开发已经5年有余,回首OTT端(酷喵APP)前端建设历程,感慨良多. ...

最新文章

  1. wordpress php教程 pdf,wordpress二次开发全能教程.pdf
  2. Oracle10g.CentOS6安装
  3. 从AlexNet到DenseNet,再到SENet,一文看懂图像分类领域的突破性进展
  4. RewriteCond和13个mod_rewrite应用举例Apache伪静态
  5. C语言实现九九乘法表共9行9列,重点考察for循环的掌握情况!
  6. 为了研究因果关系,原来科学家在这么多方向上都有尝试
  7. 大数据虚拟化零起点-5基础运维第四步-部署vSphere Big Data Extensions 1.0 vApp
  8. IBM RAS:高效存储的优化组合
  9. 排序算法:归并排序、快速排序
  10. 面到阿里月薪 27k 数据岗,很难?
  11. Spring学习笔记(三)
  12. vue子父组件间传值
  13. 有关Spring缓存性能的更多信息
  14. centos-7部署docker
  15. 博弈-尼姆博弈(nimm)
  16. 关于Stm32定时器+ADC+DMA进行AD采样的实现
  17. c++ 编程规范技巧
  18. 声音存储空间计算公式_声音采样频率计算公式
  19. 面向法律领域的罪名预测、问题分类与FAQ问答模型设计与实现【NLP】
  20. 动态设置Button图片大小

热门文章

  1. 为什么VR依然没有出现烧钱向的3A级游戏?
  2. 计算机大赛指导老师自评怎么写,计算机*学生的简单自我评价
  3. 解决127.0.0.1 已拒绝连接的方法
  4. 在长度为n的()上,删除第一个元素,其算法的时间复杂度为O(n)
  5. 用 Jupyter Notebook 爬取微博图片保存本地!
  6. RV1126笔记二十三:Nginx及cgi移植
  7. Linux查看DNS地址以及端口,nslookup命令以及更强大的dig命令
  8. STAF学习系列--安装及配置
  9. 苹果系统装win7教程
  10. vue改变class内的属性_vue 绑定 添加class 属性 4种方法 添加style 3中方法 v-bind /:...