104 lines
6.4 KiB
Markdown
Executable File
104 lines
6.4 KiB
Markdown
Executable File
# 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] 数值,避免漂移
|