Inspiration

This game was inspired by a fan favorite card game that was first released with Final Fantasy 8 in 1999, 27 years later Triple Triad is still a fun, addictive, intuitive game, Edgebreak Tactics expands the grid, adds multiplayer, adds a card deck builder and brings the action to Reddit.

Originally, I designed this game to be published on Steam // App Stores, since it was using Phaser this hackathon inspired me to push it into production.

What it does

Edgebreak Tactics is a Triple Triad-inspired multiplayer card battler that runs entirely inside a Reddit post. Players build a 13-card deck from a collection of 300 unique cards spread across five rarity tiers, then face off on a 5×5 grid where every card has four directional stats. Placement is everything, touch a stronger side to an enemy card and you flip it to your color, and chaining Same and Plus captures triggers cascading combos that can wipe half the board in a single turn (I call the 4+ flip payoff an EDGEBREAK).

There's a 100-level solo campaign with six escalating AI archetypes, a ranked Elo ladder with server-authoritative matches, private friend-code lobbies for playing with a specific opponent, an animated booster pack ceremony for opening new cards, and a full deck builder with real-time rarity-quota enforcement. Everything is portrait-first and touch-optimized for Reddit's mobile app.

How I built it

I built the whole thing solo on top of Phaser 4 for the game engine and Devvit Web 0.13 for the Reddit runtime. The client is a single-page Phaser app bundled with Vite; the server is a Hono app running on @hono/node-server, bundled with esbuild into a CommonJS blob that Devvit boots on request.

The multiplayer layer is server-authoritative, I keep every match's board, scores, turn ownership, and timers in Redis, and clients only submit intents (place card, pass, forfeit). A polling transport (PollingTransport.ts) drives the 2-second state broadcast loop, and I wrote an abstract IVersusTransport interface so I could swap in a MockTransport for local dev and a DevvitTransport in production without touching game code.

The AI is a negamax search with alpha-beta pruning that scales from a pure-random opponent at level 1 up to a 4-ply search with move ordering and center bias at level 100, budgeted at 60,000 nodes per turn so it never stalls a match. Player collection, deck, campaign progress, and audio preferences persist via a schema-versioned localStorage store so I can migrate data as the game evolves.

Challenges I ran into

Server-authoritative turn timers. Getting the 30-second turn clock and 4-minute match cap to feel snappy on the client while the server remains the source of truth took some tuning. The compromise was a 2-second server broadcast plus client-side interpolation.

AI performance. A naive minimax at depth 4 on a 5×5 board explodes fast. I had to add move ordering (captures first, then Same/Plus, then center-biased placements) and a hard node budget to keep the top-tier AI responsive without dropping frames on mobile.

Being one person. Art, engine work, server, matchmaking, AI, tutorial, audio, and playtesting all landing on one desk means every rabbit hole is a real cost.

Accomplishments that I'm proud of

Shipping real multiplayer on Devvit. Ranked queue, private lobbies, spectator hooks, Elo rating, forfeit/timeout handling, and a full match state machine, all server-authoritative, all inside a Reddit post.

The combo system. Same, Plus, and cascading combo chains with proper banner VFX, floating flip popups, and the EDGEBREAK reward for 4+ flip turns. It's the moment that sells the game.

The 100-level campaign feels like a real progression curve. Going from "obviously random" at level 5 to "why did it see that trap three moves out" at level 90 was one of my favorite systems to tune. 300 unique cards. Every single card has its own stats, sprite, tier, and flavor lore.

A booster ceremony that actually feels good. 44-frame pack animation, then a 10-card grid with tap-to-reveal, small thing, but it makes rewards land.

Full audio and animation polish, an ornate inspect overlay, sparkle borders, tier-colored frames, and a 7-step gated tutorial that actually teaches the rules instead of just narrating them.

What I learned

Server-authoritative design is worth the upfront cost. Once the server owned the match state, everything downstream, anti-cheat, spectator, forfeit, timeouts, rating, became simple additions instead of retrofits.

Devvit Web is powerful but opinionated. Learning where /api/* vs /internal/* routes go, how the menu endpoint expects a UiResponse, and how the post lifecycle interacts with client entrypoints unlocked a lot.

Redis as game state is fantastic for turn-based games. Cheap, atomic, TTL-aware — perfect for pending/active match tracking with automatic cleanup.

Elo is deceptively simple. A 20-line function gives you a fair ladder that self-tunes over time. No reason to overbuild rating for v1.

AI difficulty should scale on two axes, not one. Ply depth alone is boring; scaling the AI's available card pool alongside its search depth is what makes late-campaign matches feel like a different game. Portrait-first is the right default for Reddit. I designed the whole UI for a 540×960 canvas and never had to fight orientation issues on mobile.

Solo dev discipline. Cutting scope early (no in-game shop for v1, no cosmetics, no cross-device sync yet) is what made shipping possible.

What's next for Edgebreak Tactics

Rating persistence — currently Elo is computed and applied, but I want it saved to the persistent player profile with a public leaderboard.

Spectate UI — the server already supports spectator subscriptions; the client viewer is next.

Deck import/export codes so players can share builds in comments.

Cosmetics and card backs — pure-cosmetic unlocks tied to campaign clears and ranked seasons.

Weekly seasons and tournaments — leaderboard resets with themed reward packs.

A soul/currency economy — the plumbing exists in PlayerData; the shop UI and Reddit Gold integration are the next milestone.

Elite rules — Triple Triad "Elemental" and "Random" rule variants for private lobby modifiers.

Draft mode — pick from a shared pool of 25 cards to build a one-off deck for a single match.

Community events — cooperative "boss decks" against a shared server-controlled AI, with leaderboards for fastest wins.

Continued balance passes on the 300-card pool as playtest data comes in from the ladder.

Built With

Share this project:

Updates