Two Feet: a physics-based browser skate game where each foot is controlled separately. A game by v4rgas.
See the codeA physics skateboard game for the browser, played with two feet: each foot has its own keys. No trick buttons: the feet push the board, the physics reacts, and the game names what the board did. A game by v4rgas.
pnpm install
pnpm dev # http://localhost:5173
pnpm build # a static build in dist/ (runs the type check first)
pnpm preview # serves dist/
Checks: pnpm check && pnpm lint && pnpm test, plus pnpm montage:verify (the montage
clips land) and pnpm test:human (lines played with sloppy human timing).
The first launch opens with a short intro (a hardflip down a two-foot drop, any key skips
it), then a short tutorial on flat ground (push, ollie, kickflip). After that you're on the
Street Course. Later launches open the last map you played; Esc → Intro replays the
intro.
| Keys (regular stance) | |
|---|---|
W A S D | front foot |
↑ ← ↓ → | back foot |
Space | push on the ground, catch in the air |
hold ↓ + S, let go of ↓, then W | ollie |
A / D after the pop | kickflip / heelflip |
← / → after the pop | shove-it |
Q / E | body spin, steer |
R | restart at your checkpoint, or at the start |
C | set a checkpoint (on four wheels) |
Esc | menu: maps, stance, tutorial, intro, controls |
In goofy the two key clusters swap feet. Change stance in the menu. The menu's Controls page shows every move in your stance.
Dev builds also have F1 (debug overlay), F3 (tuning panel), ?map=<id> to open a
map directly, and ?montage / ?demo.
Add a folder src/maps/<id>/ with a map.ts that exports a MapDefinition built from the
world context's obstacle kinds. Nothing else: the game finds it at build time and it
shows in the menu. See src/maps/README.md.
GAME.md: the game shell (intro, tutorial, maps, menu, checkpoints)MECHANICS.md: the trick mechanicsREQUIREMENTS.md: architecture (DDD contexts, layer rules)STYLE.md: look and feeldocs/adr/: design decisionsLive at https://twofeet.v4rgas.com. It's a static Vite build, served by a Cloudflare Worker with static assets (the successor of Cloudflare Pages), in the Worker project two-feet.
pnpm exec wrangler login (opens a browser to authorise Cloudflare).pnpm deploy (runs the checks, builds dist/, uploads it).pnpm deploy:preview (prints a preview URL; production doesn't change).wrangler.toml holds the Worker name, the custom domain and the assets folder. public/_headers sets the cache headers. The same build is also on two-feet.juanvargasbes.workers.dev.
TypeScript
97.9%
Two Feet: a physics-based browser skate game where each foot is controlled separately. A game by v4rgas.
See the codeA physics skateboard game for the browser, played with two feet: each foot has its own keys. No trick buttons: the feet push the board, the physics reacts, and the game names what the board did. A game by v4rgas.
pnpm install
pnpm dev # http://localhost:5173
pnpm build # a static build in dist/ (runs the type check first)
pnpm preview # serves dist/
Checks: pnpm check && pnpm lint && pnpm test, plus pnpm montage:verify (the montage
clips land) and pnpm test:human (lines played with sloppy human timing).
The first launch opens with a short intro (a hardflip down a two-foot drop, any key skips
it), then a short tutorial on flat ground (push, ollie, kickflip). After that you're on the
Street Course. Later launches open the last map you played; Esc → Intro replays the
intro.
| Keys (regular stance) | |
|---|---|
W A S D | front foot |
↑ ← ↓ → | back foot |
Space | push on the ground, catch in the air |
hold ↓ + S, let go of ↓, then W | ollie |
A / D after the pop | kickflip / heelflip |
← / → after the pop | shove-it |
Q / E | body spin, steer |
R | restart at your checkpoint, or at the start |
C | set a checkpoint (on four wheels) |
Esc | menu: maps, stance, tutorial, intro, controls |
In goofy the two key clusters swap feet. Change stance in the menu. The menu's Controls page shows every move in your stance.
Dev builds also have F1 (debug overlay), F3 (tuning panel), ?map=<id> to open a
map directly, and ?montage / ?demo.
Add a folder src/maps/<id>/ with a map.ts that exports a MapDefinition built from the
world context's obstacle kinds. Nothing else: the game finds it at build time and it
shows in the menu. See src/maps/README.md.
GAME.md: the game shell (intro, tutorial, maps, menu, checkpoints)MECHANICS.md: the trick mechanicsREQUIREMENTS.md: architecture (DDD contexts, layer rules)STYLE.md: look and feeldocs/adr/: design decisionsLive at https://twofeet.v4rgas.com. It's a static Vite build, served by a Cloudflare Worker with static assets (the successor of Cloudflare Pages), in the Worker project two-feet.
pnpm exec wrangler login (opens a browser to authorise Cloudflare).pnpm deploy (runs the checks, builds dist/, uploads it).pnpm deploy:preview (prints a preview URL; production doesn't change).wrangler.toml holds the Worker name, the custom domain and the assets folder. public/_headers sets the cache headers. The same build is also on two-feet.juanvargasbes.workers.dev.
TypeScript
97.9%