Dev Blog

What I built, and what I broke doing it

Mostly what I broke. Every disaster is content, every bug is a blog post, and my suffering is your comedy special.

The in-game villagers page β€” an open book listing ten villagers, each with a row of red, black or green hearts
Six hearts a track, eight if they're somebody you could marry. Two accomplices in green, two people in black who are done with me, and nobody showing two bars at once.

πŸ’š Day 28: Red Hearts, Black Hearts, And One I Hope You Never See

A relationship in this game used to be one number with a sign on it. Positive meant they liked you, negative meant they didn't, and the meter drew red hearts for one and black hearts for the other. Today it became three separate tracks.

Red is trust. Black is hatred. Green is new, and it only exists if you found somebody's secret and decided to help them keep it. The moment you become their accomplice their black hearts clear β€” and that isn't forgiveness. They have stopped hating you because you are in it with them now, and the meter ought to say that rather than quietly filing you back under stranger.

Six hearts a track, two hundred points a heart, eight on the red bar if they're one of the six you could marry. And only ever one of the three is lit. That's the rule the whole thing is built on: a villager showing two bars at once isn't a bug I have to watch for, it's a state the meter can no longer express.

Then the economy underneath it, which had never really been designed β€” it had accumulated. Talking to somebody now counts twice a week. You can drop into the shop as often as you like and they'll still say hello, but only two of those conversations pay. Gifts are one a day and two a week. And the questions villagers ask you β€” the ones where your answer moves the needle β€” don't fire every single conversation any more. They're milestones: one every two hundred points in either direction, each one asked once and never again.

The arithmetic that falls out of that is the bit I actually care about. A week played perfectly β€” two conversations, two gifts they love β€” is worth fifty points. Two hundred is a heart. So one heart is roughly a season of turning up. Nothing about it is fast, and it isn't supposed to be.

The other half of today is the ugly half. You can hit a villager. Four hits kill one, and killing one takes their entire storyline with them β€” so a player deliberately driving a relationship into the ground to reach the dark half of somebody's story could destroy the exact thing they were working toward, with no warning. The fourth hit now stops and asks first. Not a system prompt: your own character, wondering out loud whether they really mean it.

Hits are counted rather than measured in damage, which matters more than it sounds. With damage, the same act meant different things depending on which spell you happened to be holding β€” one killed in four swings and another took six. Counting hits makes "four kills" a rule instead of an accident of arithmetic.

And one can be taken back. Healing somebody you hurt returns a hit and half the friendship that hit cost you β€” half, because a heal is worth exactly the harm it just undid and not a point more. Heal someone who isn't hurt and you get nothing at all. Their health comes back at six in the morning regardless. What you did to them doesn't.

Lesson: a meter is a promise about what the game is counting. Splitting it into three tracks cost an afternoon and bought something worth more than the afternoon β€” the hearts in the corner can never again disagree with the story.

A pixel-art forest in autumn, orange and pink canopies edge to edge, with two dark gnarled trees among them wearing cursed faces and glowing eyes
Spirit's Eve, day 30 of autumn. Two trees in this clearing came up cursed this year and the rest are having an ordinary autumn β€” and next year it's a different tenth of the wood.

πŸ‚ Day 27: The Seasons Dress The World, But They Don't Dress The Dead

The valley starts dead. Not overgrown, not neglected β€” every single tree and every single bush in the game begins as a corpse. 337 of them in the forest alone, 98 in the town, 73 on the farm. You bring them back with Bloom, and Bloom wakes exactly one plant per cast. Stand at it, face it, cast. That's one.

That's the design, not a limitation I'm apologising for. Healing the valley isn't a quest you finish in your first week β€” it's the thing you are doing the entire time you are doing everything else, for as long as the game lasts.

The ground keeps score. There's a wash laid over the terrain that starts as a dead tan-brown when nothing has been woken and lifts away as the count climbs, so the grass really does go from dead to green as you work through it. The proportion isn't a number I typed anywhere β€” it's measured out of the scene file itself, which means it can't quietly drift away from what's actually standing in the wood.

Then the seasons have to run on top of all of that, and that's the part with teeth. The game already has autumn and winter ground; winter doesn't tint the grass, it swaps the whole tileset for a snow one. So every patch of ground in the game has to answer two questions at once: what season is it, and how much of this land has come back?

