Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Need for Speed series ZDIR.BIN - Undercover, World, Most Wanted, Underground, Carbon
- # script for QuickBMS http://quickbms.aluigi.org
- math DO_DECOMPRESS = 0 # set this to 1 to decompress .lzc files
- get TMP basename
- math MULTI_ZZDATA = 0
- open FDSE "ZDIR.BIN" 1
- open FDSE "ZZDATA.BIN" 0 EXISTS
- if EXISTS == 0
- open FDSE "ZZDATA0.BIN" 0 EXISTS
- if EXISTS == 1
- math MULTI_ZZDATA = 1
- else
- math MULTI_ZZDATA = 2
- open FDSE "NAMES.HOO" 0
- get NAMES_SIZE asize
- for i = 0
- get NAME line
- # Skip "Outfile: "
- string NAME | "Outfile: "
- putarray 9 i NAME
- savepos TMP_OFF
- if TMP_OFF == NAMES_SIZE
- break
- endif
- next i
- endif
- endif
- get ZDIR_SIZE asize 1
- if MULTI_ZZDATA == 0
- get TMP long 1
- get TMP long 1
- if TMP == 0
- math MODE = 0
- else
- math MODE = 1
- endif
- endif
- goto 0 1
- set NAME string ""
- for TMP_OFF = 0 < ZDIR_SIZE
- if MULTI_ZZDATA == 0
- get NAME_HASH long 1
- get OFFSET long 1
- get SIZE long 1
- if MODE != 0
- get DUMMY long 1
- endif
- namecrc NAME NAME_HASH "ea_nfs_names.txt" 32
- else
- get NAME_HASH long 1
- get ZZDATA_NUM long 1
- get OFFSET long 1
- get XOFFSET long 1
- get SIZE long 1
- get FILE_CRC long 1
- math XOFFSET * 0x800
- namecrc NAME NAME_HASH "ea_nfs_names.txt" 32
- if MULTI_ZZDATA == 2
- getarray TMP 9 ZZDATA_NUM
- else
- # we need to reopen them everytime because they are sorted by NAME_HASH
- string TMP p "ZZDATA%d.BIN" ZZDATA_NUM
- endif
- open FDSE TMP
- endif
- math OFFSET * 0x800
- goto OFFSET
- callfunction DECOMPRESS 1
- savepos TMP_OFF 1
- next
- startfunction CHECK_DECOMPRESS
- math IS_COMPRESSED = 1
- savepos DUMP_OFFSET
- getdstring ZIP_SIGN 4
- math SKIP_BYTES = 0 # some algorithms consider the header in their size
- if ZIP_SIGN == "RFPK"
- comtype dk2
- elif ZIP_SIGN == "RAWW"
- comtype copy
- elif ZIP_SIGN == "JDLZ"
- comtype ea_jdlz
- math SKIP_BYTES = 0x10
- elif ZIP_SIGN == "HUFF"
- comtype ea_huff
- elif ZIP_SIGN == "COMP"
- comtype ea_comp
- math SKIP_BYTES = 0x10
- else
- math IS_COMPRESSED = 0
- endif
- endfunction
- startfunction DECOMPRESS
- if SIZE != 0
- callfunction CHECK_DECOMPRESS 1
- if IS_COMPRESSED == 0 || DO_DECOMPRESS == 0
- log NAME DUMP_OFFSET SIZE
- else
- get ZIP_FLAG byte
- get DUMMY byte
- get DUMMY short
- get SIZE long
- get ZSIZE long
- get DUMMY long
- math ZSIZE - SKIP_BYTES
- savepos DUMP_OFFSET
- clog NAME DUMP_OFFSET ZSIZE SIZE
- endif
- endif
- endfunction
Advertisement
Advertisement