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_two_healthy_legs_give_full_base_speed(registry): character = make_human(registry) assert character.effective_speed(30.0, registry) == pytest.approx(30.0) def test_missing_one_leg_halves_speed(registry): character = make_human(registry, body_parts=[BodyPart("left_leg", "human_left_leg", removed=True)]) assert character.effective_speed(30.0, registry) == pytest.approx(15.0) def test_missing_both_legs_gives_zero_speed(registry): character = make_human( registry, body_parts=[ BodyPart("left_leg", "human_left_leg", removed=True), BodyPart("right_leg", "human_right_leg", removed=True), ], ) assert character.effective_speed(30.0, registry) == 0.0 def test_damaged_leg_contributes_proportionally_to_integrity(registry): character = make_human(registry, body_parts=[BodyPart("left_leg", "human_left_leg", integrity=50.0)]) # left leg contributes 0.5 * 0.5 = 0.25, right leg contributes 0.5 -> total 0.75 assert character.effective_speed(30.0, registry) == pytest.approx(30.0 * 0.75) def test_bionic_leg_replacement_is_faster_than_a_normal_leg(registry): normal = make_human(registry) bionic = make_human(registry, body_parts=[BodyPart("left_leg", "bionic_leg")]) normal_speed = normal.effective_speed(30.0, registry) bionic_speed = bionic.effective_speed(30.0, registry) assert bionic_speed > normal_speed # 0.5 (right leg) + 1.2 (bionic left leg) = 1.7 assert bionic_speed == pytest.approx(30.0 * 1.7) def test_non_leg_parts_do_not_affect_speed(registry): character = make_human(registry, body_parts=[BodyPart("head", "human_head", removed=True)]) assert character.effective_speed(30.0, registry) == pytest.approx(30.0)