Hi everyone! I made a first-person snowball fight: four against four with bots on eight winter maps. Snowballs fly on a real arc, so you tap to throw quickly or hold to wind up a longer throw. A hit on the head counts twice, and three hits freeze you solid until you come back at your base.
Play (free, desktop and mobile): newkrok.com/gamer-zone/freeze-out
There are three modes: Deep Freeze (first team to 30 freezes), King of the Hill (a ring that moves every minute) and Sled Raid (pull the enemy sled home to your base). Eight characters each have a strength of their own, and five tournament cups unlock maps, characters, colours and hats. Your teammates get better the more matches you play together, and at the end the throw of the match is replayed.
Some technical bits
- No model or texture files: everything is built in code.
- Surfaces are vertex coloured, with one small triplanar texture drawn on a canvas. No UVs needed.
- Each player is one
SkinnedMeshper material: 3 draw calls instead of ~30. - Static props are merged per material: ~200 draws down to ~100.
- Your hands are a separate pass, so they never clip into walls.
- Bots solve the throw angle for an arc and lead their target.
WebGPURendererwith a WebGL 2 fallback, and auto low quality on weak GPUs.
Stack: three.js r187 (WebGPURenderer), plain JavaScript, Vite. Mouse and keyboard, touch or a gamepad, 8 languages and a weekly leaderboard.
A note on how it was made: I designed and playtested it, and the code (including every model drawn in code) was written with Claude Code. The sounds, music and voices were made with ElevenLabs.
I would love feedback, especially on how it runs on your GPU or phone and whether the bots feel fair!

