Advertisement
LuigiBlood

QuickBMS AW DOS script

Nov 15th, 2012
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.94 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement