Monday 10 June 2013

UnBrogue postmortem

This isn't an actual postmortem, because I've not finished with UnBrogue, but the 1.1 series of releases is coming towards a natural conclusion (with soon to be released 1.1.6 - assuming there are no further bugs requiring fixing that I can resolve in this branch) and I suspect there'll be a significant break between the 1.0/1.1 releases and 1.2 releases for reasons to be discussed.

UnBrogue started as a personal variant where I added and changed a few things that were annoying me, and then grew enough legs that it became worthwhile releasing for the 2012 Annual Roguelike Release Party (and which I deliberately kept under the radar prior to then). The main focus of the earliest release were about making plate armour and staffs of lightning bolts less of a no-brainer choice, making ogres more useful allies, and trying to increase the viability of a stealth game which I thought had potential but due to a dearth of rings of stealth in games I had been playing was something I hadn't experienced.

At a more meta level, I was curious to see whether I could incorporate some of the ideas I had been playing around after having played and fallen in love with the Binding of Isaac, a game which is particular "content-wide" in the sense that you will only encounter a small vertical slice of the possible content in the game in any one play through. Brogue has some of that width, but I wanted to see how much further and in what directions I could push it and still have a robust and interesting game.

What went right

1. Choosing a great game and code base to base it on.

Brogue is a great game of ideas to play around with, and a beautiful code base to write with. This ensured that when it came to development I was generally working at the coal face of working on new designs and ideas rather than having to worry about the back end framework. This is especially important for roguelikes which have a large number of complex systems with robust and interesting interactions; and in a hobbyist area where motivation is always a challenge, you want to maximise the amount of time you spend doing interesting things.

2. Not limiting myself to ideas that I could argue be reintroduced to the main game

This meant I could quite happily go and break the beauty of the code in search of new ideas. There is some pretty ugly additions to the code (Talismans of the Sinister Hand being the worst offence here), but I could quite happily add lots of stuff without worrying that I was adding a second (or third) set of flags to a particular data type, or that the elegance of the code was being diminished by bolting on a new way of doing things.

3. Spears and war pike redesign

The entire 1.0 branch pretty much failed to change the flavour of the game because while I added a lot of stuff, you only rarely encountered it (talismans) or found it useful (shields) - the changes to armour impact on stealth and enchantment impact on sneak attacks notwithstanding. Whereas, redesigning how spears and war pikes worked immediately made 1.1 much more interesting because you had a frequently occurring mechanic which worked significantly differently from the Brogue baseline. They were (and still are if you are on 1.1.3) a significant source of bugs, but the idea (which had to be modified prior to implementation because the original plan matched what Pender did with rapiers) is sound, makes sense as a game mechanic, and contrasts with the way other weapons work. The mace and warhammer changes helped here too.

4. Honouring the implementation of the Discoveries screen while changing the intent

The implicit contract in Brogue is that you are always given enough information as a first time player to be able to make intelligent decisions from a turn to turn basis. The Discoveries screen is a great example of this: you are told ahead of time what all the items could possibly be, which you can use as a source of making educated guesses about what specific item you're carrying. UnBrogue breaks this contract: there are staffs, wands and potions which are deliberately withheld from this screen, as well as whole classes of items (tomes, elixirs) which don't appear on it. But none of the items which are hidden from this screen can be both a) randomly found in the game and b) harmful to you (allies are fair game) except where c) staffs/wands of summoning which as a class are listed on the Discoveries screen, but which list of monsters can be summoned by these items is hidden information. Brogue went on to weaken this contract in the 1.7.x release with charms which are not listed on the Discoveries screen, but are always identified; of course, weapons and armor, and runics were never listed previously and could only be enumerated through repeat play.

5. The crafting system

I'm incredibly happy with the crafting implementation in UnBrogue which I have designed in such a way that it is possible to play 95% of games without even knowing it exists. Crafting ingredients are always useful items in themselves, because the ingredients are (almost) always other items: potions, scrolls and so on; and the method of combining them is as logical as I could make it. There are three methods of crafting in UnBrogue: a) fixed crafting locations which allow you to combine two existing items to make a new one, b) certain talismans which are only rarely available and c) potions of Winds. The crafting system also forced me to add lots of items: the vast majority of which are incredibly interesting in their own right because of the way Brogue's systems have been designed, while allowing these items to exist behind the wall of item placement - because they are not randomly placed, I could add as many as I want freely, while leaking them into the game in a process I hope feels like peeling back the torn edge of the wall paper to find a hidden treasury. I've changed this approach slightly in 1.1.4 and later, so that the majority of these items can be randomly generated, while reserving some as craft-only special creations. The only instances where the crafting locations require a non-functional ingredient allow me to use this non-functional ingredient as the bait in one of Brogue's machine rooms or one of the many rooms I added to support these.

