from pathlib import Path import pytest from engine.defs import DefRegistry from engine.entity import Entity, EntityPosition from engine.map import Map from engine.tile import Tile, TileLayerInstance from engine.world import World from resources.logic.swimming import in_water, try_swim_vertical DEFS_DIR = Path(__file__).resolve().parent.parent / "resources" / "defs" @pytest.fixture() def registry(): return DefRegistry.load(DEFS_DIR) def make_world(registry): m = Map("lake", 2, 1, 3) m.set_tile(0, 0, 0, Tile(flooring=TileLayerInstance("water"))) m.set_tile(0, 0, 1, Tile(flooring=TileLayerInstance("water"))) m.set_tile(0, 0, 2, Tile(room=TileLayerInstance("solid_rock"))) # a lid above the water m.set_tile(1, 0, 0, Tile(flooring=TileLayerInstance("dirt"))) world = World(registry=registry) world.add_map(m) return world def test_in_water_true_when_standing_on_water(registry): world = make_world(registry) swimmer = Entity(position=EntityPosition("lake", 0, 0, 0)) assert in_water(swimmer, world) is True def test_in_water_false_on_dry_land(registry): world = make_world(registry) walker = Entity(position=EntityPosition("lake", 1, 0, 0)) assert in_water(walker, world) is False def test_in_water_false_with_no_position(registry): world = make_world(registry) assert in_water(Entity(), world) is False def test_swim_up_moves_between_stacked_water_tiles(registry): world = make_world(registry) swimmer = Entity(position=EntityPosition("lake", 0, 0, 0)) assert try_swim_vertical(swimmer, world, 1) is True assert swimmer.position.z == 1 def test_swim_down_moves_between_stacked_water_tiles(registry): world = make_world(registry) swimmer = Entity(position=EntityPosition("lake", 0, 0, 1)) assert try_swim_vertical(swimmer, world, -1) is True assert swimmer.position.z == 0 def test_swim_is_blocked_by_a_solid_ceiling(registry): world = make_world(registry) swimmer = Entity(position=EntityPosition("lake", 0, 0, 1)) assert try_swim_vertical(swimmer, world, 1) is False assert swimmer.position.z == 1 def test_swim_vertical_is_a_no_op_on_dry_land(registry): world = make_world(registry) walker = Entity(position=EntityPosition("lake", 1, 0, 0)) assert try_swim_vertical(walker, world, 1) is False