69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
"""彩蛋触发管理器。
|
|
|
|
负责根据工具参数返回彩蛋元数据,供前端渲染对应特效。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Dict, List
|
|
|
|
|
|
class EasterEggManager:
|
|
"""管理隐藏彩蛋效果的触发逻辑。"""
|
|
|
|
def __init__(self) -> None:
|
|
# 目前仅有一个“灌水”特效,后续可在此扩展
|
|
self.effects: Dict[str, Dict[str, object]] = {
|
|
"flood": {
|
|
"label": "灌水",
|
|
"aliases": ["flood", "water", "wave", "灌水", "注水"],
|
|
"message": "淡蓝色水面从底部缓缓上涨,并带有柔和波纹。",
|
|
"duration_seconds": 45,
|
|
"intensity_range": (0.87, 0.93),
|
|
"notes": "特效为半透明覆盖层,不会阻挡交互。",
|
|
}
|
|
}
|
|
|
|
def trigger_effect(self, effect: str) -> Dict[str, object]:
|
|
"""
|
|
根据传入的 effect 名称查找彩蛋。
|
|
|
|
Args:
|
|
effect: 彩蛋标识或别名。
|
|
|
|
Returns:
|
|
dict: 包含触发状态与前端所需的特效参数。
|
|
"""
|
|
effect_key = (effect or "").strip().lower()
|
|
if not effect_key:
|
|
return self._build_error("缺少 effect 参数")
|
|
|
|
for effect_id, metadata in self.effects.items():
|
|
aliases = metadata.get("aliases", [])
|
|
if effect_key == effect_id or effect_key in aliases:
|
|
payload = {
|
|
"success": True,
|
|
"effect": effect_id,
|
|
"display_name": metadata.get("label", effect_id),
|
|
"message": metadata.get("message"),
|
|
"duration_seconds": metadata.get("duration_seconds", 30),
|
|
"intensity_range": metadata.get("intensity_range"),
|
|
"notes": metadata.get("notes"),
|
|
}
|
|
return payload
|
|
|
|
return self._build_error(f"未知彩蛋: {effect_key}")
|
|
|
|
def _build_error(self, message: str) -> Dict[str, object]:
|
|
"""返回格式化的错误信息。"""
|
|
return {
|
|
"success": False,
|
|
"error": message,
|
|
"available_effects": self.available_effects,
|
|
}
|
|
|
|
@property
|
|
def available_effects(self) -> List[str]:
|
|
"""返回可用彩蛋 ID 列表。"""
|
|
return list(self.effects.keys())
|