[issues-fix] Reveal the Victory Road 2F boulder (#282) - #283
Conversation
The pushable boulder at (33,18) on Victory Road 3F is the one boulder from #37 that #239/#241 did not restore. HandleBoulderFallThroughHole clears the flag stored in the falling boulder's own template trainer_type, so with TRAINER_TYPE_NONE there the fall cleared flag 0 and FLAG_HIDE_VICTORY_ROAD_2F_BOULDER stayed set. Only the hidden 2F boulder at (33,19) can reach 2F floor switch 2 at (14,19), and that switch opens the rock barrier at (33,16)/(33,17) -- the only way into the east half of the dungeon that is not the one-way plug boulder at 3F (35,13). With the 2F boulder never revealed, the Route 23 exit at 2F (48,12) is unreachable and Victory Road cannot be completed. Restores the upstream pokefirered value. Map data only; no SaveBlock or flag-index change, so no migration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3U1qS1Lj2x3Q74edfEBB
evilchinesefood
left a comment
There was a problem hiding this comment.
Grok automated review
Summary: One-line map data fix that correctly wires the 3F falling boulder to clear FLAG_HIDE_VICTORY_ROAD_2F_BOULDER via the established trainer_type convention used by HandleBoulderFallThroughHole / GetBoulderRevealFlagByLocalIdAndMap. Matches upstream pret/pokefirered and restores the only path that can press switch 2, so Victory Road (and the League) becomes completable again. Save-compatible; no code or flag renumbering.
Verdict: ship
Findings: None. Change is minimal, correct, and well-documented.
Tests: Author reports all listed validators pass and emulator confirmation of the flag clear + boulder appearance. CI is the authoritative make validate run. No new logic that would require additional unit tests.
Secrets: Clean (no secrets present in the diff).
|
@evilchinesefood wondering before you merge if you got through victory road in kanto. The ladder seems like a hard block w/o this fix. |
|
One thing worth adding to that question, since it's the obvious escape hatch: Fly can't bypass it either. So on a release build the pre-fix answer is: through the debug menu, or not at all. Generated by Claude Code |
|
I verified manually that it fixes it and got through victory road, so merging. |
|
Awesome work, thanks! Have I finished it, yes. On this current version, or even a few versions back at this point, no. Not easy to do full playthroughs anymore with how much content is here, so it's REALLY nice having someone else enjoying this as I am. |
Fixes #282.
What
One line in
data/maps/VictoryRoad_3F_Frlg/map.json— the pushable boulder at (33,18):Why
HandleBoulderFallThroughHole(src/field_control_avatar.c:1446-1454) clears the flag stored in the falling boulder's own templatetrainer_type. This is the ninth boulder from #37; #239/#241 restored the eight Seafoam ones and left this one out of scope. WithTRAINER_TYPE_NONEthere, pushing the boulder into the hole at 3F (34,18) cleared flag 0, soFLAG_HIDE_VICTORY_ROAD_2F_BOULDERstayed set and the 2F boulder at (33,19) never appeared.That boulder is load-bearing. Walking the three Victory Road layouts with collision, directional
MB_IMPASSABLE_*and the elevation rules enforced, and boulder pushes modelled:VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2 == 99, which onlyHandleBoulderActivateVictoryRoadSwitchproduces.MAP_INDIGO_PLATEAU_EXTERIORconnection.So before this change Victory Road could not be completed and the Pokémon League was unreachable.
Route23_OnTransitionresets the puzzle on re-entry, so no save was stuck — just unable to finish.The value matches upstream
pret/pokefirered(c75f352) for this same object, and all three Victory Road layout blobs here are byte-identical to upstream's.Testing
make validatesteps pass, run individually (python3 Testing/ValidateGen13.py,ValidateScripts,ValidateOwMonPlacements,ValidateMapEvents,ValidateMetatileBounds,GenObstacleTable.py --check,SavePatch.py --check,ValidateDoorAnims.py --max 0,ValidateTilesetPalettes,ValidateCelioGifts,ValidateGreedyGifts).make validateas a target cannot run in this container — it has noarm-none-eabitoolchain to build its map/trainer prerequisites — so CI's run is the one that counts here.ValidateMapEvents.py'scheck_trainer_typealready exempts pushable boulders carrying aFLAG_HIDE_*value (added in [issues-fix] 1 fixes, 2026-09-01 #241), so no validator change is needed.Save compatibility
Object-event template data is compiled into the ROM and read fresh on every fall. No SaveBlock change, no flag renumbering, no migration.
🤖 Generated with Claude Code
https://claude.ai/code/session_01YT3U1qS1Lj2x3Q74edfEBB
Generated by Claude Code