7.3 KiB
Executable File
7.3 KiB
Executable File
深空信标系统 · v0.5(每日挑战 + 本地排行榜)
版本:v0.5 · 日期:2026-06-23 路线图对应:v0.5 排行榜(本地版先行)+ 每日挑战动机注入
动机
v0.4 编年史系统完成后,游戏已有 6 大玩法层(采矿/解码/技术树/图谱/飞升 + 探险 + 星图 + 星潮 + 编年史),但缺少"今日目标"型的短期动机。玩家进入游戏后没有明确的"今天该做什么"指引。
本版本新增**深空信标(Deep Space Beacon)**系统:
- 每日挑战:基于 UTC 日期种子的确定性挑战,全球同一天同一挑战,每天 0 点(UTC)刷新
- 本地排行榜:记录历次挑战得分,Top 20,纯 localStorage 持久化,无需后端
- 给放置循环注入"今日目标",并为 v0.5 路线图的"云排行榜"奠定数据结构基础
核心设计
每日挑战(Daily Challenge)
- 确定性生成:
generateDailyChallenge(now)基于 UTC 日期 key(YYYY-MM-DD)派生 FNV-1a 种子 → mulberry32 PRNG,保证同一天全球玩家看到同一挑战 - 5 种挑战类型:
类型 标签 目标范围 单位 decode解码协议 6-15 × 难度倍率 颗 expedition远征指令 1-3 × 难度倍率 次 pulse脉冲任务 20-49 × 难度倍率 次 boss猎杀契约 1 × 难度倍率 处 insight洞见采集 40-119 × 难度倍率 点 - 3 档难度(加权抽取):
难度 标签 倍率 权重 颜色 routine常规信标 ×1.0 55% 翠 anomaly异常波动 ×1.6 33% 琥 singular奇点回响 ×2.4 12% 玫 - 奖励:完成时按类型 + 难度发放洞见 / 接触进度
- 倒计时:显示距 UTC 次日 0 点的 HH:MM:SS 倒计时
得分计算
得分 = 完成度 × 1000 × 难度倍率 + 速度奖励
速度奖励 = max(0, 500 - 完成时长秒 × 0.5) // 仅完成时计算
例:常规难度 × 1.0,90 秒完成 → 1000 + (500 - 45) = 1455 分
进度追踪(独立 localStorage)
- 进度独立存储于
echo-nexus-beacon-prog-v1,不污染 GameState,避免触发存档迁移 - 在 gameStore 关键动作后调用
trackBeacon(type, delta):pulse:每次脉冲 +1decode:每次解码完成 +1(手动 + 自动解码均计)expedition:每次探险结束 +1(胜负都计)boss:每次 BOSS 胜利 +1insight:每次洞见获取按数值累加
- 挑战类型与今日挑战不匹配时
trackBeacon直接 return,零开销
本地排行榜
- 存储于
echo-nexus-beacon-lb-v1,Top 20,按得分降序 - 每条记录含:时间戳 / 日期 key / 挑战类型 / 难度 / 完成度 / 得分 / 用时
- UI:奖牌图标(1st 金 / 2nd 银 / 3rd 铜)+ 难度色点 + 类型名 + 用时 + 得分
- 今日记录高亮(fuchsia 边框)
文件变更
新增
src/lib/game/beacon.ts(~290 行):核心逻辑模块generateDailyChallenge()— 确定性挑战生成computeBeaconScore()— 得分计算loadLeaderboard()/pushLeaderboardEntry()— 排行榜 CRUDloadDailyProgress()/saveDailyProgress()/addBeaconProgress()— 进度 CRUDclaimBeaconReward()— 领取奖励 + 推送排行榜msUntilNextDay()/formatCountdown()— 倒计时
src/components/game/BeaconPanel.tsx(~280 行):UI 面板- 每日挑战卡片(难度色 + 脉冲环动画 + 进度条 + 领取按钮)
- 本地排行榜(Top 20 + 奖牌 + 今日高亮)
- 难度图例
- 倒计时
修改
src/store/gameStore.ts:- 新增
trackBeacon()模块级辅助函数 - 新增
grantBeaconReward(insights, contact)action - 在
pulse/clickNode(完成) /autoDecodeTick/resolveCurrentNode后接入trackBeacon
- 新增
src/app/page.tsx:- 新增第 7 个标签页「信标」(grid-cols-7)
- 新增
beaconClaimable状态(2s 轮询,可领取时显示绿点) - StatsPanel 新增「信标最高分」行
- 版本号 v0.4 → v0.5
src/lib/game/chronicle.ts:- 导出
buildLore()(原私有) - 新增
regenerateLoreFromEntry(entry)— 显示时重新生成 lore,修复历史条目中tide_ruins等原始键名
- 导出
src/components/game/ChronicleDialog.tsx:叙事文本改用regenerateLoreFromEntry(entry)替代entry.lore
BUG 修复
编年史历史条目显示原始 tide 键名
- 现象:v0.4 之前创建的编年史条目 lore 中显示
tide_ruins而非「遗迹共振」(最新条目已修复,旧条目未回填) - 根因:lore 文本在条目创建时一次性生成并存储,历史条目存储了修复前的错误文本
- 修复:新增
regenerateLoreFromEntry(),在 ChronicleDialog 显示时从 entry 的结构化数据(tidesThisRun / perksThisAscension / milestones)重新生成 lore,保证历史与未来条目命名一致 - 验证:第二纪元 lore 现正确显示「遗迹共振、晶体潮、虚空低语、谐振风暴」
QA 验证(agent-browser + VLM)
编年史 BUG 修复验证
- ✅ 第二纪元 lore 显示「遗迹共振、晶体潮、虚空低语、谐振风暴」(修复前显示
tide_ruins等原始键) - ✅ 第三纪元 lore 保持正确「星核悸动」
- ✅ 徽章显示正确
深空信标系统验证
- ✅ 第 7 个标签页「信标」渲染正确
- ✅ 每日挑战卡片:难度标签 + 类型标签 + 标题 + 描述 + 进度条 + 奖励 + 领取按钮
- ✅ 倒计时显示「08:47:12」并每秒更新
- ✅ 难度图例显示 3 档(×1 / ×1.6 / ×2.4)
- ✅ 进度追踪:解码 1 颗晶体 → 洞见采集进度 +12(解码奖励的洞见值)
- ✅ 完成挑战后按钮变为「领取奖励」
- ✅ 领取奖励后:contact +5.1(13.47 → 18.57),按钮变「已领取」
- ✅ 排行榜生成条目:「洞见采集 ✓ 1m30s 1.46K」
- ✅ 统计面板新增「信标最高分」行
- ✅ 可领取时标签页显示绿点提示
- ✅ VLM 视觉评估:高美观度,颜色搭配佳,无重叠 bug
全系统回归验证
- ✅ 主视图(资源条 / 晶体球 / 解码面板)正常
- ✅ 探险全流程(出发 → 探索 → 前进 → BOSS → 结束 → 日志)正常
- ✅ 解码谜题生成 + 自动求解通过
- ✅ 星潮事件触发 + 指示器 + Footer 联动正常
- ✅ 成就解锁 Toast 正常
- ✅ 星图标签页(9/18 天赋,6 类别)正常
- ✅ 编年史对话框(2 条目,时间轴,里程碑)正常
- ✅ lint 零错误;HTTP 200;编译 < 250ms
路线图进展
- v0.1 MVP:放置采矿 + 解码 + 技术树 + 图谱 + 飞升
- v0.1.1:解码可解性修复
- v0.2:遗迹探险肉鸽
- v0.2.1:程序化音频 + 成就系统
- v0.3:星潮事件系统
- v0.3.1:星图天文台元进程
- v0.4:回响编年史
- v0.5:深空信标(每日挑战 + 本地排行榜) ← 本轮
- v0.5+:云存档 + 云排行榜(后端同步)
- v0.5+:全 5 纪元手写叙事节点
- 后续:socket 多人同步星潮
下一阶段优先
- 云存档 + 云排行榜(需后端 API,可将本地 localStorage 同步到服务端)
- 全 5 纪元手写叙事节点(替换模板化 lore)
- socket 多人同步星潮(全局事件,所有在线玩家同时经历)