Fixing multiple damage (bash+cut/stab) type weapons

There is a problem with armor piercing: to pierce armor well, you need a lot of one damage type, as each damage type is applied separately.

For example, a nodachi - with its huge (50) cutting damage, it pierces armor well. Against a plate armor (16/16 armor), it deals 34 damage - 62% of its 50(cut)+5(bash) damage.
Meanwhile a war hammer - weapon specifically intended for armor piercing - deals 20 bashing and 20 piercing damage. Against same plate armor, it deals meager 10 damage - 25%. That +2 comes from piercing being very slightly better against armors than cutting.

Instead of dealing the attack essentially as two separate hits, it may be possible to deal it as one, spread across the armors.
Using the example above, a plate armor would have a protection value of 16, with multiplier of 100%/100% for both bashing and cutting. A nodachi has 50 cut and 5 bash, meaning it would count as 9% bashing, 91% cutting weapon. Since for plate armor the values are identical, it would just tank 16 damage - 55-16 = 39. Thus dropping damage to 71% of its initial value.
For war hammer, it would be a bit more complex: plate armor has multipliers of 100%/80% against bashing/piercing. Since war hammer is 20/20, this would mean the average protection multiplier is 90%. Thus the armor would offer protection value of 14.4. 40-14.4 = 25. 63% of initial value.

But then there are critical hits and those have their own armor multipliers:
Bashing ignores 50% armor on crit
Cutting ignores 5 armor AND THEN 25% armor on crit
Piercing ignores 34% armor on crit

In current version, this means that:
A nodachi against plate armor deals (before damage modifiers from crit): 0 bashing (5 - 8 < 0), 42 cutting (50-(110.75)=50-8). 76%
A war hammer against same plate: 12 bashing (20-8), 11 piercing (20 - (16
0.80.66)) = 23 total. 58%
In the “one hit” version:
Nodachi: bashing multiplier 50%, cutting multiplier: (16-5)/16
75%=52%. Nodachi ignores ~50% armor, deals 55-8=47, which is 85% of initial damage.
War hammer: Bashing at multiplier 50%, piercing at 53%. War hammer ignores ~50% armor, deals 40-8=32, which is 80% of initial damage.

From the change:
Nodachi would gain +9% damage against plate on regular hits, +9% damage on crits
War hammer would gain +38% damage against plate on regular hits, +22% on crits

While nodachi still ends up more powerful here, it gains less than the war hammer. Later we could adjust all armors to the new power levels. Then nodachi would become less good at armor piercing than dedicated armor piercing weapons.

tl;dr Deal whole attack as one against armor, instead of splitting it up into two and applying armor against each

The more complicated the damage code becomes the harder it is to balance the weapons and armors later. It would be simpler to change the split damage weapons that it would be to change the entire armor system. A few ideas:

Split damage weapons use the damage type their opponent is weakest to. (Turning a bash+pierce weapon effectively into a pierce weapon, since nothing I know of resists pierce).

Armor only resists the highest damage type of the incoming weapon. (The reverse of the above - at least damage resistance wouldn’t be counted twice.)

Buffing/remove split damage weapons without altering any game mechanics. (The boring solution.)

Add zombies that are highly resistant to each type of damage and put them in the same horde. (A brittle zombie could have 60 cut resistant and 0 bash resistance, a thick zombie could have 0 cut resistance and 60 bash resistance, etc)

Of course, any such changes are meaningless if the player has no intuitive way to figure out that an enemy is resistant to his damage type (“Are zombie soldiers resistant to cutting, bashing, or both? Ah well, they die to Karate like everything else…”) You would also need to implement enemies that are resistant enough to certain damage types to make a lower damage but general purpose weapon worth using.

If I understand correctly, what this boils down to is that for any given hit, the effective armor value is the weighted average of the different armor types, with the weighting provided by the ratio of damage types in the attack.

It looks like it will meet its goals, but I’m a bit concerned about explaining how it works to contributors or players, because armor value no longer means something straightforward like, “absorbs x damage of type y”, it now requires explaining this weighting scheme.

Yeah, it is a bit complex to explain exactly.
But at the same time, it is easy to explain enough to be workable intuitively: armor is applied in same ratios as damage.
It is intuitive that increasing bashing or piercing damage should bypass armor more than increasing cutting damage.
It is also intuitive that increasing damage sum should increase damage overall if damage sum was already above armor sum (this does not actually happen right now).

I don’t see any other way of solving this problem while preserving split-type attacks. It could be manually worked around by giving the select weapons some extra armor piercing, but this would require manually going through all the entries.

I agree with the idea behind this, but I don’t like the idea of simply averaging the protection values together because this causes protection types to essentially “bleed” together by treating damage units as typeless. A fictional 100%/0%/0% armor could very easily end up functioning as a 20%/20%/20% armor through averaging, magically gaining resistance to cutting and stabbing where previously it had none while allowing bashing damage through when previously it would have stopped all of it. This also throws away the potential distinction between damage dealt of the different types, which could potentially be used to calculate things like wound infection risk or bleeding down the line.

In addition your assumptions seem slightly flawed. You assume plate value has a typeless “protection” value of 16, when in truth it’s much more then that, currently having not 1 but 2 separate amounts of 16 protection. Thus against an attack that is a 50/50 split it’d be more accurate to say it has a default protection value of 32, not 16.

This points to the true problem here, which is simply that material resistance values are way out of whack in many cases (If you hold a piece of sheet metal to your chest and I hit you with a hammer there’s going to be very little deformation; steel should offer very little in terms of bash resistance, not be tied for 3rd highest). This is then compounded further by two other things, which is that right now thickness has a very low granularity (the smallest cut/bash protection amount you can modify a piece of steel armor by is 9!) and that currently we calculate stabbing resistance as (.8 * cutting resistance) while it’s blatantly easy to find gloves and other protective clothing out there that has a high resistance to cutting while offering “little or no protection from puncture injuries”.

Thus, the solution I offer instead is multi-staged.

  1. Add piercing resistance to materials. Shatter the myth that cut = lesser puncture resistance. Materials like kevlar, for example, have very high cutting resistance, but low puncture resistance. This is the reason why most real kevlar work gloves have a different material set into the palm to provide puncture resistance there, because needles and nails will go right through them (thicker items like vests will provide some measure of resistance, but often still need to be backed by something else to totally stop penetration). This also lets the player and contributors see all armor values, thus providing further transparency.
  2. Rebalance our material values. We have a very bad case of “high values across the board” going on here; very few materials are actually resistant to everything, with most of them suffering in at least one of the three main categories in real life.
  3. Increase granularity of the thickness value. This will allow for a more fine-tuned approach with smaller balance tweaks to the items themselves, instead of only having the three categories of “useless”, “blocks most things”, and “invincible” as our options for some materials.
  4. (Optional realism addition) Cause a small amount of blocked cut/stab damage to be transformed into bashing damage.

Instead of patching the material system, it might be better to just override it, allow items to specify armor values directly when necessary, change the worst offenders first and then wrap it up with a change that bakes the currently calculated armor values into item definitions, then we can tweak from there. Deriving item stats from materials and thickness is needlessly obfuscating the actual values.

I2amroy has a point, have we exhausted the simpler solution of adjusting armor values?