diff options
Diffstat (limited to 'SL0P.md')
| -rw-r--r-- | SL0P.md | 22 |
1 files changed, 12 insertions, 10 deletions
@@ -37,23 +37,25 @@ A table-driven cheat menu. Cursor + A to pick, B to back out / close. | **ITEMS** | submenu: give ×99 of balls, Rare Candy, Full Restore, Max Revive, Max Elixer, PP Up, and all five evolution stones | | **NOWILD** | toggle wild encounters off (shows `ON`) | | **REPEL** | refill repel steps | -| **EXPLORE** | toggle noclip free-roam: disables collision so you (and Pikachu) walk through walls/NPCs/ledges and cross map connection seams seamlessly across the whole overworld. Pick it again to turn off. | +| **EXPLORE** | a screen-paging overworld camera: each d-pad press instantly redraws the next screenful of the world (no walking), hopping to the connected map at each edge. B returns to the menu. | Everything is in `engine/slop_menu.asm`. Adding a new entry = add a name to `SlopMenuText`, a `dw Handler` to `SlopMenuHandlers`, and bump `SLOP_MENU_COUNT`. Handlers return carry set (a warp/exit was started) or clear (back to the menu), and can be submenus or one-shot actions. -Persistent toggle flags: `wUnusedFlag` (NOWILD) and `wSlopNoclip` (EXPLORE, the -repurposed unused `wUnusedObtainedBadges` at D356). +Persistent toggle flag: `wUnusedFlag` (NOWILD). -**EXPLORE / noclip** hooks the home `CollisionCheckOnLand` (5-byte early-out when -`wSlopNoclip` is set; ROM0 room was reclaimed by deleting the unreferenced -`Func_0db5` dead farcall in `LoadMapHeader`). The engine's own player-walk + -connection-crossing code then carries you seamlessly across the world -- see -`tools/render_overworld.py` for the ground-truth map that proved connections join -maps along shared edges with an offset. (The player is left visible on purpose: -hiding it orphaned the Pikachu follower into a lone wandering sprite.) +**EXPLORE** is a self-contained camera loop in `engine/slop_menu.asm`. It renders +straight out of the map block buffer (`wOverworldMap`): compute a view pointer +`wOverworldMap + (by+1)*stride + bx` (by/bx = player block, stride = width+6), +`LoadCurrentMapView`, push to VRAM, OBJ off. A d-pad press moves the camera coords +by ~one screen (`SLOP_PAGE_X/Y`) and re-renders; at a map edge it crosses using +that connection's `*Alignment` offset (vertical: Y=align, X+=align; horizontal: +X=align, Y+=align) and `LoadMapData`s the neighbour, or clamps if there's none. +No walk engine, no character movement. See `tools/render_overworld.py` for the +ground-truth map that proved connections join maps along shared edges with an +offset -- the same math this camera uses to cross seams. ## Build |
