ROM Hack Upgraded Fire Emblem Fates Randomizer


New Member
Dec 17, 2019
This is a barbaric but working improvement of thane89's Fire Emblem Fates Randomizer. The repository can be found by searching Upgraded Fire Emblem Fates Randomizer on Google, clicking on the first Reddit link and following the link to the Github repository (I do not have enough posts to share the link...).


On the one hand, I refined the randomizer's algorithm in order to provide a more enjoyable game experience. The biggest selling point is the possibility to do a pseudo-Pick My Unit run: if you wish, you can limit yourself to the first 16 units recruited with their classes locked to the ones shown in the ClassSpread.csv file generated by the script.

On the other hand, I set out to upgrade the whole Fire Emblem experience by rebalancing weapons and adding several quality of life improvements. Those upgrades are completely optional.

Randomizer Features
  • Each character now gets the stats they would have if they had been assigned the randomized class from the start.
    • For instance, if Ryoma is put in Hinata's recruitment spot (so he will be Lvl 9) and assigned the Archer class, then his stats will be his Lvl 1 stats adjusted with 8 levels of (Ryoma's base growths + Archer class growths);
  • Characters with weak growth rates (Gunter, Fuga, Setsuna, Nyx...) can be buffed so that their total growth rates are at least a certain value (default: 270);
  • In counterpart, it is possible to decrease their total base stats to a certain value to keep things balanced (default: 25).
  • Fuga becomes completely busted if this is not done.
  • Similar to the original randomizer, stats will be shuffled a bit. The default settings are:
    • 10 passes per character, with each pass having:
      • 100% chance of shuffling 5% of growths
      • 50% chance of shuffling 1 stat point
      • 25% chance of shuffling 1 modifier point
  • Random swaps of stats / growths / mods can occur (always all three, except for Lck):
    • Str / Mag (default: according to class)
    • Skl / Spd (default: 20% chance)
    • Def / Res (default: 20% chance)
    • Lck / ? (default: [Lck Growth]% chance, only if Lck stat / growth / mod is superior)
  • Fixed skill randomization and removed unbalanced ones (Aptitude (108), Bold Stance (120), Point Blank (121), Winged Shield (122), Paragon (138), Armor Shield (139), Beast Shield (140), Taker Skills (142->148), Ballistician skills (149->152), Warp (154))
  • "Catch 'em all" mode: minimize duplicate final classes according to the chosen route

Upgraded Fates Features
  • I took the freedom to integrate the Expanded Same-Sex Marriage patch by UnassumingVenusaur and the Good Guy Garon Edition patch by AgahnimD
  • Dawn / Dusk Armories and Rod / Staff shops available in every route
  • Changes to weapon triangles: Tome <-> Axe, Dagger <-> Sword, and Bow <-> Lance become neutral
    • Rationale: range weapons can already hit melee weapons without retaliation so they shouldn't have weapon advantage on top of that
  • Weapon Ranks changed; in practice, every rank is matched with the one below. E-rank hell only lasts for one hit now!
    • D 21 -> 2
    • C 51 -> 22
    • B 96 -> 52
    • A 161 -> 97
    • S 251 -> 162
  • Weapon Updates: increased the difference between Hoshidan and Nohrian weapons, nerfed the hell out of those busted hidden weapons, doubled Staff Exp for convenience.
    • Swords, Lances, Yumis, Scrolls: +1 Mt, -5 Hit, -5 Avo
    • Katanas, Naginatas, Bows, Tomes: -1 Mt, +10 Hit, +5 Avo
    • Axes: +1 Mt, -5 Hit, -10 Avo
    • Clubs: -1 Mt, +5 Avo, +5 Crit
    • Daggers: -2 Mt, -5 Hit
    • Shurikens: -4 Mt, +5 Avo, -10 Hit, +5 Ddg
    • Staff: Staff Exp x2 for those listed
      • Heal 10 -> 12 Mt
      • Mend 20 -> 25 Mt
      • Physic 7 -> 9 Mt
      • Recover 35 -> 45 Mt
      • Fortify 7 -> 9 Mt
    • Rod: Staff Exp x2 for those listed
      • Bloom Festal 7 -> 4 Mt
      • Sun Festal 14 -> 10 Mt
      • Wane Festal 2 -> 1 Mt
      • Moon Festal 25 -> 20 Mt
      • Great Festal 2 -> 1 Mt



You will need to install Python, numpy and the xmltodict module. I advise using virtual environments but for the layman a simple

pip install numpy xmltodict

should do the trick.
The instructions can look daunting but once you understand how it works it takes fewer than 5 minutes to do. Some experience with Python and/or tinkering with files will obviously help though.

