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.

Tuesday 4 June 2013

UnBrogue 1.1.4 and 1.1.5 released

This isn't going to feel like much of an announcement unless you have OS/X, as there are serious problems affecting the Windows and Linux build of UnBrogue at the moment that are preventing it from being updated to the latest version. However, I've released 1.1.4 and 1.1.5 in relatively quick succession and you can download the OS/X build here. For full details on what's happening see this thread on the Brogue forums - the tldr is that I'm going to be porting UnBrogue to a newer off-trunk version of Brogue to hopefully fix the above issues, but this will be some time away.

Changes for 1.1.5
- Staffs of nature charge half as quickly.
- Rewrote spoiler free changes from Brogue.
- Vault keys are rarer but vault items are always better than those found randomly.
- Add two more machine rooms.
- Fix bug where partial armor did not have a strength requirement reduction.
- Fix description of royal purple armor.
- Fix bug where regular staff and wand workshops would require a challenge to access.
- Fix charms of duplication.
- Fix (and enable) 'too boring' Brogue summoning circle room by adding paralytic gas. Paralytic gas makes everything more interesting.

Changes for 1.1.4
- Increase variety of items which can be found in the game (as opposed to made).
- Add wands, staffs of telekinesis.
- Add potions, elixirs, charms of regeneration.
- Add armor and shields of repulsion.
- Upgraded charms of winds to be charms of respiration.
- Add scimitars and cleavers which have Brogue's stats for maces and war hammers, but 1 additional strength requirement and which continue to attack enemies either clockwise or counter clockwise, randomly chosen, from your target. These may be overpowered.
- Add sickles and war scythes which are quick and can also attack up to two enemies adjacent to both you and your target.
- Knight's shields allow you to choose the target of any reflected bolts. Tower shields also block slowing and negation bolts -- these do not damage the shield.
- Remove banded mail.
- Increased chain mail's protection and strength requirement (so that it now acts like Brogue's banded mail).
- Increased scale mail's protection while making it noisier (so that it now provides protection equivalent to Brogue's chain mail but with a lower strength requirement).
- Decreased plate mail strength requirement.
- Add robes which are always runic and allowed with all talismans, cloaks which have the best stealth of any armor (including no armor), and furs which have the lowest strength requirement.
- Fabrics and leather are reinforced by scrolls of protect armor so that cloaks, furs, robes, leather armor and scale mail gain +1 to +3 protection when first protected by these scrolls.
- Added various armor prefixes to further increase armor variety -- these prefixes are immediately visible.
- Darts and javelins gain +1 to +3 enchantment when first affected by a scroll of protect weapon.
- Thrown weapons are now degraded by acid. You are not warned before throwing at the moment. Stacks of thrown weapons will restack if you end up matching the enchantment level through acid damage. (Requested by thaumato)
- Combining items can help identify either the ingredients or the resulting item depending on the identification status of the product and output.
- Add two new talismans.
- Lamias are restricted to liquids but appear in groups.
- Precise runic does not apply to bolts which only affect one monster (Requested by tinyrodent).
- Tomes of summoning do not summon bloats (Reported by tinyrodent).
- Guaranteed good charm rooms don't contain throwable charms.
- Change spelling of sabre to American English saber to be consistent with other American English spelling.
- No longer take half damage on level 1 (From 1.7.2).
- Fix dart stacking bug (From 1.7.2).
- Fix bug where level divided by water would end up with an area filled with corridors.
- Fix bug where water trap could be generated too far away from a fountain.
- Fix bug where explosive blinking staffs would cause mysterious corpse explosions (Reported by tinyrodent).
- Fix description when enchanting a cursed item.
- Fix for tomes of slaying/immunity when applied to an already enchanted item.
- Fix bug where you could naturally regenerate while in debt.
- Fix bug where acid damaged shields could block infinite blows. (Reported by Jadeite)
- Fix bug where extinguishing gas would not put out burning flying monsters.
- Fix automatic identification of talismans, elixirs, tomes.
- Fix crash caused by trying to land an impaled blinking monster twice (Reported by tinyrodent).
- Fix tomes of teleportation.
- Fix instances where enchantment is inadvertently revealed when the rune is noticed on runic armor.
- Fix backstabbing with a heavy weapon could cause zero or negative damage, and calculate fractional backstab multipliers correctly.
- Fix damage multipliers from rapier, saber lunging, spear, pike impaling so they don't get sneak attack bonus, dual wield penalty if these don't apply.