Pixel Olympics is a browser drinking game built around a side-scrolling pixel-art race: pick your racers, cheer them to the finish line, and let the standings decide who sips.
It now includes 9 race scenes including Bangkok City, 18 selectable racers including Evil Bad Guy, Old Guy, and Monk, plus an in-game English / French language switcher.
Everything runs in the browser โ no backend, no accounts. Clone the repo and run pnpm dev, or play the live build on a phone or laptop. Add up to six players and start the race.
Play now: pixel-olympics.vercel.app
The game was built by Jonathan Rycx, who leads product direction, design, and implementation across the Rixouu party-game repos.
- Side-on race, left โ right, with photo finish and live standings HUD.
- 18 PNG-sequence racers in
public/sprites/โ Forest Ranger, Pirate, Anubis, Assassin, Black Ninja, Egyptian Mummy, Egyptian Sentry, Jungle Master, Pumpkin Head, Robin Hood, Rogue, Skull Night, Thief, Vampire, White Ninja, Evil Bad Guy, Old Guy, Monk - Each player gets a custom colour (UI swatch) and character picker in the lobby.
- 9 scene packs: Sky Kingdom, Mountain Valley, Ancient Greek, Desert Grand Prix, Neo Tokyo, Space Colony, Tropical Island, Volcanic Racing, Bangkok City.
- Each scene uses a bespoke background + track scene pack.
- 3 race lengths: Sprint (quick), Classic (balanced), Marathon (epic).
- Full UI support for English and French.
- The selected language is saved locally in the browser.
Toggle power-ups on or off before the race.
All pickups currently share the same question-box asset in public/power/power-up.png, while the gameplay effects stay distinct.
| Power-up | Effect |
|---|---|
| Boost | Burst of speed |
| Star | Speed + immunity |
| Banana | Drop a trap behind you |
| Lightning | Slow racers ahead |
| Shield | Block one hit |
Built for groups โ the results screen calculates sips automatically:
- Winner deals sips equal to the number of players.
- Everyone else drinks their finishing place (2nd = 2 sips, etc.).
- Last place gets one extra sip (chug call-out).
- Slowpoke clause: never led the race โ +1 sip of shame.
Drink responsibly โ water counts too. 18+
Full rules and house variants: docs/game-rules.md
- Procedural Web Audio SFX (boosts, spins, finish fanfare).
- Mute toggle in the corner; respects
prefers-reduced-motionfor the countdown. - English / French language switcher in the lobby; the selected language is saved in the browser.
- Mobile-friendly layout with pixel fonts (Press Start 2P, Jersey 10).
- Vite โ dev server and production bundle (split ES modules, hashed assets)
- Canvas 2D rendering with a low-res pixel scale (
image-rendering: pixelated) - Web Audio API for sound โ no external libraries
- Self-hosted fonts โ Press Start 2P & Jersey 10 (WOFF2 in
public/fonts/) - Vercel static hosting โ see docs/deployment.md
corepack enable
pnpm install
pnpm devOpen http://localhost:5173 (Vite prints the URL in the terminal).
pnpm build
pnpm preview # optional โ serve dist/ at http://localhost:4173No install needed โ pixel-olympics.vercel.app
- Import github.com/Rixouu/pixel-olympics in Vercel.
- Framework preset: Vite (auto-detected) โ install:
pnpm install, build:pnpm build, output:dist. - Deploy โ live at pixel-olympics.vercel.app.
Optional share URL: /play (rewrite to /). Details in docs/deployment.md.
pixel-olympics/
โโโ index.html # App shell + meta (Vite entry)
โโโ src/
โ โโโ main.js # Boot
โ โโโ styles/
โ โ โโโ fonts.css # Self-hosted @font-face
โ โ โโโ game.css # UI + overlay styles
โ โโโ game/
โ โโโ assets.js # Asset preload + lobby scene reveal
โ โโโ backgrounds.js # Scene image source helpers
โ โโโ config.js # Constants (colors, lengths, power-ups)
โ โโโ color.js # Color helpers
โ โโโ characters.js # Racer registry + sprite crop data
โ โโโ engine.js # Canvas, race sim, UI, lane alignment, main loop
โ โโโ i18n.js # EN/FR copy, scene labels, and metadata translations
โ โโโ image-loader.js # Shared image request cache
โ โโโ palette.js # Sprite palette helpers
โ โโโ scenes.js # Scene registry + track layout tuning
โ โโโ sprite-sheets.js# Sprite frame loading + source rect helpers
โโโ public/
โ โโโ background/ # Scene packs (background + track)
โ โโโ fonts/ # WOFF2 font files
โ โโโ power/ # Shared power-up artwork
โ โโโ sprites/ # Character frame sequences
โ โโโ favicon.svg
โ โโโ og-image.png
โ โโโ site.webmanifest
โ โโโ sw.js
โโโ docs/
โโโ vite.config.js
โโโ package.json
โโโ pnpm-lock.yaml
โโโ vercel.json- Pick English or French from the lobby language switcher if needed.
- Add players (up to 6) โ tap colour to recolour, tap the racer sprite to cycle character.
- Choose scene and race length.
- Toggle power-ups if you want chaos (or turn off for a pure sprint).
- Tap START THE RACE โ countdown, then watch the HUD.
- Results show placement, sip counts, and optional party prompts โ race again or edit settings.
Expand How to play & power-ups in the lobby for the in-game rule card.
- Extending characters / scenes: see docs/extending.md.
- Character assets: racers load from numbered PNG sequences (
Running_000.png...Running_011.png) with crop metadata insrc/game/characters.js. - Localization: all lobby, HUD, toast, results, scene, and metadata copy lives in
src/game/i18n.js. - Latest content additions: Bangkok City is registered in
src/game/scenes.js, and Evil Bad Guy, Old Guy, and Monk are registered insrc/game/characters.js. - Lane model: scenes define explicit lane geometry and top-slot formation so 1..N racers occupy the correct visible lanes from the top.
- Track layout: track textures render proportionally, with scene-specific lane offsets and mobile height tuning to avoid squeezed tracks or oversized lower aprons.
- Asset loading: the lobby keeps the main canvas hidden until the active scene art is ready, then reveals the real background and track.
- No accounts or third-party analytics.
- Core gameplay runs locally in the browser.
- Self-hosted fonts โ no Google Fonts CDN at runtime.
- No data persistence โ refresh the page to reset the lobby.
- Security headers configured in
vercel.json.
Contributions are welcome.
- Keep changes in
src/game/โ runpnpm devto verify. - Preserve the pixel-art aesthetic and mobile-first layout.
- Test on both desktop and a phone-sized viewport before opening a PR.
- Update docs when you change rules or extension APIs.
PolyForm Noncommercial 1.0.0 โ Copyright (c) 2026 Jonathan Rycx
Commercial use is not permitted under this license.
- Jonathan โ Lead Developer โ Rixouu
- Press Start 2P & Jersey 10 (self-hosted WOFF2)
- Classic party-game energy from the Rixouu drinking-game collection (split-the-g, split-the-g-mobile, and friends)
Built with โค๏ธ for friendly races and responsible sips.