# Asura engine (RSCF chunks) (script 0.2.1) # Sniper Elite # Rogue Trooper # Guard Shield # possibly other Rebellion's games # script for QuickBMS http://aluigi.org/papers.htm#quickbms get PACK_SIZE asize getdstring SIGN 8 if SIGN == "AsuraCmp" get ZSIZE long get SIZE long math ZSIZE = PACK_SIZE math ZSIZE -= 8 comtype huffboh clog TEMPORARY_FILE 8 ZSIZE SIZE open "." TEMPORARY_FILE get PACK_SIZE asize getdstring SIGN 8 elif SIGN == "AsuraZlb" get ZERO long get ZSIZE long get SIZE long savepos OFFSET math ZSIZE = PACK_SIZE math ZSIZE -= OFFSET comtype zlib clog TEMPORARY_FILE OFFSET ZSIZE SIZE open "." TEMPORARY_FILE get PACK_SIZE asize getdstring SIGN 8 endif if SIGN != "Asura " cleanexit endif for savepos CHUNK_OFFSET math TMP = CHUNK_OFFSET math TMP += 16 if TMP >= PACK_SIZE cleanexit endif getdstring CHUNK 4 get CHUNKSZ long get DUMMY long get DUMMY long if CHUNK == RSCF get TYPE long get DUMMY long get SIZE long get NAME string math OFFSET = CHUNK_OFFSET math OFFSET += CHUNKSZ math OFFSET -= SIZE log NAME OFFSET SIZE elif CHUNK == ASTS get FILES long for i = 0 < FILES get NAME string do # work-around, doesn't seem to exist a valid way get DUMMY byte while DUMMY <= 1 savepos TMP math TMP -= 1 goto TMP get SIZE long get OFFSET long log NAME OFFSET SIZE next i #else #print "CHUNK %CHUNK% %CHUNK_OFFSET% %CHUNKSZ%" #savepos OFFSET #math SIZE = CHUNK_OFFSET #math SIZE += CHUNKSZ #math SIZE -= OFFSET #log "" OFFSET SIZE # comment here if you don't want to extract these useless chunks endif math CHUNK_OFFSET += CHUNKSZ goto CHUNK_OFFSET next