Skip to content

FRLG: AutoStory, FireRed from a new game to the Boulder Badge - #120

Closed
dayfine wants to merge 113 commits into
frlg/walk-interrupt-recountfrom
frlg/autostory-mvp
Closed

dayfine wants to merge 113 commits into
frlg/walk-interrupt-recountfrom
frlg/autostory-mvp

Conversation

@dayfine

@dayfine dayfine commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Depends on #119.

There was no AutoStory program for FireRed. "PokemonFRLG: AutoStory" plays it from a new game to the Boulder Badge as checkpoints 00.01 to 00.09, written as one table on #122's shared story steps, with the shared start/end checkpoint dropdowns and AutoStory stats, and walks its routes with #119's walk_overworld_route_with_recovery(); it adds the Mart and bag checks, the save card check, readers that don't depend on the game's language, and the battles. Tested with the AutoStory suite (every route plans, checkpoints chain, items, save places, lint) and the simulation suite, which runs the whole table from a new game to Brock against a fake game, in fork CI; on console B (2026-11-01) the story ran from a new game to Viridian Forest's north gate.

Fix (2026-11-02): the bag read 5 Potions and 3 Antidotes as unreadable (Tesseract lost the 5 and the 3, whose strokes join only at a corner), and the story took an unread count for none, so a later battle never healed and the starter fainted. Bag counts are now read with the FRLG digit templates, with the capture as an image test (PokemonFRLG/ItemListReader/ in CommandLineTests), and an unread count keeps the count bought, or 1, and is logged.

00.10 gets the Running Shoes from Oak's aide in Pewter (gym to (45, 21), step onto his trigger (46, 21), clear the scene), and 00.11 runs from that save to the wall at (6, 21) to time running; from 00.11 on every route and leg runs (the run step variant), which a table test holds.

Battles (2026-11-02): the loop declined every new move, pressed B through evolutions (Squirtle stayed Lv16 on console B) and assumed a party of one. Its choices now live in BattleDecisions, and the lead's moves and PP come from data tables from pret (PokemonFRLG_AutoStoryParty): "Delete a move?" is answered from a per-line plan (Water Gun over Bubble, Bite over Tail Whip) by walking the move list to the slot, the preferred attack is used until its PP run out and then Tackle, nothing is pressed while an evolution may be on screen, a fainted lead flees wild battles and never sends a member in protected_slots, and the nurse restores PP (the ready step also goes to her when attacks run low). Tested with the new AutoStoryParty tests (movesets, prompts, fainted lead, PP, and a fake evolution that B cancels), run locally in a standalone harness; not yet on console B. Follow-ups: TM moves and Magikarp/Gyarados as a supporter, protecting the Magikarp once Gift RNG adds it, matchups and switching, PP read from the screen rather than counted, and a nurse detour mid-route.

