SHARE
TWEET

Another World PC DOS File Extractor QuickBMS script

LuigiBlood Nov 16th, 2012 87 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Another World/Out of This World DOS File Extractor by LuigiBlood
  2. # Load a MEMLIST.BIN to work, BANK files must be in the same folder as the MEMLIST.BIN.
  3.  
  4. Endian big
  5. Set DataType 0
  6. # 0=Sound, 1=Music, 2=PolyAnim, 3=Pal, 4=ByteCode, 5=Cutscene, 6=Other
  7. # 0.snd, 1.mus, 2.bma, 3.pal, 4.mac, 5.mat, 6.dat
  8. Set DataBank 0
  9. Set DataOffset 0
  10. Set DataCSize 0
  11. Set DataSize 0
  12.  
  13. Set IsFile 0
  14. Get NbFiles asize
  15. Math NbFiles /= 20
  16. Math NbFiles -= 2
  17.  
  18. # 0x01:DataType (Byte)
  19. # 0x07:DataBank (Byte)
  20. # 0x08:DataOffset (32-bit)
  21. # 0x0e:DataCSize (16)
  22. # 0x12:DataSize (16)
  23. # 20 bytes
  24.  
  25. Set DataNb 0
  26.  
  27. Do
  28.         log TEMPORARY_FILE 0 0
  29.         Set MEM_offset 1
  30.         Set MEM_Nb DataNb
  31.         Math MEM_Nb *= 20
  32.         Math MEM_offset += MEM_Nb
  33.         GoTo MEM_offset 0
  34.         Get DataType BYTE 0
  35.         # Got DataType
  36.        
  37.         If DataType == 0
  38.                 Set MEM_NAME "sound"
  39.                 String MEM_NAME += DataNb
  40.                 String MEM_NAME += ".snd"
  41.         Elif DataType == 1
  42.                 Set MEM_NAME "music"
  43.                 String MEM_NAME += DataNb
  44.                 String MEM_NAME += ".mus"
  45.         Elif DataType == 2
  46.                 Set MEM_NAME "polyanim"
  47.                 String MEM_NAME += DataNb
  48.                 String MEM_NAME += ".pol"
  49.         Elif DataType == 3
  50.                 Set MEM_NAME "palette"
  51.                 String MEM_NAME += DataNb
  52.                 String MEM_NAME += ".pal"
  53.         Elif DataType == 4
  54.                 Set MEM_NAME "code"
  55.                 String MEM_NAME += DataNb
  56.                 String MEM_NAME += ".bin"
  57.         Elif DataType == 5
  58.                 Set MEM_NAME "cine"
  59.                 String MEM_NAME += DataNb
  60.                 String MEM_NAME += ".cin"
  61.         Else
  62.                 Set MEM_NAME "other"
  63.                 String MEM_NAME += DataNb
  64.                 String MEM_NAME += ".dat"
  65.         EndIf
  66.        
  67.         Math MEM_offset += 6
  68.         GoTo MEM_offset 0
  69.         Get DataBank BYTE 0
  70.         # Got Bank data
  71.                
  72.         If DataBank == 0x00
  73.                 Set BANKNAME "BANK00"
  74.         Elif DataBank == 0x01
  75.                 Set BANKNAME "BANK01"
  76.         Elif DataBank == 0x02
  77.                 Set BANKNAME "BANK02"
  78.         Elif DataBank == 0x03
  79.                 Set BANKNAME "BANK03"
  80.         Elif DataBank == 0x04
  81.                 Set BANKNAME "BANK04"
  82.         Elif DataBank == 0x05
  83.                 Set BANKNAME "BANK05"
  84.         Elif DataBank == 0x06
  85.                 Set BANKNAME "BANK06"
  86.         Elif DataBank == 0x07
  87.                 Set BANKNAME "BANK07"
  88.         Elif DataBank == 0x08
  89.                 Set BANKNAME "BANK08"
  90.         Elif DataBank == 0x09
  91.                 Set BANKNAME "BANK09"
  92.         Elif DataBank == 0x0A
  93.                 Set BANKNAME "BANK0A"
  94.         Elif DataBank == 0x0B
  95.                 Set BANKNAME "BANK0B"
  96.         Elif DataBank == 0x0C
  97.                 Set BANKNAME "BANK0C"
  98.         Elif DataBank == 0x0D
  99.                 Set BANKNAME "BANK0D"
  100.         Elif DataBank == 0x0E
  101.                 Set BANKNAME "BANK0E"
  102.         Elif DataBank == 0x0F
  103.                 Set BANKNAME "BANK0F"
  104.         EndIf
  105.        
  106.         Get DataOffset LONG 0
  107.         # Got Offset
  108.        
  109.         Get DataCSize LONG 0
  110.         # Got CSize
  111.        
  112.         Get DataSize LONG 0
  113.         # Got Size
  114.        
  115.         Open FDSE BANKNAME 1
  116.        
  117.         If DataSize != 0
  118.                 If DataCSize == DataSize
  119.                         Encryption "" ""
  120.                         Log MEM_NAME DataOffset DataSize 1
  121.                 Else
  122.                         CallFunction unpack 1
  123.                         Encryption reverse ""
  124.                         Log MEM_NAME 0 DataSize 2
  125.                 EndIf
  126.         EndIf
  127.        
  128.         Math DataNb += 1
  129.  
  130. While DataNb <= NbFiles
  131.  
  132. StartFunction unpack
  133.         Set _unpaksize 0
  134.         Set _unpakdsize 0
  135.         Set _unpakcrc 0
  136.         Set _unpakchk 0
  137.        
  138.         Set _unpakOffset DataOffset
  139.         Math _unpakOffset u+= DataCSize
  140.         Math _unpakOffset u-= 4
  141.         GoTo _unpakOffset 1
  142.         Get _unpakdsize LONG 1
  143.         Math _unpakOffset u-= 4
  144.        
  145.         Open "." TEMPORARY_FILE 2
  146.        
  147.         GoTo _unpakOffset 1
  148.         Get _unpakcrc LONG 1
  149.         Math _unpakOffset u-= 4
  150.         GoTo _unpakOffset 1
  151.         Get _unpakchk LONG 1
  152.         Math _unpakcrc u^= _unpakchk
  153.         Math _unpakOffset u-= 4
  154.        
  155.         Do
  156.                 CallFunction NextChunk 1
  157.                 If NextChunkReturn == 0
  158.                         Set _unpaksize 1
  159.                         CallFunction NextChunk 1
  160.                         If NextChunkReturn == 0
  161.                                 Set _decUnk1_numchunk 3
  162.                                 Set _decUnk1_addcount 0
  163.                                 CallFunction decUnk1 1
  164.                         Else
  165.                                 Set _decUnk2_numchunk 8
  166.                                 CallFunction decUnk2 1
  167.                         EndIf
  168.                 Else
  169.                         Set _getCode_numChunks 2
  170.                         CallFunction getCode 1
  171.                         Set _unpack_c getCodeReturn
  172.                         If _unpack_c == 3
  173.                                 Set _decUnk1_numchunk 8
  174.                                 Set _decUnk1_addcount 8
  175.                                 CallFunction decUnk1 1
  176.                         Else
  177.                                 If _unpack_c < 2
  178.                                         Set _unpaksize _unpack_c
  179.                                         Math _unpaksize u+= 2
  180.                                         Set _decUnk2_numchunk _unpack_c
  181.                                         Math _decUnk2_numchunk u+= 9
  182.                                         CallFunction decUnk2 1
  183.                                 Else
  184.                                         Set _getCode_numChunks 8
  185.                                         CallFunction getCode 1
  186.                                         Set _unpaksize getCodeReturn
  187.                                         Set _decUnk2_numchunk 12
  188.                                         CallFunction decUnk2 1
  189.                                 EndIf
  190.                         EndIf
  191.                 EndIf
  192.         While _unpakdsize > 0
  193. EndFunction
  194.  
  195. StartFunction NextChunk
  196.         Set NextChunkReturn 0
  197.         Set CF 0
  198.         Set CFRCR 0
  199.         CallFunction RCR 1
  200.         Set CF RCRReturn
  201.         If _unpakchk == 0
  202.                 GoTo _unpakOffset 1
  203.                 Get _unpakchk LONG 1
  204.                 Math _unpakcrc u^= _unpakchk
  205.                 Math _unpakOffset u-= 4
  206.                 Set CFRCR 1
  207.                 CallFunction RCR 1
  208.                 Set CF RCRReturn
  209.         EndIf
  210.         Set NextChunkReturn CF
  211. EndFunction
  212.  
  213. StartFunction RCR
  214.         # CFRCR
  215.        
  216.         Set rCF _unpakchk
  217.         Math rCF &= 1
  218.         Math _unpakchk u>= 1
  219.         If CFRCR == 1
  220.                 Math _unpakchk u|= 0x80000000
  221.         EndIf
  222.         Set RCRReturn rCF
  223. EndFunction
  224.  
  225. StartFunction decUnk1
  226.         # _decUnk1_numchunk
  227.         # _decUnk1_addcount
  228.        
  229.         Set _getCode_numChunks _decUnk1_numchunk
  230.         CallFunction getCode 1
  231.         Set _decUnk1_count getCodeReturn
  232.         Math _decUnk1_count u+= _decUnk1_addcount
  233.         Math _decUnk1_count u+= 1
  234.         Math _unpakdsize u-= _decUnk1_count
  235.         If _decUnk1_count > 0
  236.         Do
  237.                 Set _getCode_numChunks 8
  238.                 CallFunction getCode 1
  239.                 Math getCodeReturn u&= 0xFF
  240.                 Put getCodeReturn BYTE 2
  241.                 Math _decUnk1_count u-= 1
  242.         While _decUnk1_count > 0
  243.         EndIf
  244. EndFunction
  245.  
  246. StartFunction decUnk2
  247.         # _decUnk2_numchunk
  248.        
  249.         Set _getCode_numChunks _decUnk2_numchunk
  250.         CallFunction getCode 1
  251.        
  252.         Set _decUnk2_i getCodeReturn
  253.         Set _decUnk2_count _unpaksize
  254.         Math _decUnk2_count u+= 1
  255.        
  256.         Set _decUnk2_offset 0
  257.         Set _decUnk2_offset2 0
  258.         Set _decUnk2_byte 0
  259.         Math _unpakdsize u-= _decUnk2_count
  260.         If _decUnk2_count > 0
  261.         Do
  262.                 SavePos _decUnk2_offset 2
  263.                 Set _decUnk2_offset2 _decUnk2_offset
  264.                 Math _decUnk2_offset2 u-= _decUnk2_i
  265.                 GoTo _decUnk2_offset2 2
  266.                 Get _decUnk2_byte BYTE 2
  267.                 GoTo _decUnk2_offset 2
  268.                 Put _decUnk2_byte BYTE 2
  269.                 Math _decUnk2_count u-= 1              
  270.         While _decUnk2_count > 0
  271.         EndIf
  272. EndFunction
  273.  
  274. StartFunction getCode
  275.         # _getCode_numChunks
  276.        
  277.         Set _getCode_c 0
  278.         If _getCode_numChunks > 0
  279.         Do
  280.                 Math _getCode_numChunks u-= 1
  281.                 Math _getCode_c u<= 1
  282.                 CallFunction NextChunk 1
  283.                 If NextChunkReturn != 0
  284.                         Math _getCode_c u|= 1
  285.                 EndIf
  286.         While _getCode_numChunks > 0
  287.         EndIf
  288.         Set getCodeReturn _getCode_c
  289. EndFunction
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top