Advertisement
Nicknine

EA ZDIR Extractor

May 3rd, 2019 (edited)
704
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. # Need for Speed series ZDIR.BIN - Undercover, World, Most Wanted, Underground, Carbon
  2. # script for QuickBMS http://quickbms.aluigi.org
  3.  
  4. math DO_DECOMPRESS = 0 # set this to 1 to decompress .lzc files
  5.  
  6. get TMP basename
  7. math MULTI_ZZDATA = 0
  8. open FDSE "ZDIR.BIN" 1
  9. open FDSE "ZZDATA.BIN" 0 EXISTS
  10. if EXISTS == 0
  11. open FDSE "ZZDATA0.BIN" 0 EXISTS
  12. if EXISTS == 1
  13. math MULTI_ZZDATA = 1
  14. else
  15. math MULTI_ZZDATA = 2
  16. open FDSE "NAMES.HOO" 0
  17. get NAMES_SIZE asize
  18.  
  19. for i = 0
  20. get NAME line
  21.  
  22. # Skip "Outfile: "
  23. string NAME | "Outfile: "
  24. putarray 9 i NAME
  25.  
  26. savepos TMP_OFF
  27. if TMP_OFF == NAMES_SIZE
  28. break
  29. endif
  30. next i
  31. endif
  32. endif
  33.  
  34. get ZDIR_SIZE asize 1
  35.  
  36. if MULTI_ZZDATA == 0
  37. get TMP long 1
  38. get TMP long 1
  39. if TMP == 0
  40. math MODE = 0
  41. else
  42. math MODE = 1
  43. endif
  44. endif
  45. goto 0 1
  46.  
  47. set NAME string ""
  48. for TMP_OFF = 0 < ZDIR_SIZE
  49. if MULTI_ZZDATA == 0
  50. get NAME_HASH long 1
  51. get OFFSET long 1
  52. get SIZE long 1
  53. if MODE != 0
  54. get DUMMY long 1
  55. endif
  56.  
  57. namecrc NAME NAME_HASH "ea_nfs_names.txt" 32
  58. else
  59. get NAME_HASH long 1
  60. get ZZDATA_NUM long 1
  61. get OFFSET long 1
  62. get XOFFSET long 1
  63. get SIZE long 1
  64. get FILE_CRC long 1
  65. math XOFFSET * 0x800
  66.  
  67. namecrc NAME NAME_HASH "ea_nfs_names.txt" 32
  68.  
  69. if MULTI_ZZDATA == 2
  70. getarray TMP 9 ZZDATA_NUM
  71. else
  72. # we need to reopen them everytime because they are sorted by NAME_HASH
  73. string TMP p "ZZDATA%d.BIN" ZZDATA_NUM
  74. endif
  75. open FDSE TMP
  76. endif
  77.  
  78. math OFFSET * 0x800
  79. goto OFFSET
  80. callfunction DECOMPRESS 1
  81. savepos TMP_OFF 1
  82. next
  83.  
  84. startfunction CHECK_DECOMPRESS
  85. math IS_COMPRESSED = 1
  86. savepos DUMP_OFFSET
  87. getdstring ZIP_SIGN 4
  88. math SKIP_BYTES = 0 # some algorithms consider the header in their size
  89. if ZIP_SIGN == "RFPK"
  90. comtype dk2
  91. elif ZIP_SIGN == "RAWW"
  92. comtype copy
  93. elif ZIP_SIGN == "JDLZ"
  94. comtype ea_jdlz
  95. math SKIP_BYTES = 0x10
  96. elif ZIP_SIGN == "HUFF"
  97. comtype ea_huff
  98. elif ZIP_SIGN == "COMP"
  99. comtype ea_comp
  100. math SKIP_BYTES = 0x10
  101. else
  102. math IS_COMPRESSED = 0
  103. endif
  104. endfunction
  105.  
  106. startfunction DECOMPRESS
  107. if SIZE != 0
  108. callfunction CHECK_DECOMPRESS 1
  109. if IS_COMPRESSED == 0 || DO_DECOMPRESS == 0
  110. log NAME DUMP_OFFSET SIZE
  111. else
  112. get ZIP_FLAG byte
  113. get DUMMY byte
  114. get DUMMY short
  115. get SIZE long
  116. get ZSIZE long
  117. get DUMMY long
  118. math ZSIZE - SKIP_BYTES
  119. savepos DUMP_OFFSET
  120. clog NAME DUMP_OFFSET ZSIZE SIZE
  121. endif
  122. endif
  123. endfunction
  124.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement