89 lines
3.5 KiB
Python
89 lines
3.5 KiB
Python
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from engine.character import BodyPart, Character
|
|
from engine.defs import DefRegistry
|
|
|
|
DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs"
|
|
|
|
|
|
@pytest.fixture()
|
|
def registry():
|
|
return DefRegistry.load(DEFS_DIR)
|
|
|
|
|
|
def make_human(registry, **kwargs) -> Character:
|
|
return Character(species_id="human", default_body_parts=registry.new_default_body_parts("human"), **kwargs)
|
|
|
|
|
|
def test_wield_one_handed_item_in_a_hand(registry):
|
|
character = make_human(registry)
|
|
assert character.wield_item("right_hand", "staff_oak", registry) is True
|
|
assert character.get_held_item("right_hand").item_def_id == "staff_oak"
|
|
assert character.get_held_item("left_hand") is None
|
|
|
|
|
|
def test_wield_fails_without_the_corresponding_arm(registry):
|
|
character = make_human(registry)
|
|
character.body_parts = [BodyPart("right_arm", "human_right_arm", removed=True)]
|
|
assert character.wield_item("right_hand", "staff_oak", registry) is False
|
|
assert character.get_held_item("right_hand") is None
|
|
|
|
|
|
def test_two_handed_item_occupies_both_hands(registry):
|
|
character = make_human(registry)
|
|
assert character.wield_item("right_hand", "multi_deconstructor", registry) is True
|
|
assert character.get_held_item("right_hand").item_def_id == "multi_deconstructor"
|
|
assert character.get_held_item("left_hand").item_def_id == "multi_deconstructor"
|
|
|
|
|
|
def test_two_handed_item_fails_if_paired_arm_missing(registry):
|
|
character = make_human(registry)
|
|
character.body_parts = [BodyPart("left_arm", "human_left_arm", removed=True)]
|
|
assert character.wield_item("right_hand", "multi_deconstructor", registry) is False
|
|
assert character.held_items == [] # no partial wield
|
|
|
|
|
|
def test_wielding_replaces_whatever_was_in_that_hand(registry):
|
|
character = make_human(registry)
|
|
character.wield_item("right_hand", "staff_oak", registry)
|
|
character.wield_item("right_hand", "pistol_basic", registry)
|
|
assert character.get_held_item("right_hand").item_def_id == "pistol_basic"
|
|
assert len([h for h in character.held_items if h.hand_slot == "right_hand"]) == 1
|
|
|
|
|
|
def test_two_handed_wield_clears_a_previously_one_handed_offhand_item(registry):
|
|
character = make_human(registry)
|
|
character.wield_item("left_hand", "wooden_shield", registry)
|
|
character.wield_item("right_hand", "multi_deconstructor", registry)
|
|
assert character.get_held_item("left_hand").item_def_id == "multi_deconstructor"
|
|
assert character.get_held_item("right_hand").item_def_id == "multi_deconstructor"
|
|
|
|
|
|
def test_unwield_clears_a_hand(registry):
|
|
character = make_human(registry)
|
|
character.wield_item("right_hand", "staff_oak", registry)
|
|
character.unwield("right_hand")
|
|
assert character.get_held_item("right_hand") is None
|
|
|
|
|
|
def test_four_armed_hand_slots_unavailable_on_a_two_armed_human(registry):
|
|
character = make_human(registry)
|
|
assert character.wield_item("right_hand_2", "staff_oak", registry) is False
|
|
|
|
|
|
def test_wielded_shield_detects_shield_by_stats(registry):
|
|
character = make_human(registry)
|
|
assert character.wielded_shield(registry) is None
|
|
character.wield_item("left_hand", "wooden_shield", registry)
|
|
shield = character.wielded_shield(registry)
|
|
assert shield is not None
|
|
assert shield.id == "wooden_shield"
|
|
|
|
|
|
def test_wielded_shield_ignores_non_shield_items(registry):
|
|
character = make_human(registry)
|
|
character.wield_item("right_hand", "staff_oak", registry)
|
|
assert character.wielded_shield(registry) is None
|