diff --git a/README.md b/README.md index 4d1b547..7d4450b 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/pf1e_simulator/combat.py b/src/pf1e_simulator/combat.py index edca3ec..39360b4 100644 --- a/src/pf1e_simulator/combat.py +++ b/src/pf1e_simulator/combat.py @@ -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 diff --git a/tests/test_conformance_p1.py b/tests/test_conformance_p1.py index 70a24a8..9db8154 100644 --- a/tests/test_conformance_p1.py +++ b/tests/test_conformance_p1.py @@ -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