AliceSoft早期图片格式分析

2024-02-24 02:08

本文主要是介绍AliceSoft早期图片格式分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编者按:渐渐地,身为程序员加宅男的某男已经从仅仅对三次元的事物不再感兴趣升华到只有看16色图片才能感到快乐的境界了。为了有更多的图片可以看,某男下载了大量PC98的ROM。然而最令人遗憾的是AliceSoft的《Alice之馆》和《兰斯》等经典GAME居然没有回忆模式!!事到如今只有强行解图片了。某人定下这个远大目标后,就开始到处找DOS版本……可惜没有找到;于是某人又开始找PC98下的反编译器,可惜都不好用;于是某人下载了Neko ProjectII的源代码,然后花了2个月时间写了一个反汇编插件(http://download.csdn.net/source/1234900)……然后又花了一个星期,终于解出了其中的图片……

经测试,除了《AYUMI REAL》《斗X都市》等不能解开外,其它凡是ACG.dat,BCG.dat之类的文件名都可以解开。

以下简单介绍其格式。

 

基本上,游戏中的所有.dat文件都是一个VFS(虽然在当时可能还没有这个名词),而?CG.dat则是所有CG的打包。其中每张图都有一个相对坐标,它可以贴到别的图上构成动画。

前2个字节的word-1表示这个文件最大页数。有多少页,则索引位置占页数*256个字节。例如如果为2,则从第256字节开始为数据(这个数据也不是图像,真正图像的索引要参考索引数)

第3个字节开始为word单位的索引。每个索引需要先-1,再*256。例如06,00,则是表示该图片从000500H字节数开始。那么压缩后的图片大小呢?根据下一个索引的开始字节计算就可以了。例如下一个字节为08,00,则表示下一个图片从000800H字节数开始,那么之间的差值就是本图片的打包大小。

 

图像的压缩方式:

前面几个字节是相对坐标和长宽,具体请见代码。然后是48个字节的调色板,每种颜色仅使用低4位,所以需要左移4位。(不是粗糙,经研究发现PC98是4K色的……)编码是一种类似流程码的编码。它从左到右扫描,有8个控制码,分别表示重复N个字节、从左边一列拷贝N个字节、从上一个位平面拷贝N个字节等等(关于位平面的知识已经很过时了,不知道也没关系。)压缩效率一般,不过比普通流程码好一点。

 

不多废话了,贴代码。在VS2003上编译通过,使用方法是acg *.dat (*.dat可以换成别的,如果出错了可以直接指定文件,也可以不指定,缺省是*CG.dat),生成文件是文件名+数字.bmp。

 

 

// acg.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
#include <windows.h>
#include "io.h"
#pragma warning(disable:4996)

typedef struct _tag_act {
 unsigned char* buf;
 int    buf_size;
 unsigned char palette[48];
 unsigned char* work_buf;
 unsigned char* bmp_data;
} acg_t;

void acg_init(acg_t* rec)
{
 rec->buf = NULL;
 rec->bmp_data = NULL;
 rec->work_buf = NULL;
}

int acg_count(acg_t* rec, const char* filename)
{
 FILE* fp = fopen(filename, "rb");

 unsigned short pages = 0;
 unsigned short* indexes = NULL;
 fread(&pages, sizeof(short), 1, fp);
 int words = pages*256/2-2;
 indexes = (unsigned short*)malloc((int)words*2-2);
 fread(indexes, (int)words*2-2, 1, fp);
 fclose(fp);
 int count = 0;
 for ( int i = 0; i < words-1; ++i ) {
  if (indexes[i] == 0) break;
  ++count;
 }
 return count;
}

int acg_load(acg_t* rec, const char* filename, int index)
{
 FILE* fp = fopen(filename, "rb");
 unsigned short pages = 0;
 unsigned short* indexes = NULL;<

这篇关于AliceSoft早期图片格式分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740615

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File