v0.15: 叙事深化 + 放置平衡 + UX 增强
- loreLayers 多层碎片文本(8 碎片 × 2 层 = 16 层深层叙事,5 条暗线交织) - 永久加成 softcap(≤30 全额 / 30-100 ×0.5 / >100 ×0.25,防滚雪球) - 批量领取全部工程 + 工程完成 toast 通知 - StatsPanel 独立组件 + idle 统计行(永久加成/完成工程/产出晶体/历史) - Codex 分层渲染(L0 emerald 表层 / L1 amber 隐秘注脚 / L2 fuchsia 深层回响) - 修复 v0.14 双重计算 bug(idleTotalPerSec) - 严格 4 色全息,lint 零错误,agent-browser 端到端验证通过
This commit is contained in:
+157
@@ -568,3 +568,160 @@ Stage Summary:
|
||||
4. 🟡 遗迹图鉴多层文本(Dark Souls 式 loreFragments)—— v0.15 计划
|
||||
5. 🟡 解码阈值释放叙事碎片 + 星潮三频段切换 —— v0.16 计划
|
||||
6. 🟡 健康设计:每日软上限 + "星核建议休眠"提醒 —— v0.17 计划
|
||||
|
||||
---
|
||||
Task ID: 2-b
|
||||
Agent: full-stack-developer
|
||||
Task: v0.15 叙事深化 — Fragment loreLayers 多层文本 + Codex 分层渲染
|
||||
|
||||
Work Log:
|
||||
- 阅读 worklog v0.14-reimpl 段落 + FRAGMENTS 数组 (config.ts L254-320) + Fragment 接口 (types.ts L48-57) + Codex.tsx (128 行) + gameStore 导出确认
|
||||
- 扩展 `src/lib/game/types.ts`:新增 `FragmentLoreUnlockKind` 联合类型 + `FragmentLoreUnlock` + `FragmentLoreLayer` 两个接口,Fragment 接口新增可选 `loreLayers?: FragmentLoreLayer[]` 字段
|
||||
- 扩展 `src/lib/game/config.ts`:为全部 8 个 FRAGMENTS 撰写 loreLayers(每碎片 2 层 L1+L2,共 16 层),新增导出 `isLoreLayerUnlocked(unlock, state)` 纯函数(基于 Pick<GameState,5字段> 判定,5 种 kind 全覆盖)
|
||||
- 解锁条件多样性:ascensions 1/2/3、totalDecoded 40/60、contact 50/80、fragmentCount 4/6、bossKills 3/8
|
||||
- 重构 `src/components/game/Codex.tsx`:
|
||||
- useShallow 一次订阅 5 字段
|
||||
- 顶部新增"深层叙事 X/Y 已解锁"统计行(amber 数字)
|
||||
- 列表卡片:碎片标题旁根据 L1/L2 解锁状态显示 amber/fuchsia glow 小圆点
|
||||
- 详情弹层 3 层结构:L0 表层回响(emerald) → L1 隐秘注脚(amber) → L2 深层回响(fuchsia)
|
||||
- 未解锁层用 ▓░▒ 乱码占位 + blur-sm select-none + 🔒 unlockHint
|
||||
- 移动端 375px 适配(p-3 padding、text-[12px]、长 hint 极窄屏隐藏)
|
||||
- 验证:lint 零错误零警告(修复了 1 处 unused eslint-disable 警告);dev HTTP 200;dev.log 末尾连续多次 "✓ Compiled" 无运行时错误
|
||||
- 未修改 persist version / engine / gameStore(与子代理 A 零冲突边界遵守)
|
||||
- 写入 agent-ctx/2-b-full-stack-developer.md 工作记录
|
||||
|
||||
Stage Summary:
|
||||
- ✅ 为全部 8 个碎片添加 loreLayers(目标 ≥6,超额完成 8/8,共 16 层)
|
||||
- ✅ 5 条贯穿叙事暗线:(1) 追逐者线 — 以太族被虚空追逐者逼迫飞升 (2) 回响 AI 同源线 — 玩家舰载 AI 频段源自以太族议会档案,玩家即是延续 (3) "信任"即"利用"线 — 第一纪元的信任后来者实为引诱完成未竟之事 (4) 飞升代价线 — 单向门 + 替以太族还债 (5) 满溢回归线 — 接触满 80 时回归的是"借他们形状的某种东西"
|
||||
- ✅ Codex 3 层渲染:L0 emerald(永远显示)→ L1 amber → L2 fuchsia,严格 4 色全息零蓝/靛
|
||||
- ✅ 未解锁层视觉:乱码方块 + blur-sm + 🔒 + unlockHint,移动端可读不溢出
|
||||
- ✅ 列表卡片标题旁彩色小圆点暗示"此碎片有更多内容"
|
||||
- ✅ 顶部"深层叙事 X/Y 已解锁"实时统计
|
||||
- ✅ 修改 3 文件:/home/z/my-project/src/lib/game/types.ts + /home/z/my-project/src/lib/game/config.ts + /home/z/my-project/src/components/game/Codex.tsx
|
||||
- ✅ lint 零错误零警告 + HTTP 200 + dev.log 无运行时错误
|
||||
- ⚠️ 未做 agent-browser 端到端验证(按工单由主控完成);未持久化 loreLayer 解锁进度(纯派生无需);如需"已读"标记需改 gameStore 与子代理 A 边界冲突,本轮未做
|
||||
|
||||
---
|
||||
Task ID: 2-a
|
||||
Agent: full-stack-developer
|
||||
Task: v0.15 平衡与 UX 增强 — softcap + 批量领取 + 完成 toast + StatsPanel idle 统计
|
||||
|
||||
Work Log:
|
||||
- 阅读上下文:worklog.md (v0.14-reimpl/release 段) + engine.ts (line 25-125 recomputeStats) + gameStore.ts (claimIdleProject line 1208-1290, tickIdleProjects line 1292-1314) + IdleOperationsPanel.tsx (487 行) + idle.ts (6 个放置工程定义) + types.ts (idle 字段 line 180-188) + page.tsx (内联 StatsPanel line 475-529)
|
||||
- 发现 StatsPanel.tsx 不存在为独立文件,实际为 page.tsx 内联函数(行 475-529),决定抽出为独立组件以满足"只修改 StatsPanel.tsx"的约束
|
||||
- 子任务 1(softcap):
|
||||
- 在 `engine.ts` 顶部新增并导出 `applyIdleSoftcap(bonus)` 纯函数
|
||||
- 分段公式:bonus ≤ 30 全额;30 < bonus ≤ 100 部分 × 0.5;bonus > 100 部分 × 0.25
|
||||
- 临界值验证:bonus=30 → 30;bonus=100 → 65;bonus=200 → 90
|
||||
- 替换 recomputeStats line 113 的 `crystalsPerSec += state.idlePermanentBonus ?? 0` 为 `crystalsPerSec += applyIdleSoftcap(state.idlePermanentBonus ?? 0)`
|
||||
- 注意:crystalsPerSec 现已包含 softcap 后的永久加成(store 内的 crystalsPerSec 字段已是正确总值),UI 端 idleTotalPerSec 直接等于 crystalsPerSec(修复了旧代码 crystalsPerSec + idlePermanentBonus 双重计算的 bug)
|
||||
- 子任务 2(批量领取):
|
||||
- `gameStore.ts` GameActions 接口新增 `claimAllIdleProjects: () => void` 签名
|
||||
- 实现 `claimAllIdleProjects`:遍历 idleProjectSlots 收集 completed 槽位 → 累加 crystals/insights/energy/contact/permBonus → randomFragment 处理(独立 fragments 副本避免重复) → 一次 set() + 一次 syncStats() → 汇总 toast `✦ 批量领取完成 · 共领取 N 项工程 · +X 晶体 · +Y 洞见 · ...`
|
||||
- 无可领取项时直接 return(不弹 toast)
|
||||
- 历史批量追加(上限 50 条 slice)
|
||||
- 子任务 3(完成 toast):
|
||||
- 修改 `tickIdleProjects`:循环中检测 `!slot.completed && remainingSec <= 0` 状态转变瞬间,收集 `justCompletedProjects: IdleProjectDef[]`
|
||||
- 循环外(仅当列表非空)调用一次 `toast({ title: "✦ 放置工程完成", description: "${icon} ${name} · ... · 可前往「放置」标签领取" })`
|
||||
- 一次 tick 最多弹一条 toast(多个同时完成也只汇总为一条),避免 250ms 调用频率导致的 spam
|
||||
- 子任务 4(StatsPanel idle 统计):
|
||||
- 新建 `src/components/game/StatsPanel.tsx`(独立组件,从 page.tsx 抽出)
|
||||
- 用 `useShallow` 一次性订阅所有渲染所需字段(24 个字段),避免整个 store 变化触发 re-render
|
||||
- 保留原有 25 行统计 + 新增 1 行 `放置工程历史`(idleProjectHistory.length,最近 50 条跨周目累计)
|
||||
- page.tsx 最小化改动:删除内联 StatsPanel 函数(55 行)+ 添加 `import { StatsPanel } from "@/components/game/StatsPanel"` + 清理 3 个仅在内联函数使用的 imports(TECH_TREE, CONSTELLATION_PERKS, loadLeaderboard)
|
||||
- UI 增强(IdleOperationsPanel.tsx):
|
||||
- Section 1「永久加成」StatTile 增加 `sub` 可选 prop(ReactNode),当 `isSoftcapped = effective < raw` 时渲染 amber 色副行 `有效 +X/s(原始 +Y/s · 衰减中)`
|
||||
- StatTile 显示 effectivePermBonus 而非原始值(用户看到的是实际生效的数值)
|
||||
- Section 3 标题右侧改为 flex 容器:保留 `N / 3` 计数 + 当 `claimableCount > 0` 时显示 emerald 主题「✓ 领取全部」按钮(h-5 px-2 text-[10px]),点击调用 `claimAllIdleProjects`
|
||||
- 严格 4 色全息:softcap 副行 amber、领取全部按钮 emerald,无蓝/靛
|
||||
- 持久化兼容:persist version 仍为 v1,migrate 函数未改,新 action 不需要 migrate
|
||||
- 移动端适配:领取全部按钮高度 h-5(20px)+ px-2 + text-[10px],与现有「N / 3」文字同行 flex 排列,375px 屏宽下不溢出;softcap 副行 text-[9px] leading-tight 在 StatTile 内部不撑破 grid-cols-3
|
||||
|
||||
Stage Summary:
|
||||
- ✅ 子任务 1:applyIdleSoftcap 纯函数 + recomputeStats 集成完成(30/100 阈值,0.5/0.25 系数)
|
||||
- ✅ 子任务 2:claimAllIdleProjects action + GameActions 接口签名 + UI 按钮(emerald 主题)完成
|
||||
- ✅ 子任务 3:tickIdleProjects 状态转变检测 + 单次 toast 通知完成(避免 250ms tick spam)
|
||||
- ✅ 子任务 4:StatsPanel 抽出为独立组件 + useShallow 订阅 + 新增「放置工程历史」行完成
|
||||
- ✅ 修改文件清单:
|
||||
- `/home/z/my-project/src/lib/game/engine.ts`(新增 applyIdleSoftcap 导出 + recomputeStats 改 1 行)
|
||||
- `/home/z/my-project/src/store/gameStore.ts`(GameActions 加 1 签名 + tickIdleProjects 改写 + 新增 claimAllIdleProjects action ~120 行)
|
||||
- `/home/z/my-project/src/components/game/IdleOperationsPanel.tsx`(导入 applyIdleSoftcap + 订阅 claimAllIdleProjects + softcap 副行 + 领取全部按钮 + StatTile 扩展 sub prop)
|
||||
- `/home/z/my-project/src/components/game/StatsPanel.tsx`(新建,~110 行,useShallow 订阅 + 26 行统计)
|
||||
- `/home/z/my-project/src/app/page.tsx`(最小化改动:删除内联 StatsPanel + 1 行 import + 清理 3 个未使用 imports)
|
||||
- ✅ lint 零错误零警告(`bun run lint`)
|
||||
- ✅ dev.log 全程 HTTP 200,编译 < 260ms,无运行时错误
|
||||
- ✅ 持久化兼容:version 1 保留,新 action 无需 migrate
|
||||
- ✅ 严格 4 色全息(emerald/rose/amber/fuchsia),无蓝/靛
|
||||
- ✅ useShallow 全部 store 订阅使用
|
||||
- ⚠️ 备注:page.tsx 是必要的最小化集成改动(删除内联 StatsPanel 函数 + 添加 import),不与子代理 B 冲突(B 改的是 types/config/idle/Codex)
|
||||
- ⚠️ 备注:在修复 idleTotalPerSec 时发现 v0.14 旧代码 `crystalsPerSec + idlePermanentBonus` 存在双重计算 bug(crystalsPerSec 已包含永久加成),v0.15 修正为 `idleTotalPerSec = crystalsPerSec`,UI 显示的「放置产能」现在是正确的总产能
|
||||
|
||||
|
||||
---
|
||||
Task ID: v0.15-release
|
||||
Agent: 主控 Z.ai Code + subagent(2-a) + subagent(2-b)
|
||||
Task: v0.15 叙事深化 + 放置平衡 + UX 增强 — loreLayers 多层碎片文本 + 永久加成 softcap + 批量领取 + 完成 toast
|
||||
|
||||
Work Log:
|
||||
- 主控读取 v0.14 现状(worklog + idle.ts + types.ts + engine.ts + gameStore.ts + IdleOperationsPanel.tsx + Codex.tsx + config.ts FRAGMENTS)
|
||||
- 主控规划 v0.15 任务分解为 2 个并行子代理(修改文件严格不重叠):
|
||||
- 2-a: engine.ts / gameStore.ts / IdleOperationsPanel.tsx / StatsPanel.tsx(新建)/ page.tsx(最小集成)
|
||||
- 2-b: types.ts / config.ts / Codex.tsx
|
||||
- 委派 subagent(2-a) full-stack-developer:v0.15 平衡与 UX 增强(4 项子任务)
|
||||
- 委派 subagent(2-b) full-stack-developer:v0.15 叙事深化(loreLayers 多层文本)
|
||||
- 两个子代理并行完成,零文件冲突
|
||||
- 主控集成验证:
|
||||
* bun run lint 零错误零警告
|
||||
* dev.log HTTP 200,编译 < 260ms,无运行时错误
|
||||
* agent-browser 端到端 smoke test 全流程通过:
|
||||
- 默认放置 tab 渲染正常(修复 v0.14 双重计算 bug:idleTotalPerSec 现在正确显示总产能)
|
||||
- 派遣 idle_refine → eval 快进 finishesAt → tickIdleProjects 标记 completed=true ✓
|
||||
- "✓ 领取全部"按钮出现 ✓ + 槽位显示"✓ 完成 · 永久 +0.3/s" ✓
|
||||
- 点击"领取全部" → permBonus 0→0.3, projectsCompleted 1→2, slots 清空 ✓
|
||||
- eval 设置 permBonus=50 → UI 显示"永久加成 +40/s" + amber 副行"有效 +40/s(原始 +50/s · 衰减中)" ✓
|
||||
(softcap 公式验证: applyIdleSoftcap(50) = 30 + (50-30)*0.5 = 40 ✓)
|
||||
- 图谱 tab: 8 碎片列表 + "深层叙事 0/16"统计 ✓
|
||||
- eval 解锁全部 fragments → 点击"第一缕谐振" → L0 表层回响显示完整 echo(emerald)+ L1/L2 显示"???" + 🔒 提示 ✓
|
||||
- eval 设置 ascensions=1 → L1"隐秘注脚"解锁,显示"档案的边缘有一行几乎被擦去的批注..." ✓
|
||||
- eval 设置 totalDecoded=50 → L2"深层回响"解锁,显示"你终于明白:那缕谐振的频率..." ✓
|
||||
- 深层叙事计数 0→2→6 随解锁条件递增 ✓
|
||||
- 统计 tab: StatsPanel 显示"放置永久加成 +0.3/s / 完成放置工程 2 项 / 放置产出晶体 0 / 放置工程历史 2 条" ✓
|
||||
- 主控更新版本号 v0.14 → v0.15(page.tsx line 227)
|
||||
- 主控更新 README.md:版本行 / 设计哲学标题 / 版本里程碑表 / docs 引用 / deploy 命令
|
||||
- 主控创建 docs/12-叙事深化-v0.15.md 设计文档
|
||||
- 主控恢复测试存档(localStorage.clear + reload)确保 cron job QA 干净
|
||||
|
||||
Stage Summary:
|
||||
|
||||
## v0.15 叙事深化 + 放置平衡 + UX 增强已上线
|
||||
|
||||
### 核心交付(2 个子代理并行,8 个文件改动)
|
||||
|
||||
**子代理 2-a(平衡 + UX,5 文件):**
|
||||
- ✅ P0 平衡:`applyIdleSoftcap(bonus)` 纯函数 — 分段衰减(≤30 全额 / 30-100 ×0.5 / >100 ×0.25),recomputeStats 调用,UI 显示"有效/原始"对比 + amber"衰减中"提示
|
||||
- ✅ P1 批量领取:`claimAllIdleProjects()` action — 单次 set + syncStats,汇总 toast"✦ 批量领取完成 · 共领取 N 项工程"
|
||||
- ✅ P1 完成 toast:`tickIdleProjects` 检测状态转变瞬间(!completed → completed),单次 toast"✦ 放置工程完成"
|
||||
- ✅ P2 统计:StatsPanel 独立组件(从 page.tsx 抽出),useShallow 订阅 24 字段,新增"放置工程历史"行
|
||||
- ✅ 修复 v0.14 双重计算 bug:`idleTotalPerSec = crystalsPerSec + idlePermanentBonus` → `crystalsPerSec`(已含永久加成)
|
||||
|
||||
**子代理 2-b(叙事深化,3 文件):**
|
||||
- ✅ 8 个第一纪元碎片全部添加 loreLayers(16 层深层文本,目标 ≥6 超额完成 8/8)
|
||||
- ✅ 5 条叙事暗线交织:以太族被"追逐者"逼迫飞升 / "回响"AI 频段同源 / "信任"实为"引诱" / 飞升是单向门 / 接触满 80 回归的不是"他们"
|
||||
- ✅ FragmentLoreLayer / FragmentLoreUnlock 类型扩展(5 种解锁条件:ascensions/totalDecoded/contact/fragmentCount/bossKills)
|
||||
- ✅ `isLoreLayerUnlocked()` 派生函数(纯前端计算,无新增持久化字段)
|
||||
- ✅ Codex 分层渲染:L0 emerald 表层 / L1 amber 隐秘注脚 / L2 fuchsia 深层回响,未解锁层 blur-sm + 🔒 unlockHint + ▓░▒ 全息乱码
|
||||
- ✅ 顶部"深层叙事 X/Y 已解锁"统计 + 列表卡片 amber/fuchsia glow 小圆点标记
|
||||
|
||||
### 验证结果
|
||||
- ✅ bun run lint 零错误零警告
|
||||
- ✅ HTTP 200,dev.log 无运行时错误
|
||||
- ✅ agent-browser 端到端 smoke test 全通过(派遣→快进→完成 toast→批量领取→softcap 展示→Codex 分层解锁)
|
||||
- ✅ 严格 4 色全息(emerald/rose/amber/fuchsia),零蓝/靛
|
||||
- ✅ 两个子代理修改文件零重叠,无冲突
|
||||
|
||||
### 未解决问题 / v0.16 优先项
|
||||
1. 🟡 loreLayer "已读"标记未实现(需改 gameStore,会与未来 idle 改动边界冲突,本轮未做)
|
||||
2. 🟡 解码阈值释放叙事碎片 + 星潮三频段切换 —— v0.16 计划
|
||||
3. 🟡 健康设计:每日软上限 + "星核建议休眠"提醒 —— v0.17 计划
|
||||
4. 🟡 移动端 375px 实测(Codex 分层弹层在小屏的可读性)
|
||||
5. 🟡 idleProjectHistory 可在 StatsPanel 展开查看最近 5 条详情
|
||||
|
||||
Reference in New Issue
Block a user