2026-01-07 16:36:02 -05:00
|
|
|
// 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";
|
2026-01-08 00:38:33 -05:00
|
|
|
// XMemCompress signature: 0x0FF512ED or 0x0FF512EE
|
2026-01-07 16:36:02 -05:00
|
|
|
sig1 = u32at(0);
|
|
|
|
|
require (sig1 == 0x0FF512ED || sig1 == 0x0FF512EE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Read signature info for display
|
|
|
|
|
u32 xmem_signature;
|
|
|
|
|
u32 xmem_flags;
|
2026-01-11 12:10:29 -05:00
|
|
|
xmem_signature = xmem_signature;
|
|
|
|
|
|
|
|
|
|
ui("xmem_signature", "XMem Signature");
|
|
|
|
|
xmem_flags = xmem_flags;
|
|
|
|
|
|
|
|
|
|
ui("xmem_flags", "XMem Flags");
|
2026-01-07 16:36:02 -05:00
|
|
|
|
2026-01-08 00:38:33 -05:00
|
|
|
// File size info
|
|
|
|
|
compressed_size = size();
|
2026-01-11 12:10:29 -05:00
|
|
|
compressed_size = compressed_size;
|
|
|
|
|
|
|
|
|
|
ui("compressed_size", "Compressed Size");
|
2026-01-07 16:36:02 -05:00
|
|
|
|
2026-01-08 00:38:33 -05:00
|
|
|
// Read entire file - decompressor handles header parsing
|
|
|
|
|
seek(0);
|
2026-01-07 16:36:02 -05:00
|
|
|
compressed_data = read(EOF);
|
2026-01-08 00:38:33 -05:00
|
|
|
|
|
|
|
|
// Decompress with XMemDecompress (handles header internally)
|
2026-01-07 16:36:02 -05:00
|
|
|
decompressed_data = compressed_data |> xmem;
|
|
|
|
|
|
2026-01-08 00:38:33 -05:00
|
|
|
decompressed_size = len(decompressed_data);
|
2026-01-11 12:10:29 -05:00
|
|
|
decompressed_size = decompressed_size;
|
|
|
|
|
|
|
|
|
|
ui("decompressed_size", "Decompressed Size");
|
2026-01-08 00:38:33 -05:00
|
|
|
|
|
|
|
|
// 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));
|
2026-01-11 12:10:29 -05:00
|
|
|
dec_sig = dec_sig;
|
|
|
|
|
|
|
|
|
|
ui("dec_sig", "Decompressed Signature");
|
2026-01-07 16:36:02 -05:00
|
|
|
|
2026-01-08 00:38:33 -05:00
|
|
|
is_asura = (dec_sig == "Asura ");
|
2026-01-11 12:10:29 -05:00
|
|
|
is_asura = is_asura;
|
|
|
|
|
|
|
|
|
|
ui("is_asura", "Is Asura Archive");
|
2026-01-07 16:36:02 -05:00
|
|
|
|
2026-01-08 00:38:33 -05:00
|
|
|
if (is_asura) {
|
|
|
|
|
archive = decompressed_data |> parse asura_archive;
|
2026-01-11 12:10:29 -05:00
|
|
|
ui("archive", "Archive Contents");
|
2026-01-08 00:38:33 -05:00
|
|
|
}
|
2026-01-07 16:36:02 -05:00
|
|
|
}
|
|
|
|
|
}
|