# Your mods go here A mod **replaces a file by shadowing its path**. There is no manifest, no registration and no load order: if a file exists here at the same relative path it has in the export tree, the game reads yours instead. ``` export/sprites/title/main_menu/ptbtn01.png <- what the exporter wrote data/mods/sprites/title/main_menu/ptbtn01.png <- what the game will use ``` That works for **every** asset kind the port reads — a screen's JSON, a sprite PNG, a sound cue, the music bed, a movie — because every read goes through one resolver (`port/scripts/export_tree.gd`, `ExportTree.resolve`). Nothing under `export/` is ever touched, so **re-exporting from your disc is always safe**, and *"did I break it?"* is answered by moving your file out of this directory. Point the game somewhere else with `SYLPHEED_MODS=/path/to/tree`. ## The game tells you what you changed Every file a mod replaces is printed the first time it is read: ``` mod: sprites/title/main_menu/ptbtn01.png <- /work/data/mods/sprites/title/main_menu/ptbtn01.png ``` A modded run that looked identical to an unmodded one in the log would leave you with exactly one debugging tool — delete the mod and try again. ## Try it in ten seconds Replace the `NEW GAME` label with a magenta block. The size is the original's, `203x43`, and nothing here is derived from the disc: ```bash mkdir -p data/mods/sprites/title/main_menu ffmpeg -f lavfi -i "color=c=0xff00c8:s=203x43" -frames:v 1 -pix_fmt rgba \ data/mods/sprites/title/main_menu/ptbtn01.png godot --path port -- --menu ``` Delete the file to put it back. ## Nothing in here is committed `.gitignore` excludes everything in this directory except this README. That is deliberate: a mod is usually an *edited game asset*, and this repository never holds game assets — not in `export/`, and not here either. ## One tree, not a stack Several mods layering over each other would need a load order, and a load order needs a rule nobody has asked for yet. Today there is one override tree. If you want more, say so rather than assuming the port has an answer.