From 1257bb384975ad081ee3baae8f4e0304f052efd0 Mon Sep 17 00:00:00 2001 From: ctan Date: Sun, 20 Sep 2026 21:48:02 +0200 Subject: [PATCH] docs(rules): document skill checks, Acrobatics Tumbling and Stealth in README (rule list, observation schema hidden_from, out-of-scope updates, test count 1970) --- README.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7f15021..76e5025 100644 --- a/README.md +++ b/README.md @@ -1139,6 +1139,92 @@ Règles modélisées : modificateurs d'effets (`StatModifier` avec `target` correspondant) sont appliqués via `resolve_modifiers` (mêmes règles d'empilement que les attaques). Renvoie un `SaveResult` (success, roll, total, dc). +- Compétences : `skill_check(state, skill, *, extra_mods=())` — jet de + compétence générique `d20 + rangs + mod de caractéristique + 3 si compétence + de classe avec rangs investis + pénalité d'armure` (SRD « Skill Checks », + Table 4-2 « Trained Class Skill » : le bonus de classe +3 n'est accordé que + si la compétence est de classe ET a au moins 1 rang). **Aucune réussite ou + échec automatique sur 1/20 naturel** (SRD « Skill Checks » : « Unlike attack + rolls and saving throws, a natural roll of 20 on the d20 is not an automatic + success, and a natural roll of 1 is not an automatic failure »). Renvoie un + `SkillCheckResult` (roll, total). `resolve_skill` (bonus statique de + compétence, utilisé par l'escape par compétence) délègue désormais au même + calcul. Compétences de combat modélisées : **Acrobatics — Tumbling** et + **Stealth** (voir ci-dessous) ; les autres compétences (Climb, Swim, + Diplomacy, Disable Device…) restent hors périmètre (voir « Limites hors + périmètre »). +- Acrobatics — Tumbling (SRD « Acrobatics », KB + `rules/pathfinder-unchained/acrobatics-dex-armor-check-penalty.md` ; + « Moving Through a Square », KB + `rules/prpg-core-rulebook/moving-through-a-square.md`) : + `Action(kind="move", tumble=True)` (opt-in, comme `weapon_id`/ + `destination` — `default_policy` ne tumbling jamais) fait tenter au + déplaceur un jet d'Acrobatics **par adversaire menaçant** avant de quitter + une case menacée et avant d'entrer dans la case d'un ennemi. DD = **CMD de + l'adversaire** (SRD : « The DC of this check is your opponent's CMD ») ; + entrer dans la case d'un ennemi : DD = **CMD + 5** (SRD « Move Through an + Enemy's Space » : « A trained character can attempt to use Acrobatics to + move through a square occupied by an opponent. The DC is 5 + the opponent's + CMD » — la clause « +5 si l'opposant est plus grand que vous » du cahier des + charges est couverte par cette entrée de case) ; **+2 par adversaire + supplémentaire déjà testé** dans le même déplacement (SRD : « If you attempt + to move through an enemy's space and fail, you lose the move action and + provoke an attack of opportunity from that enemy » ; « +2 to the DC for each + additional opponent you attempt to tumble past in the same round »). Le + tumbling est **réservé aux entraînés** (SRD : « A character can attempt to + use Acrobatics to move through a square occupied by an opponent only if she + is trained in the skill » — sans rang, l'action est rejetée + `untrained_tumble`). Le déplacement se fait à **moitié vitesse** (SRD : + « You can move through a threatened square at half speed »). **Échec** : + le mouvement s'arrête immédiatement et l'adversaire porte une AoO (SRD : + « If you fail this check, you provoke an attack of opportunity from that + enemy »). Le jet d'Acrobatics est un jet de compétence : pas de réussite/ + échec automatique sur 20/1 naturel. +- Stealth (SRD « Stealth », KB `rules/ultimate-intrigue/perception-and-stealth.md`, + `rules/pathfinder-unchained/perception-wis.md`) : + `Action(kind="hide")` (action de mouvement, opt-in) fait tenter au + combattant un jet de Stealth **opposé à la Perception de chaque ennemi** + (SRD : « Your Stealth check is opposed by the Perception check of anyone who + might notice you »). Le jet de Stealth vaut `d20 + rangs + mod de Dextérité + + 3 de classe + pénalité d'armure + modificateur de taille` (SRD Table 4-2 : + Small +4, Medium 0, Large −4, Tiny +8, Diminutive +12, Fine +16) ; la + Perception de l'observateur subit **−1 par 10 ft de distance** (SRD + « Perception » : « +1 to the DC for every 10 feet of distance between you + and the target » — le moteur applique le modificateur au jet de Perception + de l'observateur). Un observateur qui **voit directement** le combattant + (ligne d'effet, sans couvert ni dissimulation, non aveuglé) ne peut pas être + battu : la dissimulation contre lui est impossible (SRD « Being Observed » : + « If people are observing you, you can't use Stealth »). Un observateur qui + **échoue à battre** le total de Stealth (opposition résolue par la règle + générale des jets opposés — CRB « Skill Checks » : « the attempt is + successful if your check result exceeds the result of the target ») ne + perçoit plus le combattant : il est ajouté à `hidden_from` et le traite + comme **invisible** (SRD : « Creatures that fail to beat your Stealth check + are not aware of you and treat you as if you had total concealment ») — + dissimulation totale 50 % contre ses attaques, **+2 aux attaques** du + combattant caché contre lui et **perte de son bonus de Dextérité à la CA** + (même chemin `denies_dex_to_ac` que l'invisible), et **aucune AoO** contre + un déplacement caché (SRD « Concealment » : « You can't execute an attack of + opportunity against an opponent with total concealment relative to you »). + **Briser la dissimulation** (SRD « Breaking Stealth ») : attaquer (ou + incanter un sort de contact) révèle le combattant à tous ses observateurs + (`hidden_from` vidé) ; **courir ou charger** brise aussi la dissimulation + (SRD : « If you run or charge, you lose Stealth ») ; **se déplacer** (move, + retraite) ou **faire un pas de placement** tout en restant caché re-joue + l'opposition avec **−5** (SRD : « You can move up to half your normal speed + and use Stealth at no penalty. When moving at a speed greater than half but + not more than your normal speed, you take a −5 penalty » — le moteur + applique le −5 à tout déplacement, simplification documentée : la vitesse + exacte du déplacement n'est pas distinguée) ; un observateur qui voit + directement la nouvelle position retire le combattant de sa liste + (journalisé `no longer hidden from X (observed)`). Le snapshot d'observation + expose l'état via la clé `hidden_from` (tuple trié des ids d'observateurs + qui ne perçoivent pas le combattant). Hors périmètre (documenté) : le + **sniping** (−20 au jet de Stealth pour attaquer puis rester caché), la + **création de diversion** (Bluff), le modificateur « distrait » (+5 au DD + de Perception — le moteur n'a pas d'état « distrait » et aucune règle SRD + ne rend les observateurs en combat automatiquement distraits), et la + distinction vitesse moitié/vitesse normale du −5 (voir ci-dessus). - Modificateurs conditionnés : un `StatModifier` avec `condition=` n'est appliqué que si la condition tient au moment de la résolution (`_modifier_condition_holds`) : `target_within_30ft_ranged` (arme à distance à ≤ 30 ft), `axe` (arme dont le nom @@ -1906,7 +1992,10 @@ Règles modélisées : pas ; V5b ; `bleeding`/`confused` sont visibles via `conditions`), recurring_damage (S2c — liste des sources de dégâts récurrents de sort actives, chacune `{formula, types, rounds_left}` ; tick au début du tour, - réduit par résistance énergétique, jamais par la RD). + réduit par résistance énergétique, jamais par la RD), + hidden_from (tuple trié des ids d'observateurs ennemis qui ne perçoivent + pas le combattant — état de dissimulation par observateur, voir + « Stealth » ; vide = tout le monde le voit). - Par paire combattant actif × cible : target_index, distance_ft, weapon_for, range_penalty, can_charge, can_step5_to_attack, has_line_of_effect, flanking, movement_cost_ft, target_threatens_me, enemies_threatening_me, @@ -1990,10 +2079,11 @@ plutôt que bricolées) : son footprint ne rentre pas ; ni le squeeze payant, ni la réduction de footprint dans les couloirs ne sont modélisés. - **Passage à travers une créature (3 catégories d'écart) — approximations** : - la règle est modélisée (traversée + AoO d'entrée, voir « Mouvement ») ; - restent hors périmètre le test d'Acrobatics « Tumbling » (« A trained - character can attempt to use Acrobatics to move through a square occupied - by an opponent » — la compétence n'existe pas dans le moteur) et la clause + la règle est modélisée (traversée + AoO d'entrée, voir « Mouvement ») et le + test d'Acrobatics « Tumbling » est désormais modélisé (voir « Acrobatics — + Tumbling » : opt-in `tumble=True`, DD = CMD, +5 pour entrer dans la case + d'un ennemi, +2 par adversaire supplémentaire, moitié vitesse, échec = AoO + + mouvement arrêté) ; reste hors périmètre la clause des très grosses créatures inertes (« Some creatures, particularly very large ones, may present an obstacle even when helpless. In such cases, each square you move through counts as 2 squares » — les cases d'une créature @@ -2183,7 +2273,7 @@ Limites de sorts (conformance D6-D9, documentées plutôt que bricolées) : La gate de validation complète (tests + lint + types) : ```bash -uv run pytest -q # 1900 tests +uv run pytest -q # 1970 tests uv run ruff check src tests uv run basedpyright src # mode strict ```