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.)
home/init.asm/engine/movie/intro.asm— skip the introengine/movie/title.asm— skip the titleengine/menus/main_menu.asm— autoload + splash
🎬 Custom intro splash
A brief POKéMON / SL0P / EDITION graphic (a real 2bpp image, not text) is shown for ~2s on boot.
engine/slop_intro.asm+gfx/slop/intro.png(built with a custom rgbgfx Makefile rule → deduped tiles + tilemap)
🎛️ 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
wShadowOAMusing the font's down/ right glyphs ($ee/$ed) plus CGB OBJ X/Y-flip for up/left; setwUpdateSpritesEnabled=$ffafter building them so the vblankPrepareOAMDataleaves shadow OAM alone. Shown per-direction when a move is possible. - A warps here: scans
wTileMapoutward from the view centre (col 8,row 9) for the nearestIsTilePassabletile, setswYCoord/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.
