A good topic for a second post concerns the board game I’ve been obsessed with for a few months now: Gloomhaven! Currently the #1 Top Rated game on BoardGameGeek.com, Gloomhaven is a European-styled cooperative dungeon crawler with legacy and role-playing elements. I’ve been playing it at least once a week since January with friends and I still get just as excited to pull it out as I did on the day I got it.

The point of this blog post is to quantify the benefits of two different attack buffs in the game: bless and strengthen. They both cost the same as an enhancement, which suggests that Isaac (the designer) would consider them to be equally strong.

The first thing I do is explain the basic mechanics for how attacking works in the game, so if you’ve played before, feel free to scroll down past that to the section beyond. If you haven’t, I’ll try to be as brief as possible and only explain what is necessary to understand the question I’m trying to answer.

But even after the introduction, this post is pretty long, so TLDR: Advantage is superior for attack decks with higher variance and lower attack values. Bless is superior for characters with consistently high-damage attacks and good deck-thinning perks.

Introduction

Explanation of Gloomhaven’s Attack Mechanics

The central idea that the entire game is built around is that there would be zero dice; all the game’s behaviors and calculations are determined by cards. Players can only take actions through their class cards, and from those they have to choose if they want to use them for their top (usually an attack of some kind) or their bottom (usually movement or other utility) actions. Once a card is used, it is discarded and cannot be used again until the player “rests” and picks up his discard pile — though resting does have costs, so you can’t just spam your best card over and over.

Attack actions always have a base attack value attached, e.g. “Attack 4” means you target an enemy and attempt to do 4 damage to it. However, the game is not completely deterministic — all good strategy games should have some unpredictable elements, even without dice. Every time you make an attack, you flip a card from your “attack modifier deck.” These are small cards that add or subtract from the base attack value. The mod deck initially contains six +0’s, five +1’s, five -1’s, one +2, and one -2. Whatever you flip over is added to the attack, so with Attack 4 you’ll usually do 3-5 damage, and occasionally 2 or 6. There are also two special cards: the 2x (“crit”) doubles the attack, and the 0x (“null”) cancels the damage entirely.

Part of the game’s progression system is that you have opportunities to pick up perks which direct changes to your character’s individual modifier deck. A perk may allow you to take out the negative modifiers in your deck (so you’ll have fewer -1’s or -2’s), add positive modifiers (so you’ll have more +1’s and +2’s), and you may also be allowed to add special class-specific modifiers that are rolling modifiers. These modifiers, when revealed, add an additional effect to your attack (like poison, wound, +1, etc.) and then have you keep drawing cards until you draw one that is not rolling. With lots of rolling mods and some luck you can have an attack that applies 3 extra negative status effects and does 3 extra damage. Or you can have an attack that applies 3 extra negative status effects and then does 0 damage because you rolled into the null.

Through various means your character can gain advantage on an attack. With an advantaged attack, you flip two cards from the modifier deck and choose the better one. By default this means you cannot possibly have your attack nulled, because you’ll always go with the other modifier you drew. If you drew a rolling mod, you combine the effects of the two cards. If you drew two rolling mods, you continue to draw until you draw a non-rolling mod. The way advantage works with rolling modifiers is a point of controversy among the GH community, because both of those results are identical to what you’d get from a non-advantaged attack. In fact, introducing a rolling mod into your attack deck allows the possibility to roll into the null and miss on advantage, which was previously impossible. Many people play by house-rules that subvert that awkward interaction, but my analysis will be based on rules as-written.

At last I can explain what Strengthen and Bless are. Strengthen is a status effect that grants advantage to all your attacks and lasts until the end of your next turn. I may use “Strengthened” or “Advantaged” interchangeably, although technically that’s not true. Bless shuffles a special single-use “2x” card to the modifier deck of the target of the bless. Neither buff grants direct damage; they simply increase the probability of a strong attack. Strengthen is more immediate, improves your draws right now, and makes your deck nearly null-proof, but you can still simply draw your -1s and the buff will wear off. Bless can be stacked multiple times and makes your deck more persistently reliable overall, but if unlucky you can still go through the whole scenario without drawing any of them.

Setting Up The Question

It’s clear that Strengthen and Bless should shine in different circumstances. Strengthen is great if you’re in a short window of power: your buffs are up, the enemies are grouped, and you’ve got your good cards in hand. Advantage makes sure the multi-target attacks will all go well. Critting isn’t necessarily the point; you just want to make sure all those hits land and do good damage. Bless is at its best when stacked on a consistent damage dealer; you’ll have enemies die to random crits with greater frequency and under less restrictive conditions.

