######################################################################
# NISPack_UnPack_v1.py
######################################################################
# Built to unpack files in NISPack dat format for La Pucelle: Ragnaraok [JPN]
# Run with python 2.7
# Last Update: 09/25/2013
######################################################################
import os, sys, struct, time
dTestTime = 0.0
dStartTime = time.time()
datfname = 'SCRIPTPACK.DAT' # hardcoded for now
headerName = 'SCRIPTPACK_header.dat'
datfile = open(datfname, 'rb')
scriptdir = os.path.dirname(sys.argv[0])
if scriptdir != '': os.chdir(scriptdir) # else we're started from Python console
try:
datfile = open(datfname, 'rb')
except IOError:
print "Extraction aborted: no SCRIPTPACK.dat file in the current directory"
exit()
datfile.seek(0,2)
endfile = datfile.tell()
foffset = 624
fheaderoffset = 2048
datfile.seek(16)
fentries = list()
for i in range(32):
fname = datfile.read(32).strip('\x00')
fstart = struct.unpack('I', datfile.read(4))[0]
datfile.read(8)
fentries.append([fname, fstart])
for i in range(31):
fend = fentries[i+1][1]
fentries.append(fend)
fentries[31].append(int(endfile))
datfile.read(foffset)
dumpdir = os.path.splitext(os.path.basename(datfname))[0]
dumpdir = os.path.join(scriptdir, dumpdir)
try:
os.mkdir(dumpdir)
except WindowsError: pass
os.chdir(dumpdir)
for fentry in fentries:
fname, fstart, fend = fentry
print os.path.join(dumpdir, fname)
dumpfile = open(fname, 'wb')
dumpfile.write(datfile.read(fend - datfile.tell()))
dumpfile.close()
# Write header file for packing
datfile.seek(0)
headerFile = os.path.join(dumpdir, headerName)
headerDump = open(headerFile, 'wb')
headerDump.write(datfile.read(fheaderoffset))
headerDump.close()
datfile.close()
dTestTime = time.time() - dStartTime
print
print "Total Test Time = %.3f sec" % dTestTime