aboutsummaryrefslogtreecommitdiffstats

POKéMON SL0P EDITION

A cheeky romhack of Pokémon Yellow, built on the pret/pokeyellow disassembly. All the mods live in a handful of files and are toggled/used entirely in-game — no external cheat device.

Features

⚡ Fastboot

If a save exists, the game skips the GameFreak intro, the title screen, and the CONTINUE menu, and drops you straight into your save. (New game still shows the normal flow.)

🎬 Custom intro splash

A brief POKéMON / SL0P / EDITION graphic (a real 2bpp image, not text) is shown for ~2s on boot.

🎛️ SL0P MENU — press SELECT in the overworld

A table-driven cheat menu. Cursor + A to pick, B to back out / close.

Entry Effect
WARP submenu: fly-warp to any of 13 destinations (all towns + Route 4/10)
HEAL full HP + clear status for the whole party
MONEY ¥999,999
COINS 9,999 game-corner coins
BADGES all 8 gym badges
DEX mark every Pokémon owned + seen
MAXTEAM whole party → Lv100, perfect DVs, maxed EVs, 999 stats/HP
TEACH give every party member Hyper Beam / Earthquake / Ice Beam / Thunderbolt
HMS give all five HMs (Cut/Fly/Surf/Strength/Flash)
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 a screen-paging overworld camera: each d-pad press smooth-scrolls the next screenful of the world (no walking), gliding across the connected map at each edge. ▲▼◀▶ arrows show which directions you can move; A warps the player onto the tile you're looking at; B returns to the menu.
SAVER screensaver: EXPLORE on autopilot. Drifts the camera across the overworld on its own — keeps a heading until it hits a bound, then turns onto another open direction. Arrows and the player/Pikachu sprites are hidden. Any button wakes it back 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 flags (reused unused WRAM): wUnusedFlag (NOWILD), wUnusedCreditsByte aliased as wSlopSaverDir (screensaver: 0 = off, else the current auto-scroll PAD_* direction).

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). Movement is a real hardware smooth-scroll built on the walk engine's own machinery: SlopScroll{Up,Down,Left,Right} ramp hSCX/hSCY SLOP_SCROLL_PX px/frame, advance wMapViewVRAMPointer, and inject the newly exposed edge with the Schedule*Redraw helpers (applied in VBlank). At a map edge it smooth-scrolls the remaining distance up to the boundary, then crosses using that connection's *Alignment offset and LoadMapDatas the neighbour (one unavoidable load), or stops if there's no connection.

SAVER is the same loop with wSlopSaverDir set: instead of reading the d-pad, SlopSaverPickDir synthesises a direction into the normal dispatch (so it inherits smooth scroll + edge crossing), keeping one heading until it's blocked, then turning onto a random still-open direction (never an immediate U-turn). "Open" (SlopValidDirMask) means >= 2 coords of room that way or a connection to cross — the >= 2 matters because moves round to even coords and a map's far edge is always odd, so a plain coord != max test would never register the edge and the wander would freeze one step short of it. Arrows are skipped, and OAM is cleared + frozen right after every LoadMapData so the reloaded player/Pikachu are never drawn. Any real button exits.

Crossing a connection applies its alignment offset blindly, so at an edge the connection doesn't span the camera can land outside the neighbour; SlopClampCoords (run after every entry/cross LoadMapData) clamps the coords back into [0,maxY] x [0,maxX] so the view never reads past wOverworldMap into garbage.

  • Direction arrows are 4 OBJ sprites in wShadowOAM using the font's down/ right glyphs ($ee/$ed) plus CGB OBJ X/Y-flip for up/left; set wUpdateSpritesEnabled=$ff after building them so the vblank PrepareOAMData leaves shadow OAM alone. Shown per-direction when a move is possible.
  • A warps here: scans wTileMap outward from the view centre (col 8,row 9) for the nearest IsTilePassable tile, sets wYCoord/wXCoord, wDestinationWarpID=$ff, LoadMapData (enters at those coords), returns carry set.

See ~/dev/gbc/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

make            # -> pokeyellow.gbc  (rgbds 1.0.1)

The build is reproducible; the intro graphic regenerates from gfx/slop/intro.png.