So here then are the factors I initially thought would affect the value of each buff:

Number of blesses you can maintain in a deck. Having a bless bot or multiple blessing allies

Number of rolling modifiers in the deck. Each one increases the chance that Strengthen provides no benefit, and also makes it possible to roll into a null even with advantage. Meanwhile, rolling modifiers work very well with Bless, because bonus damage from a rolling modifier would be doubled by the crit.

The damage value of the attack. With low damage attacks (0-2), pulling a 2x feels like a waste, whereas Strengthen can be the difference between doing 2 damage or none. For high damage attacks, Bless crits can increase your damage to double-digits. Advantage won’t add very much (more likely to add +1 than anything else); however, it does make you null-proof, which is very valuable.

The quality of the modifier deck via perks. For Bless it doesn’t matter what you can draw other than the 2x. For Strengthen, it seems more important when you have either particularly good non-rolling modifiers (like +2, create element) OR when you still have negative modifiers to take out through perks (you don’t need advantage to avoid the -2 if it’s not even in the deck anymore).

Coding Infrastructure

Before I can calculate any data, I needed to build some infrastructure that allows me to simulate whatever deck I need. This script was my solution. (Yes, I figured out how to use GitHub since my last post).

Deck(a,b,c,r) creates a list of possible outcomes from drawing from a base deck with b blessings, r rolling modifiers, and c curses on an attack with attack value a. Note that a deck is made up mostly of actual numbers depending on the value of the attack (“a”). For example, the console produces this:

>>> Deck(5) [5, 5, 5, 5, 5, 5, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 7, 3, 0, 10] >>> Deck(4, b=2) [4, 4, 4, 4, 4, 4, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 2, 0, 8, 8, 8] >>> Deck(3, r=2) [3, 3, 3, 3, 3, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 1, 0, 6, 'r', 'r']

The “r’s” were tricky. First of all, I assumed that all rolling modifiers acted as “+1, roll.” Evaluating the various status effects or element creations seemed impossible, and I assumed that if you’re putting a rolling modifier into your deck, you’d value its effect at least as much as a +1. Secondly, even with this simplification, an r‘s value depended on the quality of the rest of the deck and whether you’re considering an attack with advantage, disadvantage, or neither. I left them as r‘s in the deck and had the attack simulation functions process them directly.

The basic AverageAttack() is straightforward. I average all the outcomes, where rolling modifiers are the average of the rest of the deck increased by 1. It’s calculated recursively to deal with how rolling mods can interact with each other.

AverageAttackAdvantage(), however, was very frustrating to write. In the case of drawing a rolling + non-rolling, you can usually give +1 to the non-rolling, as long as it’s not the null. But since the numbers are calculated for the deck in advance, there was no way to differentiate between a 0 caused by a null and a low-damage attack brought to 0 by a negative modifier. The solution was to evaluate all pairs in three separate categories:

Non-rolling + Non-rolling –> Pick the bigger one.

Rolling + Non-rolling -> Simulate a sub-attack at one-greater strength and no possibility of an additional rolling mod.

Rolling + Rolling -> Simulate a sub-attack at two-greater strength with two fewer rolling modifiers in the deck.

Finally, add the total damage from all possibilities, and divide by the total number of all possibilities.

Inelegant, but in the end I’m confident the results are accurate.

Interactions between Bless/Strengthen and Rolling Modifiers

How Much Worse Is Advantage with Rolling Mods?

This is one of the big questions that led me to this whole investigation, and a burning question for the community since the game’s release. I’ll take this time to show you example code for how I produce these graphs, though I don’t expect I’ll have to show all of it.

a_s = range(8) rs = range(10) for a in a_s: advGains = [AverageAttackAdvantage(a,r=r) - AverageAttack(a,r=r) for r in rs] plt.plot(rs, advGains, label = "Attack {}".format(a)) plt.show()

The important line there is Line 4, where the list of gains is constructed for all values of r for a particular attack value. I’ll I’m doing is subtracting the expected damage of an normal attack from the expected damage of an advantaged attack. Here is the result:

Each line represents the expected increase in damage due to advantage as a function of the number of rolling modifiers added to a base deck. A couple interesting points:

Advantage improves for Attack 0 and Attack 1 with increased rolling mods. I guess the reasoning is that it’s so easy to lose damage down to 0 regardless that advantage helps out more often than it hurts. With enough rolling mods, even Attack 2 and Attack 3 start to go up again. I guess the value gained by combining multiple rolling mods more easily begins to offset the penalty of rolling into the null as rolling mods become more available. EDIT @ 5/31: There was a bug in the code that caused the calculation to be performed incorrectly at higher rolling mods. In fact, there is no up-ward swoosh and they all (other than Attack 0) fall with increased modifiers with no turn-around.

