Inspiration

This game was a result of collission of two obsessions. The first: placement-tactics games. The second: the Wordle ritual — one shared puzzle a day, everyone comparing scores. Reddit felt like the perfect home for that ritual. I decided to build the game for reddit, and on day 1 I discovered the hackathon. It was a no-brainer match to join.

What it does

Wakelings Duel is a 5-minute hex duel against a machine opponent. Arrows on each creature strike whatever they point at; struck creatures fall asleep; sleepers join whoever aims more live arrows at them. When neither side can place, the bigger awake family wins. Every day, every player gets the same board. Three ways to win the day: beat your own best, beat the subreddit's leaderboard, and beat "the machine's best" — a per-board benchmark score we computed by running a beam search against our own shipped AI. It's honest: sharp humans DO beat it, and the game celebrates loudly when they do.

How we built it

The rules engine is dependency-free plain JavaScript shared by client and server: the browser animates it, and the Devvit server replays every submitted move list to recompute scores server-side — no client-claimed scores, real anti-cheat on the leaderboard. A Node simulation harness played thousands of self-play games to tune balance, prove all 365 daily seeds winnable, and compute the machine's-best benchmarks. The client is Phaser 4 at true device resolution; the creature art concept and design came from my wife, each with a matched asleep pose; every sound is synthesized WebAudio at runtime, so the app ships zero audio files and makes zero external requests. Redis holds the daily leaderboards; boards rotate at UTC midnight.

Challenges we ran into

The invisible-arrow problem. Playtesting kept surfacing the same confusion: an arrow that pointed at something and didn't fire. I adopted a design axiom: no live arrow may sit idle when an enemy stands in its fireable spot and it forced two real rules changes mid-hackathon. Although the fix was out of scope for hitting the deadline, I rushed to ultimately go for it as it makes the game more fun.

The haze hunt. The game looked mysteriously blurry on phones. Root cause: the canvas rendered at CSS resolution and the browser upscaled it 3x. Fixing it properly (native-resolution canvas + camera zoom) also forced a font redesign when I discovered our pixel font's 3s read as 8s at stat sizes.

Balance you can trust. Every rules tweak re-ran the gauntlet: 47 engine unit tests, headless-Chrome smoke tests that actually play full games, A/B self-play sims measuring wake rates and win rates, and a re-tuned benchmark table.

What we learned

I didn't realize the power of simulations to balance a game like this. Once the core game was done, the biggest hurdle for me was that how do I make sure every day is a balanced, winnable game. For that, I had to simulate every game and run simulations in a headless browser, then compile the results and re-do everything. This resulted in the game not visually progressing for days, though I knew that this balancing is very important. The simulation technique is one of the biggest thing I will carry forward to the next game.

What's next

A daily discussion thread anchored to each post ("Day 47 — post your %"), streak tracking, and a weekly harder board. I also plan to introduce new creatures and more fun challenges baked into game mechanic. For example: make sure you capture a certain unit in addition to dominating the board.

Built With

Share this project:

Updates

Submission history