HomeGBA › Pokémon Heart & Soul
GBA · Pokémon HeartGold / SoulSilver · v2.0.4 · by LilDill

Pokémon Heart & Soul

109areas1,128Pokémon55bosses438trainers
What makes it different

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
Everything it changes →
Made by

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.

SectionSource
Wild Pokémon by areaFrom the game itself
Encounter ratesFrom the game itselfSlot 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 levelsFrom the game itselfWild 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 movesetsFrom the game itself
TM and HM compatibilityFrom the game itself
Where TMs are foundFrom the game itselfTM, 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 teamsFrom the game itselfRosters — 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

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.