Benefit of advantage drops most sharply for large attacks. As discussed, this is because advantage mostly typically only raises the value of the attack by 0 to 2, but also introduces the possibility of being completely nullified.

The gain for an Attack 0 is about 0.3, but the expected attack for an Attack 0 without advantage was already greater than 0. Because a -1 and -2 have no effect in this case, the symmetry is broken and the actual expected damage from an Attack 0 is closer to 0.35.

How Much Better is Bless With Rolling Mods?

I predicted that rolling mods actually improve the effect of bless, because there’s a greater chance to have the bonus +1s from the rolling modifiers doubled along the attack with a Bless crit. Unlike the last one, though, we need to check how multiple blessings apply, so we’ll have multiple graphs. On each graph we compare how different levels of Bless will add different amounts of damage to different powers of attacks.

The first graph is hilarious. Being blessed causes you to do less damage with an Attack 0, but that’s obvious when you think about it. Eventually the super-giant crits when you have 20+ rolling mods start to matter when you get up there, but I’m not sure there are any classes that can reach that number of rolling mods.

We see that technically the gain from bless increases with more rolling mods, but only very slightly. I guess rolling into a crit isn’t as likely as I’d expect.

Comparing Advantage to Bless

Here we get to the question asked by the title of this post. It’s mostly going to be a matter of combining the previous two graphs.

Woo! Look at those. Key points:

I started at Attack 3 because that’s the first one where the lines started to intersect. Getting 10x Bless is hard enough as it is, so I didn’t consider cases where it’s just always strictly worse.

The points we care about are with which line and where the Advantage Gain line intersects with a Bless Gain line. Since these are the expected average damage based on static deck/status conditions, the correct way to interpret these intersections is this: maintaining b blesses in your deck is about equal in “increased damage value” to being advantaged for all your attacks for that number of rolling mods .

. For example, on the Attack 3 graph, the blue line starts at the 7x Blessed line at zero rolling mods and drops down to the 6x Blessed line around 4 rolling mods. So with zero rolling mods, keeping Strengthen up is worth about the same as maintaining 7 bless cards in your deck. At around 4 rolling mods, keeping Strengthen up is worth the same as maintaining 6 bless cards.

Higher attack and more rolling mods means bless gets better and advantage gets (relatively) worse. This means the number of blesses you need to maintain to beat advantage decreases. For Attack 6 and only 1 rolling mod you only need to keep a perfectly reasonable 4 blesses in your deck for it to be better. In fact, it’s probably easier to maintain 4 blesses than it is to get Advantage for every attack. So your friend Scoundrel has his awesome Crippling Poison build going and regularly does 6+ damage. Seems like a prime target for bless!

EDIT @ 5/31: Updated graphs to account for previously mentioned bug. The conclusions aren’t significantly different. Mostly I see that there are two intersection points per graph because the advantage-gain line continues to go down instead of leveling out. For example, on Attack 8, maintaining advantage has about the same worth as maintaining 4 Blesses with 0 rolling mods, the same worth as maintaining 3 Blesses at 4 rolling mods, and worth slightly more than maintaining 2 Blesses at 10 rolling mods.

Conclusions

Things Not Discussed

There’s way more to talk about here, of course.

I could throw some Muddle and Curse into the mix and see which buff is better at dealing with those (though the way Strengthen can completely throw out curses seems really strong). There aren’t really any burning questions I can think of related to this, though. Let me know if you have one.

I didn’t look at all into how having a really perked-up deck would affect each of them. All of these calculations were dealing with the base deck you get at Level 1. Advantage seems to have the strongest effect on a deck with high variance, so reducing that variance as you level may reduce the need for Advantage. The Scoundrel is capable of removing every single negative modifier from her deck (other than the null), and I suspect it’d be more effective to fill that deck with Blesses than to try to maintain Advantage. The “Add two ‘+1, roll'” perk, which guides tend not to prioritize very highly, may also end up shining. I don’t know; maybe I should write a post in defense of rolling modifiers.

The most obvious thing I’ve avoided discussing so far is that, of course, you’re allowed to combine Strengthen and Bless for great effect. It’s no secret that putting a bunch of 2x cards in your deck and then using Advantage to dig for them feels awesome.

I’m likely to revisit this subject in the future, so keep an eye out!