from pathlib import Path import pytest from engine.character import Character from engine.defs import DefRegistry from engine.entity import EntityPosition from engine.inventory import Inventory from engine.map import Map from engine.tile import Tile, TileLayerInstance from engine.world import World from resources.logic.abilities import ( ADRENABLEND_BRAIN_FOG_SEVERITY, ADRENABLEND_SPEED_MULTIPLIER, ADRENABLEND_STRENGTH_MULTIPLIER, cast_adrenablend, ) from resources.logic.actions import activate_hand from resources.logic.contagion import has_ailment DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs" @pytest.fixture() def registry(): return DefRegistry.load(DEFS_DIR) def make_world(registry): field = Map("field", 5, 5, 1) for x in range(5): for y in range(5): field.set_tile(x, y, 0, Tile(flooring=TileLayerInstance("grass"))) world = World(registry=registry) world.add_map(field) return world def make_human(registry, **kwargs) -> Character: return Character( species_id="human", position=EntityPosition("field", 2, 2, 0), default_body_parts=registry.new_default_body_parts("human"), **kwargs ) # --- cast_adrenablend -------------------------------------------------------------------------- def test_cast_adrenablend_boosts_strength_and_speed(registry): human = make_human(registry) cast_adrenablend(human, World(registry=registry), now=10.0) assert human.active_boosts["strength"] == ADRENABLEND_STRENGTH_MULTIPLIER assert human.active_boosts["speed"] == ADRENABLEND_SPEED_MULTIPLIER assert human.effective_strength(registry) > 10.0 * (1.0) # baseline strength=10, boosted def test_cast_adrenablend_sets_an_expiration_after_now(registry): human = make_human(registry) cast_adrenablend(human, World(registry=registry), now=10.0, duration=20.0) assert human.boost_expirations["strength"] == 30.0 assert human.boost_expirations["speed"] == 30.0 def test_cast_adrenablend_causes_brain_fog(registry): human = make_human(registry) cast_adrenablend(human, World(registry=registry), now=0.0) assert has_ailment(human, "brain_fog") head = human.get_body_part("head") fog = next(a for a in head.ailments if a.id == "brain_fog") assert fog.severity == ADRENABLEND_BRAIN_FOG_SEVERITY def test_repeated_casts_refresh_rather_than_stack_brain_fog(registry): human = make_human(registry) cast_adrenablend(human, World(registry=registry), now=0.0) cast_adrenablend(human, World(registry=registry), now=1.0) head = human.get_body_part("head") matching = [a for a in head.ailments if a.id == "brain_fog"] assert len(matching) == 1 # --- consumable item wiring via activate_hand -------------------------------------------------- def test_activating_a_consumable_ability_item_unwields_it(registry): world = make_world(registry) human = make_human(registry) human.inventory = Inventory(4, 4) human.wield_item("right_hand", "adrenablend", registry) world.add_entity(human) result = activate_hand(human, world, registry, "right_hand", (0, 1, 0), now=5.0) assert result is human assert human.get_held_item("right_hand") is None assert human.active_boosts["strength"] == ADRENABLEND_STRENGTH_MULTIPLIER def test_activating_a_non_consumable_ability_item_stays_wielded(registry): world = make_world(registry) human = make_human(registry) human.wield_item("right_hand", "chronowand", registry) world.add_entity(human) activate_hand(human, world, registry, "right_hand", (0, 1, 0), now=5.0) assert human.get_held_item("right_hand") is not None