Designer Diary: Corrupted by Ruin #1

I’ve started working on a new computer game. I initially envisioned it as a cross between Dungeon Keeper 2 and FTL; you build a dungeon, gain monsters, and move them around your dungeon to respond to adventurers that try to invade. By surviving over several rounds, you gradually corrupt and take control of the land you are in, and a run involves corrupting several such lands.

In contrast to Icewords, for which development was very ad-hoc, I’ve decided to plan this game out in advance. I am making a game design document in as much detail as possible to have a clear picture of where I am going. I am also experimenting with test-driven development, using the Godot unit testing framework WAT.

Understanding the genre expectations of players is crucial when making a game. You don’t have to adhere to all of them, but it is easier for players to understand a game when they are already familiar with aspects of it. Dungeon Keeper 2 is the best example of the genre I am targeting. Some of its features that I see as essential are building a dungeon out of different types of rooms, attracting a variety of monsters to your dungeon, and using those monsters to fight off heroes that try to invade. Mining for gold while building tunnels is another iconic mechanic that would be good to replicate.

I decided to start my brainstorming with the concept of rooms. A large part of the progression that I envision in my game comes from unlocking, building, and upgrading many different types of rooms. Each room has a different effect and spawns a unique minion type. Some rooms can also transform when connected to others, an idea I got from Loop Hero. For example, placing a Library next to a Graveyard transforms it into a Haunted Library. Players like having little secrets to discover.

My initial vision for the rooms was as square tiles placed in a grid, like in Galaxy Trucker. When designing any spatial game about building something, I always ask: “Why does it matter where I place things?” In Galaxy Trucker, many threats come from a predictable direction and are more likely to occur in some rows or columns than others. While this makes sense in space, I didn’t see an obvious way to do something similar underground.

There are all sorts of ways you can make positioning matter based on the abilities of certain rooms. I object to relying exclusively on room abilities, however. It places a burden on new players; to make intelligent decisions about placement, they need to learn the nuances of each room. Therefore their heuristics are not transferable when exposed to new room types. I wanted to provide a reason to put a room in a particular location independent of what the room did.

I decided to try using tetrominoes instead of uniform square tiles. Most games that deal with tetrominoes ask questions about how efficiently they tile the board and what is on the spaces they cover-up. The latter focus is perfect for a game about building a dungeon because it is naturally suited to mining mechanics: you can print resources on the board for the player to harvest by covering them up.

Cover-up mining is probably enough to justify tetromino placement, but I wanted to make efficient tiling a focus too. In Dungeon Keeper 2, you gain a mana resource based on the area of your dungeon. In thinking about implementing a similar system, it occurred to me that rewarding the playing for dungeon area and penalizing them for dungeon perimeter naturally incentivizes efficient tiling. Mechanically, the player gains energy for each tile in their dungeon and loses it for each adjacent empty tile. Thematically, rooms generate mana and radiate it off into the environment. Mana thus obeys similar rules to real-world heat, which I like.

Such a system gives players two contradictory guiding reasons for tile placement. They want to spread out to harvest resources on the map, but they want to stay compact to minimize mana radiation loss. On top of this, they need to consider room evolution and any room abilities that care about proximity or adjacency. Overall, I think this gives enough reasons to care about where they place their rooms to make tile positioning meaningful.

At this point, I decided to try out unit testing in Godot while implementing classes to handle tetromino rooms and maps. I tried using GUT first but didn’t like that I couldn’t use arguments in my constructors with it, so I switched to WAT. I also prefer WAT’s integration with the editor over GUT’s requirement that you launch a scene to run your tests.

The biggest unexpected thing I learned is that unit testing is great for giving you feedback without having to implement example scenes. Previously, when making games in Godot, I would rush through a slapdash setup to get something I could play, leading to messy code that I would have to refactor. Psychologically, we want to see results for our work, and it is hard waiting for thousands of lines of code before you see anything happen – plus, you are almost sure to have an error somewhere. But being able to write a unit test and then immediately see results reduced this need a lot. Unit testing doesn’t just help you catch errors; it also helps you stay motivated.

Combat is the next consideration, which I am still debating. The planned structure of the game is that you cycle through the phases of building rooms, preparing for the heroes, and fighting the heroes. At first, I imagined this working like FTL boarding mechanics where monsters and heroes in the same room will automatically fight each other, and the challenge is allocating your monsters. Heroes would enter the dungeon from doors that lead out, so the layout would influence where threats appear. Battles would happen in real-time, perhaps pausing to cast spells or issue orders.

However, I’m not sure how interesting I can make that without becoming inaccessible. Crew combat is simple in FTL because you have to manage other things simultaneously, like weapons and power allocation. But if the focus is on fighting alone, I’m not sure it would be interesting enough to justify the phase. The issue with idle combat is that aside from the choice of where to allocate forces, the player has very little to do. Also, the idea of independent heroes invading from many different points feels off; capturing the traditional feel of a party venturing through a sequence of encounters would be better.

