// Asset Resource file (Big Endian, Sniper Elite, AVP, etc.) // Can be raw Asura archive or XMemCompressed type asrBE [root, display="Asset Resource (Big Endian)"] byteorder BE { criteria { require _ext == "asrbe"; // Accept either Asura signature or XMemCompress signature sig = u32at(0); is_xmem = (sig == 0x0FF512ED || sig == 0x0FF512EE); is_asura = (ascii(bytesat(0, 8)) == "Asura "); require (is_xmem || is_asura); } // Check if XMemCompressed sig = u32at(0); is_compressed = (sig == 0x0FF512ED || sig == 0x0FF512EE); is_compressed = is_compressed [ui, readonly, display="XMem Compressed"]; if (is_compressed) { // 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"]; compressed_size = size(); compressed_size = compressed_size [ui, readonly, display="Compressed Size"]; // Read entire file and decompress seek(0); compressed_data = read(EOF); decompressed_data = compressed_data |> xmem; decompressed_size = len(decompressed_data); decompressed_size = decompressed_size [ui, readonly, display="Decompressed Size"]; // Export decompressed data write_file(_basename + ".asura", decompressed_data); // Parse decompressed archive if (decompressed_size > 8) { dec_sig = ascii(bytesof(decompressed_data, 0, 8)); if (dec_sig == "Asura ") { archive = decompressed_data |> parse asura_archive; archive = archive [ui, display="Archive Contents"]; } } } else { // Parse as raw Asura archive archive = parse_here("asura_archive"); archive = archive [ui, display="Asura Archive"]; } }