A dark-fantasy roguelike auto-battler where you don't play the hero — you play the Demon Lord. Raise an army, rule a treacherous court, and watch your battles erupt in synergies.
▶
▶ WATCH THE TRAILER
Opens the trailer on YouTube in a new tab.
An overview of the game, my role, and the tech behind it.
Demon Rising is a dark-fantasy roguelike auto-battler. You command the Demon Lord's castle: recruit fallen champions, convert captured heroes, and lead an inner circle of officers whose loyalty, ambition, and grudges you have to manage as carefully as the battlefield itself.
Every run sends you down a branching world map of battles, elites, markets, treasures and eerie encounters. Between fights you craft your army through talents, class fusion, relics and gear — then watch deterministic auto-battles play out, full of procs, spell chains and brutal combos.
I designed and built the whole game solo. But the part this case study focuses on is the AI-product-design work: the castle's court is driven by a local language model, and making a non-deterministic model feel like a reliable, readable product is the real story. The sections below break down how it was made.
Six interlocking systems define the game loop.
Battles run as a deterministic simulation — units take positions, move, and unleash class skills, spell chains and combo procs. You set the army, then watch synergies collide.
Charging heavies, blinking assassins, war-priests, lifesteal vampires — each class plays differently. Three-path talent trees and dual-class fusion drive deep build craft.
Your top officers debate proposals at a round table — driven by a local LLM. Persuade them, settle disputes through sparring, and rule through politics.
Every follower has a personality and a voice. Talk to them between battles, read the room, and manage loyalty before ambition turns to mutiny.
A branching world map, starting relics, a refreshing black market and dark random encounters. Build-defining choices stack up — no two runs play the same.
Merge followers into stronger forms, combine two classes into one demon, and reshape your roster mid-run into something far deadlier than its parts.
Combat, council, the world map and the systems in motion.
Click any image to enlarge.
Design goals, the systems I engineered, and what the hard parts taught me.
I wanted to build a roguelike that put the player on the other side of the fantasy. Instead of a band of heroes storming a dungeon, you are the Demon Lord at the top of it — recruiting, scheming, and sending your own monsters out to die. That single inversion drives everything: you don't just build a party, you run a court.
The goal was a game with the build-craft depth of a deck-builder, the spectacle of an auto-battler, and a layer of character and politics that most auto-battlers skip entirely.
You manage a castle and a court, not just a squad — loyalty and ambition matter as much as stats.
Many systems, one clear loop. Power comes from synergy and choices within a run — not permanent grind.
Minions have voices, officers have agendas — the castle should feel alive between every battle.
Solo, in Godot 4 / GDScript: a deterministic combat simulator with a separate visual replay layer; 9 classes with branching talent trees, fusion, relics and traits; a full roguelike run structure; a complete pixel-art interface; and the system this case study is about — an LLM-driven council and a cast of living minions. Everything below is about that last part: the AI-product-design work.
The castle's standout system is the Round Table Council. Your officers debate a proposal, and you answer them by typing whatever you want. It runs on a local language model. Talking to a model is easy; shipping a product on one is not.
A language model is a co-author you can't fully trust. It is non-deterministic, sometimes slow, occasionally wrong, and every so often returns output in the wrong format entirely. A game cannot answer that with a spinner that never ends or an error on screen. So the core question was never "what prompt?" — it was: how do you build a reliable, legible experience on top of an unreliable component? That question shaped every decision below.
I designed the degraded experience first, then built the ideal one on top of it. Four rules:
The governing principle: the AI is an enhancement layer, not a dependency. Strip the model out entirely and the game is still fully playable. Designing to that bar is what made an AI-native feature genuinely shippable.
Letting players type free text into a council is a UX trap — people don't know what's allowed, and an open box invites inputs the system can't honour. I designed around that instead of restricting it:
None of this was right the first time. The shippable version is the iterated one:
One developer, limited time, and a hard ceiling: the AI has to run on a normal player's PC — not a server I control. That ruled out "just call a big cloud model" and forced the discipline above — design the fallback first, treat the model as optional, quarantine the non-determinism, and turn every failure mode into a designed experience instead of a bug.
What made an AI-native feature shippable wasn't a better model — it was product design around an imperfect one. That approach generalises to any product with an LLM in the loop: assume it will sometimes be slow, wrong, or offline, and design so the user never pays for it.
AI product design isn't prompt-writing. It's designing the system around a probabilistic component so the end user still gets something reliable and legible: bounded latency, an honest fallback, in-product feedback that explains what the AI did, and clear, deliberate trade-offs between the AI path and the deterministic one. Demon Rising is where I learned to actually build that — and it is the lens I bring to every AI product after it.