In this article I propose alternative mechanics for representing physical damage to characters in 2d6-based role-playing games. This system takes inspiration from the following:
Other Damage Rules
Most 2d6 rules handle damage in one of the following ways:
-
Following the Original Science Fiction 2d6 RPG, damage is subtracted first from an Endurance attribute. When that goes to zero, damage comes off Strength or Dexterity, and each point of damage lowers the character’s effective Strength or Dexterity. When one of these go to 0, the character is incapacitated; if both go to 0, the character dies.
-
A variant of this scheme creates two new damage pools, Endurance and Lifeblood. Damage first comes off Endurance, which heals after a short rest. When Endurance goes to 0, damage comes off Lifeblood and has some effect on performance. When Lifeblood goes to zero, the character either dies or is on the verge of death.
-
Many other games establish a pool of points called Stamina, HITS, Lifeblood, etc. Damage comes off this pool until it goes to 0, at which point the character dies, is on the verge of death, or is incapacitated with an option for death, loss of limbs, and/or long-term hospitalization.
All rely on the assumption that damage can be quantified as “damage points”, which can be safely deducted from some resource before the character faces serious consequences. The system I propose makes all damage potentially serious. It therefore may not be suitable for “heroic” games, but it fits well with grittier, more dangerous settings.
Character Condition
Instead of Hit Points, Stamina Points, Endurance and Lifeblood, etc., all characters, animals, monsters, etc. have a Current Condition and a number of Wounds usually 0. Conditions are one of the following.
-
Unharmed: The character has no ill effects.
-
Rattled: The character takes a cumulative -1 penalty to all tests, including Soak Throws.
-
Wounded: The character takes one Wound. They take a cumulative -2 penalty for each Wound Point they sustain. If a character takes more than their Wound Limit of Wounds (generally two for player characters, one for non-player characters, zero for small animals, three or more for large animals and monsters), the character’s condition worsens to Dying.
-
Dying: The character is either unconscious or delirious, and badly in need of medical attention. They may take no action save one sentence of no more than five words spoken before they pass out. Without medical attention to stabilize their condition, a Dying character succeed at a 6+ throw every minute or move on to Dead.
-
Dead: the character is incapable of any action, ever again.
Non-Lethal Attacks
Some attacks, such as fists and science fiction “stun” weapons, may do Non-Lethal damage. In place of the conditions above, Non-Lethal Attacks inflict the following:
-
Stunned: The character takes a -2 penalty for the remainder of combat. Characters recover from being stunned after 1d6 minutes of rest. If the character is already Wounded or Stunned, they are Knocked Out instead.
-
Knocked Out: The character is unconscious and may take no actions. They have no awareness of what is going on around them.
Attack Throws
Use the standard system to represent attacks in Combat: 2d6 + attack modifiers to meet or exceed a Defense Value which may be 7+, 8+, 9+, or variable depending on the target.
Soak Throws
If a character is hit in combat, they must succeed in a Soak Throw to avoid being hit. Each weapon has an associated Damage Class (DC). The character throws 2d6 and adds bonuses for Armor, physical resilience, and any other natural or supernatural qualities. Then they consult the following chart:
| If the Soak Throw is … | the target is … | or if Non-Lethal |
|---|---|---|
| ≥ DC | Rattled | Rattled |
| < DC | Wounded | Stunned |
| < DC - 4 | Dying | Knocked Out |
Optional Rule: If the dice of a Soak Throw show a Natural 12, before modifiers, add 1d6-1 to the throw.
Armor
| Armor Bonus | Examples |
|---|---|
| +0 | no armor |
| +1 | leather armor |
| +2 | chainmail armor, ballistic vest vs. knife |
| +3 | plate armor |
| +4 | ballistic vest vs. guns |
| +5 | full body armor |
| +6 | science fiction full body armor |
| +7 | science fiction force field |
Weapons
| Damage Class | Examples |
|---|---|
| 8+ | bare knuckle |
| 9+ | small weapon, sling |
| 10+ | one-handed weapon, staff, shortbow |
| 11+ | two-handed edged/pointed weapon, longbow, crossbow |
| 12+ | small caliber gun, shotgun (at a distance) |
| 13+ | large caliber gun, shotgun (point blank) |
| 14+ | science fiction blaster |
| 15+ | science fiction plasma rifle |
Optional Rule: Players Roll All Dice
See also “Players Roll All d20s”.
Defense Throws
Instead of NPCs throwing for attacks, the Referee computes a Miss Threshold (MT) for all NPCs. When the NPC attacks, player characters have to throw this number on 2d6 + whatever modifiers to not get hit by the NPC. Modifiers that help the NPC are added to the base Miss Threshold. Advantage and Disadvantage dice are inverted, i.e. an Advantage for the NPC is a Disadvantage for the PC.
Optional Rule: If the dice of a Defense Throw show a Natural 12, before modifiers, add 1d6-1 to the throw.
Computing the Miss Threshold of an NPC, animal, or monster are system-dependent. In general, the Referee should determine the total attack bonus for the creature in question and the Base Defense Value to hit an average unarmored target (usually 7 or 8). Then cross-reference the Attack Bonus and the Base Defense Value in the following table:
| BASE | -2 | -1 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 7 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 8 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 9 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 10 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
Damage Throws
Instead of NPCs making a Soak Throw, PCs make a Damage Throw.
All NPCs have a Wound Threshold (WT), determined primarily by the NPC’s Armor, although the target’s size, physical resilience, and supernatural qualities may modify this threshold. An ordinary, unarmored human has a Wound Threshold of 7+.
After determining that a weapon hit its target, the PC throws 2d6 against the NPC’s Wound Threshold (WT) and add the Damage Bonus (DM) of the Weapon, defined as the Damage Class - 8. Then compare the result to the following chart:
| If the Damage Throw is … | the target is … | or if Non-Lethal |
|---|---|---|
| < WT | Rattled | Rattled |
| ≥ WT | Wounded | Stunned |
| ≥ WT + 4 | Dying | Knocked Out |
Optional Rule: If the dice of a Damage Throw show a Natural 12, before modifiers, add 1d6-1 to the throw.
Combat Under Players Roll All Dice
The following chart summarizes all the throws in the Player Rolls All Dice variant of the Injury System.
| Situation | PC throws 2d6 + … | vs NPC | Rule |
|---|---|---|---|
| PC Attacks | Attack Modifiers | Defense Value | Attack Throws |
| PC Hits | Damage Modifier | Wound Threshold | Damage Throws |
| NPC Attacks | Defense Modifiers | Miss Threshold | Defense Throws |
| NPC Hits | Soak Modifiers | Damage Class | Soak Throws |
Appendix: Miss Threshold Chart Generator
This program generates the Miss Threshold chart under Defense Throws. It inverts the probabilities of an attack … until the defense probability goes to zero, at which point I cheat and use the empirically derived result of (15 - Attack Target Number).
#!/bin/env python3
# /// script
# requires-python = ">=3.13"
# dependencies = [
# "tabulate",
# ]
# ///
from fractions import Fraction
from tabulate import tabulate
TN_TO_P_TABLE: dict[int, Fraction] = {
2: Fraction(36, 36),
3: Fraction(35, 36),
4: Fraction(33, 36),
5: Fraction(30, 36),
6: Fraction(26, 36),
7: Fraction(21, 36),
8: Fraction(15, 36),
9: Fraction(10, 36),
10: Fraction(6, 36),
11: Fraction(3, 36),
12: Fraction(1, 36),
}
P_TO_TN_TABLE: dict[Fraction, int] = {TN_TO_P_TABLE[k]: k for k in TN_TO_P_TABLE}
def tn_to_p(tn: int) -> Fraction:
if tn in TN_TO_P_TABLE:
return TN_TO_P_TABLE[tn]
return Fraction(1, 1) if tn < 2 else Fraction(0, 1)
def p_to_tn(p: Fraction) -> int:
if p in P_TO_TN_TABLE:
return P_TO_TN_TABLE[p]
return 13 if p == 0 else -1
def def_tn(base: int, atkmod: int) -> int:
atktn: int = base - atkmod
atkp: Fraction = tn_to_p(atktn)
defp: Fraction = 1 - atkp
deftn: int = p_to_tn(defp)
return deftn if defp > 0 else 15 - atktn
def main() -> None:
atkmods: list[int] = [x for x in range(-2, 9)]
headers: list[str] = ["BASE"] + [f"{x:+}" for x in atkmods]
table: list[list[int | Fraction | float]] = [
([base] + [def_tn(base, x) for x in atkmods]) for base in range(6, 11)
]
print(tabulate(table, headers=headers, tablefmt="pipe", floatfmt=".3f"))
if __name__ == "__main__":
main()