← All projects
Browser game · Feb to May 2025

A snowball fight for everyoneSnowball PvP

I'd never played a multiplayer snowball fight. So I made one.

One giant snowy arena, one server everyone shares, and nothing between you and your friends but some boxes and a lot of snowballs. I designed it, tested it, and shipped it to the real web, and I entered it in Vibe Jam 2025.

Built
4 months
Engine
three.js
Entered in
Vibe Jam 2025
Status
Live
The game mid-fight: a snowy arena with gray boxes and trees, a friend peeking out from behind a box, a snowball flying at them, and the kill feed in the corner ❄ 10 / 10 SPRINT
What you see when you join: one shared arena, and someone already throwing at you.
01

The story

I wanted to make a video game, and I had no idea what it should be. So I started listing games I'd never seen before, and it hit me that I had never, ever played a multiplayer snowball fight. I was like, “huh.” So I started building one, and it turned into a really fun game.

Multiplayer was never even a question. I wanted to play it with my friends, and a snowball fight on your own isn't much of a fight. Because I was building with AI, multiplayer wasn't a scary extra on top. I could decide I wanted it, design how it should work, test it, and keep going.

The Vibe Jam

I was already in the middle of building when my dad told me about the Bolt Vibe Coding Game Jam 2025, a game jam run by Pieter Levels in April 2025. The one rule that mattered: at least 80% of each game's code had to be written by AI. I thought, “Okay, why not?” and entered.

Over 1,000 games were entered. I didn't win (obviously), but submitting was fun, and the game is still in the jam's directory. Search “snowball” or “sports” on vibejam.com/2025 and it comes up, under my handle, @Oreo.

1,000+games entered
80%minimum AI-written code
1snowball fight
The Bolt Vibe Coding Game Jam 2025 title card: vibe code an entire game with AI, by @levelsio, April 2025, $17.5K in prize money, 1000+ games entered.
The jam's title card. 1,000+ games, and one of them is mine.
My listing in the Vibe Jam 2025 directory: sportsduel.app, tagged FPS and MP, by @Oreo, described as a multiplayer snowball PvP fight with a centre arena, trees, and blocks in a ring.
My listing in the jam directory. @Oreo is me.
02

How I built it

I'm a vibe coder, and I'm okay saying that. AI wrote most of the code. Everything else was me: the idea, the design decisions, which features went in and how they worked, all of the testing, and getting it running on the real web.

Step 1 of 4

Prompt

Ask for the feature or the fix I want, in plain words.

I built the whole thing in Cursor. I didn't know about Claude or Codex back then.

One layer at a time

I built it up in layers, each one on top of the last. Step through them:

The game scene, built up layer by layer scenecamerarendererserver 1 @Oreo 32 friend 1 Esc · Paused ❄ 10 / 10

By the end it wasn't a demo anymore. It was a game my friends actually wanted to play.

03

The game

No rooms, no rounds, no lobby. Everyone joins the same server and spawns into one giant open arena, and you just fight. Take enough hits and you respawn, then jump straight back in.

Top-down map: a walled square arena in the centre, an inner and an outer ring of gray boxes around it, trees across the open snow beyond, and a giant box around the whole map

I didn't build the map by hand, but the layout is my design. Drawn from above, not to scale.

Controls

WASD
Move
Mouse
Look around
Click
Throw a snowball
Space
Jump
E
Sprint
Q
Dash
R
Reload
Esc
Pause menu
Sprint and dash

The dash has rules

Sprint is just normal game movement. The dash is the one I was excited about: launch yourself at someone and throw at the same time. It took the most refining, because I had to decide the rules. You can dash once you've left the ground, so it works in the air. But it doesn't start recharging until you land.

Snowballs

10 per reload

Why 10? I just like the number 10. Reloading takes time, so you can't spam forever, and you have to think about when to do it.

Kill feed

A leaderboard that forgets

Every kill shows up in the feed, and there's a leaderboard. It isn't permanent: it's a kill count attached to each player for the session, and it's gone when you leave.

Pause menu

