XPlor/definitions/asura/asrBE.xscript

65 lines
1.9 KiB
Plaintext
Raw Normal View History

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