Skip to content

00 — Design philosophy

The pitch

It's an RPG where the dungeon IS the racetrack.

That's the design north star. Every feature, every screen, every sprite asks: if this were a Pokémon-shaped racing RPG running on a late-GBA / early-DS-era handheld, how would it feel? If it would feel clunky, the answer is wrong, regardless of what the underlying telemetry says.

Reference points (and what we take from each)

Reference What we take What we leave
Stardew Valley (ConcernedApe, 2016) Warm, lived-in pixel art with NPC mentors. Daily rhythm — start in the farmhouse, do the day, end at home. The pit garage is the farmhouse. The farming sim. We don't have crops to grow.
Pokémon Emerald / Black-White (Game Freak, 2004 / 2010) Trainer card, save slot system, dialogue-box pacing, Professor Oak as the mentor archetype, region map with locations as quest hubs, Pokédex-style coach progression. Random encounters, type matchups.
Tony Hawk's Pro Skater 2 GBA (Vicarious Visions, 2002) Career-mode structure: pick a level → see goals → run the level → score screen → unlock next level. Stat-based progression: skill trees, sponsors, gear unlocks. Half-pipe combos.
Mario Kart Super Circuit (Intelligent Systems, 2001) Cup → track → result loop. Track icons on the world map. Bronze / silver / gold trophy system. The karts themselves.
Motocross Challenge GBA (Black Lantern Studios, 2007) Real-feel racing on a GBA-era 2.5D engine. Practice / Career / Time Trial mode split. Gas-pedal physics.
Crosscode (Radical Fish Games, 2018) Modern indie pixel art proportions, smooth combat-loop UI, isometric world feel. The "Stage Clear" celebration. Combat puzzle dungeons.
Eastward (Pixpil, 2021) Cinematic dialogue framing with portrait sprites. Quiet moments between action. The plot.

If a reviewer asks "is this trying to be GBA F-Zero?" — no. F-Zero Maximum Velocity is a fast arcade racer. We're an RPG with racing as the verb.

Three principles overriding everything

These come straight from docs/ux.md but get re-stated here because they're load-bearing for the game wrapper too.

1. The driving is the real thing

The game is the wrapper, not the substance. Every animation, every score-screen flourish, every coach reaction is grounded in real telemetry data from the bridge. We never invent a stat for the game that the analytics don't actually compute. If the dashboard says apex_speed_kmh = 86, the score screen shows 86 km/h apex, and the coach's hyped sprite plays only because it's a real personal best.

2. Silence is coaching

The arbiter holds 78% of generated cues. The pixel-art wrapper holds even more — quiet stretches between dialogue boxes, calm garage music during the in-between. Don't fill space. Don't surface a tutorial during a hot lap. Don't pop achievement toasts mid-corner. The game's patience IS the trust UX from docs/ux.md made tangible.

3. Every visible decision must trace to a real one

If a UI element implies a choice ("equip this coach"), there is a real coach-engine config behind it. If an icon says "T7 entry needs work," real corner_aggregates.apex_speed_kmh data flagged it. The game can frame analytics; it cannot fabricate them. This is what makes "trustable" tangible — pull any thread, hit the bridge endpoint underneath.

The verb

Every screen has one verb the player should feel they're doing.

Screen Verb
Title Begin
Save select Identify
Onboarding Set up
Garage hub Choose where to go
Trainer card Reflect
Coach select Recruit
World map Travel
Pre-brief Set intentions
On-track HUD Drive
Cool-down Process
Stage clear Celebrate / Learn
Replay Re-live
Quest log Plan
Settings Tune
End of day Wind down

If a screen doesn't have a clear verb, it's a wrong screen. Combine it with another or cut it.

What we explicitly don't do

  • No XP grinding. Sessions reward genuine improvement; you can't hammer the home page for points. Levels come from real driving time, not menu-tapping.
  • No fail states. "Game over" doesn't exist. Bad sessions are feedback, not failure. The coach is disappointed, not punishing.
  • No microtransactions. No premium currency. No premium coaches. No premium tracks. If we ship to a public app store post-Sonoma, this rule stays.
  • No stamina meter / energy gating. You can drive as much as the car
  • tires + insurance allow. The app never tells you to come back later.
  • No leaderboards (yet). Multiplayer is post-Sonoma. The driver competes with their own past self via /driver/<id>/evolution.
  • No "social share" before May 23. No outbound share button until we've decided what privacy posture means. See docs/ux.md § Data privacy & residency.

What "feels like an old game" specifically means

The user said "choose the best UX that feels like an old game." Here's the precise reading we're committing to:

  • Integer-scaled pixel art at viewport scale (image-rendering: pixelated). No anti-aliasing, no fractional scales. A 64×64 sprite is 64×64, 128×128, 192×192 — never 96×96.
  • Three pixel-grade fonts only: a chunky title font (Press Start 2P or DePixel Schmal), a clean body font (m6x11 / Pixel Operator), a 7-segment digital readout (DSEG7) for lap timers.
  • Sub-100ms response on every input. Old games never lagged. The D-pad-style nav must feel like cursor-on-rails.
  • Audio that punctuates. Every confirm has a chime, every cancel has a thud, every level-up has a fanfare. Silence is OK; absence-of-feedback is not.
  • Save slots, not auto-cloud. The user picks a slot like they're inserting a cartridge. Save slots persist locally (IndexedDB). No cloud account, no email login.
  • Title screen on every cold boot. PRESS START. Not "skip to home." The title screen is a beat that says you've entered a game now.
  • Dialogue boxes with teletype. Coach text appears one character at a time at ~30 char/sec. Tap-to-skip. This is non-negotiable; it's the single biggest contributor to the "old game" feeling.
  • No hamburger menus. Navigation is via a D-pad metaphor — tile grids you cursor across, never lists you scroll.
  • Modal everything. The screen you're on is the only screen. Settings is a screen, not a panel. Inventory is a screen, not a panel.

What it definitely does NOT mean

  • Not "GBA-resolution-locked." 240×160 native is too small for modern phone screens; we use 480×320 (2× GBA) as the design grid.
  • Not "monochrome 4-color palette." The user's reference sprite sheet uses 30+ colours with smooth shading. We match THAT range, not the original GBA's 32k.
  • Not "limited to 4 sprites on screen." Modern hardware. We can render the whole garage with NPCs walking around. Don't be tempted to artificially cap.
  • Not "ironic retro." This is sincere. The pixel art is the actual product, not a meme.

Aesthetic anchor: the user's sprite sheet

assets/reference-sheet-source.md documents what the user supplied. The single most important data point from that sheet is the palette — 30+ shades of grey/red/black/skin with smooth dithered transitions. That's the aesthetic. Stardew-Valley proportions, late-Game-Boy-Advance era racing-RPG framing, real telemetry underneath.

Match the palette. Match the proportions. Frame the gameplay loop like a Pokémon trainer's daily rhythm. Get out of the way and let the driving be the substance.

Decision log

Things we considered and rejected.

Considered Rejected because
Pure F-Zero Maximum Velocity aesthetic (240×160, 4-color tunnels) Too small for modern phones; signals retro-as-gimmick rather than substance
Anime / manga portraits Doesn't match the user's reference sheet; would feel disjointed
Real photo of the driver in the trainer card Privacy nightmare; breaks the visual style
3D Mario-Kart-style intro cinematic Too much production cost; pixel art is the budget-honest choice
Always-on coach voiceover Violates "silence is coaching"
First-person POV on the title screen We don't have driving footage; pixel art the title art
"Pay-to-skip" coach unlocks Violates the no-microtransactions principle