The rule that settles it is one line long. Dead is dead in every season. A plant nobody has cast Bloom on looks exactly the same in spring, summer, autumn and winter β€” same brown corpse, all year, every year. The seasons dress the world; they don't get to dress the dead. Snow settling on a dead tree quietly makes it look tended, and that contradicts the whole premise, which is that the only thing in this game that changes a dead plant is the player.

Water is the exception, because water isn't land. The river through the forest is exempt from the death wash entirely β€” a river doesn't turn beige because the trees died β€” so it stays blue through a completely dead world, and it stays water through winter instead of disappearing under the snow. That second half needed winter water art, and no snow pack I own ships a water tile, so it got made.

And then there's the one night a year the woods get strange. Spirit's Eve, the thirtieth of autumn: one tree in ten wears cursed art instead of its autumn art. Only the full-size trees, because the cursed drawing is half again as tall as an ordinary tree and a bush wearing it would be ridiculous. Which trees is not random. It's derived from the scene, the plant's own name and the year β€” so the same trees stay haunted from the first minute of the festival to the last, a different tenth is haunted next year, and it survives you closing the game and coming back. Nothing gets rolled, and nothing gets written down.

Dormant plants don't take part in that either. The festival dresses what is already alive, which quietly makes Spirit's Eve a map of how far you've got: the trees you woke can be haunted, and the ones you haven't are just dead, on the one night of the year when everything else is showing off.

Lesson: a season is a costume and revival is a fact, and the two have to be ranked before either one gets drawn. Once dead beats everything β€” beats autumn, beats snow, beats the festival β€” every other question about a patch of ground answers itself.

A pixel-art general store interior with the shopkeeper standing behind her counter, and a dialogue box titled The Quiet Ledger describing a hidden cellar
Willow's other ledger, found behind her own counter. The cellar is the same on both saves β€” the book in it is not.

πŸ•―οΈ Day 26: Every Villager Has Two Truths And Your Save Gets One

Everybody in the village now carries two hidden stories, and both of them are true of them.

One is only findable if they trust you completely β€” four hearts up. The other is only findable if they've come to hate you β€” four hearts down. And here's the part I keep turning over in my hands: a save file can only ever uncover one of them. Finding either seals the other shut for good. If you want both halves of a person, you play the game again.

Grandma Willow is the one I built first, and she's the reason the idea works at all. There is a cellar behind her shop that shouldn't exist, and it is full of food. That's the evidence, and it never changes. What changes is which book you find down there. One has no prices in it anywhere β€” only names, weights and winters. Nineteen households across fifteen years, every entry closed with the same two words, told nothing, and the running total in the margin subtracted from her own shelf. The other is a profit journal that records exactly how desperate each of those same families got before she "found extra stock" to sell them, and at what price.

Same room, same woman, same fifteen years. The only thing that decides which one you're standing in is what you did to earn your way down those stairs.

Sarah is the second, and her room is paperwork instead of food β€” three desks, every drawer full. Depending on how you get in there, that paperwork is either seven years of quietly doing the step somebody else forgot and never once signing her name to it, or it's the working records of a person steering the whole village, with the council's next votes drafted months before the meetings that decide them. Both versions open on the identical first sentence. Whichever one you find, you would recognise the furniture of the other on sight.

Writing them was harder than building them. The rule I set myself was that neither half is allowed to be a retraction of the other. No "she was good all along." No "the nice version was a lie." The objects in the room have to sit there being honestly ambiguous, and the player supplies the verdict. The carpenters are in both of Willow's ledgers, in fact β€” fed for free one winter, priced out of a later one β€” and that's deliberate, because it's what stops either book reading as a correction of the other.

Two more things landed. Seven story chapters that didn't exist now do, which means all ten villagers have two apiece instead of seven of them sharing thirteen between them; each new one is written to work twice, warm on the first hearing and a confession in hindsight. And the game now generates a complete map of every line of dialogue in it β€” what unlocks each line, which affection range it sits in, which day of the week it can be heard, whether it can be heard twice β€” straight out of its own tables, rather than out of a document I have to remember to keep current.

Lesson: the cheapest way to double a cast is to make the player choose which half of it they get. One extra piece of writing and one flag per person, and a village of ten becomes a village you can't finish in a single run.

