home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 8008 / SoM_Analysis.7z / SoM_Extract_Arch05.bms < prev    next >
Encoding:
QuickBMS script  |  2014-10-22  |  4.1 KB  |  179 lines

  1. # FEAR / FEAR2 / ARCH00 archives (script 0.5)
  2. # script for QuickBMS http://quickbms.aluigi.org
  3.  
  4. quickbmsver "0.5.14,-9" # -9 is necessary for this script
  5.  
  6. comtype unzip_dynamic
  7. getdstring SIGN 4
  8. if SIGN == "LTAR"
  9. elif SIGN == "RATL"
  10.     set SIGN string "LTAR"
  11.     endian big
  12. elif SIGN == "LTAX"
  13.     comtype xmemdecompress
  14. elif SIGN == "XATL"
  15.     comtype xmemdecompress
  16.     set SIGN string "LTAX"
  17.     endian big
  18. else
  19.     cleanexit
  20. endif
  21. get VERSION long
  22.  
  23. # it's possible to make the check on the version or using this solution
  24. savepos TMP
  25. get FULL_SIZE asize
  26. get DUMMY1 long
  27. get DUMMY2 long
  28. math AUTOGUESS = 0
  29. if DUMMY1 u> FULL_SIZE
  30.     math AUTOGUESS = 1
  31. endif
  32. if DUMMY2 u> FULL_SIZE
  33.     math AUTOGUESS = 1
  34. endif
  35. goto TMP
  36. if AUTOGUESS == 0
  37.     get NAMESSZ long
  38.     get FOLDERS long
  39.     get FILES long
  40.     get DUMMY long      # 1
  41.     get DUMMY long      # 0
  42.     get DUMMY long      # 0
  43.     getdstring HASH 16
  44. else
  45.     getdstring HASH 16
  46.     get DUMMY long      # 1
  47.     get DUMMY long      # 0
  48.     get DUMMY long      # 0
  49.     get FILES long
  50.     get FOLDERS long
  51.     get NAMESSZ long
  52. endif
  53.  
  54. savepos OFFSET
  55. log MEMORY_FILE OFFSET NAMESSZ
  56.  
  57. math OFFSET += NAMESSZ
  58. set FILESSZ long FILES
  59. math FILESSZ *= 32
  60. log MEMORY_FILE2 OFFSET FILESSZ
  61.  
  62. math OFFSET += FILESSZ
  63. set FOLDERSSZ long FOLDERS
  64. math FOLDERSSZ *= 16
  65. log MEMORY_FILE3 OFFSET FOLDERSSZ
  66.  
  67. set FOLDER string ""
  68. callfunction EXTRACT
  69.  
  70. startfunction EXTRACT
  71.     savepos CURR_OFF MEMORY_FILE3
  72.     if CURR_OFF u>= FOLDERSSZ
  73.         cleanexit
  74.     endif
  75.     get NAME_OFF long MEMORY_FILE3
  76.     get SUB_FOLDERS long MEMORY_FILE3
  77.     get NEXT_FOLDERS long MEMORY_FILE3
  78.     get NUM_FILES long MEMORY_FILE3
  79.  
  80.     goto NAME_OFF MEMORY_FILE
  81.     get NAME string MEMORY_FILE
  82.  
  83.     # don't have the minimal idea if it's correct, it's an update of the old script
  84.     if AUTOGUESS == 0
  85.         string FOLDER = NAME
  86.     else
  87.         string FOLDER += NAME
  88.     endif
  89.     string FOLDER += /
  90.  
  91.     for i = 0 < NUM_FILES
  92.         savepos CURR_OFF MEMORY_FILE2
  93.         if CURR_OFF u>= FILESSZ
  94.             cleanexit
  95.         endif
  96.         get NAME_OFF long MEMORY_FILE2
  97.         get OFFSET  longlong MEMORY_FILE2
  98.         get ZSIZE   longlong MEMORY_FILE2
  99.         get SIZE    longlong MEMORY_FILE2
  100.         get ZIP     long MEMORY_FILE2
  101.  
  102.         goto NAME_OFF MEMORY_FILE
  103.         get NAME string MEMORY_FILE
  104.  
  105.         if FOLDER != "CRC/" # they are not files
  106.             set FNAME string FOLDER
  107.             string FNAME += NAME
  108.             if ZIP == 0
  109.                 log FNAME OFFSET SIZE
  110.             else
  111.                 # compression 9, it's the same for both zlib and xmem
  112.                 callfunction ZIP_DUMP 1 # 1 only for being faster
  113.             endif
  114.         endif
  115.     next i
  116.  
  117.     for i = 0 < SUB_FOLDERS
  118.         callfunction EXTRACT
  119.     next i
  120.  
  121.     set FOLDER string ""
  122.     for i = 0 < NEXT_FOLDERS
  123.         callfunction EXTRACT
  124.     next i
  125.  
  126. endfunction
  127.  
  128. startfunction ZIP_DUMP
  129.     log FNAME 0 0
  130.     math LIMIT = OFFSET
  131.     math LIMIT += ZSIZE
  132.     append
  133.  
  134. # added to original script
  135. set TMP1 string FNAME
  136. xmath TMP4 "ZSIZE"
  137. xmath TMP2 "OFFSET"
  138.  
  139.     for OFFSET = OFFSET u< LIMIT
  140.         goto OFFSET
  141.         math CHUNK_PACKED = 1
  142.         get CHUNK_ZSIZE long
  143.         if SIGN == "LTAR"
  144.             get CHUNK_SIZE long
  145.             savepos OFFSET
  146.             if CHUNK_ZSIZE == CHUNK_SIZE
  147.                 math CHUNK_PACKED = 0
  148.             endif
  149.         else    # "LTAX"
  150.             math CHUNK_SIZE = 0x10000
  151.             savepos OFFSET
  152.             if CHUNK_ZSIZE & 0x80000000 #0xf0000000
  153.                 math CHUNK_PACKED = 0
  154.                 math CHUNK_ZSIZE &= 0x0fffffff
  155.             endif
  156.         endif
  157.         if CHUNK_PACKED == 0
  158.             log FNAME OFFSET CHUNK_ZSIZE
  159.         else
  160.             clog FNAME OFFSET CHUNK_ZSIZE CHUNK_SIZE
  161.  
  162. # added to original script
  163. math TMP5 += CHUNK_SIZE
  164.  
  165.         endif
  166.         math OFFSET += CHUNK_ZSIZE
  167.         math OFFSET x= 4
  168.     next
  169.     append
  170.  
  171. # added to original script
  172. if quickbms_arg1 == 1
  173. print "#Log#  %TMP2|x%    %TMP4%    %TMP5%    %TMP1%"
  174. set PrevSize long ZSIZE
  175. set TMP5 long 0
  176. endif
  177.  
  178. endfunction
  179.