Files
echo-nexus/docs/06-音频与成就系统-v0.2.1.md

162 lines
7.2 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 回响星核 v0.2.1 — 音频系统 + 成就系统 + 视觉打磨
> 版本:v0.2.1
> 日期:2026-06-23
> 范围:程序化音频引擎、14 项成就系统、脉冲粒子爆发、UI 打磨
---
## 一、程序化音频系统(Web Audio API,零资源文件)
### 设计目标
- 无需任何外部音频文件,全部由振荡器 + 噪声 + 包络合成
- 音色契合"深空考古 / 全息晶体"美学:谐振、水晶、低频脉冲
-`soundOn` 开关控制,支持浏览器自动播放策略(首次用户交互后初始化 AudioContext
### 实现
- **文件**`src/lib/game/audio.ts`AudioEngine 单例 + 15 种音效)
- **Hook**`src/hooks/useAudio.ts``useAudioSync` 同步开关,`sfx()` 便捷播放)
### 音效清单
| 音效名 | 触发场景 | 合成方式 |
|--------|---------|---------|
| pulse | 主动脉冲 | 上升正弦短音 + 三角波泛音 |
| pulseCombo | 连击≥3 脉冲 | 更高基频 + 多泛音 |
| decodeClick | 解码点击节点 | 按颜色变调(C5/D5/E5/F5+ 泛音 |
| decodeFail | 解码点击错误 | 低频锯齿 + 噪声脉冲 |
| decodeSuccess | 解码成功 | 大三和弦琶音上扬 |
| fragmentUnlock | 记忆碎片浮现 | 空灵长音 + 扫频 |
| techBuy | 购买技术 | 双音确认 |
| expeditionStart | 探险出发 | 低频锯齿扫频 + 噪声(引擎启动感) |
| expeditionNode | 探险节点结算 | 三角波中频 |
| expeditionVictory | 探险胜利 | 上行凯旋和弦 |
| expeditionDefeat | 探险失败 | 下行低音 |
| prestige | 飞升 | 宏大扫频 + 和弦堆叠 |
| achievement | 成就解锁 | 亮丽四音琶音 |
| uiHover | 界面悬停 | 极轻正弦 |
| uiClick | 界面点击 | 轻确认 |
### 接入点
- `CrystalOrb`pulse / pulseCombo
- `DecodeArray`decodeClick(按颜色变调)/ decodeFail / decodeSuccess / fragmentUnlock
- `ExpeditionPanel`expeditionStart / expeditionNode / expeditionVictory / expeditionDefeat
- `TechTree`techBuy
- `PrestigeDialog`prestige
- `AchievementNotifier`achievement
- `SettingsDialog`:新增「试听」按钮(播放 decodeSuccess
---
## 二、成就系统(14 项,跨周目永久加成)
### 设计目标
- 给玩家长期目标与即时正反馈
- 成就奖励包含即时资源 + 永久产能/洞见百分比加成(跨周目保留,与蓝图叠加)
- 解锁时 Toast 通知 + 专属音效
### 实现
- **定义**`src/lib/game/achievements.ts`14 项成就 + `achievementBonuses` 聚合)
- **状态**`GameState.achievements: Record<string, boolean>`
- **检测**`gameStore.checkAchievements()` 每秒由主循环调用;页面可见性恢复时立即检测
- **通知**`AchievementNotifier` 组件消费 `_achievementQueue`,弹 Toast + 播音效
- **UI**`AchievementsPanel` 组件,作为第 4 个标签页
### 成就列表
| ID | 名称 | 条件 | 奖励 |
|----|------|------|------|
| ach_first_pulse | 初次触碰 | 发起第一次脉冲 | +5 晶体 |
| ach_first_decode | 谐振初鸣 | 解码第一颗晶体 | +3 洞见 |
| ach_decoded_10 | 回响解码者 | 累计解码 10 颗 | +15 洞见 · 产能 +5% |
| ach_decoded_25 | 记忆织匠 | 累计解码 25 颗 | +40 洞见 · 产能 +8% |
| ach_decoded_50 | 星核解密师 | 累计解码 50 颗 | +100 洞见 · 产能 +12% · 洞见 +10% |
| ach_tech_3 | 初窥门径 | 解锁 3 项技术 | +20 洞见 |
| ach_tech_all | 全谱精通 | 解锁全部 12 项技术 | 产能 +15% · 洞见 +15% |
| ach_frag_4 | 残篇拾遗 | 拼凑 4 段碎片 | +10 接触 · +25 洞见 |
| ach_frag_all | 回响全谱 | 拼凑全部 8 段碎片 | +25 接触 · 产能 +10% |
| ach_exp_1 | 初探遗迹 | 完成 1 次探险 | +10 洞见 |
| ach_exp_5 | 遗迹猎手 | 出发 5 次探险 | +30 洞见 · 产能 +5% |
| ach_prestige_1 | 初次接触 | 飞升 1 次 | 产能 +10% · 洞见 +10% |
| ach_prestige_3 | 维度行者 | 飞升 3 次 | 产能 +20% · 洞见 +20% |
| ach_warehouse | 满仓时刻 | 晶体达仓库上限 | +8 洞见 |
### 加成计算
`recomputeStats()` 现聚合三层数值来源:
1. 技术树节点效果
2. 飞升蓝图加成(每张 +5% 产能 / +3% 洞见 / +4% 接触)
3. **成就永久加成**(跨周目保留,飞升后仍生效)
### 旧存档兼容
- `init()` 补全缺失的 `achievements` 字段为 `{}`
- `partialize` 排除 `_achievementQueue`(运行时临时队列不持久化)
---
## 三、视觉打磨
### CrystalOrb 增强
- **粒子爆发**:每次脉冲生成 6–12 个粒子,沿径向发散(连击越高粒子越多)
- **脉冲扩散环**:点击时从晶体向外扩散的绿色光环
- **浮动数字变色**:连击≥3 紫色、≥5 琥珀色,带对应颜色光晕
- 新增 `echo-ring` / `echo-burst` 关键帧动画
### 标签栏
- 从 4 列扩展为 5 列(新增「成就」)
- 成就标签有未解锁时显示琥珀色脉冲点
- 标签字号微调以适配 5 列
### StatsPanel
- 新增「已解锁成就」「累计探险」「探险能量」三行
---
## 四、QA 验证
### agent-browser 自动化测试
- ✅ 页面加载 HTTP 200,无运行时错误
- ✅ 解码谜题:生成 → 求解(按目标色序点击相邻同色节点)→ 奖励入账(绕过仓库上限)
- ✅ 探险系统:出发 → 探索节点 → 获得奖励 → 前进 → 日志记录
- ✅ 成就面板:14 项渲染,3 项已解锁(初次触碰/谐振初鸣/满仓时刻),永久加成区域正确显示
- ✅ 统计面板:成就计数 3/14,探险次数,能量条
- ✅ 设置面板:音效试听按钮可点击,开关可用
### VLM 视觉验证
- 成就面板:深色背景 + 科技光效 + 锁/解锁状态分明,色彩对比鲜明
- 晶体集群:渐变晶核 + 旋转环 + 粒子爆发正常
### Lint
- `bun run lint` 零错误
---
## 五、文件变更清单
**新增**
- `src/lib/game/audio.ts` — 程序化音频引擎
- `src/hooks/useAudio.ts` — 音频 React 适配
- `src/lib/game/achievements.ts` — 成就定义与聚合
- `src/components/game/AchievementsPanel.tsx` — 成就面板
- `src/components/game/AchievementNotifier.tsx` — 成就 Toast 消费者
**修改**
- `src/lib/game/types.ts` — GameState 新增 `achievements` 字段
- `src/lib/game/config.ts` — INITIAL_STATE 新增 `achievements: {}`
- `src/lib/game/engine.ts` — recomputeStats 聚合成就加成;performPrestige/createInitialState 保留成就
- `src/store/gameStore.ts` — checkAchievements / consumeAchievementQueueinit/hardReset/partialize 兼容
- `src/hooks/useGameLoop.ts` — 每秒检测成就 + 可见性恢复检测
- `src/app/page.tsx` — 5 列标签 + 成就页 + AchievementNotifier + useAudioSync
- `src/components/game/CrystalOrb.tsx` — 粒子爆发 + 扩散环 + 浮动数字变色 + pulse 音效
- `src/components/game/DecodeArray.tsx` — decodeClick/fail/success/fragment 音效
- `src/components/game/ExpeditionPanel.tsx` — start/node/victory/defeat 音效
- `src/components/game/TechTree.tsx` — techBuy 音效
- `src/components/game/PrestigeDialog.tsx` — prestige 音效
- `src/components/game/SettingsDialog.tsx` — 音效试听按钮 + 文案更新
---
## 六、下一步规划
- **v0.3 剩余**:socket 全局「星潮」实时事件(需 mini-service
- **v0.4**:云存档 + 排行榜
- **v0.5**:全 5 纪元叙事扩展
- 持续关注 Gitea 工单