Add visual effects system documentation
This commit is contained in:
parent
b1ae0bcb81
commit
0e1c46cdcc
1 changed files with 86 additions and 0 deletions
86
docs/how/effects.rst
Normal file
86
docs/how/effects.rst
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
==============
|
||||||
|
visual effects
|
||||||
|
==============
|
||||||
|
|
||||||
|
the overlay system for transient visual effects like cloud trails.
|
||||||
|
|
||||||
|
overview
|
||||||
|
========
|
||||||
|
|
||||||
|
effects are temporary overlays displayed on top of terrain in the viewport.
|
||||||
|
each effect has a position, character, color, and expiration time. they're
|
||||||
|
rendered last-wins on overlap, cleaned up passively in the game loop.
|
||||||
|
|
||||||
|
data model
|
||||||
|
==========
|
||||||
|
|
||||||
|
effect dataclass
|
||||||
|
----------------
|
||||||
|
|
||||||
|
defined in ``effects.py``::
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Effect:
|
||||||
|
x: int
|
||||||
|
y: int
|
||||||
|
char: str
|
||||||
|
color: str # ANSI code
|
||||||
|
expires_at: float # monotonic time
|
||||||
|
|
||||||
|
global state
|
||||||
|
------------
|
||||||
|
|
||||||
|
single global list::
|
||||||
|
|
||||||
|
active_effects: list[Effect] = []
|
||||||
|
|
||||||
|
no per-zone partitioning. simple.
|
||||||
|
|
||||||
|
core functions
|
||||||
|
==============
|
||||||
|
|
||||||
|
``add_effect(x, y, char, color, ttl)``
|
||||||
|
creates effect with expiry at ``time.monotonic() + ttl``, appends to list
|
||||||
|
|
||||||
|
``get_effects_at(x, y)``
|
||||||
|
returns active effects at position, auto-filters expired ones
|
||||||
|
|
||||||
|
``clear_expired()``
|
||||||
|
in-place list mutation to drop expired effects. called once per tick
|
||||||
|
(10/sec) in ``server.py`` game loop
|
||||||
|
|
||||||
|
rendering
|
||||||
|
=========
|
||||||
|
|
||||||
|
in ``look.py``, for each viewport tile:
|
||||||
|
|
||||||
|
1. check ``get_effects_at(x, y)``
|
||||||
|
2. if effects exist, take ``effects[-1]`` (most recent)
|
||||||
|
3. display its ``char`` and ``color``, overlaying terrain
|
||||||
|
|
||||||
|
last-added effect wins on overlap.
|
||||||
|
|
||||||
|
timing
|
||||||
|
======
|
||||||
|
|
||||||
|
uses ``time.monotonic()`` for consistent async timing. ttl in seconds.
|
||||||
|
|
||||||
|
current usage: fly command creates cloud trail ("~" bright white) with
|
||||||
|
staggered ttls (1.5s base + 0.4s per step) so clouds fade origin to destination.
|
||||||
|
|
||||||
|
design decisions
|
||||||
|
================
|
||||||
|
|
||||||
|
- global state, not per-zone (simplicity)
|
||||||
|
- passive cleanup via tick-based ``clear_expired()``
|
||||||
|
- last-wins overlay (no z-index, no blending)
|
||||||
|
- just char + ANSI color (minimal rendering)
|
||||||
|
- monotonic time (no wall clock drift)
|
||||||
|
|
||||||
|
code
|
||||||
|
====
|
||||||
|
|
||||||
|
- ``src/mudlib/effects.py`` - dataclass, functions, global state
|
||||||
|
- ``src/mudlib/look.py`` - viewport rendering with effect overlay
|
||||||
|
- ``src/mudlib/server.py`` - game loop calls ``clear_expired()``
|
||||||
|
- ``content/commands/fly.toml`` - cloud trail effect usage
|
||||||
Loading…
Reference in a new issue