Skip to content

Walk Red, Blue and Yellow from Lt. Surge into the Hall of Fame - #607

Merged
Decryptu merged 8 commits into
mainfrom
gen1-tutor-battle
Sep 10, 2026
Merged

Walk Red, Blue and Yellow from Lt. Surge into the Hall of Fame#607
Decryptu merged 8 commits into
mainfrom
gen1-tutor-battle

Conversation

@Decryptu

@Decryptu Decryptu commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Added

  • The story walk runs Red, Blue and Yellow from Lt. Surge into the Hall of Fame: Rock Tunnel, Erika, the Rocket Hideout and the SILPH SCOPE, Pokemon Tower and the POKé FLUTE, Route 12's SNORLAX, Koga, the Safari Zone's HM03 and HM04, Celadon Mart's FRESH WATER for Route 7's guard, Silph Co.'s LAPRAS and CARD KEY, the rival, Giovanni and the MASTER BALL, Saffron Gym, SURF down Route 19 and Route 20 through the Seafoam Islands, the Mansion's SECRET KEY, Blaine's quiz, Route 21 to Pallet, Viridian's gym, Route 22's gate, Route 23's guards and river, Victory Road's three boulder switches, the Elite Four, Lance and the Champion. 360 steps on Red and Blue, 361 on Yellow, all eight badges.
  • RomRegistry marks Red, Blue and Yellow playable, so the shelf offers Play on all three.
  • The world screen answers Generation 1's HallOfFamePC request with the induction and the credits, and the jp Init behind the Hall's save with a restart; a playthrough had ended on a prompt to press A.
  • The old man's catch tutorial on Red and Blue and Prof. Oak's Pikachu battle on Yellow: wBattleType maps onto the Dude's tutorial with the cartridge's own ball, back pic, cursor timings and outcome. Yellow's walk takes the Pikachu, the EEVEE ball and Damian's CHARMANDER and reaches Lt. Surge.
  • gen1_walk pins the catch training, the ghost MAROWAK both ways, the Safari gate's early leave and the card key door's flag; gen1_trainers pins the three coded trainer headers a cartridge carries; gen1_maps refuses a number marker in any map script and pins the Safari fee line; gen1_battle drives the tutor's throw on every cartridge.

Fixed

  • EndTrainerBattle zeroes wCurMapScript, which the silent call dropped: every Elite Four room's end-battle state, which calls it and prints on, stayed on itself and printed the after-battle line for ever.
  • DisplayTextID by id is hSpriteIndex too, so a map script opening a trainer's row fights the object of that index; Lance's trigger had asked for a wild Pokemon of species 0.
  • CinnabarIsland_Script sets BIT_CUR_MAP_LOADED_1 on every frame and nothing on the island reads it, so a load bit no callback of the map takes is no longer pending; the walk had never settled there.
  • A hidden event's text row can sit past every object's, as the Mansion's four switches do, and the text table was grown before the hidden rows were read, so the switches opened nothing.
  • PrintCardKeyText sets BIT_CUR_MAP_LOADED_1 behind the block, so the floor's callback flags the door on the next frame. The port flagged it on the next map load, and a second door opened elsewhere first overwrote wCardKeyDoorY: Silph Co. 3F's door shut again on the way back from 11F.
  • A text_bcd over a buffer the script wrote every byte of is filled at import: Yellow's Safari gate printed <NUM_CD3D> where Red spells ¥500, and HiddenCoins' two boxes printed <NUM_FFA0> on all three cartridges.
  • A trainer header's text can be machine code: Red's RocketHideoutB4FRocket3AfterBattleText, Lance's after-battle line and Yellow's end-battle text all decode as scripts now. The LIFT KEY had never appeared and EVENT_BEAT_LANCE had never been set.
  • wBattleResult at zero had no outcome row, so the tower's MAROWAK stood again after every won fight.
  • wSavedCoordIndex was written when a row was resolved rather than when its step was spent, so the Safari gate's "Leaving early?" asked for ever.
  • OverworldLoop reads wCurOpponent after the script has returned, so a battle request now stands behind the rest of its row; Yellow's initial catch training set its event before the throw and the ball could miss.
  • A Safari or tutorial battle keeps the back pic up and draws no player HUD; the Safari had been sending the lead out.
  • A plain map text row and a trainer header's lines are filled from the run's buffers, so Lt. Surge's receipt names TM24 and the Silph rival names the player.
  • Yellow's lab hands over the Pikachu and takes the parcel: wPartyMon1CatchRate is a silent store, DisablePikachuOverworldSpriteDrawing a silent call, and OaksLabScript_RemoveParcel's call reads like Red's jp.
  • tools/validate.gd runs its topics from the first _process, since the root is not in the tree during _initialize.

