Files
echo-nexus/docs/10-深空信标系统-v0.5.md

7.3 KiB
Executable File
Raw Permalink Blame History

深空信标系统 · 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 日期 keyYYYY-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.090 秒完成 → 1000 + (500 - 45) = 1455 分

进度追踪(独立 localStorage

  • 进度独立存储于 echo-nexus-beacon-prog-v1不污染 GameState,避免触发存档迁移
  • 在 gameStore 关键动作后调用 trackBeacon(type, delta)
    • pulse:每次脉冲 +1
    • decode:每次解码完成 +1(手动 + 自动解码均计)
    • expedition:每次探险结束 +1(胜负都计)
    • boss:每次 BOSS 胜利 +1
    • insight:每次洞见获取按数值累加
  • 挑战类型与今日挑战不匹配时 trackBeacon 直接 return,零开销

本地排行榜

  • 存储于 echo-nexus-beacon-lb-v1Top 20,按得分降序
  • 每条记录含:时间戳 / 日期 key / 挑战类型 / 难度 / 完成度 / 得分 / 用时
  • UI:奖牌图标(1st 金 / 2nd 银 / 3rd 铜)+ 难度色点 + 类型名 + 用时 + 得分
  • 今日记录高亮(fuchsia 边框)

文件变更

新增

  • src/lib/game/beacon.ts~290 行):核心逻辑模块
    • generateDailyChallenge() — 确定性挑战生成
    • computeBeaconScore() — 得分计算
    • loadLeaderboard() / pushLeaderboardEntry() — 排行榜 CRUD
    • loadDailyProgress() / saveDailyProgress() / addBeaconProgress() — 进度 CRUD
    • claimBeaconReward() — 领取奖励 + 推送排行榜
    • 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.113.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 多人同步星潮

下一阶段优先

  1. 云存档 + 云排行榜(需后端 API,可将本地 localStorage 同步到服务端)
  2. 全 5 纪元手写叙事节点(替换模板化 lore)
  3. socket 多人同步星潮(全局事件,所有在线玩家同时经历)