fly <direction> moves the player 5 tiles, ignoring terrain. Leaves a trail of bright white ~ clouds that fade after 2 seconds. Effects system supports arbitrary timed visual overlays on the viewport. TinTin aliases: fn/fs/fe/fw/fne/fnw/fse/fsw.
84 lines
2.1 KiB
Python
84 lines
2.1 KiB
Python
"""Tests for the temporary visual effects system."""
|
|
|
|
import time
|
|
|
|
import pytest
|
|
|
|
from mudlib.effects import (
|
|
Effect,
|
|
active_effects,
|
|
add_effect,
|
|
clear_expired,
|
|
get_effects_at,
|
|
)
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clean_effects():
|
|
"""Clear effects before and after each test."""
|
|
active_effects.clear()
|
|
yield
|
|
active_effects.clear()
|
|
|
|
|
|
def test_add_effect_creates_entry():
|
|
add_effect(10, 20, "~", "\033[1;97m", ttl=2.0)
|
|
assert len(active_effects) == 1
|
|
e = active_effects[0]
|
|
assert e.x == 10
|
|
assert e.y == 20
|
|
assert e.char == "~"
|
|
assert e.color == "\033[1;97m"
|
|
|
|
|
|
def test_add_effect_sets_expiry_from_ttl():
|
|
before = time.monotonic()
|
|
add_effect(0, 0, "~", "", ttl=2.0)
|
|
after = time.monotonic()
|
|
e = active_effects[0]
|
|
assert before + 2.0 <= e.expires_at <= after + 2.0
|
|
|
|
|
|
def test_get_effects_at_returns_matching():
|
|
add_effect(5, 5, "~", "c1", ttl=2.0)
|
|
add_effect(5, 5, "~", "c2", ttl=2.0)
|
|
add_effect(6, 5, "~", "c3", ttl=2.0)
|
|
|
|
at_5_5 = get_effects_at(5, 5)
|
|
assert len(at_5_5) == 2
|
|
assert {e.color for e in at_5_5} == {"c1", "c2"}
|
|
|
|
|
|
def test_get_effects_at_excludes_expired():
|
|
add_effect(5, 5, "~", "alive", ttl=10.0)
|
|
# manually insert an expired effect
|
|
active_effects.append(
|
|
Effect(x=5, y=5, char="~", color="dead", expires_at=time.monotonic() - 1.0)
|
|
)
|
|
|
|
at_5_5 = get_effects_at(5, 5)
|
|
assert len(at_5_5) == 1
|
|
assert at_5_5[0].color == "alive"
|
|
|
|
|
|
def test_clear_expired_removes_old_effects():
|
|
add_effect(1, 1, "~", "alive", ttl=10.0)
|
|
active_effects.append(
|
|
Effect(x=2, y=2, char="~", color="dead", expires_at=time.monotonic() - 1.0)
|
|
)
|
|
|
|
clear_expired()
|
|
assert len(active_effects) == 1
|
|
assert active_effects[0].color == "alive"
|
|
|
|
|
|
def test_multiple_effects_along_path():
|
|
"""Simulates adding a cloud trail along a flight path."""
|
|
for i in range(5):
|
|
add_effect(10 + i, 20, "~", "\033[1;97m", ttl=2.0)
|
|
|
|
assert len(active_effects) == 5
|
|
# all at y=20, x from 10-14
|
|
for i, e in enumerate(active_effects):
|
|
assert e.x == 10 + i
|
|
assert e.y == 20
|