Changed

  • Cache format 132: Yellow's ProfOakPicBack is a third player_back slot, imported boxes carry their numbers, a hidden event's rows are read, and a state that calls EndTrainerBattle returns to the default one.
  • The story tool answers elevator_requested, vending_requested, hall_of_fame_requested, quick_save_requested and soft_reset_requested, plans through spin tiles, surfs and lands, pushes a Generation 1 boulder the way TryPushingBoulder moves it, falls through a dungeon hole, takes a pad that lands on its own map as arriving, plans around a cell whose script moved the player off it, and names a crossing's edge cell.

… Surge

`wBattleType` is read across onto Crystal's numbering at the wild-battle
node: BATTLE_TYPE_OLD_MAN and Yellow's BATTLE_TYPE_PIKACHU share
`DisplayBattleMenu`'s branch, so both are the Dude's tutorial with the raw
byte and its tutor on the request. `LoadPlayerBackPic`'s `ProfOakPicBack`
is Yellow's third `player_back` slot, which bumps the cache format.

- `StartBattle` sends the player out on a normal battle alone: a Safari or
  a tutor's fight keeps the back pic up and draws no player HUD. The
  Safari had been sending the lead out.
- The cursor `DisplayBattleMenu` and `DisplayListMenuIDLoop` draw
  themselves is the Dude's auto-input machine over the cartridge's own
  `DelayFrames`: 80, 50 and 80 on Red and Blue, 20 each on Yellow. The
  tutor's ball is the cartridge's POKE_BALL, not Crystal's.
- `ItemUseBall`'s `.oldManBattle` lands the ball except under Yellow's
  EVENT_INITIAL_CATCH_TRAINING, where `$63` breaks out and
  `wCapturedMonSpecies` ends the battle anyway.
- `OverworldLoop` reads `wCurOpponent` once the script has returned, so
  a row's battle stands behind the rest of the row.
- A tutor with no party stands on the fallback party, never written back.
- `_ItemUseText001` puts the item on the bottom row; `_ItemUseBallText05`
  is a `line` and a `cont`.
- `wStringBuffer` outlives the row that filled it: Lt. Surge's receipt
  had printed a bare marker where TM24 goes.
- Yellow's `OaksLabScript_RemoveParcel` ends on `call` and `ret`, its
  lab writes LIGHT_BALL_GSC over the starter's catch-rate byte and calls
  `DisablePikachuOverworldSpriteDrawing`; all three are read now, so the
  lab hands over PIKACHU and takes the parcel.
- The story walk takes Yellow's EEVEE ball, Damian's CHARMANDER for HM01
  and Yellow's own EVENT_GOT_DOME_FOSSIL, and reaches Lt. Surge.
- `validate.gd` runs its topics on the first frame: the root is not
  inside the tree in `_initialize`, so a screen a topic adds is never
  ready. `gen1_battle.gd` drives the five tutor fights on the real
  overlay that way.
Back up the Underground Path, Route 9 behind its tree, Rock Tunnel's four
ladders, Lavender Town, Route 8's Underground Path to Route 7, Celadon City
and the gym: four badges, 55 fights, 103 steps on all three cartridges.
Vermilion's gym tree stands again on the way out, since
`ReplaceTreeTileBlock` edits the tilemap alone, and is cut from inside the
fence; Rock Tunnel's route is the one `TilePairCollisionsLand`'s CAVERN
rows leave.
The story walk runs on from Erika to the poster's guard, four hideout
floors down to the LIFT KEY, the car to Giovanni and the SILPH SCOPE, the
car back up, Lavender's tower floor by floor past the rival, the
channelers and the ghost MAROWAK, and Mr. Fuji's POKé FLUTE, on all three
cartridges. Fixed at their seams and pinned in the checks:

- A trainer header's text can be machine code. Red's
  `RocketHideoutB4FRocket3AfterBattleText` is `text_asm` whole, Lance's
  after-battle text sets EVENT_BEAT_LANCE behind its line, and Yellow's
  end-battle text reaches the LIFT KEY's `ShowObject` behind a
  `text_promptbutton`. All three header texts decode as scripts now; the
  after one is resolved in place of the line and the end one runs behind
  the won fight. The LIFT KEY had never appeared and EVENT_BEAT_LANCE had
  never been set.
- `wBattleResult` at zero had no row in `GEN1_BATTLE_OUTCOMES`, so the
  tower's MAROWAK stood again after every won fight.
- A header's plain lines are filled the way a script's box is.
- The story tool plans through spin tiles, one edge per ride, and answers
  `DisplayElevatorFloorMenu` with a standing floor.
Route 12's SNORLAX wakes to the flute and is fought off the map script,
the two gates on Route 12 and Route 15 are crossed, Route 13 is left at
row 8 (its rows 4 and 6 end at Bird Keepers standing in one-cell
corridors, so a crossing may name its edge cell now), and Fuchsia's gym
gives the fifth badge on all three cartridges.
The gate's fee, areas 1, 2 and 3 to the secret house's HM03 and the GOLD
TEETH, back the same way, and the warden's HM04, on all three cartridges.
The Safari centre's tree lines split it three ways, so the entrance
reaches the east door alone.

