# Task 7: 角色属性系统(探索力/智慧/勇气/灵感) ## Agent: full-stack-developer ## 完成状态: ✅ 全部完成 ## 创建的文件 1. `/home/z/my-project/src/lib/game/attributes.ts` — 属性逻辑层(~330 行) 2. `/home/z/my-project/src/components/game/AttributesPanel.tsx` — 属性 UI 面板(~330 行) ## 修改的文件 1. `/home/z/my-project/src/lib/game/types.ts` — GameState 新增 attributes/attributeProgress/pendingAttrPoints 2. `/home/z/my-project/src/lib/game/config.ts` — INITIAL_STATE 补全新字段默认值 3. `/home/z/my-project/src/lib/game/engine.ts` — recomputeStats 聚合属性加成;performPrestige 发放属性点 4. `/home/z/my-project/src/store/gameStore.ts` — 新增 allocateAttribute/gainAttributeExp action;pulse/clickNode/autoDecodeTick/resolveCurrentNode/grantCruiseReward/tickTide/init 接入属性逻辑;旧存档兼容 5. `/home/z/my-project/src/lib/game/achievements.ts` — 新增 2 项属性成就 6. `/home/z/my-project/src/app/page.tsx` — 新增第 8 个「角色」标签页 + grid-cols-7→8 + 红点提示 + 统计面板新增属性行 + 版本号 v0.6→v0.7 ## 关键实现细节 ### attributes.ts 逻辑层 - **类型系统**:AttributeKey(4 个键)/ CharacterAttributes(0-100 数值)/ AttributeProgressEntry(exp + level) - **加成公式**: - 0-50 线性区:每点 +0.5% 加成(0..50 → 0..25%) - 50-100 递减区:每点 +0.2% 加成(50..100 → 25..35%) - 超过 100 仍按 100 计算加成(软上限) - **getAttributeBonus(attr)** 单属性加成百分比 - **getAllBonuses(attrs)** 返回 12 个修饰器:探险力倍率/巡航速度/解码步数/洞见倍率/自动解码周期/探险生命/BOSS 胜率/巡航护盾/接触率/星潮触发/脉冲连击/产能加成 - **levelUpCheck(progress)** 自动跨多级升级,安全上限 200 次循环 - **expRequiredForLevel(level) = 10 × level**(最低 10) - **computePrestigeAttrPoints(ascensions) = ascensions × 2 + 1**(飞升前次数计算) - **migrateAttributes(state)** 旧存档兼容:补全缺失字段、夹紧越界值、同步 level 与 attributes ### engine.ts 改造 - recomputeStats 末尾追加 `getAllBonuses(state.attributes ?? {})` 聚合: - `crystalsPerSec *= am.crystalsPerSecMult` - `insightMult += am.insightMultAdd` - `contactRateMult *= am.contactRateMult` - `decodeStepsBonus += am.decodeStepsBonus` - performPrestige: - 保留 attributes 数值(跨周目永久) - 清空 attributeProgress(新周目重新累积经验) - pendingAttrPoints += computePrestigeAttrPoints(ascensions) = ascensions × 2 + 1 - createInitialState:每次返回全新 attributes/attributeProgress 对象,避免引用共享 ### gameStore.ts 集成(核心) - **pulse**:连击 ≥3 给灵感经验(expGain = 1 + floor(combo/2));脉冲威力乘以灵感连击加成 - **clickNode** 完成:给智慧经验(expGain = puzzle.tier × 2) - **autoDecodeTick**:自动解码也给智慧经验 +1;自动解码周期受智慧 am.autoDecodeIntervalMult 影响 - **startExpedition**:探险力乘 am.expeditionPowerMult;探险生命加 am.expeditionHpBonus - **resolveCurrentNode**: - BOSS 节点用包装 RNG 提升 +am.bossWinRateBonus 胜率(单次 rng 调用,B% 概率返回 0,其余返回 r-B 保持均匀分布) - 战斗胜利给勇气+探索力经验(中途战斗 +2/+1,BOSS 击破 +8/+6,探险胜利 +4) - **grantCruiseReward**:按总奖励量缩放给探索力+勇气经验(expBase = max(2, totalReward/30)) - **tickTide**:灵感 am.tideTriggerBonus 缩短星潮间隙(gap × (1 - bonus)),上限 30% - **doPrestige**:performPrestige 后用 next.attributes 重算 stats - **allocateAttribute(attr, points=1)**:分配属性点,同步 attributeProgress[attr].level - **gainAttributeExp(attr, amount)**:通用经验获取(自动升级) - **init()**:调用 migrateAttributes 补全旧存档字段,并传 attributes 到 syncStats - 所有 syncStats 调用点(10+ 处)都补充 `attributes: ...` 参数 ### AttributesPanel.tsx UI - 四维属性卡片网格(小屏 2×2,大屏 1×4): - 图标(Compass/Brain/Swords/Sparkles)+ 中文名 + 英文名 + Lv.{value} badge - 数值 /100 + 加成百分比 - 经验进度条(gradient + glow)+ "递减区"标记 - 加成影响列表(3 条) - 「+分配」按钮(pendingAttrPoints > 0 时可点,hover scale 105) - 顶部:标题 + 待分配点数 badge(pendingAttrPoints > 0 时 echo-pending-pulse 动画) - 底部:总等级 + 总加成概览 + 12 个修饰器明细行 - 配色:4 色全息(emerald/fuchsia/amber/rose),辉光边框 + 顶角光晕装饰 - 完全响应式(2 列 → 4 列),overflow-y-auto + 自定义 scrollbar ### page.tsx 集成 - 新增 `User` 图标导入 - 新增 `pendingAttrPoints` store selector - TabsList: grid-cols-7 → grid-cols-8 - 新增第 8 个 TabsTrigger「角色」(value="attributes"),主题色用 emerald→fuchsia→rose 渐变 - pendingAttrPoints > 0 时显示 rose 红点 - 新增 TabsContent 渲染 AttributesPanel - StatsPanel 新增 5 行属性行(探索力/智慧/勇气/灵感/待分配属性点) - 版本号 v0.6 → v0.7 ### achievements.ts 新增 - `ach_attr_total_50`(四维觉醒):四维属性总和 ≥ 50 → 产能+6%/洞见+6% - `ach_attr_max_100`(维度精通):任一属性 ≥ 100 → 产能+12%/洞见+10% ## QA 验证结果 - ✅ `bun run lint` 零错误 - ✅ dev 服务器 HTTP 200 - ✅ 编译 < 250ms(177ms 实测) - ✅ 7 标签页 + 巡航按钮完好保留,新增第 8 个「角色」标签页 - ✅ data-tut 锚点(tab-expedition/tab-tech/prestige-btn/crystal-orb/decode-panel)保留 - ✅ 色彩规范:严格 emerald/fuchsia/amber/rose 四色全息,零蓝色/靛色 - ✅ 旧存档兼容:migrateAttributes 补全 attributes/attributeProgress/pendingAttrPoints 字段 - ✅ 飞升后 pendingAttrPoints = ascensions × 2 + 1(飞升前次数) - ✅ pulse/clickNode/resolveCurrentNode/grantCruiseReward/autoDecodeTick 均接入属性经验获取 ## 注意事项 - BOSS 胜率 RNG 包装:仅在 boss 节点生效,单次 rng 调用保持均匀分布;+am.bossWinRateBonus 上限 +30% - 灵感星潮触发:通过缩短 gap 间接提升触发频率(上限 30%) - 属性加成与现有所有系统(技术树/蓝图/成就/星图/星潮)叠加,不冲突 - migrateAttributes 同步 attributeProgress[attr].level 与 attributes[attr] 数值,避免漂移