日式横版射击游戏《天蓝色ElexiaJ》的资源解包

-----------------------------------------------------------------------

!!警告!!

游戏资源所有权,归游戏开发商所有;

以下解包算法仅供学习交流,请勿用于商业与非法用途;

由此产生的一切后果,与博主(我)无关;

-----------------------------------------------------------------------

废话不多说,游戏的封包以 pack 为后缀名,内存布局很简单,首先是一个文件信息头:

1 struct PACK_FILE_HEADER {
2     char sig[ 4 ]; // KCAP
3     short file_number; // 文件数量
4     char u1[ 2 ];
5 };

sig 为 4 字节大小的签名,该值永远为 KCAP 四个字母,随后是 2 字节大小的文件数量;

随后是一串连续的文件信息结构体,结构体定义如下:

1 struct PACK_FILE_INFO {
2     char file_name[ 64 ]; // 文件完整路径名
3     BYTE u1[ 8 ];
4     int file_data_pos_in_file; // 文件数据在 pack 中的开始位置
5     int file_size; // 文件数据大小
6     BYTE u2[ 4 ];
7 };

以上两个结构体,以 u 开头的成员结构体,目前还没摸索出具体作用,其余成员都可以从变量名中看出具体用法,就不多解释了;

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <Windows.h>
 4
 5 struct PACK_FILE_HEADER {
 6     char sig[ 4 ]; // KCAP
 7     short file_number; // 文件数量
 8     char u1[ 2 ];
 9 };
10
11 struct PACK_FILE_INFO {
12     char file_name[ 64 ]; // 文件完整路径名
13     BYTE u1[ 8 ];
14     int file_data_pos_in_file; // 文件数据在 pack 中的开始位置
15     int file_size; // 文件数据大小
16     BYTE u2[ 4 ];
17 };
18
19 void buildDirectoryPath( const char * _path ){
20     unsigned int len = ::strlen( _path );
21     char * build_path = new char[ len + 1 ];
22     for( unsigned int i = 0; i < len; ++ i ){
23         build_path[ i ] = _path[ i ];
24         if( ‘\\‘ == build_path[ i ] ){
25             build_path[ i + 1 ] = ‘\0‘;
26             CreateDirectoryA( build_path, nullptr );
27         }
28     }
29 }
30
31 const char * getFileTitle( const char * _file_name ){
32     static char title[ 256 ] = { 0 };
33     memset( title, 0, sizeof( title ) );
34     for( unsigned int i = 0; i < strlen( _file_name ); ++ i ){
35         if( ‘.‘ == _file_name[ i ] )
36             break;
37         title[ i ] = _file_name[ i ];
38     }
39     return ( const char * ) title;
40 }
41
42 void extraFile( FILE * _pack_file, const char * _pack_name, PACK_FILE_INFO * _file_info ){
43     FILE * file = nullptr;
44     BYTE * file_data = new BYTE[ _file_info->file_size ];
45     char full_path[ 256 ] = { 0 };
46
47     sprintf_s( full_path, 256,
48         "%s\\%s",
49         getFileTitle( _pack_name ),
50         _file_info->file_name );
51     buildDirectoryPath( full_path );
52
53     printf( "%s \n", full_path );
54     fopen_s( & file, full_path, "wb" );
55     fseek( _pack_file, _file_info->file_data_pos_in_file, SEEK_SET );
56     fread( file_data, 1, _file_info->file_size, _pack_file );
57     fwrite( file_data, 1, _file_info->file_size, file );
58     delete [ ] file_data;
59     fclose( file );
60 }
61
62 void extraPack( const char * _pack_name ){
63     FILE * pack_file = nullptr;
64     PACK_FILE_HEADER header;
65     PACK_FILE_INFO * file_list = nullptr;
66
67     fopen_s( & pack_file, _pack_name, "rb" );
68
69     // 读取文件头信息
70     fread( ( void * ) & header, 1, sizeof( PACK_FILE_HEADER ), pack_file );
71
72     // 读取文件信息
73     file_list = new PACK_FILE_INFO[ header.file_number ];
74     fread( ( void * ) file_list, 1, sizeof( PACK_FILE_INFO ) * header.file_number, pack_file );
75
76     // 解开文件
77     for( short i = 0; i < header.file_number; ++ i ){
78         extraFile( pack_file, _pack_name, & file_list[ i ] );
79     }
80
81     delete [ ] file_list;
82     fclose( pack_file );
83 }
84
85 int main( int argc, char * argv[ ] ){
86     extraPack( "data2.Pack" );
87     extraPack( "data.Pack" );
88     return 0;
89 }

以上代码通过函数 extraPack( ) 分别解开 data2.Pack 与 data.Pack 两个资源包, extraFile( ) 函数负责从 pack 里读出文件数据,并创建完整目录结构与文件,随后把数据写入到新建的文件里,getFileTitle( ) 函数可以从一个带后缀名的文件名中提取不包含后缀名的文件标题部分,buildDirectoryPath( ) 函数从给定的完整文件路径创建完整的目录链;

代码就是这么多,下面展示提取出来的资源:

还有一些脚本之类的文本文件:

完整的可执行程序就不给出来了,资源可以自己下载游戏,程序可以自己新建个 Win32 Console 工程,把上面的代码粘贴进去,直接生成就行了;

 PS: buildDirectoryPath( ) 函数忘记 delete 那个 new 出来的 build_path 变量了,结果导致程序运行后产生大量内存泄漏,大家手工自己加上去吧(笑)

