fix(rules): let a natural 20 auto-succeed on escape

PF1e (SRD Combat Maneuvers): "Rolling a natural 20 while attempting a combat maneuver is always a success (except when attempting to escape from bonds)" - escaping a grapple is a combat maneuver, not bonds. _maneuver_escape now auto-succeeds on a natural 20 below CMD (the natural 1 auto-failure is unchanged). README updated.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-09-12 08:58:11 +02:00
parent c96579a485
commit faa8a72a86
3 changed files with 52 additions and 4 deletions
+5 -1
View File
@@ -4384,7 +4384,11 @@ class CombatEngine:
target_cmd = self._maneuver_cmd(target)
roll = self._rng.d20()
total = roll + escape_bonus
success = roll != 1 and total >= target_cmd
# PF1e (SRD Combat Maneuvers): "Rolling a natural 20 while attempting
# a combat maneuver is always a success (except when attempting to
# escape from bonds)" — escaping a grapple is a combat maneuver, not
# bonds, so the natural 20 auto-succeeds here too.
success = roll == _NATURAL_TWENTY or (roll != _NATURAL_ONE and total >= target_cmd)
if success:
target.active_conditions = [
ac for ac in target.active_conditions if ac.condition.name != "grappled"