Moves from the summary (2026-11-02): console B's save after Route 3 has Squirtle Lv16 with Water Gun where Tackle was (the move list's DOWNs went out before it faded in, so A forgot the top move) and Bubble kept; the plan put Water Gun in Bubble's slot and fell back to a Tackle it doesn't know. A run that loads a save now reads the lead's species, level and moves with PP off its summary (read_party_summary(), new SummaryMovesReader), battles pick attacks by name and PP and fall back to the strongest damaging move with PP, and "Delete a move?" reads the cursor before each press. Tested with new AutoStoryParty cases (the console's moveset, unread PP, fewer than four moves) and SummaryMovesReader image tests (images in dayfine/CommandLineTests#2, so a FileException in CI); syntax and code health checked locally, not run on the console.

Matchups and bag on load (2026-11-03, for #211): the loop always opened with Water Gun, which the Cerulean rival's Bulbasaur and Misty's Staryu and Starmie resist. Against a trainer whose party is in pret's trainer_parties.h (trainer_party(): the rival, Misty), it now picks the move with PP left with the most expected damage over the party (power x STAB x type effectiveness, a small type chart for the party's moves); unknown trainers and wild battles keep the old order. Bite is learned over Tail Whip, else Withdraw. A run that loads a save also reads the Items pocket for its counts (read_bag_supplies()), so its wild battles are no longer all run from with 0 Potions. Tested with new AutoStoryParty cases (Bite on the rival's Bulbasaur and both parties, the fallback for an unknown foe, Bite learned without Tail Whip) and an AutoStoryItems case (a loaded save's counts come from the bag), run locally with an out-of-tree runner; not run on the console.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

dayfine and others added 22 commits November 1, 2026 01:07
The story segment table and game-defined positions live there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Checkpoints 00.01 to 00.08 from the by-hand run on console B
(2026-11-01) as a table of story steps on the shared story engine:
routes planned from the pose the run carries, talks, text read with B
until START opens the menu, YES/NO answers, battles, the nurse, the
Viridian Mart, saving with the START cursor read, and the new game's
intro with default names. Routes walk with story interrupts that fight
trainers (and wild Pokemon in the forest) instead of stopping. A failed
checkpoint reloads its save. Unit tests plan every route of the table
on the map files and check that checkpoints chain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…eyboard

The first console run went back to the controls pages: they read as a
message box without an arrow, so after two presses the intro took them
for the keyboard and pressed B, which in the intro goes back a page. Now
a message box gets A every 1.5 s whatever it shows, and the empty name
is entered only when the naming screen is detected. The naming screen
detector is the one from frlg/naming-screen (fork #81), unchanged; on the
lab's 331 captures it fires on the five keyboard shots and nothing else.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…s ball

Measured on console B: after Squirtle and the rival's pick the player
stands at (9, 5) facing the table, so the walk to the rival's trigger
can start without a facing check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…s first turn

On console B the rival's battle logged a learn prompt and "over after 0
turns" during the opening slide-in, then waited 300 s for the overworld
with the FIGHT menu up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Oak's white text box during the rival's battle reads as no battle screen,
so the loop waited 10 minutes on "TOSH." (console B).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Measured on console B after the 00.06 save: Oak's Lab (6, 4), facing south.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
answer_yes_no() didn't see her YES/NO box and failed although the heal
had happened (console B). YES is the default there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
After the tutorial he stands east of the player; the route's first leg east
didn't move and the walk north ended under Route 2's ledge (console B).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
… A/B when no menu shows

Console B, 2026-11-01 (run 13, 00.07 pewter_nurse): a wild battle used an
Antidote twice and no Potion, then the starter fainted; and a "trainer
battle" after a message pressed B on the overworld for 10 minutes, since
before the first turn the loop never took the battle to be over.

A Potion is now used whenever the HP bar is yellow or red; an Antidote
only when PSN is read at two turns in a row, and at most once a battle.
The purple taken for PSN is narrower. Before the first turn, the battle
is over once START opens the menu. With no battle menu for 60 s, A and B
are pressed in turn. Each change of what the loop sees, and each turn's
HP and PSN reading, is logged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
The forest's last leg now ends in its north gate; from there to Pewter's
Center wild battles are run from, and trainers still fought.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
… battles in the battle loop

Console B, 2026-11-01 (run 14):
- A forest battle was called over 4 s after its last battle screen while
  the move prompt's YES/NO was up; the message interrupt then pressed B
  through "Delete a move?" and "Stop learning?" for 60 s.
- Running from a Route 1 battle with flee_battle() failed ("Can't
  escape!" outlasted its watch), and its fallback opened START inside the
  battle: "Failed to open Start menu 5 times in a row".

The battle loop now ends a battle only when START opens the menu, after
2 s without a battle screen; a YES/NO under no battle screen is answered
as a move prompt (NO, then YES). Wild battles that the story runs from
go through the same loop, with RUN for the turn, up to 4 tries before
fighting. advance_text() answers a YES/NO the same way instead of
pressing B through it. The A/B presses after 60 s without a battle menu
are kept to within 10 s of a battle screen, so they don't talk to a gym
leader again after the speech.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…lone

BattleDialogDetector also fires on the black below a small indoor map
(console B, 2026-11-01: Oak's Lab's mat, and Viridian Forest's north gate,
where a "wild battle (seen late)" ended a route and no battle came). The
new BattleScreenDetector wants the battle menu, or the battle text box
with the opponent's or the player's HP box. The walker's late wild battle
watch and its trainer-battle check use it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
The story's late wild battle watch and advance_text() take a battle only
from BattleScreenDetector. In the battle loop the text box alone counts
only once the battle menu or an HP box has shown; with neither in 15 s
the loop returns, taking it for no battle, and the route's overworld
check goes on from there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
… by legs that end on walls

Console B, 2026-11-01 (run 17):
- Fighting every wild Pokemon in Viridian Forest used up all 4 Potions,
  and the starter then fainted in a battle begun at yellow HP. A wild
  Pokemon is now fought only with green HP and at least 2 Potions; else
  the turn is RUN. After a battle on the way, a Potion is used from the
  bag on the overworld when the last HP read wasn't green.
- forest_exit's planned route had open legs; after a battle the player
  was lost (the failure screenshot puts them at (21, 5), under the north
  edge, 5 tiles east of the Bug Catcher at (16, 5)), and the last leg's
  warp never came. The forest is now left by a fixed list of legs (new
  LEGS step), each ending on a wall except two single steps, then north
  onto the exit. The route test checks that every leg of forest_exit and
  forest_gate ends on a wall or a warp, or is one step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Console B, 2026-11-01 (run 18): walking up column 6 through Liam's row,
he stopped the player only on the way back, and the walker couldn't find
the stopped leg again. In pokefirered Liam (3, 8) always faces east with
sight 4, so he sees (4..7, 8). 00.08 now goes up the gym's east side to
(10, 9), then by fixed legs along row 6 to (4, 7), and steps south onto
(4, 8) beside him: he battles without walking, and FRLG leaves the player
facing south there. The route test checks the way to (10, 9) stays off
his row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Each checkpoint is now one StoryCheckpoint expression with its steps in a
braced list, the step comments inline, instead of push_back after
push_back. New helpers legs(), new_game_intro(), talk() and heal() build
the steps that needed fields set by hand. The table's data is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
The user's call: walk north from the gym's door and fight Liam where he
stops the player. The route now ends at (6, 9), below his row; a single
step north onto (6, 8), in his line, starts his battle, and the player
stays there facing north. The detour by the gym's east side, and the
route test that kept it off his row, are dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…-mvp

#119 now has nav/shared (#114) through #117 and #118, so this PR's diff shows only its own files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
… when out

The user's call: don't always walk back to the Pokemon Center after Liam.
A new READY step decides from the starter's HP and the Potions left: green
goes on; yellow or red uses a Potion from the bag on the overworld; red
with no Potion walks to the nurse given in the table and heals. The
battle loop now reads the HP bar at every battle screen that shows the
starter's box, so the reading includes the battle's last hit. 00.08 uses
it between Liam and Brock; the route test plans the way to the nurse too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…g/autostory-mvp

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine added a commit that referenced this pull request Nov 1, 2026
LegPlanner's wild-step weighting moved from #119 to #114 (7008f8c) and merged down #117 → #118 → #119 → #120; #120's diff is PokemonFRLG only. Adds #119, #120, #121 to the tree and a file-ownership table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine and others added 4 commits November 1, 2026 09:23
The route tests skip in CI, which has no map files. Pewter City, its
Pokemon Center and its gym are now embedded in the test file as JSON
fixtures, and a test plans 00.08 step by step: from the nurse in by the
door mat and straight up column 6 to (6, 9) (one leg, north 5); the step
onto (6, 8); then (6, 8) to (6, 6), north 2; and the nurse's way back,
north 8 from the mat to (6, 6). The gym's legs are checked exactly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
… PAR after battles

The HP bar and status badge are now read in small boxes, with colors
measured on console B's battle captures (2026-11-01): fill green
(100, 251, 171), yellow (255, 228, 23), red (255, 113, 68); the badge's
place off-white (255, 255, 217) with no status, (228, 168, 212) for PSN.
The old reading, over the whole box, took the female symbol for PSN. On
22 lab captures it reads every HP bar's color and every PSN badge right.

After a battle on the way, PSN is cured with an Antidote and PAR with a
Parlyz Heal from the bag, then a Potion is used if HP wasn't green. The
READY step sends the player to the nurse only for red HP with no Potion,
or a status no item cures (SLP, BRN, FRZ). In the forest a wild Pokemon
is run from when the starter has any status. Viridian Mart now sells the
story 5 Potions, 3 Antidotes and 1 Parlyz Heal (2000 at pokefirered's
prices). PAR's badge color is a guess: there is no capture of it yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
The route and chain tests planned on story_maps(), read from Packages, so CI
skipped them; the gym test had its own trimmed copies of three Pewter maps.
All of them now plan on test_overworld_maps() (#118) with the Hall of Fame
flags story_maps() uses: one copy of each map, the generator's, checked
against it by frlg_maps.py --check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine added a commit that referenced this pull request Nov 1, 2026
In run 7 (console B, 2026-11-01) the player had drifted onto Route 1's
grass, and the step meant for Oak's Lab's door set off a wild battle. Its
flashes and wipe passed for the warp's fade, and the route went on as if
inside. After a warp's fade the walker now watches 5s for a battle screen;
if one shows, it flees and fails with "a wild battle, not the warp to
...: the player is off the route", for the caller to re-plan.

A battle screen is BattleScreenDetector: the battle menu, or the battle
text box together with an HP box. The text box alone also reads on the
black below a small indoor map (Oak's Lab's mat, Viridian Forest's north
gate), where the walker tried to flee battles that weren't there. The
late-battle and trainer-battle watches use it too. The detector is moved
here unchanged from #120 (ac1873b), where it was added for the story's
battles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine and others added 2 commits November 1, 2026 09:52
…-mvp

OverworldWalk.cpp: #119 no longer needs BattlePokemonDetector.h; its
battle watchers are BattleScreenWatcher now. AutoStory_Tests plan on
story_maps() again: overworld_maps() reads the maps built in from
Overworld/Maps (#118), so test_story_maps() and the TestData include go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
walk_overworld_route() now recovers a stopped open leg only when given a
RoutePlanning (#119). Both story walks, planned routes and fixed legs,
pass one on the story's maps, so a leg stopped part-way is planned back
to its end and the rest walked as given, as in run 18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine and others added 2 commits November 3, 2026 04:48
…s data

The matchup choice knew only the Cerulean rival's and Misty's parties, and
wild battles always used the fixed order. devtools/maps/frlg_battle_data.py
now generates BattleData/*.json from pret/pokefirered (type chart, species
types and base Attack/Sp. Atk, move power/type/PP, every trainer's party,
the trainers each map battles), built into the program. Each story battle
step maps to its trainer by map and name; a wild battle reads its Pokemon
at the first battle menu and falls back to the plan's order when unread.
Expected damage now scales by the lead's Attack or Sp. Atk, by the Gen 3
type split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…nd move prompts out of step

Console B, m48 (00.13 Mt. Moon, 2026-11-03):
- The HP bar's share was counted over a 2-row box on the darker top row
  and one lighter row, so 17/55 HP read as 15% of the bar, and 2% with the
  box a pixel lower. A new reader (BattleHpBarReader) counts filled
  columns on the lighter rows in a 5-row box: within a pixel of the
  48-pixel bar either way.
- The story went into Miguel's battle with yellow HP and no Potion: the
  nurse was only for red HP. nurse_before_battle() sends it for any HP
  not green that no Potion healed.
- The move list after YES to "Delete a move to make room for BITE?"
  closed with nothing forgotten; the game asked "Stop learning BITE?"
  where the story expected the next "Delete a move?", and NO/YES went
  round 13 times (75 s). A YES/NO right after the move list is now
  "Stop learning?" (YES, the lead keeps its moves), and past 4 move
  prompts since a turn the answer is a plain YES, which ends either one.

Tests: AutoStoryBattle image tests on four console B frames (new in the
CommandLineTests draft), AutoStoryParty tests for the nurse and the move
prompts; all red before the fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine and others added 3 commits November 3, 2026 05:18
With the story run options' verify mode on, AutoStory loads the start
checkpoint's save and runs it as verify_checkpoint() does: a set number of
runs, a soft reset to the save between them, no save at its end. It
finishes when enough runs pass and fails the program otherwise. A
checkpoint that starts a new game has no save to reload and is refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…battle sim for big fights

The battle data from pret now carries every base stat, each move's
accuracy, priority and effect, and each trainer's AI flags, items, IVs,
natures and moves. A Gen 3 damage calculator (CalculateBaseDamage, crit,
STAB, type chart in order, random roll) checks out against hand-worked
numbers and the Elite Four Farmer's Starmie table.

Trainer battles now track the foe out: its name at each battle menu, else
the game's own send-out rule after a faint. LOW risk steps use the best
expected damage against it; HIGH risk steps (rival, gym leaders, bosses,
Elite Four) use a battle sim's move and Potion choices, and refuse the
fight before it starts when the sim's win chance is under 70%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
…lg/autostory-rng-loop

# Conflicts:
#	SerialPrograms/cmake/SourceFiles.cmake
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
…lg/autostory-capture-pc

# Conflicts:
#	SerialPrograms/cmake/SourceFiles.cmake
dayfine added a commit that referenced this pull request Nov 3, 2026
…frlg/autostory-mart-teach-grind

# Conflicts:
#	SerialPrograms/cmake/SourceFiles.cmake
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine added a commit that referenced this pull request Nov 3, 2026
dayfine and others added 3 commits November 3, 2026 06:27
…ys the lead the summary showed

Console B, 2026-11-03 (m51): at 8/60 HP against Misty's Starmie, the
HIGH tier used a Potion five turns running, each undone by the next hit,
then fainted with none left. At either tier a Potion is now used only if
it outheals the foe's expected hit (the sim's mean, or the HP the last
hit was seen to take, if more), or if it lets the lead last until it
faints the foe when attacking now wouldn't; otherwise it attacks.

The sim's lead was the story's: its level from moves_through_level and
its stats at OWN_GENES. It now takes the summary's species, level,
moves and PP, and POKEMON SKILLS' stats, with the levels since added,
and the HP from the last bar read. A refusal names the chance and the
lead and Potions it was played with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
…e in any box

A taught TM's move (Water Pulse on console B, 2026-11-03) wasn't in the
dictionary, so the moves read stopped before it and the TEACH step's
check after teaching failed. read_move_name() reads the TM CASE's rows too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
A MOON STONE at the top of the Items pocket stopped the reader, so every
load read nothing and the rival at 00.15b was fought with 0 of the bag's
15 Potions (console B, 2026-11-03). An unread name now keeps its row, items
the story doesn't count take their rows in item_row(), and every reload
reads the bag again, so each verify run starts from the save's counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
@dayfine

dayfine commented Nov 3, 2026

Copy link
Copy Markdown
Owner Author

Superseded by #213 (FRLG stack consolidated into stage PRs; will be resplit for upstream).

@dayfine dayfine closed this Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autostory AutoStory programs game:frlg FireRed/LeafGreen

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant