73 lines
2.3 KiB
Python
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
|