6. Armor redesign and armor prefixes

While making stealth degrade as your armour improved made plate armour less of a no brainer, armour in UnBrogue was pretty flavourless and uninteresting, runics aside. This changed significantly in 1.1.4 in two ways: I redesigned the existing armour types to make them more distinct, including adding three leather armour variants, and dropping one intermediate armour type; and I added armour prefixes which gave various armour types new abilities which in many cases were just buffs or tweaks, or the equivalent of low strength runics but with drawbacks. I didn't want to overburden the armour identification mini-game, which is already the weakest of any identification routine, so I made armour prefixes obvious - this also meant I could add more flavour to them without affecting suspension of disbelief; and one of the leather armour variants, robes, is effectively automatically identified as being runic to make things even easier. Armour prefixes have been pretty much great from their initial introduction, bar one which is undergoing redesign, but the work I put into the leather armour variants was at risk of going to waste because so few games result in winners in leather. So I compensated by balancing them up by allowing scrolls of protect armour to buff them to the equivalent power level (give or take) of banded mail. This may have made every suit of armour too useful: but it is a risk I'm willing to take to make them more interesting.

7. Adding lots of the right stuff

1.1.4 seems to have hit the sweet spot for item generation so that there is sufficient variety for every single play through I've experienced: 1.1.6 is getting to a similar place for placement of machine rooms in the dungeon so there's enough variation from game to game (prior to this version, there's not enough different rooms early on). I'll just quickly enumerate how much stuff UnBrogue adds to the game: as of 1.1.6, I've added 12 autogenerators (flavoured blobs of terrain which gets added to the dungeon), 12 reward rooms and another 23 machine rooms (rooms which have puzzle type challenges in them) - I'm guessing all up roughly doubling the original figures, give or take, and this doesn't include modifications to 3 or 4 existing rooms - 12 monsters (of which only 2 appear as 'regular' monsters in the main game), 5 melee weapons, 9 missile weapons, 3 armours, 19 armour prefixes (new 'runic' type), 3 shields (new item category), 2 scrolls, 14 tomes (new item category), 5 potions, 21 elixirs (new item category), 7 wands or staffs of which staffs of summoning can summon 13 different monster types, 12 wand or staff runics (new runic type), 2 rings, 22 charms and 16 talismans. Having said that, other than talismans, autogenerators and reward and machine rooms, there's very little of which is truly original: I would say across all these items only marking, grappling and extinguishing darts, potions of Winds, staffs/wands of Nature, Telekinesis and Detonation and wand/staff runics bring new systems into play, and Nature and Detonation both riff on ideas which Pender originally introduced to Brogue (bloodwort plants and explosive mutations).

Next to UnAngband (where I added over 1000 monsters to vanilla Angband), these numbers pale into insignificance - but here they have far more impact. Even the humble potion of Water is incredibly useful - you can steal items from monsters, use it to make your escape or cover your scent, make a temporary bridge over lava, create a steam bath to kill something in; and more importantly, due to the finite constraint on resources that Brogue's core design entails, these actions can be life saving and even game winning. At the same time, items I added as an afterthought can become core to a play strategy: I recently almost ascended relying on a staff of Dead Man's Ear which creates a immobile and inactive monster which simply acts as a damage sponge, which more than doubled the combat capability of my single troll ally since it acted preferentially as a target while he engaged in melee (wiser players than I would have taken a direct path to the amulet of Yendor using my wand of Tunnelling instead of naively walking the long way around).

These successes are testament to the core Brogue design, but also the strengths of the roguelike genre: provided you play to those strengths as Joshua Day has written about previously. And it turns out that my central thesis: more variety is better appears to hold for the most part, even if the variety is 10 or more sets of 3 similar items with the same effect but with non-uniform activations. As it turns out, the most problematic parts of the game occur when I try to strike out further with new abilities, instead of tweak and iterate on existing systems.

And in the follow up article, I'll write about what went wrong and discuss in more detail some of the stuff I've implemented and hopefully come to some more robust conclusions.

1 comment:

x said...

You inspired me to do a post mortem for Underhall. I even mention this as the inspiration. You can read it here:

http://nosoftware.blogspot.com/