Inspiration

Daily puzzle games like Wordle proved that a simple constraint -- one attempt per day, same puzzle for everyone -- can turn a casual game into a global ritual. But that format has been limited to word and logic puzzles. I wanted to apply it to a genre with real depth: roguelike dungeon crawlers. The core question was simple -- what if every Redditor explored the exact same dungeon each day, and the only variable was skill and strategy? Combine that with Reddit's built-in social layer (comments, leaderboards, sharing), and you get a competitive daily game that people actually talk about.

What it does

Daily Pixel Dungeon generates a new procedurally-generated dungeon every day using a shared seed -- every player faces identical rooms, enemies, and loot. Players navigate grid-based floors with turn-based, bump-to-attack combat. Five enemy types (Slime, Rat, Skeleton, Ghost, Dragon) scale in difficulty as you descend. Every 5th floor is a Boss Floor featuring an Elder Dragon with doubled HP. Treasure rooms appear randomly with bonus loot and zero enemies.

The game tracks kills, gold collected, and floors cleared to produce a final score. Players get one attempt per day -- die and you're done until tomorrow. After a run, you can share your result as a formatted summary in Reddit comments and compete on the daily leaderboard. A combo streak system rewards consecutive kills with escalating messages from "Nice!" to "GODLIKE!", and visual feedback (floating damage numbers, particle bursts, screen shake) keeps every action feeling impactful.

How we built it

Engine & Platform: Phaser 3.90.0 for 2D rendering with pixel-art mode, deployed as a Reddit Devvit custom post with splash (inline preview) and expanded game views.

Deterministic Dungeon Generation: Dungeons use Binary Space Partitioning (BSP) -- the map recursively splits into regions, each getting a room with randomized padding, connected by L-shaped corridors. A Mulberry32 seeded PRNG with djb2 string hashing ensures the same date string always produces the same dungeon. Each floor derives its own sub-seed ({date}:floor:{n}) so changes on one floor never cascade to others.

Zero External Assets: All 20+ pixel art textures (player, 5 enemies, 4 items, tiles, HUD hearts, D-pad buttons) are generated programmatically at runtime using Phaser's Graphics API (fillRect, fillCircle, fillTriangle + generateTexture). No sprite sheets, no loading screens.

Server: Hono handles API routes. Redis sorted sets (zAdd, zRange, zScore) power the leaderboard with 48-hour TTL. Score validation is server-side -- the server recomputes floor * 100 + kills * 10 + gold before accepting submissions.

Game Feel: Fog of war uses 360-ray raycasting with an 8-tile view radius. A real-time mini-map renders explored tiles. Camera fade transitions between floors with animated "Floor N" announcements. Enemy health bars appear when enemies take damage. The combo system tracks kill streaks with pulsing HUD counters.

Input: Unified input handling across keyboard (WASD + arrows), touch swipe gestures, and an on-screen D-pad with tactile scale-press feedback -- all debounced through a single lock to prevent conflicts.

Challenges we ran into

Programmatic pixel art -- Designing recognizable characters using only primitive shape calls was surprisingly difficult. Making a dragon look like a dragon with just fillRect and fillTriangle required many iterations.

Deterministic multi-floor seeding -- Naively reusing one RNG instance meant adding a treasure room on floor 1 would cascade and change every subsequent floor's layout. The fix was deriving independent sub-seeds per floor.

One-shot balance -- With only one attempt per day, a frustrating first experience kills retention. Floor 1 needed to feel approachable while floor 10+ needed genuine threat. Tuning enemy scaling, item distribution, and the score formula took careful iteration.

Cross-platform input conflicts -- Supporting keyboard, swipe, and D-pad simultaneously required guarding against swipe events firing in the D-pad region and ensuring all three input sources funnel through a single debounced lock.

Reddit platform constraints -- Working within Devvit's custom post framework meant adapting to its specific lifecycle (splash vs. expanded views), Redis API surface, and build pipeline while keeping the game responsive.

Accomplishments that we're proud of

Zero-asset architecture -- the entire game loads instantly with no external files, no CDN, no loading bar. Every texture is generated in milliseconds at runtime. True fairness -- seeded PRNG guarantees every player faces the identical dungeon. Combined with server-side score validation, the leaderboard reflects pure skill. Game feel polish -- floating damage numbers, colored particle bursts, camera shake on boss kills, combo streak messages, and score pop animations make the game viscerally satisfying despite being built entirely from rectangles and triangles. Full-featured in ~1500 lines -- BSP dungeon generation, 5 enemy AI behaviors, fog of war raycasting, turn-based combat, leaderboard, shareable results, mini-map, boss floors, and treasure rooms -- all in a tight, maintainable codebase.

What we learned

Seeded randomness is powerful -- a single date string can deterministically generate an entire game world, enabling fair competition without storing world state server-side. Juice is disproportionately impactful -- adding damage numbers, particles, and screen shake took a fraction of the development effort but transformed how the game feels. BSP is elegant for dungeons -- recursive space partitioning produces more natural, varied room layouts than simpler grid-based algorithms. Daily constraints create urgency -- limiting players to one attempt turns a casual game into something people think about and plan for. Programmatic art is viable -- for pixel-art games, generating textures at runtime eliminates the entire asset pipeline and makes iteration instant.

What's next for Pixel Dungeon

Daily modifiers -- themed challenges like "Double Gold Tuesday" or "Ghost Swarm Friday" to keep each day feeling unique Status effects -- poison, slow, and stun from special enemy variants Run replays -- store move sequences so players can watch top-scoring runs and learn strategies Meta-progression -- unlock cosmetic player skins based on lifetime stats (total kills, floors explored, bosses defeated) Nightmare mode -- halved fog radius, enemies move twice per turn, for players who want a harder challenge Sound effects -- procedurally generated retro audio using Web Audio API to match the programmatic art approach

Built With

Share this project:

Updates