# 回响星核 v0.14 — 放置系统(Idle Operations)设计文档 > 版本:v0.14 · 日期:2026-01-25 > 核心目标:让玩家打开游戏 **5 秒内** 就能看出这是个 idle game --- ## 1. 设计动机 ### 1.1 用户反馈 > "你的这个我没有看到任何可放置的功能" —— 玩家反馈 虽然 v0.8 已有 `crystalsPerSec` 在后台自动累积,但 **没有任何 UI 元素明示这一事实**: - 没有「放置中」徽章 - 没有可视化自动采矿机 - 没有定时工程项目 - 离线收益弹窗只在重新加载页面时触发,玩家日常游玩看不到 放置游戏的灵魂是「关掉也在进步」。如果玩家看不到这一点,就等于没有放置玩法。 ### 1.2 设计目标 1. **可见性**:5 秒内让玩家意识到 idle 属性 2. **决策性**:放置不只是数字增长,要有玩家选择 3. **节奏感**:3 层 idle 节奏(被动产能 / 放置工程 / 离线收益)协同 4. **健康性**:避免 24h 挂机的极端沉迷 --- ## 2. 三层 Idle 节奏 ### 节奏 1:被动产能(Passive Generation) - **载体**:采矿无人机舰队(Miner Fleet) - **来源**:每解锁一个采矿分支技术节点 → 加入一架无人机 - **行为**:24h 持续产出晶体,无需任何操作 - **限制**:受 `crystalCap` 限制,仓库满后停止 - **离线**:按 `offlineEff`(默认 50%)持续累积,上限 8h #### 采矿分支技术 → 无人机映射 | 技术节点 | 无人机名 | 输出/s | 解锁成本(洞见) | |---------|---------|--------|-----------------| | `min_1` | ⛏️ 谐振钻头 | +0.6 | 5 | | `min_2` | 🌋 深层矿脉 | +1.6 | 24 | | `min_3` | 🤖 自治机群 | +5 | 120 | | `min_4` | 💠 量子采掘矩阵 | +12 | 400 | | `min_5` | ☀️ 戴森星核 | +30 | 1200 | 无采矿技术时显示「谐振钻头(休眠中)」占位卡片,引导玩家解锁采矿分支。 --- ### 节奏 2:放置工程(Idle Projects) #### 2.1 工程列表 | ID | 名称 | 时长 | 奖励 | 解锁条件 | 图标 | 色 | |----|------|------|------|---------|------|-----| | `idle_scan` | 深空勘探扫描 | 60s | ✦ +8 洞见 | 产能 ≥ 0.5/s | 🛰️ | emerald | | `idle_refine` | 晶体精炼阵列校准 | 180s | ⇪ +0.3/s 永久 | 产能 ≥ 1/s | ⚙️ | rose | | `idle_archive` | 遗迹碎片整理 | 600s | ✦ +20 洞见 + 📜 随机碎片 | 飞升 ≥ 1 OR 产能 ≥ 5/s | 📜 | amber | | `idle_anchor` | 维度锚点部署 | 1200s | ⚡ +2 能量 + ☄ +5 接触进度 | 飞升 ≥ 1 | ⚓ | fuchsia | | `idle_drones` | 无人机群扩编 | 1800s | 💎 +500 晶体 + ⇪ +2/s 永久 | 产能 ≥ 10/s | 🛸 | emerald | | `idle_resonance` | 跨维度谐振标定 | 3600s | ✦ +100 洞见 + ☄ +15 接触 + ⇪ +8/s 永久 | 飞升 ≥ 2 | 🌌 | fuchsia | #### 2.2 槽位机制 - **3 个并行槽位**:可同时运行 3 个工程 - **不重复**:同一工程不能在多个槽位同时运行 - **完成需手动领取**:避免"打开就有奖励"的条件反射 - **取消不退时间**:误取消的代价 - **离线推进**:关闭浏览器后工程继续倒计时 #### 2.3 奖励类型说明 | 奖励 | 含义 | 设计意图 | |------|------|---------| | 晶体 | 立即加到 `crystals` | 短期反馈 | | 洞见 | 立即加到 `insights` | 用于解锁技术 | | 能量 | 加到 `energy`(受 `energyMax` 上限) | 探险资源 | | 接触进度 | 加到 `contact`(0-100) | 推进飞升 | | **永久产能加成** | 加到 `idlePermanentBonus`,影响 `recomputeStats` | 长期投资 | | 随机碎片 | 从 `FRAGMENTS` 中随机解锁一个未拥有 | 叙事推进 | --- ### 节奏 3:离线收益(Offline Gains) #### 3.1 公式 ``` gain = crystalsPerSec × elapsed × offlineEff elapsed = min(realElapsed, 8h) ``` #### 3.2 解锁路径 - 初始 `offlineEff = 0.5`(50% 离线效率) - 通过技术树 `offlineEff` 类效果提升 - 通过星图天赋 `offlineEffBonus` 提升 - 上限 100% #### 3.3 8h 上限理由 - 参考 GDC 2016 Anthony Pecorella "Quest for Progress":Egg Inc 2h 硬 cap 导致玩家流失 - 但完全无 cap 会导致 24h 挂机成为最优策略,破坏短会话体验 - 8h 折中:覆盖一个工作日/一夜,但不鼓励全天挂机 #### 3.4 离线报告弹窗 重新加载页面时,若 `elapsed > 60s`,弹出 `OfflineReportDialog`: - 「你离开了 X 小时 Y 分」 - 「星核为你产出 Z 颗晶体」 - 「产能 /s · 离线效率 N%」 - 「是否触达 8h 上限」标志 --- ## 3. UI 设计 ### 3.1 始终可见的 Idle 徽章(Header) 位置:顶部 Header,紧邻「巡航」按钮左侧 状态: - 产能 > 0:`● 放置中 +X.X/s`(绿点脉动) - 产能 = 0:`○ 休眠中`(灰点静止) 悬停 Tooltip 显示明细: ``` 基础产能 8.2/s 永久加成 +1.5/s 离线效率 75% 完成工程 12 次 ``` 点击徽章 → 切换到「放置」标签。 ### 3.2 默认标签页 = 放置 首次打开游戏,默认 tab 是「放置」(v0.13 前是「探险」或「技术」)。 返回玩家若有进行中探险或待选天赋,自动切回原默认。 ### 3.3 放置标签页四段式布局 ``` ┌─────────────────────────────────────────┐ │ Section 1: 放置收益概览 │ │ [放置产能] [永久加成] [完成工程] │ │ [━━━━━━━ 离线效率 50% · 上限 8h ━━━━━━] │ ├─────────────────────────────────────────┤ │ Section 2: 采矿无人机舰队 │ │ [⛏️ 钻头] [🌋 矿脉] [🤖 机群] ... │ ├─────────────────────────────────────────┤ │ Section 3: 放置工程槽位 │ │ [槽位1: 运行中 47s ▓▓▓░] [槽位2: 空] [槽位3: 空] │ ├─────────────────────────────────────────┤ │ Section 4: 可派遣工程 │ │ [🛰️ 深空勘探扫描 1m +8] [⚙️ 精炼校准 3m +0.3/s] │ │ [📜 碎片整理 10m +20] │ │ │ │ 未解锁工程(3): │ │ ⚓ 维度锚点部署 · 需 飞升≥1 │ │ 🛸 无人机群扩编 · 需 产能≥10/s │ │ 🌌 跨维度谐振标定 · 需 飞升≥2 │ └─────────────────────────────────────────┘ ``` ### 3.4 IdleProjectBar(晶体球下方) 位置:左侧晶体球区,`CrystalYieldPanel` 下方 显示:当前运行的工程迷你 pill ``` 🛰️ 深空勘探扫描 47s ▓▓▓░░░░░ ⚙️ 晶体精炼校准 2m 13s ▓▓░░░░░░ ``` 无运行工程时返回 `null`(不占位)。 --- ## 4. 技术实现 ### 4.1 数据结构 ```typescript // types.ts interface IdleProjectDef { id: string; name: string; desc: string; durationSec: number; reward: { crystals?; insights?; energy?; contact?; crystalsPerSecPermanent?; randomFragment?; }; minAscensions?: number; minCrystalsPerSec?: number; icon: string; color: "emerald" | "rose" | "amber" | "fuchsia"; order: number; } interface IdleProjectSlot { projectId: string; startedAt: number; finishesAt: number; remainingSec: number; completed: boolean; } // GameState 新增 4 字段 idleProjectSlots: (IdleProjectSlot | null)[]; // 3 槽 idleProjectHistory: { projectId: string; finishedAt: number }[]; // 最近 50 条 idlePermanentBonus: number; idleStats: { projectsCompleted: number; crystalsFromIdle: number }; ``` ### 4.2 Store actions - `startIdleProject(slotIndex, projectId)` — 校验 + 创建槽位 - `cancelIdleProject(slotIndex)` — 置空槽位 - `claimIdleProject(slotIndex)` — 应用奖励 + toast + 置空槽位 - `tickIdleProjects(now)` — 推进剩余时间,标记完成 ### 4.3 引擎集成 `recomputeStats()` 末尾添加: ```typescript crystalsPerSec += state.idlePermanentBonus ?? 0; ``` 这让永久产能加成真正生效。 ### 4.4 飞升处理 `performPrestige()` 重置 `idleProjectSlots = [null, null, null]`(不跨周目继承进行中工程),但保留 `idlePermanentBonus` / `idleProjectHistory` / `idleStats`(跨周目永久)。 ### 4.5 存档迁移 persist 添加 `version: 1` + `migrate` 函数,为旧存档补全 4 个新字段: ```typescript idleProjectSlots: (s.idleProjectSlots as unknown[]) ?? [null, null, null], idleProjectHistory: (s.idleProjectHistory as unknown[]) ?? [], idlePermanentBonus: (s.idlePermanentBonus as number) ?? 0, idleStats: (s.idleStats as unknown) ?? { projectsCompleted: 0, crystalsFromIdle: 0 }, ``` 旧存档零崩溃风险。 ### 4.6 主循环集成 `useGameLoop` 每 250ms tick: 1. `tick(now)` — 产能 + 自动产晶体 2. `autoDecodeTick()` — 自动解码 3. `tickTide(now)` — 星潮事件 4. **`tickIdleProjects(now)` — v0.14 放置工程进度**(新增) 5. `checkAchievements()` — 每秒一次 页面可见性切回时也调用 `tickIdleProjects(now)`。 --- ## 5. 平衡考虑 ### 5.1 永久产能加成可能过强 - `idle_resonance` +8/s 永久,多次完成可能让玩家飞快积累 - **v0.15 待办**:加飞升次数 softcap,例如 `effectiveBonus = idlePermanentBonus × sqrt(ascensions + 1) / (ascensions + 1)` ### 5.2 工程时长曲线 - 60s / 180s / 600s / 1200s / 1800s / 3600s - 短工程奖励低但灵活(适合短会话) - 长工程奖励高但需等待(适合过夜挂机) - 玩家自主选择节奏 ### 5.3 解锁条件 - 0 飞升 + 0.5/s:新手 5 分钟内可解锁第一个 - 1 飞升:玩家完成首次飞升后解锁中段 - 2 飞升 + 10/s:长线目标 --- ## 6. 验证记录 ### 6.1 Lint - ✅ 零错误零警告 ### 6.2 Dev 服务器 - ✅ HTTP 200 - ✅ 无运行时错误 ### 6.3 Agent Browser 端到端测试 1. ✅ 默认 tab 是「放置」 2. ✅ Header 显示「放置中 +0.4/s」徽章 3. ✅ 4 段面板完整渲染 4. ✅ 买 min_1+min_2 后产能 2.6/s,解锁 idle_scan + idle_refine 5. ✅ 点击「派遣至槽位 1」→ 槽位显示运行中 60s + 进度条 + 取消按钮 6. ✅ IdleProjectBar 同步显示迷你 pill 7. ✅ 快进完成后标记 completed=true 8. ✅ 领取后 insights +8、projectsCompleted 0→1、槽位清空 ### 6.4 Sticky Footer 验证 - ✅ Header `position: sticky; top: 0` - ✅ Footer `position: sticky; bottom: 0; margin-top: auto` - ✅ 内容超出视口时 footer 被自然推下(无浮动空隙) --- ## 7. 未解决问题 / 后续 - 🟡 `crystalsFromIdle` / `idleProjectHistory` 已在 store 累加但 UI 未展示——v0.15 可在统计 tab 补 - 🟡 永久产能加成可能需要飞升次数 softcap - 🟡 缺「批量领取全部」按钮(玩家有 3 个槽位都完成时方便) - 🟡 缺工程完成 toast 通知(目前只能在面板内看到「待领取」标志) - 🟢 v0.15 可加 Dark Souls 式 loreFragments 多层文本,让"遗迹碎片整理"工程的随机碎片奖励更有叙事感 --- ## 8. 设计哲学总结 > "Incremental games are very raw. They're about relating to a process and becoming obsessed with its growth, like watching something you planted in the ground, through a time-lapse camera, grow into a tree." —— Clark (via Frank Lantz, New Yorker 2019) 回响星核 v0.14 的放置系统不只是把数字挂机增长,而是让玩家**看到**这个过程: - 采矿无人机像植物在土里生长 - 放置工程像种子在发芽 - 离线收益像收获时节 玩家不再只是「数字变大」,而是「亲手布置了一个会自动运转的考古基地,然后离开,让它在自己不在的时候继续工作」。 这是 idle game 的本质:**让玩家信任系统会在他不在时为他工作**。