Dynamic-Pokemon-Expansion/scripts/make.py
Skeli 7e9cdd31a6 Hisuian Pokemon
-Also add code to use alternate form dex species names
2022-09-11 21:48:18 +03:00

124 lines
3.0 KiB
Python

#!/usr/bin/env python3
import os
import shutil
import sys
############
# Options go here.
############
ROM_NAME = "Pokemon Unbound.gba" # The name of your rom
OFFSET_TO_PUT = 0x1650000
SEARCH_FREE_SPACE = False # Set to True if you want the script to search for free space
# Set to False if you don't want to search for free space as you update the engine
#############
# Options end here.
#############
###############
# Functions start here.
###############
def MakeOffset0x100Aligned(offset: int) -> int:
while offset % 16 != 0:
offset += 1
return offset
def FindOffsetToPut(rom, neededBytes: int, startOffset: int) -> int:
offset = startOffset
rom.seek(0, 2)
maxPosition = rom.tell()
numFoundBytes = 0
while numFoundBytes < neededBytes:
if offset + numFoundBytes >= maxPosition:
print("End of file reached. Not enough free space.")
return 0
numFoundBytes += 1
rom.seek(offset + numFoundBytes)
if rom.read(1) != b'\xFF':
offset = MakeOffset0x100Aligned(offset + numFoundBytes)
numFoundBytes = 0
return offset
def ChangeFileLine(filePath: str, lineToChange: int, replacement: str):
with open(filePath, 'r') as file:
copy = file.read()
file.seek(0x0)
lineNum = 1
for line in file:
if lineNum == lineToChange:
copy = copy.replace(line, replacement)
break
lineNum += 1
with open(filePath, 'w') as file:
file.write(copy)
def EditLinker(offset: int):
ChangeFileLine("linker.ld", 4, "\t\trom : ORIGIN = (0x08000000 + " + hex(offset) + "), LENGTH = 32M\n")
def EditInsert(offset: int):
ChangeFileLine("./scripts/insert.py", 10, "OFFSET_TO_PUT = " + hex(offset) + '\n')
ChangeFileLine("./scripts/insert.py", 11, 'SOURCE_ROM = "' + ROM_NAME + '"\n')
def BuildCode():
if shutil.which('python3') is not None:
result = os.system("python3 scripts/build.py")
else:
result = os.system("python scripts/build.py")
if result != 0: # Build wasn't sucessful
sys.exit(1)
def InsertCode():
if shutil.which('python3') is not None:
os.system("python3 scripts/insert.py")
else:
os.system("python scripts/insert.py")
def ClearFromTo(rom, from_: int, to_: int):
rom.seek(from_)
for i in range(0, to_ - from_):
rom.write(b'\xFF')
##############
# Functions end here.
##############
def main():
try:
with open(ROM_NAME, 'rb+') as rom:
offset = OFFSET_TO_PUT
if SEARCH_FREE_SPACE is True:
offset = FindOffsetToPut(rom, 0x50000, MakeOffset0x100Aligned(offset))
EditLinker(offset)
EditInsert(offset)
BuildCode()
InsertCode()
rom.close()
except FileNotFoundError:
print('Error: Could not find source rom: "' + ROM_NAME + '".\n'
+ 'Please make sure a rom with this name exists in the root.')
if __name__ == '__main__':
main()