feat(combat): skills system

This commit is contained in:
2026-09-04 22:55:41 +02:00
parent d792b6e28f
commit ab2874d79b
4 changed files with 233 additions and 1 deletions
+161
View File
@@ -40,6 +40,166 @@ class Saves(_FrozenModel):
will: int
class SkillSpec(_FrozenModel):
"""Definition of a PF1e skill."""
name: str
ability: Literal["str", "dex", "con", "int", "wis", "cha"]
trained_only: bool = False
armor_check_penalty: bool = False
class SkillRank(_FrozenModel):
"""A combatant's rank in a skill."""
rank: int = 0
class_skill: bool = False
armor_penalty: int = 0
# Predefined PF1e skills (37 skills)
PREDEFINED_SKILLS: dict[str, SkillSpec] = {
"acrobatics": SkillSpec(
name="Acrobatics", ability="dex",
trained_only=False, armor_check_penalty=True
),
"appraise": SkillSpec(
name="Appraise", ability="int",
trained_only=False, armor_check_penalty=False
),
"bluff": SkillSpec(
name="Bluff", ability="cha",
trained_only=False, armor_check_penalty=False
),
"climb": SkillSpec(
name="Climb", ability="str",
trained_only=False, armor_check_penalty=True
),
"craft": SkillSpec(
name="Craft", ability="int",
trained_only=True, armor_check_penalty=False
),
"diplomacy": SkillSpec(
name="Diplomacy", ability="cha",
trained_only=False, armor_check_penalty=False
),
"disable_device": SkillSpec(
name="Disable Device", ability="dex",
trained_only=True, armor_check_penalty=False
),
"disguise": SkillSpec(
name="Disguise", ability="cha",
trained_only=False, armor_check_penalty=False
),
"escape_artist": SkillSpec(
name="Escape Artist", ability="dex",
trained_only=False, armor_check_penalty=True
),
"fly": SkillSpec(
name="Fly", ability="dex",
trained_only=False, armor_check_penalty=True
),
"handle_animal": SkillSpec(
name="Handle Animal", ability="cha",
trained_only=True, armor_check_penalty=False
),
"heal": SkillSpec(
name="Heal", ability="wis",
trained_only=False, armor_check_penalty=False
),
"intimidate": SkillSpec(
name="Intimidate", ability="cha",
trained_only=False, armor_check_penalty=False
),
"knowledge_arcana": SkillSpec(
name="Knowledge (Arcana)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_dungeoneering": SkillSpec(
name="Knowledge (Dungeoneering)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_engineering": SkillSpec(
name="Knowledge (Engineering)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_geography": SkillSpec(
name="Knowledge (Geography)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_history": SkillSpec(
name="Knowledge (History)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_local": SkillSpec(
name="Knowledge (Local)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_nature": SkillSpec(
name="Knowledge (Nature)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_nobility": SkillSpec(
name="Knowledge (Nobility)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_planes": SkillSpec(
name="Knowledge (Planes)", ability="int",
trained_only=True, armor_check_penalty=False
),
"knowledge_religion": SkillSpec(
name="Knowledge (Religion)", ability="int",
trained_only=True, armor_check_penalty=False
),
"linguistics": SkillSpec(
name="Linguistics", ability="int",
trained_only=True, armor_check_penalty=False
),
"perception": SkillSpec(
name="Perception", ability="wis",
trained_only=False, armor_check_penalty=False
),
"perform": SkillSpec(
name="Perform", ability="cha",
trained_only=False, armor_check_penalty=False
),
"profession": SkillSpec(
name="Profession", ability="wis",
trained_only=True, armor_check_penalty=False
),
"ride": SkillSpec(
name="Ride", ability="dex",
trained_only=False, armor_check_penalty=True
),
"sense_motive": SkillSpec(
name="Sense Motive", ability="wis",
trained_only=False, armor_check_penalty=False
),
"sleight_of_hand": SkillSpec(
name="Sleight of Hand", ability="dex",
trained_only=True, armor_check_penalty=True
),
"spellcraft": SkillSpec(
name="Spellcraft", ability="int",
trained_only=True, armor_check_penalty=False
),
"stealth": SkillSpec(
name="Stealth", ability="dex",
trained_only=False, armor_check_penalty=True
),
"survival": SkillSpec(
name="Survival", ability="wis",
trained_only=False, armor_check_penalty=False
),
"swim": SkillSpec(
name="Swim", ability="str",
trained_only=False, armor_check_penalty=True
),
"use_magic_device": SkillSpec(
name="Use Magic Device", ability="cha",
trained_only=True, armor_check_penalty=False
),
}
class DamageComponent(_FrozenModel):
"""One damage roll with its types (e.g. 1d8 piercing).
@@ -116,3 +276,4 @@ class Combatant(_FrozenModel):
casting_ability: str = "wis" # ability used for spell DCs: str/dex/con/int/wis/cha
resources: dict[str, int] = Field(default_factory=dict) # resource pools per combat
metamagic_feats: list[str] = Field(default_factory=list) # e.g. Empower/Maximize/Extend Spell
skills: dict[str, SkillRank] = Field(default_factory=dict)