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