// 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("is_compressed", "XMem Compressed"); if (is_compressed) { // 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"); compressed_size = size(); compressed_size = compressed_size; ui("compressed_size", "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("decompressed_size", "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; ui("archive", "Archive Contents"); } } } else { // Parse as raw Asura archive archive = parse_here("asura_archive"); ui("archive", "Asura Archive"); } }