9 minute read

I dislike the Superior Technique Fighter Style

This post is an exploration of whether my immediate dislike is based in reality or is just reactionary because I'm a grouchy Dungeon Master (DM) when it comes to new content added to 5th-edition Dungeons and Dragons (D&D 5e).

What is Superior Technique?

Superior Technique is a new optional Fighter "fighting style" (class feature) that was made available with the release of Tasha's Cauldron of Everything by Wizards of the Coast as new official content rules for D&D 5e.
Superior Technique
You learn one maneuver of your choice from among those available to the Battle Master archetype. If a maneuver you use requires your target to make a saving throw to resist the maneuver’s effects, the saving throw DC equals 8 + your proficiency bonus + your Strength or Dexterity modifier (your choice).
You gain one superiority die, which is a d6 (this die is added to any superiority dice you have from another source). This die is used to fuel your maneuvers. A superiority die is expended when you use it. You regain your expended superiority dice when you finish a short or long rest.

What alternatives existed previously?

Considering alternatives that do nothing other than augment damage for a particular type of Fighter, let's make a comparison to Great Weapon Fighting, which is probably the most-common option for a Fighter previously.
Great Weapon Fighting
When you roll a 1 or 2 on a damage die for an attack you make with a melee weapon that you are wielding with two hands, you can reroll the die and must use the new roll, even if the new roll is a 1 or a 2. The weapon must have the two-handed or versatile property for you to gain this benefit.

What do I dislike when comparing the two?

I don't think there is any longer an argument to make for selecting Great Weapon Fighting over Superior Technique, which is no fun because it reduces diversity in viable selection choices during character creation. To see why this is, we simply look at the expected damage for a player wielding either a Greataxe (1d12) or Greatsword (2d6) using either of the two options, constrained to some number of turns between Short Rests (when the dice from Superior Technique would reset). Obviously, in the limit that the character never gets a short rest, Great Weapon Fighting is superior. What we would like to know is:
How many attack rolls should we expect Great Weapon Fighting to require between Short Rests for it to generate an expectation of "better" damage by comparison to Superior Technique?

How much damage does Superior Technique add?

We will start with the simplest case in which we assume the Maneuver that is selected has no additional benefit. Of course, the Maneuver is a critical choice and will inevitably have added benefits, but we want to start with some baseline. Therefore, as-written, we know that regardless of the PC level (unlike for Superiority Dice added using Battle Master class, which scale with level), the Superior Technique dice is a flat 1d6. Therefore, the expectation is:
baseline_st_added_damage = (1 + 6)/2
baseline_st_added_damage = 3.5
So as long as Great Weapon Fighting adds greater than 3.5 damage per short rest or more, then at least from baseline it is better than Superior Technique.

How much damage does Great Weapon Fighting add?

We can obtain this analytically or by simulation. Since we want to throw in additional variables, such as the anticipated number of attacks made between short rests (or possibly derive this value from the expected number of encounters, and enemy health in said encounters, and other factors such as party size) we will use simulations from the outset because that will ultimately be easier.
For the simulation, we have to write it so that any time a roll is equal to 1-or-2, it is re-rolled and the new result is kept. We can write this as a first function called by a second one.
The second function uses gw_roll to simulate 1,000 repetitions of some attack damage roll occurring over some arbitrary number of attacks that happen between short rests. That value will depend on many things, as mentioned previously, but should factor in the ability to actually land an attack, the total number of opportunities to make an attack, etc. Since the function itself doesn't care about any of that, we just give it the end-product of whatever produces the number of damage rolls as the value n.
So, to do this simulation we must run simulate_damage using some user-parameterized expected number of attacks (n). We need to do this for a few values of k and x depending on what we think the weapon is to be used. And we can basically do this over a grid of values for these three parameters to get an answer to our question.
K = [ 1, 1, 1, 2, 2, 2]; % Expected damage for 1d12 = (1 + 12)/2 = 6.5; for 2d6 = 3.5 + 3.5 = 7.
X = [12,12,12, 6, 6, 6];
The number of attacks (that land) between short rests is a critical point. Let's assume there are 2-3 encounters per short rest, and that an average encounter should be expected to last 3-5 rounds before it gets monotonous. That means we could expect 6-15 attacks per short rest. The number of those that land will depend on the AC of the enemies, the proficiency of the user, and maybe some other things like item bonuses etc.
N = [ 3, 7, 15, 3, 7, 15];
So, ultimately what we will want to do is take for any of the 1d12 rolls, what is the expectation (beyond 6.5 damage per attack) that we get for using Great Weapon Fighting. Similarly, for the 2d6 rolls, what is the expectation (beyond 7 damage per attack)?

Great Weapon Fighter (GWF) Damage Distributions

dmgDistGreatAxe = plotDamageDistribution(1,12); % For Great-Axe
-> (With GWF): E[damage 1d12] ~ 7.33 (per-attack) -> E[damage-added 1d12] ~ +0.83 (per-attack)
dmgDistGreatSword = plotDamageDistribution(2,6); % For Great-Sword
-> (With GWF): E[damage 2d6] ~ 8.36 (per-attack) -> E[damage-added 2d6] ~ +1.36 (per-attack)

What GWF value is added for a given number of damaging attacks between Short Rests?

