Advertisement
LuigiBlood

Another World PC DOS File Extractor QuickBMS script

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