mzm/tools/extractor.py

61 lines
1.5 KiB
Python
Raw Normal View History

2022-09-24 15:42:57 +00:00
from array import array
from io import BufferedReader
import shutil
2022-09-25 19:05:36 +00:00
import os
2022-09-24 15:42:57 +00:00
2022-09-24 20:19:02 +00:00
DATA_PATH = "data/"
2022-09-24 15:42:57 +00:00
subDirs: array = [
2022-09-25 19:56:27 +00:00
"sprites/",
2022-12-24 16:07:17 +00:00
"hud/",
2023-01-28 14:42:10 +00:00
"weapons/",
2023-01-31 15:44:13 +00:00
"common/",
2023-02-01 13:50:25 +00:00
"intro/",
"cutscenes/",
"cutscenes/KraidRising/",
"cutscenes/StoryText/",
2023-02-04 17:27:37 +00:00
"cutscenes/RidleyInSpace/",
2023-02-03 17:52:02 +00:00
"cutscenes/RidleyLanding/",
"cutscenes/RidleySpawn/",
"cutscenes/MechaSeesSamus/",
"cutscenes/GettingFullyPoweredSuit/",
2023-02-06 21:56:29 +00:00
"cutscenes/BeforeCharlie/",
2023-02-07 09:39:28 +00:00
"cutscenes/StatueOpening/",
2023-02-28 15:30:57 +00:00
"menus/",
2023-02-28 21:03:51 +00:00
"menus/TitleScreen/",
"menus/EraseSram/",
2022-09-24 15:42:57 +00:00
]
2022-09-25 19:05:36 +00:00
try:
shutil.rmtree(DATA_PATH, ignore_errors=False, onerror=None)
except:
pass
2022-09-24 15:42:57 +00:00
2022-09-25 19:05:36 +00:00
# Create directories
os.mkdir(DATA_PATH)
for dir in subDirs:
os.mkdir(DATA_PATH.__add__(dir))
2022-09-24 15:42:57 +00:00
2022-09-24 20:19:02 +00:00
rom: BufferedReader = open("mzm_us_baserom.gba", "rb")
db: BufferedReader = open("database.txt", "r")
2022-09-24 15:42:57 +00:00
line: str = db.readline()
while line != '':
2022-09-25 19:05:36 +00:00
# Formatted as follows : name;length;address;size
2022-09-24 20:19:02 +00:00
# The symbol # can be used as the first character of a line to make the extractor ignore it
if line[0] != '\n' and line[0] != '#':
info: array = line.split(";")
2022-09-25 19:05:36 +00:00
name: str = info[0]
print("Extracting", name)
2022-09-24 20:19:02 +00:00
rom.seek(int(info[2], 16))
2022-09-25 19:05:36 +00:00
size: int = int(info[3])
output: BufferedReader = open(DATA_PATH.__add__(name), "ab")
for x in range(0, int(info[1])):
output.write(int.from_bytes(rom.read(size), "little").to_bytes(size, "little"))
2022-09-24 20:19:02 +00:00
output.close()
2022-09-24 15:42:57 +00:00
line = db.readline()
rom.close()