nSim = numel(K); % Should have equal # elements in K, X, and N
dmg = nan(1,nSim);
dmg_dist = cell(1,nSim);
for iSim = 1:nSim
fprintf(1,'\nSimulating damage for:\n');
fprintf(1,'\t<strong>%dd%d</strong>, %d attacks ... ',K(iSim),X(iSim),N(iSim));
[dmg(iSim), dmg_dist{iSim}] = simulate_damage(K(iSim),X(iSim),N(iSim));
fprintf(1,'<strong>%5.2f</strong> Damage Expected\n',dmg(iSim));
end
Simulating damage for:
1d12, 3 attacks ...
2.62 Damage Expected
Simulating damage for:
1d12, 7 attacks ...
5.90 Damage Expected
Simulating damage for:
1d12, 15 attacks ...
12.14 Damage Expected
Simulating damage for:
2d6, 3 attacks ...
4.06 Damage Expected
Simulating damage for:
2d6, 7 attacks ...
9.17 Damage Expected
Simulating damage for:
2d6, 15 attacks ...
20.14 Damage Expected

Conclusion

So, we can see that Great Weapon Fighter outscales quickly with the number of attacks. For the Great-Axe, if you only land very few attacks between short rests, the Superior Technique option is superior from the outset. For the Great-Sword, Great Weapon Fighter is better almost immediately. For campaigns with only 2 adventurers where combat (when occurring) is longer than expected and a given character could be expected to need to contribute more attacks in order to end the encounter than normal, GWF still appears to be advantageous and retains the damage benefits (most likely).
This precludes any possibility that Superior Technique may in fact add value by virtue of the utility that the Optional Maneuvers associated with it incur. For example, one such Maneuver allows the attacker to automatically gain advantage on the attack roll (wherein 1d20 is rolled twice and the higher value is selected in order to determine whether the damage dice should even be rolled to begin with). This will clearly result in an increased number of expected damage rolls made between short rests; however, I am not looking to do an entire exercise in theory-crafting to figure out how many such attacks are expected depending on parameters such as:
  • Enemy AC
  • Attack Roll Modifier
  • Total (Effective) Enemy Health
All of which could be parameterized on a grid in similar fashion. Other nonlinear components could be incorporated as well:
  • Great Weapon Master (feat): this synergizes well with advantage on attack rolls. The attacker takes a flat -5 to the to-hit roll, but if the attack lands they add a flat +10 to the damage roll, which is huge.
I may expand upon this at a later date if so inclined.

Function Definitions

function value = gw_roll(k,x,n)
%GW_ROLL Make damage roll for [k]D[x], rerolling (once) any 1-or-2 value.
% We can extend this to `n` rolls returning each result as a row.
diceValues = randi(x,n,k);
diceValues(diceValues <= 2) = randi(x,sum(diceValues <= 2,"all"),1);
value = sum(diceValues,2); % Add all dice rolls in a "row" to get value.
end
function [dmg_expected, dmg_dist] = simulate_damage(k,x,n)
%SIMULATE_DAMAGE Simulate damage rolls of [k]D[x] for [n] attacks.
N_SIMS = 1000; % Repeat simulation 1000 times.
dmg_dist = nan(N_SIMS,1);
dmg_expected_standard = k * (1 + x)/2;
for ii = 1:N_SIMS
% We are taking the value difference from expected for each roll and
% adding them all together, and repeating that process for `N_SIMS`. The
% sum reflects the total number of attacks made between short rests.
dmg_dist(ii) = sum(gw_roll(k,x,n) - dmg_expected_standard,1);
end
% The end is the expected value
dmg_expected = mean(dmg_dist,1);
end
function fig = plotDamageDistribution(k,x)
%PLOTDAMAGEDISTRIBUTION Plot histogram for [k]D[x]
str = sprintf('Distribution of damage for %dd%d Damage Rolls',k,x);
fig = figure('Name',str,...
'NumberTitle','off',...
'Color','w','Units','Normalized',...
'PaperOrientation','landscape','Position',[0.2 0.2 0.7 0.4]);
ax = axes(fig,'NextPlot','add','XColor','k','YColor','k','LineWidth',1.5,'FontName','Arial');
dmg = gw_roll(k,x,1000);
binVec = 0.5:(max(dmg)+0.5);
histogram(ax,dmg,binVec,'Normalization','probability');
c = get(ax,'Children');
set(c,'FaceColor','k','EdgeColor','none','DisplayName','Damage Rolls');
ksdensity(ax,dmg,'Function','pdf','Kernel','epanechnikov','Bandwidth',1);
title(ax,str,'FontName','Arial','Color','k','FontSize',24);
xlabel(ax,'y (Damage Roll)','FontName','Arial','Color','k','FontSize',20);
ylabel(ax,'pdf(y)','FontName','Arial','Color','k','FontSize',20);
c2 = setdiff(get(ax,'Children'),c);
set(c2,'LineWidth',4,'Color','b','DisplayName','Approximate Distribution (Kernel Smoothing)');
mu = mean(dmg);
MU = k * (1 + x)/2;
% Bin boundaries are at "0.5" values
line(ax,[2.5 2.5],ax.YLim,'Color','r','LineWidth',2,'LineStyle',':','DisplayName','Re-Roll');
line(ax,[mu mu],ax.YLim,'Color','b','LineWidth',2,'LineStyle','--','DisplayName',sprintf('E[%dd%d] ~ %5.2f damage',k,x,mu));
legend(ax,'Location','EastOutside','FontName','Arial','TextColor','black');
fprintf(1,'\n\t->\t(With GWF): <strong>E[damage %dd%d]</strong> ~ %5.2f (per-attack)\n',k,x,mu);
fprintf(1,'\t\t->\t<strong>E[damage-added %dd%d]</strong> ~ %+5.2f (per-attack)\n\n',k,x,mu - MU)
end

Leave a Comment