SlayerQuest - Combat

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

LevelSuperbExcellentGoodAveragePoorLevelSuperbExcellentGoodAveragePoor
110075675033262550193317001267850
220015013310067272625200017501300875
3300225200150100282700206718001333900
4400300267200133292775213318501367925
5500375333250167302850220019001400950
6600450400300200312925226719501433975
77005254673502333230002333200014671000
88006005334002673330752400205015001025
99006756004503003431502467210015331050
1010007506675003333532252533215015671075
1111008257335503673633002600220016001100
1212009008006004003733672650223316251117
1313009758676504333834332700226716501133
14140010509337004673935002750230016751150
151500112510007505004035672800233317001167
161600120010678005334136332850236717251183
171700127511338505674237002900240017501200
181800135012009006004337672950243317751217
191900142512679506334438333000246718001233
2020001500133310006674539003050250018251250
2121001575140010507004639673100253318501267
2222001650146711007334740333150256718751283
2323001725153311507674841003200260019001300
2424001800160012008004943003300270020001400
2524751867165012338255045003400280021001500