From a5ebbecad8f833ceaf97442d7cd09be97341d01b Mon Sep 17 00:00:00 2001 From: ctan Date: Sat, 19 Sep 2026 10:44:25 +0200 Subject: [PATCH] fix(rules): Friendly Face and Extremely Fashionable become documented no-ops (SRD: animal attitude +2 steps and +1 Bluff/Diplomacy/Intimidate in fine clothing - neither attitude nor clothing state is modeled; old +1/+4 Diplomacy bonuses were wrong) --- data/pcs/harvie.json | 1 + data/pcs/oni.json | 2 +- src/pf1e_simulator/abilities.py | 15 +++++++++++---- tests/test_feats.py | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/data/pcs/harvie.json b/data/pcs/harvie.json index 6e759f6..50fee6a 100644 --- a/data/pcs/harvie.json +++ b/data/pcs/harvie.json @@ -69,6 +69,7 @@ } ], "source": "fiches_personnages/harvie_sheet.json", + "notes": "Feat : 'Friendly Face' est un no-op documenté (attitude initiale des animaux +2 pas, système d'attitude non modélisé).", "features": [ "Friendly Face", "Fey-touched", diff --git a/data/pcs/oni.json b/data/pcs/oni.json index b6d64cf..454d448 100644 --- a/data/pcs/oni.json +++ b/data/pcs/oni.json @@ -92,7 +92,7 @@ } ], "source": "fiches_personnages/oni_sheet.json", - "notes": "Armes placeholder Foundry sans dégâts encodés omises : 'une Pioche' (non maîtrisée) et 'Weapon' (à remplacer par la vraie arme). Trait : 'Exalted of the Society' accorde +1 canalisation d'énergie/jour (channel_energy 6 -> 7, fusionné par le chargeur).", + "notes": "Armes placeholder Foundry sans dégâts encodés omises : 'une Pioche' (non maîtrisée) et 'Weapon' (à remplacer par la vraie arme). Traits : 'Exalted of the Society' accorde +1 canalisation d'énergie/jour (channel_energy 6 -> 7, fusionné par le chargeur) ; 'Extremely Fashionable' est un no-op documenté (+1 Bluff/Diplomacy/Intimidate en habits fins, état vestimentaire non modélisé).", "features": [ "Summon Good Monster", "Sacred Summons", diff --git a/src/pf1e_simulator/abilities.py b/src/pf1e_simulator/abilities.py index f7d3c99..ef46973 100644 --- a/src/pf1e_simulator/abilities.py +++ b/src/pf1e_simulator/abilities.py @@ -222,11 +222,14 @@ LIKE_THE_WIND = AbilitySpec( effects=(StatModifier(target="speed_ft", value=10),), ) -# Friendly Face: +1 trait bonus on Diplomacy checks +# Friendly Face (feat, Animal Archive): "Other animals of roughly the same +# kind as you have their starting attitudes toward you improved by two +# steps." Attitude/social state is not modeled by the combat engine -> +# documented traced no-op (the previous "+1 diplomacy" was the wrong effect). FRIENDLY_FACE = AbilitySpec( name="Friendly Face", category="trait", - effects=(StatModifier(target="diplomacy", value=1),), + source_detail="feat (not modeled: animal initial attitude +2 steps)", ) # Fey-touched: +1 trait bonus on saves vs. fey effects @@ -359,11 +362,15 @@ SACRED_SUMS = AbilitySpec(name="Sacred Summons", category="feat") # Selective Channeling: exclude targets from channel energy SELECTIVE_CHANNELING = AbilitySpec(name="Selective Channeling", category="feat") -# Extremely Fashionable: +4 trait bonus on Diplomacy checks +# Extremely Fashionable (Faction trait, Pathfinder Society): "+1 trait bonus +# on Bluff, Diplomacy, and Intimidate checks while wearing fine clothing." +# Clothing state is not modeled by the engine and the bonus is conditional on +# it -> documented traced no-op (the previous flat "+4 diplomacy" was the +# wrong value and ignored the clothing condition). EXTREMELY_FASHIONABLE = AbilitySpec( name="Extremely Fashionable", category="trait", - effects=(StatModifier(target="diplomacy", value=4),), + source_detail="trait (not modeled: +1 Bluff/Diplomacy/Intimidate in fine clothing)", ) # Exalted of the Society (Basic Faith trait, Faction Guide; requires Cleric + diff --git a/tests/test_feats.py b/tests/test_feats.py index 9dd8d51..b4938a7 100644 --- a/tests/test_feats.py +++ b/tests/test_feats.py @@ -16,7 +16,9 @@ from pf1e_simulator.abilities import ( BORN_DAMNED, COMBAT_REFLEXES, EXALTED_SOCIETY, + EXTREMELY_FASHIONABLE, FORTIFIED_DRINKER, + FRIENDLY_FACE, MOUNTED_COMBAT, POINT_BLANK_SHOT, ) @@ -272,3 +274,19 @@ def test_axe_to_grind_is_inert_documented_noop() -> None: the wrong effect; the SRD bonus is not tied to axes).""" assert AXE_TO_GRIND.effects == () assert "not modeled" in AXE_TO_GRIND.source_detail + + +def test_friendly_face_is_inert_documented_noop() -> None: + """SRD (Animal Archive feat): animals of the same kind have their starting + attitude toward you improved by two steps. No attitude model -> inert + no-op (old +1 Diplomacy was the wrong effect).""" + assert FRIENDLY_FACE.effects == () + assert "not modeled" in FRIENDLY_FACE.source_detail + + +def test_extremely_fashionable_is_inert_documented_noop() -> None: + """SRD (PFS faction trait): +1 trait bonus on Bluff, Diplomacy and + Intimidate while wearing fine clothing. Clothing state not modeled -> + inert no-op (old flat +4 Diplomacy was the wrong value and unconditional).""" + assert EXTREMELY_FASHIONABLE.effects == () + assert "not modeled" in EXTREMELY_FASHIONABLE.source_detail