Name: NitroPlus Description: Archive: .pak Author: 痴漢公賊 (glanser@163.com) Version: 1.0.1 Status: Alpha 【TODO】 1. Support pak archives of version 1. 2. Support .npp and .npa archives. 3. some .pak which can't be extracted is video, please directly playback with player 【.pak Archive Info】 the pak is actual type of archive with directory. original data according to practical situation, can be png, jpg, ogg, ini, nps(script), txt(script) and so on. header: u32 version; // 1, 2, 3 or 4 on the basis of difference of version field, division into 4 different archive. 【.pak(Ver2) Archive Info】 header: u32 version; // 2 u32 index_entries; // resource number u32 uncomprlen; // length of index segment decompression u32 comprlen; // length of index segment zlib compression u32 unknown1; // 0 or 0x100(related to is_compr?) s8 magic[256]; // always is game's english name index segment: zlib compression,index item with variable length u32 name_length; // resource name length s8 *name; // resource name u32 offset; // resource data offset(count from index segment ending) u32 uncomprlen; // decompressed data length u32 act_length; // actual data length u32 is_compr; // whether in zlib compression(0-no zlib compression; 1-zlib compression) u32 comprlen; // data length of zlib compression(if is_compr is 0, the field is 0) data: closely behind index segment; about state of is_compr as 0, data is plaintext; if is_compr is 1, need decompression. 【.pak(Ver3) Archive Info】 header: u32 version; // 3 u32 index_entries; // resource number u32 uncomprlen; // length of index segment decompression u32 comprlen; // length of index segment zlib compression u32 unknown[2]; s8 magic[256]; // always is game's english name index segment: zlib compression,index item with variable length u32 name_length; // resource name length s8 *name; // resource name u32 offset; // resource data offset(count from index segment ending) u32 uncomprlen; // decompressed data length u32 act_length; // actual data length u32 is_compr; // whether in zlib compression(0-no zlib compression; 1-zlib compression) u32 comprlen; // data length of zlib compression(if is_compr is 0, the field is 0) data: closely behind index segment; about state of is_compr as 0, data is plaintext; if is_compr is 1, need decompression. notice: ver3 has a variant,format as same as ver4, only version field is 3. 【.pak(Ver4) Archive Info】 header: u32 version; // 4 s8 magic[256]; // xor decryption key(always is game's english name) u32 xor_factor; // using for xor decrypting comprlen field u32 uncomprlen; // length of index segment decompression(encryption) u32 index_entries; // resource number(encryption) u32 comprlen; // length of index segment zlib compression(encryption) index segment: zlib compression,index item with variable length u32 name_length; // resource name length s8 *name; // resource name,also xor decryption key u32 offset; // resource data offset(count from index segment ending)(encryption) u32 uncomprlen; // decompressed data length(encryption) u32 next_offset; // offset to next index item in index segment(encryption) u32 is_compr; // whether in zlib compression(0-no zlib compression; 1-zlib compression)(encryption) u32 comprlen; // data length of zlib compression(if is_compr is 0, the field is 0)(encryption) data: encryption closely behind index segment; about state of is_compr as 0, data need xor decoding(decoding previous 1024 bytes at most); if is_compr is 1, require to xor decoding all decompressed data. 【ChangeLog】 2007-08-19 22:41 ver 1.0.1 supported a variant of ver3 2007-05-10 00:13 ver 0.9.0 1st version released