adding hit dice and defenses
This commit is contained in:
+13
-2
@@ -49,6 +49,15 @@ def bootstrap(db):
|
||||
darkvision.add_modifier(schema.Modifier("Darkvision", target="vision_in_darkness", absolute_value=120))
|
||||
tiefling.add_trait(darkvision)
|
||||
|
||||
# resistant to both magical and non-magical sources of fire
|
||||
infernal_origin = schema.AncestryTrait("Infernal Origin")
|
||||
infernal_origin.add_modifier(schema.Modifier("Infernal Origin", target="defenses.fire", new_value="resistant"))
|
||||
infernal_origin.add_modifier(
|
||||
schema.Modifier("Infernal Origin", target="defenses.magical_fire", new_value="resistant")
|
||||
)
|
||||
tiefling.add_trait(infernal_origin)
|
||||
db.add_or_update(tiefling)
|
||||
|
||||
dragonborn = schema.Ancestry("dragonborn")
|
||||
dragonborn.add_trait(darkvision)
|
||||
|
||||
@@ -70,7 +79,9 @@ def bootstrap(db):
|
||||
fighting_style.add_option(name="Defense")
|
||||
db.add_or_update(fighting_style)
|
||||
|
||||
fighter = schema.CharacterClass("fighter", hit_dice="1d10", hit_dice_stat="CON", starting_skills=2)
|
||||
fighter = schema.CharacterClass(
|
||||
"fighter", hit_die_name="1d10", hit_die_stat_name="_constitution", starting_skills=2
|
||||
)
|
||||
db.add_or_update(fighter)
|
||||
|
||||
# add skills
|
||||
@@ -81,7 +92,7 @@ def bootstrap(db):
|
||||
assert acrobatics in fighter.skills
|
||||
assert athletics in fighter.skills
|
||||
|
||||
rogue = schema.CharacterClass("rogue", hit_dice="1d8", hit_dice_stat="DEX")
|
||||
rogue = schema.CharacterClass("rogue", hit_die_name="1d8", hit_die_stat_name="_dexterity")
|
||||
db.add_or_update([rogue, fighter])
|
||||
|
||||
# characters
|
||||
|
||||
@@ -101,12 +101,19 @@ def test_manage_character(db, bootstrap):
|
||||
db.add_or_update(char)
|
||||
assert char.level == 8
|
||||
assert char.levels == {"fighter": 7, "rogue": 1}
|
||||
assert sum([len(dice) for dice in char.hit_dice.values()]) == char.level == 8
|
||||
|
||||
# remove a class
|
||||
char.remove_class(rogue)
|
||||
db.add_or_update(char)
|
||||
assert char.levels == {"fighter": 7}
|
||||
assert char.level == 7
|
||||
assert sum([len(dice) for dice in char.hit_dice.values()]) == char.level == 7
|
||||
|
||||
# verify hit dice are added and removed correctly
|
||||
assert len(char.hit_dice["fighter"]) == char.level_in_class(fighter).level == 7
|
||||
assert char.hit_dice["fighter"][0].name == fighter.hit_die_name == "1d10"
|
||||
assert char.hit_dice["fighter"][0].stat == fighter.hit_die_stat_name == "_constitution"
|
||||
|
||||
# remove remaining class by setting level to zero
|
||||
char.add_class(fighter, level=0)
|
||||
@@ -266,3 +273,51 @@ def test_modifiers(db, bootstrap):
|
||||
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
|
||||
|
||||
|
||||
def test_defenses(db, bootstrap):
|
||||
with db.transaction():
|
||||
tiefling = db.Ancestry.filter_by(name="tiefling").one()
|
||||
carl = schema.Character(name="Carl", ancestry=tiefling)
|
||||
assert carl.resistant("fire", magical=False)
|
||||
assert carl.resistant("fire", magical=True)
|
||||
carl.apply_damage(5, "fire", magical=True)
|
||||
assert carl.hit_points == 8 # half damage
|
||||
|
||||
immunity = [
|
||||
schema.Modifier("Fire Immunity", target="defenses.fire", new_value="immune"),
|
||||
schema.Modifier("Fire Immunity", target="defenses.magical_fire", new_value="immune")
|
||||
]
|
||||
for i in immunity:
|
||||
carl.add_modifier(i)
|
||||
assert carl.immune("fire")
|
||||
carl.apply_damage(5, "fire", magical=True)
|
||||
carl.apply_damage(5, "fire", magical=False)
|
||||
assert carl.hit_points == 8 # no damage
|
||||
|
||||
vulnerability = [
|
||||
schema.Modifier("Fire Vulnerability", target="defenses.fire", new_value="vulnerable"),
|
||||
schema.Modifier("Fire Vulnerability", target="defenses.magical_fire", new_value="vulnerable")
|
||||
]
|
||||
for i in vulnerability:
|
||||
carl.add_modifier(i)
|
||||
assert carl.vulnerable("fire")
|
||||
assert not carl.immune("fire")
|
||||
carl.apply_damage(2, "fire", magical=True)
|
||||
assert carl.hit_points == 4 # double damage
|
||||
|
||||
absorbs = [
|
||||
schema.Modifier("Absorbs Non-Magical Fire", target="defenses.fire", new_value="absorbs"),
|
||||
]
|
||||
carl.add_modifier(absorbs[0])
|
||||
carl.apply_damage(20, "fire", magical=False)
|
||||
assert carl.hit_points == carl._max_hit_points == 10
|
||||
|
||||
for i in immunity + vulnerability + absorbs:
|
||||
carl.remove_modifier(i)
|
||||
carl.apply_damage(5, "fire", magical=True)
|
||||
assert carl.resistant("fire")
|
||||
assert not carl.immune("fire")
|
||||
assert not carl.vulnerable("fire")
|
||||
assert not carl.absorbs("fire")
|
||||
assert carl.hit_points == 8 # half damage
|
||||
|
||||
Reference in New Issue
Block a user