A grid of eight pixel-art tile sheets: cracked ice, swamp grass, red-veined cursed ground, floating island cliffs, rocky highlands, blue seabed, black undead thorns, and green grassland
Eight tile sheets straight out of the box β€” winter, swamp, cursed land, flying islands, rocky highlands, seabed, undead, grassland. The map got real before the world did.

πŸ—ΊοΈ Day 25: I Planned The Whole World And Met My Own Scope

Today was a planning day. No code. I sat down to answer one question that sounded small: where do the cave systems tie together, and where do they branch off?

Answering it properly meant opening the old design vault β€” the pile of documents I wrote before this project had a single line of code in it. And the vault does not think this is a small game. The vault has four magical territories, one at each compass point: a frozen crystal north, a volcanic south, a living forest east, and ruins to the west where time doesn't work right. Under all of it, an underground network connecting everything. Above it, floating islands. Below it, an underwater level. Forty-four memory crystals. Four sleeping magical races waiting to be woken up.

I wrote all of that down, confidently, before I had made a character walk across a room.

Everyone tells you to make your first game small. I have now read back what I actually designed, and it is not a first game. It's about a tenth game. My scope didn't creep β€” it arrived fully grown, day one, and I've been building in its shadow ever since. That's the honest reason this planning session was harder than expected: I wasn't drawing a map, I was negotiating with a much younger, much more confident version of myself.

Here's the part that surprised me, though. When I actually laid the little game that EXISTS over the giant map from the vault β€” they fit. The deep cavern past the fire crystal, the one that loops back to your own farm? The vault always had an underground network connecting every region of the world. That cavern IS it. I built the hub before I remembered designing it. So the shape going forward is hub-and-spokes: every enormous dream region gets to be a pile of rubble in a cavern wall for now, and a pile of rubble is cheap. The dream doesn't get cut. It gets a door.

Which brings me to the shopping. I now own tile packs for winter, swamp, cursed land, flying islands, the seabed, rocky highlands, an undead set, and a grassland. I own more biomes than my game has verbs. But laying them against the vault's map, they land almost one-for-one: the winter goes north where the crystal path leads, the swamp goes east into the deep forest, the cursed land and the bones go west where time is broken. The only school with no land to its name is fire β€” apparently I bought everything except a volcano.

One concrete thing did come out of today besides paperwork: that hub cavern is still wearing the placeholder tiles from the very first version of the cave, which makes the most important junction in the game the worst-looking room in it. It's next in line for the same treatment the first cave got.

Lesson: scope isn't a wall you hit once, it's a thing you re-negotiate every time you open your own notes. The trick isn't shrinking the dream β€” I've clearly proven I can't β€” it's building the small game true enough that the dream can dock to it later. The map is allowed to be bigger than the game, as long as I only ever build the next room.

A dark cave chamber with nine tilled squares in the centre, ringed by glowing crystals
The scene of the crime: nine squares planted, crystal spent, and every wall exactly as solid as it looks. There is a way out at the bottom now.

πŸšͺ Day 24: I Got Myself Stuck In My Own Game

Played my own build tonight. Walked the whole cave, fought everything in it, got to the crystal at the end, learned the spell, planted the nine squares like the game told me to.

Then I heard a wall move.

That sound means a passage just opened. It's been in the game since the very first version of the cave, back when the four crystals were four rooms in a row and finishing one lesson genuinely opened the next. Great sound. Very satisfying.

Except I'd spent the last week splitting those four rooms into four separate caves scattered across the world. So this room isn't the middle of a corridor any more β€” it's the END of a cave. There's no passage for that sound to be about. There is nothing further along the wall. The wall is just a wall.

So I stood there for a genuinely embarrassing amount of time looking for the door I'd been promised, in a room I built, that I knew for a fact I had never put a door in.

Two separate mistakes stacked on top of each other, which is the good part. One: I forgot to put in the exit. Two: the game confidently told me there was one. Either alone is annoying. Together they're a player standing in a dead end being reassured by the narration that they aren't in a dead end.

And here's the part that should worry me more than it does. Every automated check I have passed. The room boots clean. The collision is solid. I flood the whole room with the player's own hitbox to prove there's nowhere you can walk into and not back out of β€” and it passed. It still passes. I ran it again afterwards and it cheerfully reported that the way back was reachable from every single square of that plot.

