# YoYo Games data.win (script 0.1.1) # IFF WAD file format # script for QuickBMS http://quickbms.aluigi.org quickbmsver "0.6.5" math GENERIC_DUMP_FIXED_SIZE_ENABLED = 0 # keep it disabled for the moment get FULL_SIZE asize for CHUNK_OFFSET = 0 < FULL_SIZE getdstring CHUNK_NAME 4 get CHUNK_SIZE long savepos CHUNK_OFFSET xmath CHUNK_LIMIT "CHUNK_OFFSET + CHUNK_SIZE" print "CHUNK %CHUNK_NAME% %CHUNK_OFFSET|x% %CHUNK_SIZE|x%" math FILES = 0 if CHUNK_NAME == "FORM" # the main chunk math FULL_SIZE = CHUNK_LIMIT math CHUNK_SIZE = 0 elif CHUNK_NAME == "GEN8" elif CHUNK_NAME == "OPTN" elif CHUNK_NAME == "EXTN" elif CHUNK_NAME == "SOND" math SIZE = 0x24 callfunction GENERIC_DUMP_FIXED_SIZE 1 elif CHUNK_NAME == "SPRT" math GET_OFFSET = 0 math GET_NAME = 1 math GET_NAME2 = 0 math GET_SIZE = 0 callfunction DUMP_ENTRIES 1 elif CHUNK_NAME == "BGND" math SIZE = 0x14 callfunction GENERIC_DUMP_FIXED_SIZE 1 elif CHUNK_NAME == "PATH" elif CHUNK_NAME == "SCPT" math SIZE = 0x8 callfunction GENERIC_DUMP_FIXED_SIZE 1 elif CHUNK_NAME == "FONT" elif CHUNK_NAME == "TMLN" elif CHUNK_NAME == "OBJT" math GET_OFFSET = 0 math GET_NAME = 1 math GET_NAME2 = 0 math GET_SIZE = 0 callfunction DUMP_ENTRIES 1 elif CHUNK_NAME == "ROOM" math GET_OFFSET = 0 math GET_NAME = 1 math GET_NAME2 = 1 math GET_SIZE = 0 callfunction DUMP_ENTRIES 1 elif CHUNK_NAME == "DAFL" elif CHUNK_NAME == "TPAG" elif CHUNK_NAME == "CODE" math GET_OFFSET = 0 math GET_NAME = 1 math GET_NAME2 = 0 math GET_SIZE = 1 callfunction DUMP_ENTRIES 1 elif CHUNK_NAME == "VARI" elif CHUNK_NAME == "FUNC" elif CHUNK_NAME == "STRG" math FILES = -1 get STRINGS long for i = 0 < STRINGS get DUMMY long next i for i = 0 < STRINGS get STRING_SIZE long math STRING_SIZE + 1 slog "STRG.txt" -1 STRING_SIZE next i elif CHUNK_NAME == "TXTR" callfunction COLLECT_ENTRIES 1 for i = 0 < FILES getarray OFFSET 0 i goto OFFSET get DUMMY long # 1 get OFFSET long putarray 0 i OFFSET next i math j = 0 for i = 0 < FILES getarray OFFSET 0 i math j += 1 getarray NEXT_OFFSET 0 j xmath SIZE "NEXT_OFFSET - OFFSET" putarray 1 i OFFSET putarray 2 i SIZE putarray 3 i "." next i elif CHUNK_NAME == "AUDO" callfunction COLLECT_ENTRIES 1 for i = 0 < FILES getarray OFFSET 0 i goto OFFSET get SIZE long savepos OFFSET putarray 1 i OFFSET putarray 2 i SIZE putarray 3 i "." next i else print "Chunk %CHUNK_NAME% not supported" endif if FILES == 0 # dump the whole chunk string NAME p= "%s/%s" CHUNK_NAME "." log NAME CHUNK_OFFSET CHUNK_SIZE elif FILES > 0 for i = 0 < FILES getarray OFFSET 1 i getarray SIZE 2 i getarray NAME 3 i string NAME p= "%s/%s" CHUNK_NAME NAME log NAME OFFSET SIZE next i endif # FILES < 0 means that we don't want to extract files math CHUNK_OFFSET += CHUNK_SIZE goto CHUNK_OFFSET next startfunction COLLECT_ENTRIES math j = 0 get FILES long for i = 0 < FILES get OFFSET long if OFFSET != 0 if OFFSET u< CHUNK_LIMIT putarray 0 j OFFSET math j += 1 endif endif next i putarray 0 j CHUNK_LIMIT math FILES = j endfunction startfunction DUMP_ENTRIES set NAME string "." callfunction COLLECT_ENTRIES 1 for i = 0 < FILES getarray OFFSET 0 i goto OFFSET if GET_NAME != 0 get NAME_OFF long endif if GET_NAME2 != 0 get NAME2_OFF long endif if GET_SIZE != 0 get SIZE long putarray 2 i SIZE endif if GET_OFFSET != 0 get OFFSET long else savepos OFFSET endif if GET_NAME != 0 goto NAME_OFF get NAME string endif if GET_NAME2 != 0 goto NAME2_OFF get NAME2 string if NAME2 != "" string NAME += / string NAME += NAME2 endif endif putarray 0 i OFFSET putarray 3 i NAME next i math j = 0 for i = 0 < FILES getarray OFFSET 0 i math j += 1 getarray NEXT_OFFSET 0 j xmath SIZE "NEXT_OFFSET - OFFSET" math SIZE -= 4 # NAME_OFF putarray 1 i OFFSET if GET_SIZE != 0 getarray SIZE 2 i endif putarray 2 i SIZE #putarray 3 i NAME # already set next i endfunction startfunction GENERIC_DUMP_FIXED_SIZE if GENERIC_DUMP_FIXED_SIZE_ENABLED != 0 get FILES long for i = 0 < FILES get DUMMY long next i savepos OFFSET for i = 0 < FILES putarray 1 i OFFSET putarray 2 i SIZE putarray 3 i "." math OFFSET + SIZE next i endif endfunction