Pokémon Heart & Soul
HeartGold and SoulSilver rebuilt from scratch on the modern pokeemerald-expansion engine: the whole of Johto, a complete Kanto post-game, and bonus areas from as far afield as Alola.
More about the game
Heart & Soul is a from-scratch Game Boy Advance decompilation remake of Pokémon HeartGold and SoulSilver, built on the Rom Hacking Hideout's pokeemerald-expansion engine rather than as a ROM hack of any existing GBA game. Johto plays out in full, followed by a complete Kanto post-game across all 16 gyms, and the adventure keeps going afterward through Mt. Silver, Trainer Hill, the Sinjoh Ruins, the Battle Frontier and a set of bonus areas that reach as far as Alola. Species, moves and abilities are current through the modern generations the engine supports, with the physical/special split and every trainer built with real held items, abilities and movesets.
What's different, point by point
- The whole of Johto followed by a complete, 8-gym Kanto post-game
- Every trainer rebuilt with held items, abilities and real movesets
- Modern-generation species, types (Fairy included) and the physical/special split
- Bonus post-game areas beyond Kanto, including a Sinjoh Ruins you can actually walk through and an Alola-set side region
- Built on the Rom Hacking Hideout's pokeemerald-expansion engine
LilDill
This guide is built from LilDill's own documentation. The game, the ideas and the work are theirs — the site just makes the numbers searchable. Play it from the official page, and send them the feedback and the thanks.
What this guide covers
Every guide here is built from the game's own documentation. Where a ROM hack changed something but never published the numbers, this says so rather than quietly filling the gap with the original game's — which would be worse than leaving it out.
| Section | Source | |
|---|---|---|
| Wild Pokémon by area | From the game itself | |
| Encounter rates | From the game itself | Slot rates come from this hack's own encounter_rates arrays in src/data/wild_encounters.json, so every table's percentages are this build's real numbers. |
| Wild levels | From the game itself | Wild levels are real, absolute numbers straight out of wild_encounters.json — confirmed live against ChooseWildMonLevel() in src/wild_encounter.c, which rolls within this same min–max range and never rescales it to the player's own team. the encounter code |
| Stats, abilities and movesets | From the game itself | |
| TM and HM compatibility | From the game itself | |
| Where TMs are found | From the game itself | TM, HM and rod locations are read from the map scripts — both a direct giveitem/finditem pickup and a Poke Mart's own stock list count. 1 of this hack's 100 TMs and HMs are neither handed out nor sold anywhere this converter's source tree can see — those rows say so rather than guessing a spot. |
| Trainer and boss teams | From the game itself | Rosters — species, held item, ability, level and four moves — are complete for every trainer this build actually places on a map, read straight from trainers_hns.party. |
Credits
- Pokémon Heart & Soul: LilDill
- The hack's source, which every number in this guide is read from: LilDill
- Heart & Soul's development team (per the game's own in-game credits): InfiniteBacon42, Exclsior, TixoRebel, Phantonomy, DaniRainbow, Resetes, Jozuno, Skeletonkey36, Pinny and Grintoul
- Modern Emerald, the earlier decomp base Heart & Soul was originally built on before moving to pokeemerald-expansion: resetes12
- pokeemerald, the Emerald decompilation this hack (via pokeemerald-expansion) is built on: the pret team
- pokeemerald-expansion, the engine branch Heart & Soul extends: Rom Hacking Hideout
- Sprites via PokéAPI; base move and TM data from PokéAPI and Bulbapedia.
Reading the tables
KantoKanto exists twice in this hack's source: an unmodified leftover import of the original FireRed/LeafGreen maps and trainers, and this hack's own rebuild layered over it. Only the rebuilt copy is ever reachable in-game, and that is the only copy this guide reads from.
LevelsEvery wild encounter and every trainer's Pokémon carries a real, fixed level straight out of the source — nothing in this game scales to your own team. ChooseWildMonLevel() in src/wild_encounter.c rolls a plain min–max range for wild Pokémon (a Lure only pushes that roll to the top of the range), and every Pokémon in every trainer's own .party file is written with an absolute Level. The one level-changing option this game ships, a Level Cap setting (Off/Easy/Hard), only clamps how high the player's own party can level up — confirmed in src/caps.c — and never touches a wild table or a trainer's roster.
RatesEncounter percentages are the real slot rates from this hack's own encounter tables, with duplicate slots for the same Pokémon at the same level added together. * marks anything at 5% or less.
RivalYour rival's name is chosen by the player at the start of the game, so it isn't a fixed value in the source and isn't printed here. Their team always counters your own starter (their Chikorita/Cyndaquil/Totodile branch is whichever one beats yours), shown here as the three separate rosters this hack actually writes for that fight.
TogglesThis build ships dozens of optional gameplay toggles in its options menu on top of the base game — Gen 1-3 vs. Gen 4+ physical/special split, Fairy type on/off, finite or infinite TMs, IV/EV/Nature scaling by badge count, a full Gen 1-9 species randomizer, Nuzlocke-style modes and more. All of them are optional and off by default; this guide publishes the numbers a brand-new save starts with rather than trying to model every combination.
TrainersRosters — species, held item, ability, level and moves — come straight from trainers_hns.party, this hack's one real trainer file (Johto and Kanto both). A same-named trainer fought more than once at their own gym with a visibly larger team (Chuck, Pryce and Jasmine each have three separate, mandatory encounters) is numbered (1)/(2)/(3) here rather than shown once; a genuine rematch — every gym leader can be refought post-game in Saffron City's Fighting Dojo — is marked as one rather than folded into the story fight.