Banner
← Return to Projects

Hearthfall: My Pixel-Art Roguelike

December 2023Game DevUnityRoguelikePixel ArtAIUnity 6.6C#URP 2DTopDown Engine 5InkUI ToolkitCinemachinePythonSupabaseClaude Code
Project StatusIn Progress
RoleSolo Developer

I made a video game! 🎮

Hearthfall is a story-driven pixel-art roguelike. You fight your way down a dungeon, room by room, die, go back to town, and the story moves forward.

The whole story is playable from start to finish. What's left is art, balance, polish, and a redesign of the final boss.

❄️ The Story

Hearthmere, a walled city under endless snow
Hearthmere. Three hundred years of winter.

The kingdom of Hearthmere has known only winter for three hundred years.

A magic flame called the Hearth keeps the city alive. The Church says the cold comes from a Hollow King buried below, and that killing him will bring summer back.

The town square gathered around the Hearth
The Hearth, in the middle of town.

So the Descenders' Guild sends people down the Pit, a giant shaft in the old district, into the Undercroft.

Most go for the loot: three centuries of weapons, alchemy and strange magic, left behind by everyone who died down there. A few have reached the king. Nobody has ever beaten him.

Descenders on the scaffolding around the Pit
The Pit.

You play a nameless Descender who can't remember falling. You wake up at the bottom next to Snowdrop, a small, cheerful flame spirit who says you hit your head.

She revives you when you die, eats the souls of what you kill, and powers your spells. She seems very happy to have you. 🙂

Snowdrop the flame spirit floating over the fallen Descender
Snowdrop. Nothing suspicious here.

⚔️ How It Plays

It's a twin-stick action roguelike, kind of a mix of Hades and Slay the Spire:

  • The fighting is fast top-down shooting and slashing.
  • The route is a branching map you pick your way through, room by room.
  • The progression is a Hades-style loop. You die, go back to town, and the story moves on.

It works with mouse and keyboard or a controller.

A Descent

Each depth is a branching map with the boss at the top. Before going into a room, you can see what's in it: a fight, an elite, a shop, a treasure chest (about 1% are mimics 👀), a rest site, a challenge, a mystery event...

Picking a route on the map, then an elite room: the Spore Mother.

The doors lock until every wave is dead. Then you grab the reward and pick the next room.

A Horde challenge.

Building Your Character

This is the fun part. Every descent, you build a character out of stats, boons, weapons, spells, gear and companions.

There are 6 stats: Strength, Defense, Agility, Focus, Friendliness and Luck.

Enemies drop Embers, little coloured orbs that go into your stats. When a stat hits a breakpoint, you pick one of three boons.

Putting Embers into a stat, then picking a boon.

On top of that:

  • Weapons: 11 classes (pistols, shotguns, snipers, lasers, rockets, staffs...). They can have an element and up to three modifiers like bounce, pierce, homing or chain. And 53 recipes merge two weapons into a new one.
  • Spells: three slots, paid for with souls. Instant casts, auras, beams, and conjured weapons.
  • Gear: helmet, body, pants and boots, with 9 sets that give bonuses.
  • Companions: hire them and they fight next to you.
  • Curses: some of the most powerful items come with one...
The inventory: stats, weapons, spells, gear and companions.

When a build comes together, it gets a little chaotic. 💥

One hit, a whole crowd down.
45 kills without a scratch.

Mystery Events

There are 115 hand-written events: riddles, gambles, ambushes, deals and strangers. Some choices depend on your stats.

The ghost archer.

Bosses

Each depth has a story boss you always fight first. After that, the boss is picked at random from a rotation.

A short cutscene plays before and after every boss.

The Hollowed Descender facing the player in a cave
Meeting the Hollowed Descender, the first story boss.
...and beating him.

And at the bottom of depth 3, King Kaldor, the Hollow King, is waiting on his throne.

The Hollow King on his throne of ice
Nobody has ever made it past the king. 👑

What's after the king? You'll have to find out for yourself. :)

🏘️ Hearthmere, the Hub

When you die (or win), you go back to Hearthmere, a snowy walled town above the Pit.

The town square, around the Hearth.

You spend Ash, the currency you keep between runs, on new heroes and on perks sold by the townsfolk. There are 6 heroes: the Wanderer, Berserker, Paladin, Rogue, Mage and Bard (who starts with Biscuit the dog 🐶).

The people of Hearthmere have their own stories, and they move forward as you play. A gold "!" shows up when someone has something new to say.

Catching up with the townsfolk between descents.

Your choices change the town, decide who lives, and lead to different endings.

The Descender and Snowdrop at a campfire with two travellers
Coming home for the first time.

There's also a training yard, an armory with every weapon in the game on display, daily challenges, New Game+, a boss rush, and 75 achievements.

📦 By the Numbers

The game got pretty big:

  • Weapons: about 120 you can loot, plus 53 recipes
  • Spells: 57
  • Gear: 80 pieces in 9 sets
  • Boons: 172
  • Enemies: 225, including 44 bosses and minibosses
  • Mystery events: 115
  • Cutscenes: 44 scenes
  • Dialogue: about 7,000 lines, from 53 characters
  • Music: 43 tracks
  • Code: about 100,000 lines of C#

🎬 Cutscenes

The cutscenes are pixel-art stills with captions and slow camera moves (zoom, pan, hold), plus music and sound effects.

The Guild's ledger of the dead, by candlelight
The Guild's ledger.
Marlo's tavern, deep in the Undercroft
Marlo's tavern, the shop.

The stills are AI-generated, then pixelated and matched to the game's palette.

🛠️ How It's Made

  • Engine: Unity 6.6 with URP 2D (640×360, pixel-perfect)
  • Gameplay base: TopDown Engine 5 by More Mountains (characters, weapons, AI, inventory)
  • Dialogue: Ink by inkle. Every conversation in the game is written in it.
  • UI: UI Toolkit
  • Camera: Cinemachine
  • Tools: about 90 Python scripts that generate and recolour sprites
  • Balancing: anonymous run summaries sent to Supabase (you can turn it off)

Every sprite is remapped to one shared palette, Resurrect 64, so art from different packs looks like it belongs together.

All the content (weapons, spells, boons, enemies, events...) lives in JSON files, and a menu in Unity turns them into game data in one click.

And most of the code was written with Claude Code. It can even read the Unity console and inspect scenes by itself.

🚧 The Making Of

I started this project back in December 2023, as a prototype in Unity 2022.3. In October 2026, I rebuilt it in Unity 6.6: that month alone has 651 commits.

The full story of how it got made, with the early versions, the playtests and the glitches, is coming soon!

Back to Main Campaigns