Esc makes you vanish

Pausing takes your avatar off the map, so stepping away doesn't mean standing there getting pelted. Then resume, or exit to the main menu.

04

Try the controls

A little practice yard with the game's real controls. Knock over the snowmen, then try the move the arena is built around: jump, and dash over the wall while you're in the air. It's a calm, top-down, one-player version of something much louder.

  • WASD move
  • E sprint
  • Q dash
  • Space jump
  • Click throw
  • R reload

The real thing is a lot more chaotic. It's first person, and everyone shares one server, so there are snowballs coming from every direction, people dashing over walls, and somebody launching off a tree. Play it at sportsduel.app

05

The hardest part: hitboxes

The biggest problem by far was collisions. Players needed real hitboxes so they didn't walk straight through each other, and snowballs needed to actually register when they hit someone. That took the longest and the most testing of anything in the game.

You can't really test multiplayer collisions on your own. So a lot of it was me and a friend in the game at the same time: walking into each other, throwing at each other, checking whether the hits counted, and then going back to fix whatever didn't.

Two players, a snowball between them, and a tree. With hitboxes shown, each player is a capsule, the snowball is a sphere, and the tree is a mesh of triangles.
Players, snowballs, and trees all need a shape the game can test hits against.

Getting it online

The other brand-new thing was putting the game on the real web. It runs on an external server my dad bought, and I'd never worked with one before. I figured all of it out myself:

  1. 1Learn how to get into the server and set it up.
  2. 2Install pm2, so the game keeps running on its own.
  3. 3Link up the sportsduel.app domain.
  4. 4Set up an SSL certificate, so the site is valid and secure.

It was a little hard. It wasn't as hard as the collisions.

06

What didn't make it

I wanted different kinds of snowballs. They didn't make it into the final game, but here's what they were going to be, compared to a normal snowball.

Cut

Heavy

More damage, but slower. Big commitment, big reward.

Damage
Speed
Cut

Quick

Less damage, but much faster and harder to dodge.

Damage
Speed
Cut

Grenade

Exactly what it sounds like.

Damage
Splash
Speed

a normal snowball

07

Stories

Launching off trees

I remember when my friend and I figured out the trees were bugged. If you jumped into a tree with forward momentum, whether you were running or dashed straight into it, its triangle geometry would catch you and launch you way up into the air. We laughed so much.

From then on we'd head to one corner of the map, launch ourselves off a tree, and rain snowballs down on everyone from the heavens. We did it every time we played, even in groups of four, five, or six.

The best bug I never fixed.

The practice yard above has the same bug. Run into a tree.

Free time, day one

Playing at school

I showed the game to a new friend during some free time at school. We just played and laughed, and everything was normal. We had a really good time.

The next free period

This site is blocked

sportsduel.app

Category
Games
Reason
Blocked by your school's network

If you think this is a mistake, contact your school's IT team.

So good it got blocked

The school's filter had picked it up and figured out it was a video game. My game joined Cool Math Games, Poki, and all the big game sites on the block list. I was so proud. I made a game that got enough attention to get blocked by my school, and that's still one of my favorite things about this project.

08

By the numbers

4
Months to build (Feb to May 2025)
1
Server everyone shares
10
Snowballs per reload
4
Ways to move (walk, sprint, jump, dash)
8
Controls to learn
2
Rings of boxes around the arena
3
Snowball types planned, then cut
80%
Minimum AI-written code for the jam
1
Times blocked by my school (and proud of it)
1,000+
Games in Vibe Jam 2025, mine included

Tools I used

Building
Cursor (AI-assisted coding)
Game
JavaScriptthree.js
Hosting
External serverpm2SSL certificatesportsduel.app
Testing
MeA lot of friends

Why this project matters

Snowball PvP showed me I can build things that make the people around me happy. I put the effort in, and I made something my friends actually enjoyed, with a lot of good memories along the way. Even after it got blocked. (“Oh damn, it was so good it got blocked.”)

Not the code, not the jam. I built something, and it brought joy to the people who played it.