▶ Play it live · License: MIT · Built with Kaplay — no build step
A complete 2D platformer that runs in the browser, born as a personalized gift and grown into a small, polished arcade game. Pick a heroine, cross six themed worlds, beat a multi-phase boss, and reach the Sala da Ballo finale — on desktop or phone, online or offline.
It plays as an arcade run against the clock: 3 lives, deaths cost a life (and 500 Coccoline 😏), losing them all restarts from level 1, and finishing posts your time to a global time-attack leaderboard — the net play time, so pauses and death overlays don't count.
- 🗺️ Six themed levels + a finale — forest, coral abyss, oriental rooftops, snowy peaks,
twilight garden, royal castle. Levels are pure data (ASCII tile maps), so the world builds
itself from
src/levels/*.jswith no per-level rendering code. - 👑 Multi-phase final boss — the Custode di Pietra hovers out of reach, rains shockwaves and debris, then dives into a window where a stomp wounds it. Deliberately softlock-proof.
- 👗 Skin progression — each cleared level layers on a new clothing piece (skirt → … → royal cape), rendered as stacked sprites on the same heroine.
- 📱 Mobile-first & PWA — landscape touch controls, iOS audio-unlock handling, safe-area aware, and installable to the home screen with offline play via a service worker.
- ⏱ Time-attack leaderboard — a live HUD timer tracks your net play time (pauses and deaths excluded); finish the six worlds and it's ranked fastest-first on a Vercel serverless function backed by Upstash Redis. It's a history: every run you post is its own entry (your earlier times are never overwritten), and the board is paged. Degrades gracefully to "hidden" when offline or unconfigured.
- 🌍 Italian & English — the whole game, finale letter included. It picks your device's
language on first load (Italian for Italian speakers, English for everyone else) and you can
switch any time from the menu's Settings;
?lang=it/?lang=enforce it. - 🎨 100% generated assets — every sprite, tile, parallax background and music/SFX track is
procedurally generated by
tools/gen/(deterministic) — no third-party art packs.
Vanilla JavaScript ES modules, no build step: Kaplay is vendored
(vendor/kaplay-3001.0.19.mjs) and imported directly, so the game is just static files served
as-is. src/config.js is the single source of truth (resolution, palette, characters, skins,
physics, assets) and src/i18n/ is the single source of truth for every user-facing string.
DOM/HTML UI (src/ui/) is isolated from the gameplay/collision logic
(src/scenes/game.js). Deployed on Vercel; browser tests run in real Edge via
playwright-core (the only dev dependency).
Performance work that makes it smooth — and cool — on a real iPhone: pixelDensity: 1 on touch
devices, off-screen culling of draws, greedy-meshed solid colliders, a per-state frame cap that
drops the render rate when nothing is moving (menus/pause/reward) so the GPU stops cooking the phone,
and a refresh-aware in-play cap (uncapped on 60Hz panels, tamed on 120Hz ProMotion) that keeps jumps
smooth — see CLAUDE.md for the engineering notes and
gotchas.
ES modules need an HTTP server (opening index.html via file:// won't work):
python tools/serve.py 8137 # or: npm run serveThen open http://localhost:8137 and play (on mobile, hold the phone in landscape).
Tests: npm install once, then npm test. Deploy: npm run deploy (reads VERCEL_TOKEN from a
gitignored .env).
- Desktop: ◀ ▶ move · Space / ↑ jump · Esc pause.
- Mobile: on-screen D-pad + jump button + pause, shown only during play.
| # | World (IT / EN) | Twist |
|---|---|---|
| 1 | Foresta Incantata / Enchanted Forest | running, ravines, brambles, forest critters |
| 2 | Abissi di Corallo / Coral Depths | sea-urchin hazards, patrolling crabs |
| 3 | Tetti d'Oriente / Eastern Rooftops | flying obstacles over pagoda rooftops |
| 4 | Cime Innevate / Snowy Peaks | stalactites that drop and reset |
| 5 | Giardino del Crepuscolo / Twilight Garden | breeze columns that carry you on long glides |
| 6 | Castello Reale / Royal Castle | pendulum chandeliers + the Custode di Pietra boss |
| 7 | Sala da Ballo / The Ballroom | the finale — heroine in all six skins + a personalized note |
This project was designed and built by Vito D'Elia in close collaboration with Claude Code (Anthropic's agentic coding assistant) — architecture, level/boss design, the procedural asset pipeline, the test harness, and the iOS/PWA performance work — with a human in the loop steering direction, reviewing every change, and testing on real devices.
A small showcase of agentic, AI-assisted development: human product taste and on-device QA paired with an AI agent that refactors, generates assets, and writes tests across the whole codebase. Curious about the workflow? Open an issue.
- Engine: Kaplay
3001.0.19— MIT, vendored. - Font: Pixelify Sans — SIL Open Font License.
- Art & audio: original, procedurally generated by
tools/gen/— no third-party packs. - Code: © 2026 Vito D'Elia, released under the MIT License.
0 comments
log in to comment.