83 lines
1.9 KiB
Plaintext
83 lines
1.9 KiB
Plaintext
|
|
// PAK Archive format - THQ Australia Engine (Xbox 360)
|
||
|
|
// Xbox 360 version uses version 2, big-endian, 24-byte entries
|
||
|
|
|
||
|
|
type thqa_pak_xenon [display="THQA PAK (Xbox 360)"] byteorder BE
|
||
|
|
{
|
||
|
|
// Header (24 bytes)
|
||
|
|
magic = ascii(read(4));
|
||
|
|
|
||
|
|
ui("magic", "Magic");
|
||
|
|
u32 version;
|
||
|
|
|
||
|
|
ui("version", "Version");
|
||
|
|
u32 entry_table_offset;
|
||
|
|
|
||
|
|
ui("entry_table_offset", "Entry Table Offset");
|
||
|
|
u32 metadata_size;
|
||
|
|
|
||
|
|
ui("metadata_size", "Metadata Size");
|
||
|
|
u32 entry_table_size;
|
||
|
|
|
||
|
|
ui("entry_table_size", "Entry Table Size");
|
||
|
|
u32 entry_count;
|
||
|
|
|
||
|
|
ui("entry_count", "Entry Count");
|
||
|
|
|
||
|
|
// Calculate derived values
|
||
|
|
entry_size = entry_table_size / entry_count;
|
||
|
|
|
||
|
|
ui("entry_size", "Entry Size");
|
||
|
|
filename_table_offset = entry_table_offset + entry_table_size;
|
||
|
|
|
||
|
|
ui("filename_table_offset", "Filename Table Offset");
|
||
|
|
|
||
|
|
// Seek to entry table and read entries
|
||
|
|
seek(entry_table_offset);
|
||
|
|
|
||
|
|
if (entry_count > 0 && entry_count < 10000) {
|
||
|
|
entry_idx = 0;
|
||
|
|
repeat(entry_count) {
|
||
|
|
// Read entry fields (24 bytes each)
|
||
|
|
u32 e_offset;
|
||
|
|
u32 e_decomp_size;
|
||
|
|
u32 e_comp_size;
|
||
|
|
u32 e_name_off;
|
||
|
|
u32 e_unknown;
|
||
|
|
e_compress = ascii(read(4));
|
||
|
|
|
||
|
|
saved_pos = pos();
|
||
|
|
|
||
|
|
// Get filename
|
||
|
|
seek(filename_table_offset + e_name_off);
|
||
|
|
e_name = cstring();
|
||
|
|
|
||
|
|
// Extract file data
|
||
|
|
seek(e_offset);
|
||
|
|
if (e_compress == "zlib") {
|
||
|
|
raw_data = read(e_comp_size);
|
||
|
|
file_data = raw_data |> zlib;
|
||
|
|
} else {
|
||
|
|
file_data = read(e_decomp_size);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Export file
|
||
|
|
write_file(e_name, file_data);
|
||
|
|
|
||
|
|
// Pass filename to child via global
|
||
|
|
ctx_set("_thqa_pak_entry_name", e_name);
|
||
|
|
|
||
|
|
// Create child entry
|
||
|
|
child = file_data |> parse thqa_pak_entry_be;
|
||
|
|
push("entries", child);
|
||
|
|
|
||
|
|
seek(saved_pos);
|
||
|
|
entry_idx = entry_idx + 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
file_size = size();
|
||
|
|
|
||
|
|
|
||
|
|
ui("file_size", "Total File Size");
|
||
|
|
}
|