0. Begin by either cloning the repository or downloading and extracting its zip.
1. First, choose which version of Fates you want to play:
  • Vanilla Fates: for copyright-related reasons, you will have to dump your own romfs. Follow the instructions in thane89's original thread.
  • Gay Fates: Vanilla Fates patched with vastly expanded supports. This is very welcome since randomization doesn't touch supports. Extract fates_gay_decompressed.7z.
  • Upgraded Gay Fates: Gay Fates patched with my curated upgrades listed above. Extract fates_gay_upgraded_decompressed.7z.
  • Good Guy Garon Upgraded Gay Fates (recommended): Upgraded Gay Fates with the Good Guy Garon Edition patch. Extract fates_gay_upgraded_GGG_decompressed.7z.
The extracted folder will be referred to as the "romfs" folder.
2. Run Fates Randomizer Beta 5-5.jar, click "Open and Verify", and select the romfs folder. You should see a new window pop up with options. If you do not, the window will show you which file was not found. Make sure that the selected folder has folders named castle, GameData, m, Scripts directly inside it.
3. Select a path and options. Refer to the original readme below if you do not understand an option. I recommend selecting All Routes (even if you plan to play Birthright or Conquest, the Python script has route options too) and all options except the experimental ones and the stat randomization.
4. Hit "Randomize" and let the program sit. When the program finishes, a little notification will pop up in the corner of the window.
5. Close Fates Randomizer Beta 5-5.jar.
6. Copy the `RandomizerSettings.xml` file from the romfs folder to the data folder.
7. Open a command prompt in the same folder as Run


  • If you want to know about the options, type:
python -h
  • Refer to the section "All Options" below for the details.
  • If you did not select the option "Anna" / "Amiibo characters" / "Children" in the randomizer, you have to use the options -ba / -bac / -bc respectively.
8. If the script ran successfully, you should have two files named RandomizerSettingsUpdated.xml and ClassSpread.csv in the data folder. Otherwise, try to run one more time, and if it fails again, raise an issue on this repository.
  • ClassSpread.csv contains on each line the original character, their replacement and the class assigned to the replacement. I recommend respecting the file's assignements for more fun and challenge.
  • RandomizerSettingsUpdated.xml contains the detailed information of the randomized run. For each character, the StringData and ClassData fields are tied to the character while the other fields are tied to their spot. If Ryoma has as "switchingCharacter" Hinata, he will have the stats that are written in Hinata's `Stats` field (but those stats will have been computed as Ryoma's "expected" stats at this spot). I recommend not looking at it for more fun.
10. Delete the romfs folder and repeat steps 1-5 but, in step 3, choose "Custom Path" and select RandomizerSettingsUpdated.xml. Don't forget to check the "Join Order" options again if you did previously.
11. Close Fates Randomizer Beta 5-5.jar. Open FEAT.exe. Drag the romfs folder into FEAT: this will recompress the files. Once FEAT is done, you can close it.
12. Phew! You're done! Now you can copy your roms folder to the mods folder of your gaming medium.
13. As a final note, DO NOT use this on top of an existing save or branch of fate. Use a fresh save starting from the very beginning if you want a stable playthrough.

All Available Options

Please check the repository , it's horrible to reformat text on GBATemp.

Example Custom Run

python -ba -bac -bc -bdc -bssmax 25 -bssmin 15 -dms -elsc -esc -g "Conquest" -gsmax 370 -gsmin 270 -mc 5 -ns 3 -rsgs

This example command will ensure the following:
- Anna will not be randomized
- neither will Amiibo characters
- neither will children characters
- DLC classes will be banned
- all units will have a total Lvl 1 base stats sum randomly sampled between 15 and 25
- unit models will not be swapped, i.e. they will appear as the original unit
- there will only be 2 staff-only characters (the retainer and an early recruit)
- Corrin will have a sword-wielding final class
- only Conquest replacement units will be updated; in particular, they should all have different final classes (except maybe children).
- all units will have a total growth rates sum randomly sampled between 270 and 370
- all unit stat modifiers will be increased by 5
- all units will have 3 randomized skills


Chapter 2: There's an immobile "phantom" unit near the top left corner!

This sometimes happens. Just kill it after the others, you should be able to.

Chapter 5: This chapter is way too hard!
I advise using the Infinite Movement cheat code for this chapter. If you can play Randomized Fates, you can probably find how to use cheats on your gaming medium.

Conquest Chapter 9: Talking with Nyx crashes the game!

Break the wall near Nyx before talking to her.

Revelations Chapter 8: Hayato was not replaced!

This is an issue from the original randomizer; I can't fix it myself. This can amusingly lead to recruiting two Hayatos.
  • Like
Reactions: nxwing and thane98
General chit-chat
Help Users
    KennieDaMeanie @ KennieDaMeanie: And triggers