Mi2dRPGamEng/tests/test_swimming.py

73 lines
2.3 KiB
Python

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