Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement