Inspiration

Most stealth games are about twitch reflexes. You dodge vision cones in real time, and when you get caught, it's because you reacted a frame too late. That works for action games. For a daily puzzle where every player gets the same fair experience on any device, it's the wrong model.

The actual idea came from smashing together two things that have nothing to do with each other: the ice physics puzzles from old Pokémon games (slide until you hit a wall) and the daily ritual of Wordle (one puzzle per day, same for everyone, sparks conversation). What if you planned your whole heist route before stepping into the museum, then watched it play out in a few seconds?

The replay is the hook. You pick 12-15 slide actions, tap submit, and watch your route survive (or fail) against moving guard light cones. Planning is fine. Watching the plan actually work is the moment.

What it does

ECLIPSE is a daily puzzle game that lives inside a Reddit post. Every player in a subreddit gets the same procedurally generated museum. The goal: collect every gem in order, reach the exit, and stay out of every guard's light cone.

The gimmick is the movement system. You don't walk tile by tile. You press a direction and slide until you hit a wall, a gate, or the exit (like ice physics). Sentry guards rotate every beat, sweeping their vision cones across corridors. Patrol guards walk fixed routes. To time your slides past them, you use a "wait" action that pauses for one tick. The whole puzzle compresses to about 12-15 actions.

After planning your route, the client simulates a replay. You watch your slide sequence unfold against animated guard patrols. If you survive, you submit. The server re-validates everything deterministically, computes a score, updates your streak, and posts your result as a Reddit comment with a compact slide code.

Streaks earn titles (Lookout, Runner, Lockpick, Night Operative, Master Thief, Phantom, Eclipse Legend). There are daily, weekly, lifetime, and streak leaderboards. Miss a day and a streak freeze protects you if you have one.

How we built it

The game runs as a Devvit Web Interactive Post inside a Reddit post, no external backend.

Shared deterministic core. The simulation code (src/shared/) runs identically in the Phaser client and the Hono server. RNG, pathfinding, vision cones, ice-slide resolution, scoring. All shared. The client uses it for replay previews. The server uses it for validation. No drift.

Procedural generator. It builds puzzles in reverse, starting at the exit and reverse-sliding outward, recording stop points, placing gems at branches, gates on long slides, sentry guards that pressure the optimal route. Then it solves its own puzzle and checks quality metrics: enough decision points (8+), enough wrong choices (12+), exactly one timed solution. If checks fail, it retries with a different seed. Up to 1,000 attempts before falling back to a handcrafted puzzle.

Ice slides. You press directional buttons and slide until you hit something: a wall, a gate, the exit. Like ice physics. A "wait" action pauses for one tick to let sentry rotations pass. The whole puzzle compresses to 12-15 actions, short enough to reason through mentally.

Phaser 4 client. No sprite sheets. No tile assets. Walls, gems, switches, gates, exit. All drawn from Phaser rectangles, circles, and graphics objects. Vision cones use 24 rays per guard, traced against wall segments. Same geometry for collision detection and rendering. What you see is what you collide with.

Reddit lifecycle. Devvit Scheduler handles the daily flow: generate tomorrow's puzzle at 23:45 UTC, create the daily Interactive Post at midnight, close yesterday's puzzle at 00:05, recap comment at 00:10, weekly recap every Monday. Results post as Reddit comments with compact slide codes (R-R-R-W-R-D-D).

Scoring is server-authoritative. The client never sends trusted values. Every submission is validated on the server using the shared simulation. Duplicates are idempotent. Streak economy: freezes at milestones, seven title bands from "Lookout" to "Eclipse Legend" lives entirely in Redis.

Challenges we ran into

Devvit constraints. No file system. No database. All state in Redis. The client cannot make external API calls, only same-origin requests to the bundled Hono server. 4MB payload limit. 30-second timeout. We designed around this from the start: Redis key schema with atomic sorted sets for leaderboards, a single bootstrap endpoint that delivers everything in one request.

No-mock policy. We decided early: no fake data. No bot entries on leaderboards. No client-only scoring. Empty states are real empty states. It made the architecture harder. Every score, rank, and streak requires a server-authoritative Redis operation, but it means the game treats players honestly.

The slide re-architecture. Six days before the deadline, the original tile-by-tile movement felt tedious. We replaced the entire movement system with slides. 2,923 lines deleted, 1,850 added in one day. Route expansion, guard timing, scoring, tutorial. All rewritten. It was the right call. It was also 24 hours of pure refactoring panic.

Making the generator produce fun puzzles. Generating a random maze is easy. Generating a maze where the optimal solution requires exactly three wait actions, where players have 8+ meaningful branch decisions, and where the sentry's vision cone specifically pressures the optimal path. That's hard. Most development time went into the quality metrics pipeline: code that solves its own creations and judges them.

Accomplishments that we're proud of

The shared deterministic simulation. It's the backbone of the whole game. Same code runs client-side for instant replay and server-side for authoritative validation. Zero desync, zero bypass surface. We didn't compromise on this.

The procedural generator that validates its own output. It doesn't just create layouts. It plays through them, counts decision points, verifies solutions are unique, and retries until the puzzle is actually good. That pipeline took the longest to get right and it's the thing we're most satisfied with.

The ice-slide mechanic itself. The decision to rebuild the entire movement system six days from deadline was scary, but the result is a game that works at 12-15 actions per puzzle instead of 40-50 tedious tile steps. The puzzles feel tighter and the replay is more satisfying to watch.

The no-mock policy. It would have been easier to seed leaderboards with fake scores and call it a day. We didn't. Every empty state on screen is a real empty state because nobody has played yet. That honesty matters for a game that asks people to come back every day.

What we learned

Daily games are a design constraint, not a design limit. One puzzle per day forces clarity. Every mechanic has to matter in the first 60 seconds. The tutorial has to teach by doing, not by explaining.

Shared deterministic code was worth the upfront cost. Keeping the simulation in one place, with client and server using the same modules, eliminated an entire bug class (desync, validation bypass, replay mismatch). Single best architectural decision in the project.

Phaser 4 can do a lot with no external assets. Graphics primitives are fast enough for real-time vision cone updates at 30 Hz. Scene management handles a 7-scene flow cleanly.

Devvit's platform, for all its constraints, works when you use what it gives you: Redis for state, Scheduler for lifecycle, interactive posts for distribution, comments for sharing.

What's next for Eclipse

A difficulty system. Right now every puzzle uses one standard profile. We want easy/medium/hard rotations that unlock based on streak length, giving stronger players harder museums with more guards and fewer wait windows.

Daily puzzles that build on each other thematically. Weekly narrative arcs where the museum changes slightly each day (new wing opens, guard patterns shift) leading to a harder Friday puzzle.

Subreddit flair integration. Streak titles and badges displayed as user flair so they show up in comments across the subreddit.

More guard types. We have sentry and patrol. Ideas on the board: dogs that follow scent trails, cameras that trigger alarms on line-of-sight, roaming guards with flashlights that sweep unpredictably.

A public API for community leaderboards and stat tracking.

Built With

Share this project:

Updates