SHARE
TWEET

QuickBMS AW DOS script

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