// 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("xmem_signature", "XMem Signature"); xmem_flags = xmem_flags; ui("xmem_flags", "XMem Flags"); // File size info compressed_size = size(); compressed_size = compressed_size; ui("compressed_size", "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("decompressed_size", "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("dec_sig", "Decompressed Signature"); is_asura = (dec_sig == "Asura "); is_asura = is_asura; ui("is_asura", "Is Asura Archive"); if (is_asura) { archive = decompressed_data |> parse asura_archive; ui("archive", "Archive Contents"); } } }