// 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"]; } } }