add support for modifier overrides with proficiency and expertise
This commit is contained in:
+6
-2
@@ -37,8 +37,12 @@ def bootstrap(db):
|
||||
human = schema.Ancestry("human")
|
||||
|
||||
tiefling = schema.Ancestry("tiefling")
|
||||
tiefling.add_modifier(schema.Modifier("Ability Score Increase", target="intelligence", relative_value=1))
|
||||
tiefling.add_modifier(schema.Modifier("Ability Score Increase", target="charisma", relative_value=2))
|
||||
tiefling.add_modifier(
|
||||
schema.Modifier("Ability Score Increase", target="intelligence", stacks=True, relative_value=1)
|
||||
)
|
||||
tiefling.add_modifier(
|
||||
schema.Modifier("Ability Score Increase", target="charisma", stacks=True, relative_value=2)
|
||||
)
|
||||
|
||||
# ancestry traits
|
||||
darkvision = schema.AncestryTrait("Darkvision")
|
||||
|
||||
+46
-4
@@ -132,7 +132,7 @@ def test_ancestries(db, bootstrap):
|
||||
porc = schema.Ancestry(
|
||||
name="Pygmy Orc",
|
||||
size="Small",
|
||||
walk_speed=25,
|
||||
speed=25,
|
||||
)
|
||||
assert porc.name == "Pygmy Orc"
|
||||
assert porc.creature_type == "humanoid"
|
||||
@@ -150,6 +150,7 @@ def test_ancestries(db, bootstrap):
|
||||
str_bonus = schema.Modifier(
|
||||
name="STR+3 (Pygmy Orc)",
|
||||
target="strength",
|
||||
stacks=True,
|
||||
relative_value=3,
|
||||
description="Your Strength score is increased by 3.",
|
||||
)
|
||||
@@ -186,7 +187,7 @@ def test_modifiers(db, bootstrap):
|
||||
db.add_or_update([carl, marx])
|
||||
assert carl.speed == carl.ancestry.speed == 30
|
||||
|
||||
cold = schema.Modifier(target="speed", relative_value=-10, name="Cold")
|
||||
cold = schema.Modifier(target="speed", stacks=True, relative_value=-10, name="Cold")
|
||||
hasted = schema.Modifier(target="speed", multiply_value=2.0, name="Hasted")
|
||||
slowed = schema.Modifier(target="speed", multiply_value=0.5, name="Slowed")
|
||||
restrained = schema.Modifier(target="speed", absolute_value=0, name="Restrained")
|
||||
@@ -201,11 +202,11 @@ def test_modifiers(db, bootstrap):
|
||||
|
||||
# speed is doubled
|
||||
assert carl.remove_modifier(cold)
|
||||
assert carl.speed == 30
|
||||
assert carl.add_modifier(hasted)
|
||||
assert carl.speed == 60
|
||||
|
||||
# speed is halved
|
||||
assert carl.remove_modifier(hasted)
|
||||
# speed is halved, overriding hasted because it was applied after
|
||||
assert carl.add_modifier(slowed)
|
||||
assert carl.speed == 15
|
||||
|
||||
@@ -219,8 +220,49 @@ def test_modifiers(db, bootstrap):
|
||||
|
||||
# back to normal
|
||||
assert carl.remove_modifier(slowed)
|
||||
assert carl.remove_modifier(hasted)
|
||||
assert carl.speed == carl.ancestry.speed
|
||||
|
||||
# modifiers can modify string values too
|
||||
assert carl.add_modifier(reduced)
|
||||
assert carl.size == "Tiny"
|
||||
|
||||
# modifiers can be applied to skills, even if the character doesn't have a skill associated.
|
||||
athletics = db.Skill.filter_by(name="athletics").one()
|
||||
assert athletics not in carl.skills
|
||||
assert carl.check_modifier(athletics) == 0
|
||||
temp_proficiency = schema.Modifier(
|
||||
"Expertise in Athletics",
|
||||
target="athletics_check",
|
||||
stacks=True,
|
||||
relative_attribute="expertise_bonus",
|
||||
)
|
||||
assert carl.add_modifier(temp_proficiency)
|
||||
assert carl.check_modifier(athletics) == carl.expertise_bonus + carl.strength.bonus == 2
|
||||
assert carl.remove_modifier(temp_proficiency)
|
||||
|
||||
# fighters get proficiency in athletics by default
|
||||
fighter = db.CharacterClass.filter_by(name="fighter").one()
|
||||
carl.add_class(fighter)
|
||||
db.add_or_update(carl)
|
||||
assert carl.check_modifier(athletics) == 1
|
||||
|
||||
# add the skill directly, which will grant proficiency but will not stack with proficiency from the class
|
||||
carl.add_skill(athletics, proficient=True)
|
||||
db.add_or_update(carl)
|
||||
assert len([s for s in carl.skills if s == athletics]) == 2
|
||||
assert carl.check_modifier(athletics) == 1
|
||||
|
||||
# manually override proficiency with expertise
|
||||
carl.add_skill(athletics, expert=True)
|
||||
assert carl.check_modifier(athletics) == 2
|
||||
assert len([s for s in carl.skills if s == athletics]) == 2
|
||||
|
||||
# remove expertise
|
||||
carl.add_skill(athletics, proficient=True, expert=False)
|
||||
assert carl.check_modifier(athletics) == 1
|
||||
|
||||
# remove the extra skill entirely, but the fighter proficiency remains
|
||||
carl.remove_skill(athletics, proficient=True, expert=False, character_class=None)
|
||||
assert len([s for s in carl.skills if s == athletics]) == 1
|
||||
assert carl.check_modifier(athletics) == 1
|
||||
|
||||
Reference in New Issue
Block a user