papermario/tools/old/migrate_effect_rodata.py
Ethan Roseman 8837fbdf65
Player sprites & more (#1055)
* WIP work on sprites (sprite_stuff.py)

* cleanup of various stuff

* separate compiler installation into separate script

* wipz

* more

* renames, bugfixes

* more

* very grood

* cleanin

* goods and services

* oopth

* oopth2

* Parse palette data from xml

* more work

* more wipperz

* more

* it working

* git subrepo pull --force tools/splat

subrepo:
  subdir:   "tools/splat"
  merged:   "e72a868f9f"
upstream:
  origin:   "https://github.com/ethteck/splat.git"
  branch:   "master"
  commit:   "e72a868f9f"
git-subrepo:
  version:  "0.4.5"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "aa416e4"

* fix symbol_addrs for new splat

* upd8s

* Use generated header, other versions, fixes

* fixes & formatting

* wip fusing npc + player extraction & cleanup

* remove npc_files

* buildin

* fix some bugs

* Cleanup, yay0s separately

* cleen

* cleanup

* Respect stack during build

* jp spritz

* dun

* fix c files

---------

Co-authored-by: pixel-stuck <mathmcclintic@gmail.com>
2023-06-26 19:27:37 +09:00

150 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python3
import os
from pathlib import Path
script_dir = os.path.dirname(os.path.realpath(__file__))
root_dir = script_dir + "/../"
asm_dir = root_dir + "ver/current/asm/"
asm_effects_dir = asm_dir + "nonmatchings/effects/"
asm_data_dir = asm_dir + "data/effects/"
data_to_thing = {
"337F10": "sparkles",
"339F10": "shape_spell",
"33BB70": "gather_energy_pink",
"33D5D0": "drop_leaves",
"33EFE0": "dust",
"3407C0": "shattering_stones",
"342120": "smoke_ring",
"342FD0": "damage_stars",
"343F30": "explosion",
"345190": "lens_flare",
"345B10": "got_item_outline",
"34E710": "spiky_white_aura",
"34F480": "smoke_impact",
"352CB0": "purple_ring",
"354F20": "stars_burst",
"355D10": "stars_shimmer",
"3564E0": "rising_bubble",
"357380": "ring_blast",
"359320": "shockwave",
"35A580": "music_note",
"35BFB0": "smoke_burst",
"35C530": "sweat",
"35E8A0": "windy_leaves",
"35F0A0": "falling_leaves",
"360A10": "stars_spread",
"361640": "steam_burst",
"362C30": "stars_orbiting",
"365970": "green_impact",
"366C80": "radial_shimmer",
"36AE80": "ending_decals",
"36DE10": "light_rays",
"36ED30": "lightning",
"374D80": "shimmer_burst",
"375500": "energy_shockwave",
"376FC0": "shimmer_wave",
"37ACF0": "bulb_glow",
"37D140": "effect_3D",
"38A2F0": "firework",
"38BAB0": "confetti",
"38D040": "snowfall",
"38E8F0": "effect_46",
"38F6F0": "gather_magic",
"393080": "flashing_box_shockwave",
"3960C0": "floating_rock",
"397010": "chomp_drop",
"3BD770": "snowman_doll",
"3C1B60": "fright_jar",
"3CB7C0": "stop_watch",
"3CD670": "effect_63",
"3D11B0": "effect_65",
"3D2460": "tubba_heart_attack",
"3D3910": "whirlwind",
"3D4930": "red_impact",
"3D4E70": "floating_cloud_puff",
"3D5E60": "energy_in_out",
"3D7740": "shiny_flare",
"3D80B0": "huff_puff_breath",
"3D8F30": "cold_breath",
"3DBEA0": "embers",
"3DCD00": "hieroglyphs",
"3DED90": "misc_particles",
"3E11B0": "static_status",
"3E1CC0": "moving_cloud",
"3E5060": "firework_rocket",
"3E5ED0": "peach_star_beam",
"3EBC30": "chapter_change",
"3F8CA0": "ice_shard",
"3FA480": "spirit_card",
"3FF180": "lil_oink",
"4032A0": "something_rotating",
"403BB0": "breaking_junk",
"404E40": "partner_buff",
"407040": "quizmo_assistant",
"40A180": "ice_pillar",
"40BB70": "sun",
"40D130": "star_spirits_energy",
"412FD0": "pink_sparkles",
"413F20": "star_outline",
}
def handle_symbol(effect, symbol):
for root, dirs, files in os.walk(asm_effects_dir + effect + "/"):
for f_name in files:
if f_name.endswith(".s"):
f_path = os.path.join(root, f_name)
with open(f_path) as f:
asm_lines = f.readlines()
has_rodata_section = False
for line in asm_lines:
if ".section .rodata" in line:
has_rodata_section = True
continue
if symbol[1] in line:
if not has_rodata_section:
asm_lines.insert(3, ".section .rodata\n")
asm_lines.insert(4, "\n")
asm_lines.insert(5, ".section .text\n")
asm_lines.insert(6, "\n")
asm_lines.insert(5, f"dlabel {symbol[1]}\n")
asm_lines.insert(6, f"{symbol[2]}\n")
asm_lines.insert(7, "\n")
with open(f_path, "w", newline="\n") as f:
f.write("".join(asm_lines))
return True
return False
def handle_file(f_path):
with open(f_path) as f:
rodata_lines = f.readlines()[4:]
effect = f_path.split("/")[-1].split(".")[0]
symbols = []
for i in range(0, len(rodata_lines), 3):
l1 = rodata_lines[i].strip()
l2 = rodata_lines[i + 1].strip()
symbols.append((i + 4, l1.split()[1], l2))
for symbol in reversed(symbols):
if symbol[2].startswith(".word") and not symbol[1].startswith("jtbl_"):
print("skipping" + str(symbol))
continue
migrated = handle_symbol(data_to_thing[effect], symbol)
# Walk through asm files and rename stuff
print("Walking through asm files")
for root, dirs, files in os.walk(asm_data_dir):
for f_name in files:
if f_name.endswith(".data.s"):
f_path = os.path.join(root, f_name)
handle_file(f_path)