DEV Community

snipforge
snipforge

Posted on • Edited on

Sushi Striker: A World Cup Sushi Goalkeeper Game for the June Solstice Game Jam.

June Solstice Game Jam Submission

@ben @jess This is a submission for the June Solstice Game Jam.

I spend my work days making sure software does not break. Test plans, automation, edge cases. So when I saw a game jam themed around June and its many celebrations, I wanted to do the opposite of my day job for once and build something that exists purely to be fun.

Then I learned International Sushi Day falls on June 18. Same month as the World Cup. The idea arrived almost fully formed: a goalkeeper, a stadium full of fans, and an endless barrage of flying sushi instead of footballs.

So I built Sushi Striker, a browser reflex game where you defend your goal from nigiri, maki, curveballs, penalty kicks and the occasional bomb. No engine, no libraries. Every pixel and every sound is built from scratch with the HTML5 Canvas API and the Web Audio API.

Play it here:

Demo video: https://youtu.be/WurGymWGOJI

Fair warning before you click. Round 3 is chaos. My best score so far is 220. If you beat it, drop your score in the comments. And if anyone manages an S grade on Hard mode with a single life, I genuinely want to hear about it, because I built this game and I still have not pulled that off.

What you are up against:
You control the goalkeeper glove with your mouse, or your finger on mobile. Block the sushi before it reaches the goal. Three rounds, 20 seconds each, and you need to keep your accuracy above the bar to advance. The game does not tell you the exact requirement upfront. You watch the live accuracy bar and the yellow target marker, and if you are slipping it turns red and warns you.

Each sushi type is hand drawn on canvas with its own shape and its own synthesized sound. Nigiri lands with a soft plop, maki with a deep thud, and the shrimp has a high pitched ping because it is worth the most points. Golden sushi is rare, fast, and worth 5.

Then the field starts fighting back Penalty kicks. From Round 2, a whistle blows, a red target marker appears on your goal line, and a football rockets toward it. Save it for +10 points. Miss it and you concede a goal, which costs a life.
Curveball sushi. Some sushi swerves side to side on the way down, like a banana kick. Reading the arc matters more than raw speed.
Wasabi. Catch the green blob and everything drops into slow motion for a few seconds. Save it mentally for when a penalty is incoming.
Soy sauce. If the bottle reaches your goal, it splats and blacks out chunks of your view for a couple of seconds while sushi keeps falling. Catch it before it lands.
Bombs. Do not catch these. Obviously I still do, constantly.
Big Glove. Catch 5 in a row and your glove grows. Combos at 3+ catches double your points and the crowd starts pulsing when your streak hits 5.

Beat all three rounds and you unlock Sudden Death: no timer, no accuracy bar, every single miss costs a life, and the speed keeps climbing until you break. This is where the real scores happen.

Difficulty modes range from Easy with 5 lives to Hard with exactly one.

How I built it:
Pure HTML, CSS, and JavaScript in a single file. A few decisions that mattered: All sushi is drawn procedurally with canvas primitives instead of image files or emoji, so it renders identically on every browser and OS.
Movement is delta time based, so the game runs at the same speed whether your machine pushes 30fps or 144fps.
Every Web Audio call lives inside an isolated module wrapped in try/catch, because audio failures should never be able to touch the game loop.
Canvas size is read once after a 100ms delay so layout has settled, then never recalculated. Game objects use a dead flag instead of splicing arrays mid loop.

What I learned:
This was my first time building a complete game from scratch without an engine, and the lesson that cost me the most time was audio. At one point the entire game silently died in one browser and I could not figure out why. No error, no broken visuals, just a frozen canvas. It turned out a single Web Audio call was throwing inside the game loop. My QA instincts eventually kicked in: isolate the problem, stop guessing, reproduce it reliably. Now every audio call is wrapped and quarantined, and the game keeps running even if sound fails completely.

The other big one: game feel comes from juice. Screen shake, particle bursts, a crowd that reacts to your streak, a whistle before a penalty. None of it changes the mechanics, all of it changes how the game feels in your hands.

What is next:

I am deciding between a persistent leaderboard for Sudden Death survival times and a full World Cup bracket mode across multiple matches. Which would you add first? Genuinely deciding, and comments will sway me.

Built with HTML5 Canvas and Web Audio API by @snipforge
June 2026, June Solstice Game Jam

Top comments (0)