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