- Fix TerminalDisplay: add screen clear each frame (cursor home + erase down) - Fix CameraStage: use set_canvas_size instead of read-only viewport properties - Fix Glitch effect: preserve visible line lengths, remove cursor positioning - Fix Fade effect: return original line when fade=0 instead of empty string - Fix Noise effect: use input line length instead of terminal_width - Remove HUD effect from all presets (redundant with border FPS display) - Add regression tests for effect dimension stability - Add docs/ARCHITECTURE.md with Mermaid diagrams - Add mise tasks: diagram-ascii, diagram-validate, diagram-check - Move markdown docs to docs/ (ARCHITECTURE, Refactor, hardware specs) - Remove redundant requirements files (use pyproject.toml) - Add *.dot and *.png to .gitignore Closes #25
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
import random
|
|
|
|
from engine import config
|
|
from engine.effects.types import EffectConfig, EffectContext, EffectPlugin
|
|
from engine.terminal import C_DIM, G_DIM, G_LO, RST, W_GHOST
|
|
|
|
|
|
class NoiseEffect(EffectPlugin):
|
|
name = "noise"
|
|
config = EffectConfig(enabled=True, intensity=0.15)
|
|
|
|
def process(self, buf: list[str], ctx: EffectContext) -> list[str]:
|
|
if not ctx.ticker_height:
|
|
return buf
|
|
result = list(buf)
|
|
intensity = self.config.intensity
|
|
probability = intensity * 0.15
|
|
|
|
for r in range(len(result)):
|
|
cy = ctx.scroll_cam + r
|
|
if random.random() < probability:
|
|
original_line = result[r]
|
|
result[r] = self._generate_noise(len(original_line), cy)
|
|
return result
|
|
|
|
def _generate_noise(self, w: int, cy: int) -> str:
|
|
d = random.choice([0.15, 0.25, 0.35, 0.12])
|
|
return "".join(
|
|
f"{random.choice([G_LO, G_DIM, C_DIM, W_GHOST])}"
|
|
f"{random.choice(config.GLITCH + config.KATA)}{RST}"
|
|
if random.random() < d
|
|
else " "
|
|
for _ in range(w)
|
|
)
|
|
|
|
def configure(self, config: EffectConfig) -> None:
|
|
self.config = config
|