fix(rules): restrict nauseated creatures to a single move action

PF1e (SRD Conditions, nauseated): "The only action such a character can take is a single move actions per turn." _NAUSEA_MOVE_KINDS now holds only genuine move actions (move, stand_up, retrieve_weapon, repair_weapon): the 5-foot step and dropping prone are free actions and are dropped by the nauseated filter. The pinned filter test was retargeted; 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 09:44:53 +02:00
parent 49aa79d612
commit dde6bc1f5d
3 changed files with 19 additions and 6 deletions
+6 -1
View File
@@ -931,7 +931,12 @@ Règles modélisées :
- Conditions effectives : 28 conditions prédéfinies (`conditions.py`). Leurs drapeaux
comportementaux sont appliqués par le moteur : `cant_act` (étourdi, paralysé, dazed,
endormi, inerme, fasciné) annule le tour ; `cant_attack` (nauséeux) n'autorise qu'une unique action
de mouvement (`move`, `5foot_step`, `stand_up`, `drop_prone`) et bloque toute
de mouvement — conformance L9 (SRD « Conditions — Nauseated ») : « The only
action such a character can take is a single move actions per turn » — seuls
les vraies actions de mouvement (`move`, `stand_up`, `retrieve_weapon`,
`repair_weapon`) survivent au filtre ; le pas de placement (`5foot_step`) et
se jeter à terre (`drop_prone`) sont des actions **libres**, non de
mouvement, et sont donc retirés ; le nauséeux bloque toute
attaque, manœuvre **et incantation** (CRB : un nauséeux ne peut ni attaquer,
ni incanter, ni se concentrer) ; `staggered` restreint à une action
simple (une action de mouvement OU standard, pas d'attaque à outrance ni
+5 -3
View File
@@ -6388,10 +6388,12 @@ def _choose_spell_action(
_SWIFT_BONUS_KINDS: frozenset[str] = frozenset({"deed", "inspire_courage", "swift"})
# PF1e (CRB): a nauseated creature can take only a single move action per
# turn — no standard, no full-round, no attacks, no spellcasting.
# PF1e (SRD Conditions, nauseated): "The only action such a character can
# take is a single move action per turn" — genuine move actions only: the
# 5-foot step and dropping prone are free actions, not move actions, and
# run/charge/withdraw are full-round.
_NAUSEA_MOVE_KINDS: frozenset[str] = frozenset(
{"move", "5foot_step", "stand_up", "drop_prone"}
{"move", "stand_up", "retrieve_weapon", "repair_weapon"}
)
# Casting-time plumbing for the budget filters: a cast_spell action consumes
+8 -2
View File
@@ -409,11 +409,17 @@ def test_nauseated_cannot_cast_via_action_execution() -> None:
def test_nauseated_filter_keeps_move_kinds_drops_everything_else() -> None:
for kind in ("move", "5foot_step", "stand_up", "drop_prone"):
# SRD nauseated: "The only action such a character can take is a single
# move action per turn" — only genuine move actions survive; the 5-foot
# step and dropping prone are free actions, not move actions.
for kind in ("move", "stand_up", "retrieve_weapon", "repair_weapon"):
kept = _nauseated_filter((Action(kind=kind, target_id="foe"),))
assert len(kept) == 1, kind
assert kept[0].kind == kind, kind
for kind in ("attack", "cast_spell", "full_attack", "charge", "maneuver", "hex"):
for kind in (
"attack", "cast_spell", "full_attack", "charge", "maneuver", "hex",
"5foot_step", "drop_prone",
):
assert _nauseated_filter((Action(kind=kind, target_id="foe"),)) == (), kind