`wSavedCoordIndex` was written when a row was resolved rather than when
its step was spent, and a `YesNoChoice` resolves both sides before the
answer, so the gate's "Leaving early?" always landed on the NO side's
state and asked again for ever. The run keeps its own copy now and the
world takes the step; `gen1_walk.gd` pins the early leave.
…card key door open

The story walk buys FRESH WATER on Celadon Mart's roof, hands it to Route 7's guard, climbs Silph Co. to the CARD KEY, opens 3F's and 11F's doors, fights the rival and Giovanni, takes the MASTER BALL, rides the pads back to 3F's car and crosses Saffron Gym's pads to the MARSHBADGE on all three cartridges: six badges and four HMs.

PrintCardKeyText sets BIT_CUR_MAP_LOADED_1 behind the block it replaces, so the floor's callback turns wCardKeyDoorY into the door's own flag on the next frame. The port flagged it on the next map load instead, and opening a second door elsewhere first overwrote the coordinates: 3F's door shut again on the way back from 11F. The card key steps set the bit and the map-loaded pass runs the unlock. gen1_walk pins the flag on the frame after the box.

A text_bcd over a buffer the script has written every byte of is filled at import: Yellow's Safari gate said <NUM_CD3D> where Red spells ¥500, and HiddenCoins' two boxes said <NUM_FFA0> on all three. gen1_maps refuses a number marker in any map's script and pins the fee line. Cache format 130.

Route 7's gate is entered on its lower cell alone, as block $5F's arch tiles are not in Overworld_Coll. A pad that warps on its own map counts as arriving, which is how Saffron Gym is crossed.
The story walk takes Silph Co.'s LAPRAS, teaches it SURF, sails Route 19 and Route 20 through the Seafoam Islands to Cinnabar, turns the Mansion's switches for the SECRET KEY, answers Blaine's six quiz machines, surfs Route 21 to Pallet and beats Giovanni in Viridian's gym: all eight badges on all three cartridges.

CinnabarIsland_Script sets BIT_CUR_MAP_LOADED_1 on every frame and nothing on the island reads it, so gen1_map_load_pending() now answers only for a bit some callback of the map takes; the walk had never settled there.

A hidden event's text row can sit past every object's, as the Mansion's four switches do, and the table was grown before the hidden rows were read, so the switches opened nothing. Cache format 131. gen1_maps refuses a hidden event naming a row that was not read and gen1_walk presses 3F's switch.

Route 20's rock column at x = 62 parts its two seas below the islands' north field, so the sea from Fuchsia takes the west door; B3F's pool is crossed from its one $15 bank a side, TilePairCollisionsWater's CAVERN row keeping the $05 banks off it. A surfing walk plans over water alone until the cell it lands on, a dungeon hole is fallen through when a step ends on it, a same-map pad counts as arriving, and a cell whose script only moved the player off it is planned around next time. Yellow's Route 19 keeps two more rows of sand.
@Decryptu Decryptu changed the title Walk Red, Blue and Yellow from Lt. Surge to Sabrina Walk Red, Blue and Yellow from Lt. Surge to the EARTHBADGE Sep 10, 2026
… three

The story walk teaches STRENGTH to the LAPRAS, crosses Route 22's gate and Route 23's guards and river, solves Victory Road's three boulder switches, beats the Elite Four, Lance and the Champion, and is inducted into the Hall of Fame: 360 steps on Red and Blue, 361 on Yellow. RomRegistry marks all three playable, which is what the shelf's Play reads.

EndTrainerBattle's ResetButtonPressedAndMapScript zeroes wCurMapScript, which the silent call dropped: an end-battle state that calls it and prints on, as every Elite Four room's does, stayed on itself and printed the after-battle line for ever. The call writes the zero now. Cache format 132.

DisplayTextID by id is hSpriteIndex too, so a map script opening a trainer's row hands TalkToTrainer the object of that index; Lance's own coordinate trigger had asked for a wild Pokemon of species 0.

HallOfFamePC is a runtime request on Generation 1 that nothing answered, and jp Init behind the Hall's save is another: the world screen opens the induction and the credits for the first and restarts for the second, the node commits ENGINE_HALL_OF_FAME in front of the request, and the story walk stops at the reset. A real playthrough had ended on a prompt to press A.

A Generation 1 boulder moves alone: TryPushingBoulder is MoveSprite on the boulder, armed by a first bump, so the walk steps after it between pushes. gen1_walk pins the Elite room's return to its default state, Lance's trigger, and the induction's request, flag, save and reset.
@Decryptu Decryptu changed the title Walk Red, Blue and Yellow from Lt. Surge to the EARTHBADGE Walk Red, Blue and Yellow from Lt. Surge into the Hall of Fame Sep 10, 2026
@Decryptu
Decryptu merged commit 8c57865 into main Sep 10, 2026
1 check passed
@Decryptu
Decryptu deleted the gen1-tutor-battle branch September 10, 2026 16:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant