
https://mega.nz/#!Oh8WmZaB!NUbV8Hc0Nl-2 ... WqN8IwSNFA
Code: Select all
old script erroneous, corrected script pending
Code: Select all
# Star Trek: Conquest (WSB/WSS)
# script for QuickBMS http://quickbms.aluigi.org
# base written by Aluigi - thanks! :)
# corrections written by AlphaTwentyThree
# note that the extracted files only have a pseudo-header and need to be processed further
open FDDE "WSB"
open FDDE "WSS" 1
endian big
goto 0x4
get FILES long
goto 0xc
get PARTS long # entries / file parts
xmath INFO "0x14 * FILES + 0x30"
goto INFO
for i = 0 < FILES
get PART1 long
get PART2 long
getDstring DUMMY 0x1c
putArray 0 i PART1
putArray 1 i PART2
next i
for i = 0 < FILES
getArray PART2 1 i
get OFFSET1 long
savepos DAT1
getDstring H1 0x3c
savepos MYOFF
get OFFSET2 long
savepos DAT2
xmath SIZE1 "OFFSET2 - OFFSET1"
getDstring H2 0x3c
if PART2 != 0xcdcdcdcd # stereo
set CH 2
savepos MYOFF
else # mono file
set CH 1
set OFFSET2 0
set DAT2 0
set SIZE2 0
endif
xmath n "i + 1"
if n != FILES
get SIZE2 long
goto MYOFF
else
get SIZE2 asize 1
endif
math SIZE2 -= OFFSET2
xmath PSIZE "SIZE1 + SIZE2 + CH * 0x3c + 4"
putVarChr MEMORY_FILE PSIZE 0
log MEMORY_FILE 0 0
putVarChr MEMORY_FILE 0 SIZE1 long # interleave or stream size
putVarChr MEMORY_FILE 4 CH long # channels
append
log MEMORY_FILE DAT1 0x3c
if CH == 2
log MEMORY_FILE DAT2 0x3c
endif
log MEMORY_FILE OFFSET1 SIZE1 1
if CH == 2
log MEMORY_FILE OFFSET2 SIZE2 1
endif
append
get SIZE asize MEMORY_FILE
get NAME basename
string NAME p= "%s_%d.mus" NAME i
log NAME 0 SIZE MEMORY_FILE
next i
Code: Select all
# Star Trek: Conquest
# converts *.mus with pseudo-headers to playable GENH files
# written by AlphaTwentyThree of Zenhax
# script for QuickBMS http://quickbms.aluigi.org
endian big
get INTSIZE long
get CH long
get NOS long
get DUMMY long
get FREQ long
savepos OFF_COEFF1
getDstring DUMMY 0x30
if CH == 2
getDstring DUMMY 0xc
savepos OFF_COEFF2
set HEADER 0x80
elif CH == 1
set OFF_COEFF2 OFF_COEFF1
set HEADER 0x44
endif
set INTERLEAVE 4
endian little
if CH == 2
set LAYERS 2
set SPLIT_LAST_BLOCK 1
set BLOCKSIZE 0
xmath BLOCKSIZE "(INTSIZE * LAYERS)"
set WSIZE INTSIZE
get CYCLES asize
xmath CYCLES "(CYCLES - HEADER) / BLOCKSIZE"
get LASTBLOCK asize
xmath LASTBLOCK "(LASTBLOCK - HEADER) % BLOCKSIZE"
xmath LASTINT "LASTBLOCK / LAYERS"
get PSIZE asize
xmath PSIZE "(PSIZE - HEADER) / LAYERS"
callfunction deinterleave 1
else
log MEMORY_FILE2 0 0
log MEMORY_FILE3 0 0
endif
callfunction GENH 1
if CH == 2
callfunction reinterleave 1
else
get SIZE asize
math SIZE -= HEADER
append
log MEMORY_FILE HEADER SIZE
append
endif
get SIZE asize MEMORY_FILE
get NAME basename
string NAME += ".genh"
log NAME 0 SIZE MEMORY_FILE
startfunction deinterleave
xmath PSIZE "CYCLES * WSIZE + LASTINT"
for i = 1 <= LAYERS
if i == 1
putVarChr MEMORY_FILE2 PSIZE 0
log MEMORY_FILE2 0 0
elif i == 2
putVarChr MEMORY_FILE3 PSIZE 0
log MEMORY_FILE3 0 0
endif
xmath BIAS_A "(i - 1) * WSIZE" # bias at start
xmath BIAS_B "BLOCKSIZE - BIAS_A - WSIZE" # bias at end
xmath RES_BIAS_A "(i - 1) * LASTINT"
xmath RES_BIAS_B "LASTBLOCK - RES_BIAS_A - LASTINT"
goto HEADER
for k = 1 <= CYCLES
getDstring DUMMY BIAS_A
getDstring WDATA WSIZE
if i == 1
putDstring WDATA WSIZE MEMORY_FILE2
elif i == 2
putDstring WDATA WSIZE MEMORY_FILE3
endif
getDstring DUMMY BIAS_B
next k
if LASTBLOCK != 0
getDstring DUMMY RES_BIAS_A
getDstring WDATA LASTINT
if i == 1
putDstring WDATA LASTINT MEMORY_FILE2
elif i == 2
putDstring WDATA LASTINT MEMORY_FILE3
endif
getDstring DUMMY RES_BIAS_B
endif
next i
endfunction
startfunction GENH
get SIZE1 asize MEMORY_FILE2
get SIZE2 asize MEMORY_FILE3
xmath SIZE "SIZE1 + SIZE2" # stream size
xmath PRE_SIZE "SIZE + 0xc0"
putVarChr MEMORY_FILE SIZE 0
log MEMORY_FILE 0 0
putVarChr MEMORY_FILE 0 0x484e4547 long # "GENH"
putVarChr MEMORY_FILE 4 CH long # ch
putVarChr MEMORY_FILE 8 INTERLEAVE long # interleave
putVarChr MEMORY_FILE 0xc FREQ long
putVarChr MEMORY_FILE 0x10 0xffffffff long
putVarChr MEMORY_FILE 0x14 NOS long # number of samples
putVarChr MEMORY_FILE 0x18 0xc long # ?
putVarChr MEMORY_FILE 0x1c 0xc0 long # stream start
putVarChr MEMORY_FILE 0x20 0xc0 long # stream start
putVarChr MEMORY_FILE 0x24 0x80 long # coeff1
putVarChr MEMORY_FILE 0x28 0xa0 long # coeff2
putVarChr MEMORY_FILE 0x2c 1 long
putVarChr MEMORY_FILE 0x34 0x80 long # coeff1
putVarChr MEMORY_FILE 0x38 0xa0 long # coeff2
putVarChr MEMORY_FILE 0x7f 0 byte
append
log MEMORY_FILE OFF_COEFF1 0x20
log MEMORY_FILE OFF_COEFF2 0x20
append
endfunction
startfunction reinterleave
get LOOPS asize MEMORY_FILE2
xmath LOOPS "LOOPS / INTERLEAVE"
set OFFSET 0
for i = 1 <= LOOPS
goto OFFSET MEMORY_FILE2
getdstring VAR INTERLEAVE MEMORY_FILE2
putdstring VAR INTERLEAVE MEMORY_FILE
goto OFFSET MEMORY_FILE3
getdstring VAR INTERLEAVE MEMORY_FILE3
putdstring VAR INTERLEAVE MEMORY_FILE
math OFFSET += INTERLEAVE
next i
endfunction