Another problem with real-time combat, in general, is that it severely limits the feedback you can give the player about differences between units. For instance, I recently played a newly released game called Hero’s Hour, where you recruit armies comprising many different types of units. However, combat involves a real-time battle where your entire army fights the enemy army, and it is difficult in the chaos to tell how each type of unit differs from the rest. I have observed this with RTS games as well; real-time combat smooths over the unique properties of each unit. I want the different monster types to have personalities, not blur together into generic minions. Therefore, I realized that I needed to have turn-based combat.

Currently, I am considering a system where a single party of adventurers encounters one room of your dungeon at a time, and you deploy monsters (and traps and spells) to that room as though you are playing cards. I was thinking about a turn-based idle system where heroes and monsters alternate dealing their damage, but that adds a lot of time to the game, and I’m not sure how your choices would change between combat rounds. If a spell is good to play, wouldn’t you spam it? And if you can’t, then why have multiple turns? Instead, my current vision is that there is one round of combat in which you play your cards and hit resolve, and then the heroes progress to the next room.

I’ve been playing a lot of Spirit Island lately, so it occurred to me that the power thresholds mechanic would work well with such a combat system. Each room and monster in the room provides elements, and each room, monster, trap, and spell has two effects – a weaker default effect and a better effect that applies when used in a room with the matching elements. I still need to figure out what makes the most sense thematically for how traps work.

I love reading or listening to post-mortems and designer diaries, but my games often have few records about why I made the choices I did or what issues I encountered. I think recording my reasoning as I go is valuable not just for looking back but also to help understand my design choices as I make them, so I will make more of an effort to post about it here.

How to make randomized victory points work

My opinion of Eclipse has deteriorated since I first learned about it in college. Back then, it had just come out, and I was excited at the prospect of a shorter Twilight Imperium with more streamlined mechanics. The part that most intrigued my inner designer was how it dealt with income – you removed cubes from a track to place them on a board, and the number uncovered was how much you got to collect. This practice is commonplace nowadays, but it was innovative at the time. I bought the game along with its expansion and played it extensively with my friends.

I revisited Eclipse a few years ago and found that it did not live up to my memories of it. In particular, I found myself much more aware of how arbitrary so much of it is. Exploring is costly, and the quality of the systems you encounter varies widely. Combat is a dice fest. But the most obvious way in which the game feels random is the reputation tile mechanics.

When you fight in Eclipse, whether you win or lose, you are rewarded with randomly drawn “reputation tiles” – which my friends and I abbreviated to “reptiles” to the frequent confusion of new players. These are worth some number of victory points between one and four, and the value of the tiles you own is secret. You can only hold a limited number of tiles and eventually discard lower-value tiles to make room for more valuable ones.

The reasons behind this system make sense. Because there are only a limited number of high-value tiles and players are trading up to them, players want to fight early. Because the value of the tiles is secret, players can’t be sure what anybody’s total score is, obfuscating the current leader. Succeeding in battle is also incentivized because you draw more tiles and choose one to keep.

Statistically, reputation tiles work. In practice, they lead to feel-bad moments where you draw a low tile by chance and feel cheated. The problem isn’t just with Eclipse, either. In general, when you distribute random amounts of victory points to players for the same actions, you make it easier for players to attribute their successes or failures to luck rather than their hard work.

The risk of unfairness may be why randomized point distribution of this sort is uncommon in board games. But such mechanics have undeniable benefits. We do not want players to know who has won the game until the end, and hidden victory points that nobody else knows about are great at confusing the issue. So how do we give players random victory points without making success feel arbitrary?

One of the principles I hold to in game design is that when bad things happen to a player, there should be a silver lining for them to see. My favorite example to point to is Imperial Settlers, where whenever another player destroys one of your buildings, you get one wood and a foundation that you can sacrifice to build something else. The foundation isn’t technically a benefit – after all, you could have used the building you had before the attack as a foundation already. But psychologically, it feels like a silver lining because it makes one of your choices – which card to give up – easy to make.

We can use this same principle to fix the reputation tile problem. What if you could spend reputation tiles and the value of the tile didn’t matter? For example, imagine a game where you transport cargo drawn at random from four different point values. However, during the game, you can burn unwanted tokens to move faster. The amount of the boost is independent of the point value of what you spent. (Note: This is basically how the Reactor Furnace in Galaxy Trucker works, though there the cargo isn’t drawn randomly)

In this scenario, drawing low-point tokens does not feel unfair. It is sometimes even a relief because it simplifies the player’s decision of what to do. Draw some worthless scrap? Burn it! Yet hidden tokens still serve to obscure a player’s point total. A player might choose not to burn cargo because it is valuable, or they might think they can win without doing so.

I think hidden randomized victory points can work without feeling arbitrary, and I think the key is giving players ways to convert the less valuable ones into something useful.