79 lines
2.8 KiB
Python
79 lines
2.8 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": "特效为半透明覆盖层,不会阻挡交互。",
|
||
},
|
||
"snake": {
|
||
"label": "贪吃蛇",
|
||
"aliases": ["snake", "贪吃蛇", "snakegame", "snake_game"],
|
||
"message": "发光的丝带贪吃蛇追逐苹果,吃满 20 个后会一路远行离开屏幕。",
|
||
"duration_seconds": 200,
|
||
"notes": "动画为独立 Canvas,不影响页面点击。",
|
||
"apples_target": 20,
|
||
"initial_apples": 3,
|
||
},
|
||
}
|
||
|
||
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),
|
||
}
|
||
payload.setdefault("duration_seconds", 30)
|
||
for key, value in metadata.items():
|
||
if key in {"label", "aliases"}:
|
||
continue
|
||
payload[key] = value
|
||
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())
|