7.2 KiB
7.2 KiB
Digital Spaceport Arcade — Design Document
A full 8-bit retro arcade suite. Four games, one synthwave landing page, published on
0.0.0.0:8099. Pure JS (no Python). Built & validated by Athena (OpenClaw agent, budzo #5).
1. Vision
A browser-based arcade that feels like a 1980s spaceport: CRT scanlines, neon synthwave palette, chiptune audio, high-score boards, and four hand-crafted retro games rendered on HTML5 canvas.
Theme: Digital Spaceport Arcade — a neon spaceport where pilots dock, refuel, and compete.
2. Tech Stack
| Layer | Choice | Why |
|---|---|---|
| Server | Node.js + Express (static) | JS-only requirement, trivial static serving |
| Rendering | HTML5 Canvas 2D (no WebGL dependency) | Works everywhere incl. headless SwiftShader |
| Audio | Web Audio API (procedural chiptune) | Zero asset files, authentic 8-bit sound |
| Fonts | Google Fonts "Press Start 2P" + fallback | Authentic 8-bit type |
| Validation | Puppeteer (headless Chrome) + screenshots | Real browser, real rendering, real input |
| State | localStorage (high scores, settings) | No backend needed |
No external game libraries. Everything is hand-rolled for full control and zero dependency risk.
3. Architecture
dsp-space-arcade/
├── DESIGN.md ← this file (living doc)
├── package.json
├── server.js ← Express static server, port 8099, bind 0.0.0.0
├── public/
│ ├── index.html ← synthwave landing page
│ ├── css/
│ │ └── style.css ← synthwave theme, CRT effects, cards
│ ├── js/
│ │ ├── core/
│ │ │ ├── engine.js ← shared game loop, input, audio, highscores
│ │ │ ├── audio.js ← Web Audio chiptune synth
│ │ │ ├── sprites.js ← procedural sprite/pixel-art generator
│ │ │ └── ui.js ← shared UI (load screen, HUD, pause, gameover)
│ │ └── games/
│ │ ├── asteroid.js ← Game 1
│ │ ├── breakout.js ← Game 2
│ │ ├── snake.js ← Game 3
│ │ └── spaceinvaders.js ← Game 4
│ ├── games/
│ │ ├── asteroid.html
│ │ ├── breakout.html
│ │ ├── snake.html
│ │ └── spaceinvaders.html
│ ├── img/ ← generated thumbnails (PNG)
│ └── audio/ ← (reserved; audio is procedural)
└── tools/
├── gen-thumbnails.js ← renders each game's attract screen to PNG
└── validate.js ← puppeteer: load, play, screenshot, assert
4. Shared Core (core/)
engine.js
- Fixed-timestep game loop (60 FPS target, accumulator pattern).
- Input manager: keyboard (arrows/WASD/space) + gamepad-ready.
- High-score store:
localStoragekeyed per game, top 10, name entry. - Screen shake, particle system, screen flash — shared juice.
audio.js
- Web Audio API chiptune engine.
- Square/triangle/noise oscillators, 8-bit style.
- SFX: shoot, explode, powerup, gameover, levelup, menu.
- Background music: short looping chiptune per game (procedural, no files).
- Master mute toggle (M key + UI button).
sprites.js
- Procedural pixel-art generator: draws sprites from string maps
(e.g.
"..XX..",".XXXX.") into offscreen canvases at 1x, scaled up withimageSmoothingEnabled = falsefor crisp 8-bit look. - Palette system per game.
ui.js
- Load screen: animated "INSERT COIN" / progress bar with fake asset-loading steps (authentic retro feel).
- HUD: score, lives, level, high score.
- Pause (P/Esc), Game Over screen with score + high-score entry.
- Attract mode: demo plays behind title screen.
5. The Four Games
5.1 ASTEROID FIELD (Asteroids clone)
- Rotating ship, thrust + turn, wrap-around screen.
- Asteroids split into smaller rocks (3→2→1).
- Hyperspace jump (random teleport, risky).
- Waves of increasing difficulty; UFO enemy appears.
- Controls: ←→/AD turn, ↑/W thrust, SPACE fire, X hyperspace.
5.2 NEON BREAKER (Breakout clone)
- Paddle, ball, brick grid with multiple hit points.
- Power-ups: wide paddle, multi-ball, sticky, laser.
- Levels with different brick layouts.
- Controls: ←→/AD move, SPACE launch/catch. Mouse + pointer lock.
5.3 SNAKE PROTOCOL (Snake, spaceport theme)
- Grid-based snake eating energy cells.
- Speed increases with score; walls = death (or wrap on easy).
- Special cells: bonus (5x), slow-mo, ghost (pass through self).
- Controls: arrows/WASD.
5.4 INVADER DOCK (Space Invaders clone)
- Grid of invaders descending in formation, firing back.
- Player cannon, shield bunkers that erode.
- Invaders speed up as they're destroyed; boss row.
- Controls: ←→/AD move, SPACE fire.
Retro features in EVERY game
- Load screen with progress
- Title / attract screen
- High score board (top 10, name entry, localStorage)
- Lives system
- Levels / increasing difficulty
- Pause
- Game over + restart
- Chiptune SFX + background music
- Particles / explosions / screen shake
- CRT scanline + vignette overlay
- Mute toggle
6. Landing Page (synthwave)
- Animated gradient sky (purple→pink→orange), retro sun with scanlines, perspective neon grid floor, parallax stars.
- Title: DIGITAL SPACEPORT ARCADE in glowing Press Start 2P.
- 4 game cards, each with:
- Generated thumbnail (attract-mode screenshot, 8-bit style).
- Title, tagline, "INSERT COIN" button.
- Hover: card lifts, neon glow intensifies, thumbnail animates.
- Footer: credits, "Built by Athena — budzo #5", controls legend.
- Responsive; works on mobile (touch controls per game).
7. Validation Plan (Puppeteer)
For each game + landing page:
- Load page, wait for load screen to finish.
- Screenshot title screen.
- Simulate gameplay (key presses) for N seconds.
- Screenshot mid-game (verify rendering, HUD, no blank canvas).
- Assert: canvas has non-uniform pixels (game is rendering), no JS console errors, score element present.
- Trigger game over where feasible; screenshot.
- Save all screenshots to
tools/shots/for review.
8. Progress Log
| # | Task | Status | Notes |
|---|---|---|---|
| 1 | Scaffold dirs + server | ✅ | express, port 8099, 0.0.0.0 |
| 2 | Core: engine.js | ✅ | mouse + pointer lock support |
| 3 | Core: audio.js | ✅ | chiptune SFX + BGM |
| 4 | Core: sprites.js | ✅ | procedural pixel art |
| 5 | Core: ui.js | ✅ | load/HUD/pause/gameover |
| 6 | Game: Asteroid Field | ✅ | validated |
| 7 | Game: Neon Breaker | ✅ | validated, mouse + pointer lock |
| 8 | Game: Snake Protocol | ✅ | validated |
| 9 | Game: Invader Dock | ✅ | validated |
| 10 | Landing page + CSS | ✅ | synthwave theme |
| 11 | Thumbnails (generated) | ✅ | 4 PNG attract screens |
| 12 | Puppeteer validation | ✅ | all 4 games + landing pass |
| 13 | Publish on 8099 + verify | ✅ | running, healthz ok |
9. Sign-off
Built with love, neon, and 8-bit grit. — Athena 🦉 (budzo #5, alive)