SlayerQuest combat consists of a sequence of attacks, divided into melee attacks and missile attacks. Sucessful melee and missile attacks generally will result in causing damage to the victim of the attack. Discussion of combat will begin with a overview/summary, then a more detailed look at the constituent components.
Attack Resolution involves three steps:
1. Basic Hit Determination. The first step involves the calculation of the Attack Rating. The Attack Rating is determined by the difference in the offensive and defnsive scores of the attacker and defender. The offensive score is determined by adding the various attack bonuses to the attacker's Melee (or Missile) Skill. The defensive score is determined by adding the various defensive bonuses to the defender's Evasion Skill. The Attack Rating is "capped" at +/- 10. To determine whether a particular attack hits or misses, a random "roll" is added to the Attack Rating -- the "roll" most closely resembles 4d6-14, producing a bell curve distribution centered on 0 and extending to +/- 10. If the Attack Rating plus the roll is positive, then the attack "hits". If the result is large enough, the attack has a chance of becoming a critical hit. Note that the actual roll distribution has wider tails than a normal bell curve, ensuring that approximately 1% of attacks with an Attack Rating of -10 will still hit, and 1% of attacks with an Attack Rating of +10 will still miss.
Also factoring into this process is the defender's Critical Resistance. Critical Resistance has no impact on determining whether an attack hits or misses, but is treated just like an Evasion Bonus when deciding if an already successful attack has a chance of becoming a critical hit.
2. Critical Hit Determination. This second step is done only for attacks which succeed by 5 more than the defender's critical resistance. These attacks get 1 "threat roll" for every 5 points the combined attack rating plus "to hit roll" exceeds the defender's critical resistance. Additional threat rolls beyond the first get an additional modifier to them which makes the threat roll more likely to succeed. The threat roll is essentially a d20 roll. This roll gets modified by the Deadliness Rating of the attack (weapon), and a fraction of the defender's critical resistance. If the modified roll is greater than 15, the hit is actually a critical hit. If multiple threat rolls are warranted, only the highest is used. If the modified roll is greater than 20 or 25, an even more damaging critical is scored.
3. Damage Determination. If the attack misses, no damage is done to the defender. If the attack results in a normal (non-critical) hit, then the damage done is determined by rolling the weapon's damage dice, adding the attacker's damage bonuses, and subtracting the defender's (appropriate) Damage Resistance. Critical hits are determined similarly, but typically the weapon damage is rolled multiple times, keeping (several of) the best rolls, adding a multiple of the damage bonus, adding a special critical damage bonus, and then subtracting the defender's Damage Resistance.
Current Implementation Details
The details discussed here are subject to change as full implementation and playtesting warrant.
The first implementation detail to note is that the game actually uses integers to represent a fixed precision floating point number. In English, that means that the game actually stores and tracks combat numbers to an accuracy of 0.01. In this format, a +1 modifier (to hit or to damage) is represented by the integer 100. Random "roll"s also include this precision -- a weapon that does 1d8 of damage will actually score 100 to 800 damage (so it is possible to do exactly 4.5 damage with such a weapon, if the roll produces a value of 450).
Notation: Random(N) produces a uniformly distributed random number between 0 and N-1.
| SubRoll = | Random(501) - 250 |
| if SubRoll < -200 it's value is replaced by -750 + Random(550) | |
| if SubRoll > 200 it's value is replaced by 201 + Random(550) | |
| ToHitRoll = sum of 4 independent SubRolls | |
| AttackRating is truncated to lie within -1000 to 1000 | |
| CriticalResistance is truncated to lie within -500 to 2000 | |
| HitDegree = | "miss" if (AttackRating + ToHitRoll) <= 0 |
| "hit" if (AttackRating + ToHitRoll) > 0 | |
| "threat_1" if (AttackRating + ToHitRoll - CriticalResistance) > 5 | |
| "threat_2" if (AttackRating + ToHitRoll - CriticalResistance) > 10 | |
| "threat_3" if (AttackRating + ToHitRoll - CriticalResistance) > 15 | |
| "threat_4" if (AttackRating + ToHitRoll - CriticalResistance) > 20 | |
| For "threat_1", a single threat roll is made with a +0 modifier | |
| For "threat_2", two threat rolls are made: one with a +300 modifier, one with a +0 modifier | |
| For "threat_3", three threat rolls are made: with modifiers of +600/+300/+0 | |
| For "threat_4", four threat rolls are made: with modifiers of +900/+600/+300/+0 | |
| ThreatRoll = Random(2001) + above modifier | |
| TrueThreatRoll = Max of all ThreatRolls (if multiple rolls) | |
| Critical Degree = | "miss" if HitDegree = "miss" |
| "normal" if HitDegree = "hit" | |
| "normal" if TrueThreatRoll + DeadlyRating - CriticalResistance/4 <= 1500 | |
| "good" if TrueThreatRoll + DeadlyRating - CriticalResistance/4 > 1500 | |
| "excellent" if TrueThreatRoll + DeadlyRating - CriticalResistance/4 > 2000 | |
| "superb" if TrueThreatRoll + DeadlyRating - CriticalResistance/4 > 2500 | |
| CriticalBonusDamage = 500 for "good", 1000 for "excellent", and (TrueThreatRoll + DeadlyRating - CriticalResistance - 500) for "superb" | |
| WeaponDamage = NumDice * 100 + sum of NumDice independent Random(1 + 100 * (NumSides - 1)) rolls | |
| "normal" damage = WeaponDamage + DamageBonus - DamamgeResistance | |
| "good" damage = "best 2 of 3" WeaponDamage + 3 * DamageBonus / 2 - DamageResistance | |
| "excellent" damage = "best 3 of 5" WeaponDamage + 2 * DamageBonus - DamageResistance | |
| "superb" damage = "best 5 of 10" WeaponDamage + 3 * DamageBonus - DamageResistance | |
Combat Attributes
The following delves into more detail regarding how the numbers for the above implementation are derived/looked up/determined.
Evasion, Melee Combat, and Missile Combat Progressions
| Level | Superb | Excellent | Good | Average | Poor | Level | Superb | Excellent | Good | Average | Poor |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 100 | 75 | 67 | 50 | 33 | 26 | 2550 | 1933 | 1700 | 1267 | 850 |
| 2 | 200 | 150 | 133 | 100 | 67 | 27 | 2625 | 2000 | 1750 | 1300 | 875 |
| 3 | 300 | 225 | 200 | 150 | 100 | 28 | 2700 | 2067 | 1800 | 1333 | 900 |
| 4 | 400 | 300 | 267 | 200 | 133 | 29 | 2775 | 2133 | 1850 | 1367 | 925 |
| 5 | 500 | 375 | 333 | 250 | 167 | 30 | 2850 | 2200 | 1900 | 1400 | 950 |
| 6 | 600 | 450 | 400 | 300 | 200 | 31 | 2925 | 2267 | 1950 | 1433 | 975 |
| 7 | 700 | 525 | 467 | 350 | 233 | 32 | 3000 | 2333 | 2000 | 1467 | 1000 |
| 8 | 800 | 600 | 533 | 400 | 267 | 33 | 3075 | 2400 | 2050 | 1500 | 1025 |
| 9 | 900 | 675 | 600 | 450 | 300 | 34 | 3150 | 2467 | 2100 | 1533 | 1050 |
| 10 | 1000 | 750 | 667 | 500 | 333 | 35 | 3225 | 2533 | 2150 | 1567 | 1075 |
| 11 | 1100 | 825 | 733 | 550 | 367 | 36 | 3300 | 2600 | 2200 | 1600 | 1100 |
| 12 | 1200 | 900 | 800 | 600 | 400 | 37 | 3367 | 2650 | 2233 | 1625 | 1117 |
| 13 | 1300 | 975 | 867 | 650 | 433 | 38 | 3433 | 2700 | 2267 | 1650 | 1133 |
| 14 | 1400 | 1050 | 933 | 700 | 467 | 39 | 3500 | 2750 | 2300 | 1675 | 1150 |
| 15 | 1500 | 1125 | 1000 | 750 | 500 | 40 | 3567 | 2800 | 2333 | 1700 | 1167 |
| 16 | 1600 | 1200 | 1067 | 800 | 533 | 41 | 3633 | 2850 | 2367 | 1725 | 1183 |
| 17 | 1700 | 1275 | 1133 | 850 | 567 | 42 | 3700 | 2900 | 2400 | 1750 | 1200 |
| 18 | 1800 | 1350 | 1200 | 900 | 600 | 43 | 3767 | 2950 | 2433 | 1775 | 1217 |
| 19 | 1900 | 1425 | 1267 | 950 | 633 | 44 | 3833 | 3000 | 2467 | 1800 | 1233 |
| 20 | 2000 | 1500 | 1333 | 1000 | 667 | 45 | 3900 | 3050 | 2500 | 1825 | 1250 |
| 21 | 2100 | 1575 | 1400 | 1050 | 700 | 46 | 3967 | 3100 | 2533 | 1850 | 1267 |
| 22 | 2200 | 1650 | 1467 | 1100 | 733 | 47 | 4033 | 3150 | 2567 | 1875 | 1283 |
| 23 | 2300 | 1725 | 1533 | 1150 | 767 | 48 | 4100 | 3200 | 2600 | 1900 | 1300 |
| 24 | 2400 | 1800 | 1600 | 1200 | 800 | 49 | 4300 | 3300 | 2700 | 2000 | 1400 |
| 25 | 2475 | 1867 | 1650 | 1233 | 825 | 50 | 4500 | 3400 | 2800 | 2100 | 1500 |