时间: 2024-10-11 16:40:11

日式横版射击游戏《天蓝色ElexiaJ》的资源解包的相关文章

Unity3D开发一个2D横版射击游戏

教程基于http://pixelnest.io/tutorials/2d-game-unity/ , 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改了一些地方, 写篇文和大家一起分享下, 同时也加深记忆. 有什么纰漏的地方还请大家多包涵. 1.创建第一个场景 新建工程,在Project面板创建文件夹, 是为了更好的规划管理资源文件. 接着在Hierarchy面板上创建多个空对象(这样的结构也是清晰了整个游戏的层次, 对象之间的关系一目了然),

GameMaker Studio 2—制作横版射击游戏教程-HeartBeast 短期小结2

这期视频主要讲了枪和子弹的实现. 枪的绘制 /// @description Draw the gun var dir = point_direction(x, y, mouse_x, mouse_y); var flipped = (mouse_x > x) * 2 -1; //draw the player draw_sprite_ext(s_player, 0, x, y, 1, 1, 0, image_blend, image_alpha); //draw the gun draw_sp

简易2D横版RPG游戏制作

Unity学习笔记1 简易2D横版RPG游戏制作 http://m.blog.csdn.net/article/details?id=24601905

横版格斗游戏 cocos2d-x游戏源码

请大家赏个脸,如果感兴趣的看一下,含金量非常高的横版格斗游戏源码,  我的淘宝网址: Beat 'Em Up Game 名将.恐龙.拳皇.三国战纪.战国传承,一个个响当当的名字,承载了80后多少儿时的梦想.横版格斗过关游戏,曾经是最受大众欢迎的一种类型,拳拳到肉的打击感,轻风飘逸的一招一式,还有怒涛般的连击技,令无数玩家如痴如醉.这种游戏也一度是游戏性最强的游戏,但在卡牌横行,快餐文化泛滥的今天,这种游戏已经失去了往日的光彩,但这不是游戏本身的错,而主要在于游戏厂商的急功近利.这种游戏不同于纯界

Beat &#39;Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源码出售

请大家赏个脸,如果感兴趣的看一下,含金量非常高的横版格斗游戏源码,  我的淘宝网址: Beat 'Em Up Game 名将.恐龙.拳皇.三国战纪.战国传承,一个个响当当的名字,承载了80后多少儿时的梦想.横版格斗过关游戏,曾经是最受大众欢迎的一种类型,拳拳到肉的打击感,轻风飘逸的一招一式,还有怒涛般的连击技,令无数玩家如痴如醉.这种游戏也一度是游戏性最强的游戏,但在卡牌横行,快餐文化泛滥的今天,这种游戏已经失去了往日的光彩,但这不是游戏本身的错,而主要在于游戏厂商的急功近利.这种游戏不同于纯界

Beat &#39;Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源码

浓缩精华,专注战斗! 游戏的本质是什么?界面?养成?NoNo! 游戏来源于对实战和比赛的模拟,所以它的本源就是对抗!就是战斗!是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城?各种升级系统?NoNo,还是战斗! 名将.恐龙.拳皇.三国战纪.战国传承,一个个响当当的名字,承载了80后多少儿时的梦想.横版格斗过关游戏,曾经是最受大众欢迎的一种类型,拳拳到肉的打击感,轻风飘逸的一招一式,还有怒涛般的连击技,令无数玩家如痴如醉.这种游戏也一度是游戏性最强的游戏,但在卡牌横行,快餐文化泛滥

【独立游戏】Sunset——二次元横版动作游戏

SUNSET是一个动漫风横版动作同人游戏,讲述了在虚拟现实发达的未来,白帽黑客们与骇客的斗争 游戏中你不仅可以获得传统动作游戏的爽快打击感,还能运用各种科技道具体验到不一样的快感 游戏由南昌大学游戏部的sols&茶炉推出 下载地址:https://pan.baidu.com/s/1eS85ZcI 茶炉大大画的封面图~ 爽快的技能和酷炫的特效 可选4个角色 可以双人游戏 原文地址:https://www.cnblogs.com/sols/p/8449360.html

【我的第一款App(“跑酷好基友” 英文名:BothLive) 登录App Store(一)】使用iOS7推出的Sprite Kit框架制作一款横版小游戏

从本篇文章开始,我将陆续用至少三篇文章介绍一下我个人的第一款上线App Store的游戏:“跑酷好基友”,英文名BothLive.从游戏制作.社交分享.App上传审核,以及版本更新迭代(如果有)几个方面来介绍.目前,这只是一个非常非常easy的超轻量级游戏. 说来也很有意思,本人一直从事iOS应用客户端的开发,对于iOS游戏制作从来也没花时间和心思.但是一个偶然的机会:2014年3月份公司派我去南京晓庄学院做一场开发讲座,讲座中需要向同学们演示一个小游戏的开发过程,于是我便利用iOS7推出的全新

Unity3D手游-横版ACT游戏完整源码下载

说明: 这不是武林,这不是江湖,没有道不完的恩怨,没有斩不断的情仇,更没有理不清的烦恼,这是剑的世界,一代剑魁闯入未知世界,将会为这个世界展开什么样的蓝图,让你来创造它的未来,剑魁道天下,一剑斗烛龙!!! 游戏开发了三个月,非常值得收藏,至于做什么用途,就看你自己啦!来来来,放大招了!请看附件:) 测试环境: Unity3D 4.3.4 运行效果: 完整源码下载http://www.yxkfw.com/thread-5035-1-1.html