mirror of
https://github.com/CraftyBoss/SuperMarioOdysseyOnline.git
synced 2024-11-22 19:25:16 +00:00
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
|
import sys, os
|
||
|
|
||
|
subsdk0Offset = {
|
||
|
"310" : 0x48DF000
|
||
|
}
|
||
|
|
||
|
DEFAULT_VERS = "310"
|
||
|
SOURCE_DIR = "source"
|
||
|
HOOK_MAGIC = "// hook_from "
|
||
|
|
||
|
def calcJump(from_addr_str, dest_func, vers=DEFAULT_VERS):
|
||
|
from_addr = int(from_addr_str, 16)
|
||
|
dest_func = dest_func + "("
|
||
|
|
||
|
mapFilePath = "build" + vers + "/starlight" + vers + ".map"
|
||
|
with open(mapFilePath, 'r') as f:
|
||
|
mapFile = f.read()
|
||
|
|
||
|
foundPos = mapFile.find(dest_func) - 34
|
||
|
foundLine = mapFile[foundPos:mapFile.find("\n", foundPos)]
|
||
|
|
||
|
print("Found:")
|
||
|
print(foundLine)
|
||
|
|
||
|
func_addr = int(foundLine[:foundLine.find(" ")], 0)
|
||
|
jump_offset = subsdk0Offset[vers] + func_addr - from_addr
|
||
|
print("Jump needed: " + hex(jump_offset))
|
||
|
|
||
|
if len(sys.argv) > 3:
|
||
|
calcJump(sys.argv[1], sys.argv[2], sys.argv[3])
|
||
|
elif len(sys.argv) > 2:
|
||
|
calcJump(sys.argv[1], sys.argv[2])
|
||
|
else:
|
||
|
hasOutput = False
|
||
|
for root, subdirs, files in os.walk(SOURCE_DIR):
|
||
|
for file in files:
|
||
|
with open(root+"/"+file, 'r') as f:
|
||
|
file_iter = iter(f.readlines())
|
||
|
for line in file_iter:
|
||
|
if HOOK_MAGIC in line:
|
||
|
hook_addr = line[len(HOOK_MAGIC):-1]
|
||
|
line = next(file_iter)
|
||
|
hook_func = line[:line.find('(')]
|
||
|
hook_func = hook_func[hook_func.rfind(' ') + 1:]
|
||
|
calcJump(hook_addr, hook_func)
|
||
|
hasOutput = True
|
||
|
|
||
|
if not hasOutput:
|
||
|
print("Usage: %s [from addr] [to func name] (s2 vers, like '310')" % sys.argv[0])
|