mirror of
https://github.com/Skeli789/Dynamic-Pokemon-Expansion.git
synced 2026-03-22 09:44:17 -05:00
124 lines
3.0 KiB
Python
124 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
|
|
############
|
|
#Options go here.
|
|
############
|
|
|
|
ROM_NAME = "BPRE0.gba" #The name of your rom
|
|
OFFSET_TO_PUT = 0x1800000
|
|
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 for example 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()
|
|
|