Inspiration
I wanted a tower defense that felt like a real lunch rush — not another “kill the creeps” lane. Food Court Frenzy flips the fantasy: hangry mall shoppers aren’t enemies to destroy, they’re customers to stuff. Hunger bars instead of hit points. Burps and tips instead of death animations. The joke has to land, but the loop still has to work one-thumb on a portrait phone.
Contest constraints did the rest of the shaping: portrait 9:16, single-player, fully offline, no CDNs, under 35 MB.
What it does
Hangry guests pour through the north doors and walk an S-lane toward the south exit. You tap a stall in the Food Tray, then tap a glowing pad (drag still works). Eight pads. Eight throws:
- Burger hits one fast
- Kebab slows a pack
- Cone is a heavy splash
- Pizza pierces the lane
- Hotdog chains
- Pretzel lobs a cluster
- Donut leaves glaze
- Smoothie freezes
Fill the meter and they burp, tip, and leave. Let them walk out hangry and morale drops.
10 Waves is a lunch rush. Endless has no last call — after ten it is overtime, and the crowd keeps getting hungrier. Extra toppings twist a shift. Wave 10 brings Ultimate Karen. Clock out on a fake review card.
How I built it
- Stack: HTML5, readable JavaScript, local Three.js, WebAudio, pixel sprites shipped in the zip
- Play: modular
src/packed into a contest zip withindex.htmlat the root — no network, no accounts - Loop: tap-then-pad placement, ★ upgrades per stall, FASTER and HEART in the Food Tray, COMP to save one walk-out, restock between waves
- Cast: original mall manager Skip at the exit, a full guest roster with walk cycles, and a local Employee of the Month wall
Hit Play and audio unlocks. That’s the whole live service.
Challenges I ran into
- Rules as design. Offline-only meant every sprite, stall, and sound had to live in the zip, and the packer had to fail if a CDN string sneaked in.
- Satiation has to read. Players need to feel “full,” not “dead.” Hunger bars, burps, stuffed walk-offs, and the review card had to carry that.
- Portrait clarity. The board has to scream “drop food on pads, stop the walk-outs” in one glance on a tall phone, at 60 FPS.
- Talking without yelling. Skip has a lot to say. Combo spam and two-second bubbles made him unreadable, so the lines that matter now stay up long enough to actually read.
What I learned
Constraints are a feature. Hunger-as-HP lined the comedy up with the systems. A complete one-thumb loop — title, place, feed, restock, clock out — mattered more than a ninth stall. And a portrait arcade game on Three.js only feels native if you protect the frame rate and keep every button thumb-sized.
Credits
Background music: “Hot Swing” by Kevin MacLeod (CC BY 3.0).
Burps: Joseph Sardin / BigSoundBank (CC0).
Foley: Kenney (CC0) and Mixkit.
Built With
- art
- canvas
- defense
- development
- game
- horizon
- html5
- javascript
- meta
- mobile
- offline
- pixel
- portrait
- three.js
- tower
- webaudio

Log in or sign up for Devpost to join the conversation.