# New features (deliberate additions beyond the original) Intentional enhancements this port adds on top of faithful Pokémon Red behavior. They have no Game Boy equivalent and are kept by design. Genuine divergences from the original (things still missing, wrong, or approximated) live in docs/known-differences.md; faithfully-ported behavior is in docs/behavior-porting-notes.md. ## Survey zoom The mouse wheel (or `-`/`=`) zooms the overworld between 1 pixel per world pixel (full survey) and 2× the window fit scale (close-up), in crisp integer steps. This has no Game Boy equivalent: - Connected maps render their full bodies, and their NPCs appear as visual-only "ghosts", they wander but have no sight lines, triggers, dialogue, or collision until the map is actually entered. - Menus, text boxes, and battles draw at normal scale on top of the zoomed world. Zoom input is ignored while a script, menu, or battle is active; the zoom level persists across warps and is never saved. - Beyond the border ring the border block repeats indefinitely (interiors stay black, seaside towns stay water, except OVERWORLD-tileset maps, whose beyond-edge space fills with the solid tree wall instead of the per-map border block), and each visible map area is colorized with its own SGB palette (the original recolored the whole screen per map). - Neighbor maps load two connection hops out so corner-adjacent maps don't pop in and out, and ghost NPCs share instances with the real ones so their wander positions persist across seamless connection crossings (a warp or fresh map entry still respawns everything at its script position, like the original's per-entry sprite init). ## Tilt mode The `3` key (and the Options menu TILT row) cycles a visual-only perspective tilt of the overworld through **OFF → 15° → 35° → 50° → OFF** for an HD-2D / diorama look. Like survey zoom this is purely presentational and has no Game Boy equivalent: - The entire map tilts as one rigid ground plane, paths, grass, water, floors, and every background-tile structure (buildings, trees, fences, signs; in Gen 1 these are baked into the tile layer, not sprites), so rows above the player recede and rows below come toward the viewer. Only things that actually *stand* on the ground draw as upright billboards, unscaled and pixel-identical to flat mode: the player, NPCs, item balls, and the screen-anchored FX attached to them (heal machine glow, emote bubbles, the fishing rod, the FLY bird). An earlier revision tried billboarding buildings/trees/signs too (cutting them out of the ground per hand-curated per-tileset tables); that chased an endless tail of special cases, dense tree canopy, fences fused into grass, building facades with their own baked-in fake perspective, because Gen 1's art was never drawn with a clean seam between ground and standing scenery. It wasn't merged; tilting everything but the characters as one plane is the simpler, shipped tradeoff (buildings recede/foreshorten with the ground like a photo of a diorama, rather than standing fully upright next to a full-height character). - Cycling tweens the angle between levels over ~0.25s rather than snapping; with tilt fully off the world pass drops back onto the flat blit path, so flat rendering stays pixel-identical to tilt-off and off costs nothing. - Tilt input is gated exactly like survey zoom, honored only while free-roaming, ignored while a script, menu, or battle is active, and it composes with survey zoom (the zoom scale feeds the projection). The tilt level is persisted in `save.options.tilt` (default OFF). - It applies everywhere the overworld draws, interiors and caves included. Menus, text boxes, and battles render flat on top, unaffected, and the infinite beyond-the-border-ring fill stays flat by design. - Collision, movement, sight lines, triggers, encounters, and scripts are untouched; nothing about the tilt reaches gameplay. ## Colors mode The `2` key (and the Options menu COLORS row) cycles the global shade-remap display mode through **GBC → OG → OG INV → GBC INV → CLASSIC → GBC**: - **GBC** (default): current SGB / GBC zone palettes. - **OG**: force the four DMG grays (colorization off). - **OG INV**: inverted DMG grays. - **GBC INV**: each SGB zone palette with shade order reversed. - **CLASSIC**: original Game Boy pea-soup greens (`#9BBC0F` / `#8BAC0F` / `#306230` / `#0F380F`). The transform is applied centrally in `PaletteFX.sendColors`, so it covers overworld, menus, battles, and tilt upright billboards. Persisted as `save.options.colors`. ## GBC FX The `5` key (and the Options menu GBC FX row) cycles a "played on real unlit-GBC hardware" post-process through **OFF → 1 → 2 → 3 → 4**. The levels are a cumulative ladder: - **1**: reflective-screen backing transparency. - **2**: + LCD pixel grid. - **3**: + pixel drop shadows. - **4**: + sunlight glare and rainbow shimmer with a drifting light. It runs as a final present pass after world + UI composite in `Renderer:endFrame`, inspired by the Pixel Transparency RetroArch shader ([github.com/mattakins/Pixel_Transparency](https://github.com/mattakins/Pixel_Transparency)). Default OFF; persisted as `save.options.gbcfx`. ## Peer-to-peer link play (lua-enet) Trades and link battles connect two copies of the game directly over lua-enet (ENet ships inside LÖVE, nothing to install, no server to run) on a reliable-ordered channel, replacing the original standalone Python room-code relay (`tools/relay_server.py`, deleted). HOST A GAME shows the host's LAN address (UDP 7777; `POKEPORT_LINK_PORT` overrides); JOIN A GAME enters it. Closing performs a graceful ENet disconnect so the final confirm/bye always lands; a vanished peer exits with "The link was broken." Internet play needs a forwarded UDP port or a VPN (deliberate tradeoff vs. the relay). Headless tests drive the protocol over an in-memory loopback (`Net.loopbackPair`); under LÖVE the same test file also exercises real UDP pairing. ## Custom boot text The boot sequence replaces the Nintendo / GAME FREAK identifiers with "bois club" / "bryanthaboi", a deliberate branding customization. The rest of the boot beats (copyright splash, "presents" shooting-star, the Nidorino-vs-Gengar attract scene) mirror the original. ## Custom Options Options persist in a standalone `options.lua` (separate from the game progress `save.lua`), so audio/display/battle preferences survive New Game and aren't wiped when a save slot is cleared. Changing a row in the Options menu or cycling hotkeys `2`/`3`/`5` writes immediately; an in-game save also flushes the live options. Old saves that still embed an `options` table are migrated once into `options.lua` on load. - Music / SFX volume - Music Filter - OG GLITCHES on / off (Gen 1 quirks vs. modern-clean battle rules) - COLORS (GBC / RED++ / OG / OG INV / GBC INV / CLASSIC), also hotkey `2` (RED++ uses pokered-gbc SuperPalettes + per-species mon colors) - TILT (OFF / 15 / 35 / 50), also hotkey `3` while free-roaming - GBC FX (OFF / 1 / 2 / 3 / 4), also hotkey `5`