lostkefin/extract.py
2025-05-10 03:16:13 -04:00

116 lines
3.2 KiB
Python

# todo: extract all the files into their appropirate folders (using fileorder)
# also turn the functions into while loops? pass start and end address
import os
slpm = open("extracted/SLPM_663.60", "rb")
logfile = open("logfile.txt", "w", encoding="shift-jis")
baseptr = 0xFFF80
sector = 0x800
filenamesize = 32
terminator = "\x00"
def extractfile(address, file):
os.makedirs(f"{file}", exist_ok=True)
datafile = open(f"extracted/{file}.BIN", 'rb')
slpm.seek(address)
filenameptr = slpm.read(4)
filesize = slpm.read(4)
filesectorstart = slpm.read(4)
filesectorsize = slpm.read(4)
filenameptr = int.from_bytes(filenameptr, "little")
filesize = int.from_bytes(filesize, "little")
filesectorstart = int.from_bytes(filesectorstart, "little")
filesectorsize = int.from_bytes(filesectorsize, "little")
filenameloc = filenameptr - baseptr
slpm.seek(filenameloc)
filename = slpm.read(filenamesize)
filename = filename.decode(encoding="shift-jis", errors="backslashreplace")
filename = filename[:filename.find(terminator)]
filesectorstart = filesectorstart * sector
filesectorsize = filesectorsize * sector
datafile.seek(filesectorstart)
filedata = datafile.read(filesize)
newfile = open(f"{file}/{filename}", "wb")
newfile.write(filedata)
newfile.close
return f"Address: {address:X}\tFile name: {filename}\tFilename location: {filenameloc:X}\tFilename pointer: {filenameptr:X}\tFile size: {filesize:X}\tFile data start in {file}.BIN: {filesectorstart:X}\tFile data sector size: {filesectorsize:X}"
fileorder = 0
fileptrstart = 0x001829D0
fileptrend = 0x001875E0
fileptr = fileptrstart
logfile.write("\nDATA.BIN Files\n\n")
while fileptr < fileptrend:
logfile.write(f"{extractfile(fileptr, "DATA")}\tindex {fileorder}\n")
fileptr += 16
fileorder += 1
def extractfolder(address, file):
slpm.seek(address)
foldernameptr = slpm.read(4)
folderorderstart = slpm.read(4)
foldercount = slpm.read(4)
foldernameptr = int.from_bytes(foldernameptr, "little")
folderorderstart = int.from_bytes(folderorderstart, "little")
foldercount = int.from_bytes(foldercount, "little")
foldernameloc = foldernameptr - baseptr
slpm.seek(foldernameloc)
foldername = slpm.read(filenamesize)
foldername = foldername.decode(encoding="shift-jis", errors="backslashreplace")
foldername = foldername[:foldername.find(terminator)]
os.makedirs(f"{file}/{foldername}", exist_ok=True)
return f"Address: {address:X}\tFolder name: {foldername}\tFoldername location: {foldernameloc:X}\tFilename pointer: {foldernameptr:X}\tFolder Order start {folderorderstart}\tFolder file count: {foldercount}\n"
logfile.write("\nDATA.BIN Folders\n\n")
folderptrstart = 0x001875E0
folderptrend = 0x00187A18
folderptr = folderptrstart
while folderptr < folderptrend:
logfile.write(f"{extractfolder(folderptr, "DATA")}")
folderptr += 12
# DATA0.BIN extractions
fileorder = 0
fileptrstart = 0x187A40
fileptrend = 0x18E7C0
fileptr = fileptrstart
logfile.write("\nDATA0.BIN Files\n\n")
while fileptr < fileptrend:
logfile.write(f"{extractfile(fileptr, "DATA0")}\tindex {fileorder}\n")
fileptr += 16
fileorder += 1