XPlor/definitions/asura/xbox360.xscript

50 lines
1.7 KiB
Plaintext
Raw Normal View History

// Xbox 360 compressed archive (Sniper Elite, AVP, etc.)
// XMemCompressed data containing Asura archive
type xbox360 [root, display="Xbox 360 Archive"] byteorder BE
{
criteria {
require _ext == "xbox360";
// XMemCompress signature: 0x0FF512ED or 0x0FF512EE
sig1 = u32at(0);
require (sig1 == 0x0FF512ED || sig1 == 0x0FF512EE);
}
// Read signature info for display
u32 xmem_signature;
u32 xmem_flags;
xmem_signature = xmem_signature [ui, readonly, display="XMem Signature"];
xmem_flags = xmem_flags [ui, readonly, display="XMem Flags"];
// File size info
compressed_size = size();
compressed_size = compressed_size [ui, readonly, display="Compressed Size"];
// Read entire file - decompressor handles header parsing
seek(0);
compressed_data = read(EOF);
// Decompress with XMemDecompress (handles header internally)
decompressed_data = compressed_data |> xmem;
decompressed_size = len(decompressed_data);
decompressed_size = decompressed_size [ui, readonly, display="Decompressed Size"];
// Export decompressed data for inspection
write_file(_basename + ".asura", decompressed_data);
// Check decompressed data signature
if (decompressed_size > 8) {
dec_sig = ascii(bytesof(decompressed_data, 0, 8));
dec_sig = dec_sig [ui, readonly, display="Decompressed Signature"];
is_asura = (dec_sig == "Asura ");
is_asura = is_asura [ui, readonly, display="Is Asura Archive"];
if (is_asura) {
archive = decompressed_data |> parse asura_archive;
archive = archive [ui, display="Archive Contents"];
}
}
}