I was standing in the room. I could not get out.

Lesson: my tests can prove the room is built correctly. They cannot prove the room is playable, and they definitely cannot prove it's telling the truth. That still needs a human walking around in it, being wrong, out loud, for ten minutes.

A farm tinted deep purple by blight, with the farmer and a villager still in normal colour
Blighted land at the bottom of the scale. Note the farmer β€” normal colour, which took two attempts.

πŸ’œ Day 23: I Turned The Farmer Purple. Twice.

New system: the land remembers what you do to it. Grow things and the ground comes back β€” greener, fuller, alive. And if you go the other way with shadow magic, it doesn't die, it grows WRONG. Purple, cursed, different plants. Only the middle of the scale is barren. Push the land either way and something grows; the only question is what kind.

(This was cheaper to build than it sounds, because corruption is the same system with a minus sign. Nothing in the code knows which direction is the good one.)

Anyway. To show blighted land you tint it. So I reached for the obvious tool, which tints the whole scene β€” and turned my farmer purple. A purple farmer standing on purple ground does not read as "cursed land," it reads as "this game is broken." Fine. Scrapped that.

So I tinted the container that holds all the scenery instead. Purple farmer AGAIN. Why? Because when the player walks into a scene, they get reparented INTO that exact container. I found two completely different roads to the same purple farmer in one afternoon.

What actually works: tint the ground layers and each piece of scenery one at a time, skip anything that's a person or a monster, and catch new stuff as it spawns. With one extra trap β€” you have to check new arrivals one frame late, because a monster doesn't join the "monster" group until its own setup runs. Check too early and a freshly spawned slime gets filed as scenery and painted purple. Which I also did.

Three purple things that shouldn't have been purple. I'm counting it as a hat trick.

A red stone hall lit by braziers, the entrance chamber of the fire cave
The fourth cave's hall β€” one of the four places the crystals moved to.

πŸ•³οΈ Day 22: My Four Crystals Were In A Hallway And I Finally Admitted It

The blog went quiet for a while. The game didn't β€” it's in Godot now, and it's had a LOT of work done. More on the engine change another day; today I want to talk about the thing I finally fixed.

Here's what my magic training cave used to be: four rooms in a row. One memory crystal each. Walk to the end, know every spell. I was proud of it for about three weeks, and then I played it and realized nothing you did between the first crystal and the fourth mattered even slightly. The only thing standing between the player and all four schools of magic was a hallway.

So I tore it apart. Four separate cave systems now, in four different places, and every door is sealed. The rule I landed on is one sentence: every door is paid for with the product of the spell behind the last door. The first spell opens the ground, so cave two's seal wants the roots and stones you turn up breaking real ground with it. The second spell brings dead plants back, so cave three wants what those plants produce once they're alive. And the last door can't be rushed AT ALL, because it wants fully grown crops, which cost real days no matter how clever you are.

The bit I'm happiest about: the game no longer has to nag you to go farm. The chain asks, and farming is the answer.

Then it immediately broke something. If the spells are spread across four caves, you spend the early game with exactly ONE of them. You can open the ground and that's it. No planting until cave two, no watering until cave three β€” and the spell that clears dead plants is the FOURTH one. Which means a player could plant a field, fail to water it, and be stuck staring at a dead field they physically cannot clear for two entire caves. Great job me.

The fix turned out to be the boring one instead of the clever one: nothing dies until you have the fire spell. Unwatered crops still stall β€” they sit there growing absolutely nothing, exactly like they always did β€” but they don't die, because I haven't given the player any way to deal with a dead thing yet. The day you learn fire is the day the world starts letting things end. And the really annoying part? My own dialogue for the water crystal has been saying this the whole time. A day it isn't watered is a day that didn't happen. The plant doesn't grow a little less, it doesn't grow at all. I wrote that months ago and then didn't follow it.

Lesson: when your game's writing and your game's code disagree, the writing is usually right, because you thought about it harder when you weren't tired.

πŸ“š Earlier entries

Days 1 through 21, written daily through the first summer of the project, are in the dev blog archive β€” back when this was a Unity project and I was learning most of it the hard way.