Helps benched characters keep up in Fire Emblem: Three Houses without boosting the units you actually deploy.
- Fire Emblem: Three Houses 1.2.0, Build ID
89048449BA238C8CF565518B83BF02D3 - The FE3H-specific Skyline loader, such as Aldebaran
Back up your saves before installing the plugin.
Download the NRO or installable ZIP from Releases. With the FE3H Skyline loader already installed, copy the NRO to:
sdmc:/atmosphere/contents/010055D009F78000/romfs/skyline/plugins/feth-bench-exp.nro
Fully restart the game after installation. To disable the plugin, remove the NRO and restart the game. The ZIP contains this plugin only, not the Skyline loader. Do not replace other plugins when merging directories.
On Eden, merge the ZIP into the emulator's emulated SD card, not its
ordinary game-mod folder. On Windows, this is typically %AppData%\eden\sdmc.
The ZIP contains this plugin only; it does not include the Skyline loader.
Fully restart Eden after installation. To disable it, remove the NRO and
restart the emulator. Do not replace other plugins when merging directories.
On the normal battle-result exit path, the plugin captures the IDs of actual player-side fighters and adjutants from the battle actors before cleanup. After the game writes those actors back and finishes cleanup, it calculates the integer average of the settled levels of those fighters and subtracts 3 by default. Save deployment flags cleared during cleanup do not change the captured roster. Eligible bench units and adjutants below the floor are then brought up to it; adjutants keep their normal battle EXP first. Units already at or above the floor are unchanged. Dead, unavailable, and unrecruited units are excluded. Actual fighters never receive catch-up EXP.
Each initialized battle can trigger catch-up only once. Retreat and the alternative event/rewind exit paths do not grant catch-up. Missing or duplicate fighter records, a changed save pointer, or an empty valid fighter roster cause catch-up to be skipped rather than calculating from a partial roster. The old, repeatedly invoked stage-clear UI activation hook is no longer used.
EXP is granted one level at a time through the game's 1.2.0 EXP/level-up
function. The plugin does not directly write a unit's level or change skill
EXP, class mastery, support points, or weapon ranks. It makes no save metadata
of its own, but any earned EXP and stat gains can be saved normally and are not
undone by removing the plugin. It is designed to coexist with
feth-fixed-growths: the
game's level-up function calls the fixed-growth hook if both are active.
Next-level EXP is read from the game's table as a positive 16-bit value. Version 0.2.0 removes an incorrect 1,000-EXP validation cap in earlier releases, which stopped catch-up around level 29. Table and pointer checks remain in place, and every EXP call must advance exactly one level before continuing.
Put feth-bench-exp.cfg in the root of the console's SD card (or the
emulator's virtual SD card), not alongside the NRO:
level_gap=3
diagnostic_log=true
log_max_kib=2048All settings are optional. level_gap accepts 0–99; 0 catches bench units up
to the rounded-down deployed average. It works even with logging disabled.
diagnostic_log defaults to false. log_max_kib accepts 64–65536 KiB and
defaults to 2048 KiB (2 MiB). Existing files containing only diagnostic_log
remain supported. Missing or invalid configuration uses the defaults.
Fully restart the game (and the emulator, if used) after changing settings.
When enabled, the plugin writes to sdmc:/feth-bench-exp.log. Once the size
limit is reached, it drops the oldest complete lines, keeps roughly the newest
half, and continues writing. An existing oversized log is trimmed the same way.
It does not stop logging just because the file is full.
The log includes:
- Game version, every executable signature check, and whether the hook was installed. A signature mismatch includes its offset, expected instruction, and actual instruction.
- Battle initialization, each battle-exit entry, its exit mode, and whether
catch-up was armed. The log header uses
diagnostic_schema=2. - Captured battle actor IDs and normalized role flags, followed by the frozen fighter IDs, settled level sum and count, rounded-down average, gap, target floor, and number of recipients. Adjutants are distinguished from ordinary bench recipients.
- Every save roster slot's character ID, level, EXP, and raw flags after the game's writeback/cleanup, before and after catch-up.
- Each next-level threshold and EXP amount passed to the game's EXP function, its observed result, and any reason catch-up stopped.
- Reasons catch-up was skipped or stopped. These observations do not prove that a later manual save and reload persist the change.
For example, the default gap with a deployed average of 20 produces a target
of 17. A bench unit already at level 17 will not gain EXP. If the file contains
startup checks but no battle_exit entries after leaving the result screen, the selected hook
did not run; if there are entries, the plan and per-unit reasons show why
catch-up did or did not happen.
The logger uses a separate SD mount from the durability plugin. Logging may
slow the game; set diagnostic_log=false and fully restart when diagnostics
are no longer needed. A log-file I/O failure stops logging, not catch-up EXP.
Win one ordinary battle with logging enabled, check the bench units afterward,
then send feth-bench-exp.log and the emulator log if available. No action-by-action
notes are needed. If no file appears, the emulator log is needed to distinguish
a plugin load failure from an incorrect SD path or a file I/O error.
- Back up a save, then record one deployed unit's level and one low-level bench unit's level, EXP, and stats.
- Win one short battle without deploying the bench unit. Include an adjutant if possible.
- Leave the stage-clear/result screens, then manually save and check whether the bench
unit rose toward
floor(deployed average) - level_gap; deployed units should get only their original EXP. - Reload that save and confirm that the levels and stats persist. If the game
crashes, remove only
feth-bench-exp.nro, keep the backed-up save, and provide Eden's log and the point of failure.
The v0.1.3 timing change is checked against the 1.2.0 executable and covered by host regression tests, including the cleared-flags and low-level-adjutant cases. Hardware/emulator save-and-reload verification is still required.
This is an independent implementation. These projects provided public technical references or runtime tooling; their source and assets are not included here.
- Aldebaran — FE3H Skyline loader and runtime research.
- Progenitor — public FE3H save-structure reference.
- skyline-rs — plugin runtime.
Fire Emblem and related names are trademarks of Nintendo and Intelligent Systems. This unofficial fan project is not affiliated with or endorsed by them.
MIT License © jinghaihan