NDS《凉宫春日的直列》的一些破解信息

本文介绍了NDS游戏《凉宫春日的直列》的文件格式、压缩算法以及解压缩过程。通过对游戏文件的分析,揭示了封包结构、LZ变种压缩方式,并提供了ASM解压代码。同时,讨论了解压缩后字库的扩容问题,提出了可能的解决方案。

  破解这个游戏也有一段时间了,期间陆陆续续遇到一些困难,不过都得以解决,但是现在遇到的新问题就是游戏在模拟器上没问题(包括NO$GBA和ideal),不过在真机上死机(TT),也想不到什么方法解决,死神的提议也不知道怎么弄...。这里真的要感谢给我帮助的大大们(flyeyes,死神,空气,以及Cristal的教程《破解塞尔达字库》(tgb进不去了,所以大家想看教程的话,网上搜一下吧))

  没打算写教程,所以只是一些简单的描述。

 

  先来张测试截图吧:

 

 

  1.封包的格式

   dat.bin
   evt.bin --文本(标准JIS编码)
   grp.bin --图片,其中最大的文件为字库
   scn.bin

   其中文本主要在evt.bin中,但是其他文件里也有一些零散的文本。

   格式:

  

2.压缩

  在封包里的每个文件是压缩了的,跟asm后发现是lz的变种,这里放上asm代码和解压代码,如果有人有兴趣可以写写压缩代码。压缩代码我已经写了,不过只是随便写的,效率很低,就不放上来了。

   所有的代码都会被折叠,请按expand source查看。

 

 解压代码:

 

3.扩容

 这个游戏是需要扩容的,一共有1900多个字左右,根据大大们以前的经验,向这样的文字类游戏需要2700个字左右。

 下面是我遇到的问题:

  解压后字库格式很简单,就不多说了,经过测试,发现最大只能扩到2300个,否则就白屏(模拟器crash)。

  可能的原因以及解决方法:

  1.猜想程序员在写程序的时候malloc一个固定大小的内存,所以导致扩到2300个以上后,就导致缓冲区溢出...但是测试后发现貌似不是固定大小的(也有可能是先malloc一个固定大小,等解压后知道解压后的空间又调用relloc来重新分配...),这个没法解决,没跟到这个值。

  2.因为知道有这么一块内存放字库的话,只要减少字模的大小,然后在显示时再转换为4bpp就能扩容了。这里我选择的是转2bpp为4bpp。

     这里之所以能用这个方法是因为,凉宫在现实字模的时候,是先会每一个字都copy到内存的另外一个地方,然后再交由显存(这是我的猜想,没有继续往下跟)。所以我们只需要让游戏调用我们自己的copy函数,copy的时候顺便转换。

  下面贴上我的转换函数,写的很挫,转换后的4bpp只能显示2种颜色...另外,gba 4bpp是从右往左存的,而2bpp是从左往右存的。参考的是白总的教材:

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值