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:
@@ -931,7 +931,12 @@ Règles modélisées :
|
|||||||
- Conditions effectives : 28 conditions prédéfinies (`conditions.py`). Leurs drapeaux
|
- Conditions effectives : 28 conditions prédéfinies (`conditions.py`). Leurs drapeaux
|
||||||
comportementaux sont appliqués par le moteur : `cant_act` (étourdi, paralysé, dazed,
|
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
|
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,
|
attaque, manœuvre **et incantation** (CRB : un nauséeux ne peut ni attaquer,
|
||||||
ni incanter, ni se concentrer) ; `staggered` restreint à une action
|
ni incanter, ni se concentrer) ; `staggered` restreint à une action
|
||||||
simple (une action de mouvement OU standard, pas d'attaque à outrance ni
|
simple (une action de mouvement OU standard, pas d'attaque à outrance ni
|
||||||
|
|||||||
@@ -6388,10 +6388,12 @@ def _choose_spell_action(
|
|||||||
|
|
||||||
|
|
||||||
_SWIFT_BONUS_KINDS: frozenset[str] = frozenset({"deed", "inspire_courage", "swift"})
|
_SWIFT_BONUS_KINDS: frozenset[str] = frozenset({"deed", "inspire_courage", "swift"})
|
||||||
# PF1e (CRB): a nauseated creature can take only a single move action per
|
# PF1e (SRD Conditions, nauseated): "The only action such a character can
|
||||||
# turn — no standard, no full-round, no attacks, no spellcasting.
|
# 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(
|
_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
|
# Casting-time plumbing for the budget filters: a cast_spell action consumes
|
||||||
|
|||||||
@@ -409,11 +409,17 @@ def test_nauseated_cannot_cast_via_action_execution() -> None:
|
|||||||
|
|
||||||
|
|
||||||
def test_nauseated_filter_keeps_move_kinds_drops_everything_else() -> 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"),))
|
kept = _nauseated_filter((Action(kind=kind, target_id="foe"),))
|
||||||
assert len(kept) == 1, kind
|
assert len(kept) == 1, kind
|
||||||
assert kept[0].kind == kind, 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
|
assert _nauseated_filter((Action(kind=kind, target_id="foe"),)) == (), kind
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user