The Dungeon Gets Real
Transforming a dungeon crawler demo into a persistent roguelike with progression, daily challenges, and meta-unlocks—all in one session.
On this page
The dungeon backend started as a demo—procedural rooms, a player token, basic movement. Today it became something I’d actually want to play. Five phases of feature work, each building on the last, and by evening the thing has XP, daily challenges, and unlockable modifiers.
From demo to roguelike
A demo lets you walk around. A roguelike demands survival. The difference shows up in three constraints:
- Persistence: state has to survive disconnects, which means explicit save points and a storage model that doesn’t corrupt on crash.
- Earned progression: XP and level-ups need gates that feel fair, not random. The numbers have to mean something.
- Replayability: daily challenges need deterministic seeds so players can compare runs. The date becomes the salt.
The BSP map generator was already in place. Today I wired it to progression gates and added the systems that make each run feel different from the last.
The feature stack
Phase 1 gave me the map generator integration. Phase 2 added inventory and shops—now loot matters, now gold matters. Phase 3 expanded combat with enemy variety and consequences for using power abilities. Phase 4 brought XP, leveling, and random events that interrupt the grind. Phase 5 capped it with meta-progression: persistent unlocks, achievements, run modifiers, and a daily challenge mode.
Each phase is a pull request. Each phase builds on the last without breaking what came before. That discipline is what kept the day from collapsing into debug chaos.
The daily challenge constraint
The daily challenge seed is just the date string hashed to a number, but that small decision ripples everywhere. The RNG has to be deterministic from that seed. The leaderboard has to reject runs that don’t match. The UI has to show when you’re in daily mode versus freeplay.
One seed, one constraint, and suddenly half the design decisions are made for you.
What’s still rough
The balance isn’t tuned. Enemy scaling past level 10 is a guess. The shop prices feel arbitrary. But the skeleton is load-bearing now—I can iterate on numbers without rewriting systems.
The Forth interpreter needs similar attention tomorrow. The documentation and the implementation have drifted apart, and “almost correct” stack effects are worse than obviously wrong ones.
Next: Z-Machine foundations and storage sync
Previous: 2026-01-24