fix(rules): treat a blinded attacker as facing total concealment
CRB 'Conditions - Blinded': 'All opponents are considered to have total concealment (50% miss chance) against the blinded character.' The sneak-attack gate and the AoO suppression gate now apply the same max(target_concealment, 50) convention as _resolve_hit_damage: a blinded attacker cannot sneak attack and its AoOs are suppressed without spending the budget. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -2618,12 +2618,20 @@ class CombatEngine:
|
||||
30 ft); dice = (level + 1) // 2. Only TOTAL concealment (miss chance
|
||||
>= 50%) denies the sneak attack; partial concealment (blurred 20%)
|
||||
does not (CRB rogue "Sneak Attack": "cannot sneak attack while
|
||||
striking a creature with total concealment"). PF1e (CRB): undead and
|
||||
constructs are immune to precision damage — ooze/plant immunity is not
|
||||
modeled (no such creature types exist in the data model).
|
||||
striking a creature with total concealment"). A BLINDED attacker faces
|
||||
total concealment against ALL its opponents (CRB "Conditions —
|
||||
Blinded": "All opponents are considered to have total concealment
|
||||
(50% miss chance) against the blinded character"), so it cannot sneak
|
||||
attack either — same max(target, 50) convention as _resolve_hit_damage.
|
||||
PF1e (CRB): undead and constructs are immune to precision damage —
|
||||
ooze/plant immunity is not modeled (no such creature types exist in
|
||||
the data model).
|
||||
"""
|
||||
effective_concealment = concealment
|
||||
if self._has_condition_named(attacker, "blinded"):
|
||||
effective_concealment = max(concealment, _TOTAL_CONCEALMENT_PCT)
|
||||
if (
|
||||
concealment >= _TOTAL_CONCEALMENT_PCT
|
||||
effective_concealment >= _TOTAL_CONCEALMENT_PCT
|
||||
or not self._has_feat(attacker, _SNEAK_ATTACK_FEATURE)
|
||||
):
|
||||
return 0
|
||||
@@ -3082,10 +3090,17 @@ class CombatEngine:
|
||||
PF1e (CRB "Cover"): "You can't execute an attack of opportunity
|
||||
against an opponent with cover relative to you"; (CRB "Concealment"):
|
||||
"You can't execute an attack of opportunity against an opponent with
|
||||
total concealment" (miss chance >= 50%). Melee line: terrain cover
|
||||
only — creatures grant no melee cover.
|
||||
total concealment" (miss chance >= 50%). A BLINDED attacker considers
|
||||
ALL its opponents to have total concealment (CRB "Conditions —
|
||||
Blinded": "All opponents are considered to have total concealment
|
||||
(50% miss chance) against the blinded character"), so its AoOs are
|
||||
suppressed too. Melee line: terrain cover only — creatures grant no
|
||||
melee cover.
|
||||
"""
|
||||
if self._concealment_chance(target) >= _TOTAL_CONCEALMENT_PCT:
|
||||
concealment = self._concealment_chance(target)
|
||||
if self._has_condition_named(attacker, "blinded"):
|
||||
concealment = max(concealment, _TOTAL_CONCEALMENT_PCT)
|
||||
if concealment >= _TOTAL_CONCEALMENT_PCT:
|
||||
return "total concealment"
|
||||
if cover_bonus_cells(
|
||||
self._grid,
|
||||
|
||||
Reference in New Issue
Block a user