docs: Mana 完整化设计规范(递增蓝耗+infinite_spells+魔力虹吸+UI+平衡,待评审)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,146 @@
|
|||||||
|
# Mana 完整化设计规范(可发布)
|
||||||
|
|
||||||
|
> **日期**:2026-07-21 · **状态**:设计已确认,待写实现计划
|
||||||
|
> **背景**:Mana 精实 MVP(蓝池/逐节点扣蓝/蓝空停施/回蓝/HUD 蓝条/编辑器可调)已上线。本规范把 Mana 补成可发布的完整功能:加入 3 个 Mana 定义性机制 + UI 打磨 + 平衡。
|
||||||
|
> **数据驱动原则**:所有可调数值入 `balance.json`(平衡页签可调)/ `cores.json`(Core 编辑器)/ `spells.json`(法术编辑器),不硬编码。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 范围
|
||||||
|
|
||||||
|
**本次包含**:
|
||||||
|
- **P1 递增蓝耗**:连续高射速堆"热",蓝耗随热上涨;停火/慢射衰减。防"无限蓝机枪"。
|
||||||
|
- **P2 `infinite_spells` 特性 + `heavy_cost` 修正器**:蓝空时不停施、扣 HP 续命(卖血流),单次 HP 上限 15% max HP。
|
||||||
|
- **P3 魔力虹吸(多来源)**:击杀回蓝;来源 = Core 基础值 + 卡组内法术 `meta.mana_leech` 之和(+ 未来属性货架加成)。
|
||||||
|
- **P4 UI 打磨**:蓝条叠数字、低蓝反馈、过热提示、`UI_MANA` 四语键。
|
||||||
|
- **P5 平衡**:调基础杖续航手感(可持续突突、但堆射速会憋蓝)。
|
||||||
|
|
||||||
|
**明确不做**:`cast_delay` 施法后摇重构(独立战斗节奏系统)、全局蓝池+法杖取 Min、过热强制冷却(用 P1 递增蓝耗替代)、`§5.E` 双重 HP 组合的 UI 警告(可选,留后续)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. P1 递增蓝耗
|
||||||
|
|
||||||
|
### 2.1 状态与参数
|
||||||
|
- `PlayerStats.mana_heat: float = 0.0`(0 = 无热,1.0 = 蓝耗翻倍)。
|
||||||
|
- `balance.json`:`"mana_heat": { "per_cast": 0.01, "decay_per_sec": 0.1, "max": 1.0 }`;`SettingsManager` 加载 + getters `mana_heat_per_cast/_decay/_max()`(缺字段回退默认)。
|
||||||
|
|
||||||
|
### 2.2 逻辑
|
||||||
|
- **扣蓝乘算**:`SpellEvaluator.execute_compiled` 开头取 `heat_mult = 1.0 + PlayerStats.mana_heat`;每个节点扣蓝时 `实际蓝耗 = base_mana_cost × heat_mult`。
|
||||||
|
- **堆热**:`cast_fired` = 本次至少成功扣了一次蓝 或 触发了一次 infinite 扣血(即真的打出了东西);为真则 execute_compiled 末尾 `mana_heat = min(max, mana_heat + per_cast)`。完全被蓝空拦下(非 infinite、首节点就付不起)→ 不堆热。
|
||||||
|
- **衰减**:`PlayerManager._physics_process` 每帧 `PlayerStats.mana_heat = max(0.0, mana_heat - decay_per_sec × delta)`(无条件衰减)。
|
||||||
|
- **效果**:慢杖(2/s)每秒 +0.02 vs 衰减 −0.1 → 热≈0;机枪杖(20/s)每秒 +0.2 vs −0.1 → 堆至 cap,蓝耗翻倍节流。只惩罚真机枪流。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. P2 `infinite_spells` + `heavy_cost`
|
||||||
|
|
||||||
|
### 3.1 数据
|
||||||
|
- `cores.json` 加 `wand_eternal`(传说):`feature_tags = 5`(`CoreFeatureTag.INFINITE_SPELLS`,单选枚举值),`mana_max` 较低(如 40,逼迫卖血)。
|
||||||
|
- `spells.json` 加 `modifier_heavy_cost`(鲜血献祭):`{ "type": 1, "meta": { "heavy_cost": 10, "damage_add": 50, "mana_cost": 0, "shop_cost": 26 } }`。
|
||||||
|
- `balance.json`:`"infinite_spells": { "hp_per_shot": 1.0, "hp_cost_cap_ratio": 0.15 }`;`SettingsManager` getters。
|
||||||
|
|
||||||
|
### 3.2 逻辑(SpellEvaluator)
|
||||||
|
- `SpellContext` 加 `hp_cost_accum: float = 0.0`;`reset()` 归零。
|
||||||
|
- `_apply_modifier`:`if meta.has("heavy_cost"): ctx.hp_cost_accum += float(meta["heavy_cost"])`(主动构建代价,先累加)。
|
||||||
|
- **扣蓝门控统一为 helper** `_charge_mana(base_cost: float, ctx, infinite: bool, heat_mult: float) -> bool`:
|
||||||
|
```
|
||||||
|
if base_cost <= 0.0: return true
|
||||||
|
if PlayerStats.spend_mana(base_cost * heat_mult): return true
|
||||||
|
if infinite:
|
||||||
|
ctx.hp_cost_accum += SettingsManager.infinite_hp_per_shot() # 蓝空 → 每发扣 HP,继续
|
||||||
|
return true
|
||||||
|
return false # 非 infinite → 停施
|
||||||
|
```
|
||||||
|
三处门控点(主循环 / `_run_logic_loop` / `_run_branch_payload`)都改调 `_charge_mana(...)`,`infinite` 与 `heat_mult` 在 `execute_compiled` 开头计算(`infinite = compiled.feature_tags == CoreFeatureTag.INFINITE_SPELLS`)并传入。
|
||||||
|
- **施法末结算 HP 代价**:`var hp_cost = minf(ctx.hp_cost_accum, PlayerStats.hp_max * cap_ratio)`;`if hp_cost > 0.0: PlayerStats.spend_hp_cost(hp_cost)`。
|
||||||
|
- `PlayerStats.spend_hp_cost(amount)`:**直接扣血**(主动代价,不走难度减伤 take_damage):`hp = max(0.0, hp - amount)`;`stats_changed.emit()`;`hp<=0 → emit PLAYER_DIED`。
|
||||||
|
- §5.E 一致:heavy_cost 先记 10,蓝空再 +1,同帧上限 15% max HP(cap 兜底)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. P3 魔力虹吸(多来源击杀回蓝)
|
||||||
|
|
||||||
|
### 4.1 状态与来源
|
||||||
|
- `PlayerStats.mana_leech: float = 0.0`(计算值,装备/换牌时重算)。
|
||||||
|
- `CoreDefinition.base_mana_leech: float = 0.0`(`cores.json.mana_leech`,Core 编辑器加一栏,续航型 Core 带之;如 wand_eternal 给 2)。
|
||||||
|
- 法术 `meta.mana_leech`(如新增「魔力虹吸」MODIFIER `modifier_mana_leech`:`meta:{mana_leech:2, mana_cost:0, shop_cost:22}`,放卡组即生效)。
|
||||||
|
|
||||||
|
### 4.2 逻辑
|
||||||
|
- **重算点**:`combat_manager._rebuild_wand()`(已有 core + 原始 nodes)末尾:
|
||||||
|
```
|
||||||
|
var leech: float = _equipped_core.base_mana_leech if _equipped_core else 0.0
|
||||||
|
for n in nodes:
|
||||||
|
if n != null: leech += float(n.meta.get("mana_leech", 0.0))
|
||||||
|
PlayerStats.mana_leech = leech
|
||||||
|
```
|
||||||
|
- **击杀回蓝**:`PlayerStats` `_ready` 订阅 `ENEMY_KILLED` → `gain_mana(mana_leech)`;`func gain_mana(n): if n>0: mana = min(mana_max, mana + n)`(emit stats_changed)。
|
||||||
|
- 求和天然叠加:换更高 base 的 Core、或卡组塞多张 leech 卡都能提升。为未来属性货架 C 留 `+ 加成` 接口(现为 0)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. P4 UI 打磨(combat_s2 HUD)
|
||||||
|
|
||||||
|
- **蓝条数字**:在 `_mana_bar` 上叠一个居中 `Label`,`_refresh_hud` 里 `= tr("UI_MANA") % [int(PlayerStats.mana), int(PlayerStats.mana_max)]`(如 "蓝 40/100")。新增 `UI_MANA` 四语键。
|
||||||
|
- **低蓝反馈**:`_refresh_hud` 里 mana/mana_max < 0.2 时把蓝条 fill 颜色改暗红并轻微闪烁(用 `sin(time)` 调 alpha),否则蓝色。
|
||||||
|
- **过热提示**:`mana_heat > 0.01` 时蓝条边框/自身 modulate 泛红(热越高越红),直观显示"憋蓝中"。
|
||||||
|
- 纯表现层,读 PlayerStats,不反向依赖。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. P5 平衡(数值,编辑器可调)
|
||||||
|
|
||||||
|
- 现状基础杖续航偏紧(spark 5/发 × 2/s = 10 vs 回蓝 5 → 净耗)。目标手感:**基础杖能持续突突基础弹,但堆射速/用贵法术会憋蓝**。
|
||||||
|
- 调整入口(数据驱动、MCP 实测手感):`cores.json` 基础 `mana_regen`(如 5→8)、`spells.json` spark `mana_cost`(如 5→3),保留递增蓝耗对机枪流的惩罚。
|
||||||
|
- 不写死结论;实现时用 MCP 起战斗观测蓝条曲线与手感,落到数据。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 边界
|
||||||
|
- `mana_heat` 不入存档(战斗态,开局/换杖清零);换杖 `equip_wand` 时 `PlayerStats.mana_heat = 0.0`。
|
||||||
|
- `hp_cost_accum` 每次施法 reset,防池化残留。
|
||||||
|
- 非 infinite Core 行为与现状完全一致(蓝空 break);heavy_cost 卡在非 infinite 杖上仍扣 HP(主动代价,符合设计"卖血流")。
|
||||||
|
- `mana_leech` 换杖/换牌必重算,防旧值残留;卡组为空/无 leech → 0。
|
||||||
|
- **SubPayload 命中执行(`execute_sub`)保持不扣蓝、不受热/infinite/heavy_cost 影响**(同 MVP,仅主施法流承担资源)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 测试计划(Godot MCP 运行时实测)
|
||||||
|
1. **递增蓝耗堆积/衰减**:模拟连续施法 N 次 → mana_heat 上升并封顶 max;停手若干帧 → 衰减回 0;heat=0.5 时 spark 实扣蓝 = 5×1.5=7.5。
|
||||||
|
2. **infinite_spells 扣血**:装 wand_eternal(feature=5, 低蓝),mana=0 施 spark → 不停施、hp 下降、单次 HP ≤ 15% max。
|
||||||
|
3. **heavy_cost 叠加**:deck [modifier_heavy_cost, action] 施一次 → hp −10(+若蓝空再 −1);上限 15% 生效。
|
||||||
|
4. **魔力虹吸多来源**:Core base_mana_leech=2 + 卡组含 modifier_mana_leech(2) → PlayerStats.mana_leech=4;发 ENEMY_KILLED → mana +4(封顶 max)。
|
||||||
|
5. **回归**:既有 MVP(逐节点扣蓝/停施/LOOP扣蓝/持久内存 [0,0,1,0])在加乘算后仍正确(heat=0 时行为不变)。
|
||||||
|
6. **UI**:截图确认蓝条数字、低蓝暗红、过热泛红。
|
||||||
|
7. **平衡**:起战斗观测基础杖蓝条能维持基础弹、堆射速会见底。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 涉及文件清单
|
||||||
|
| 文件 | 改动 |
|
||||||
|
| :--- | :--- |
|
||||||
|
| `scripts/autoloads/player_stats.gd` | +`mana_heat`/`mana_leech`;`gain_mana`/`spend_hp_cost`;订阅 ENEMY_KILLED 回蓝 |
|
||||||
|
| `scripts/domain/spell_system/core_definition.gd` | +`base_mana_leech` |
|
||||||
|
| `scripts/autoloads/wand_preset.gd` | 读 `mana_leech` |
|
||||||
|
| `scripts/domain/spell_system/spell_context.gd` | +`hp_cost_accum` + reset |
|
||||||
|
| `scripts/domain/spell_system/spell_evaluator.gd` | `_charge_mana` helper(heat 乘算 + infinite 扣血);三处门控改调;heavy_cost 累加;施法末 HP 结算 + heat 堆积 |
|
||||||
|
| `scripts/domain/player_manager.gd` | 每帧衰减 mana_heat;equip 清零 heat |
|
||||||
|
| `scripts/domain/combat/combat_manager.gd` | `_rebuild_wand` 重算 mana_leech |
|
||||||
|
| `scripts/autoloads/settings_manager.gd` | 加载 mana_heat/infinite_spells 配置 + getters |
|
||||||
|
| `data/balance.json` | +`mana_heat`/`infinite_spells` 配置 |
|
||||||
|
| `data/cores.json` | +wand_eternal;相关 Core +`mana_leech`;平衡回蓝 |
|
||||||
|
| `data/spells.json` | +modifier_heavy_cost / modifier_mana_leech;平衡 spark 蓝耗 |
|
||||||
|
| `scenes/main/combat_s2.gd` | HUD 蓝条数字 + 低蓝/过热反馈 |
|
||||||
|
| `addons/game_designer/core_tab.gd` | Core 编辑器 +`mana_leech` 栏(编辑器可调) |
|
||||||
|
| `translations/*.po` | `UI_MANA` 四语键 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 完成定义 (DoD)
|
||||||
|
- 上述 7 项测试运行时全绿、0 编译错误。
|
||||||
|
- 递增蓝耗只惩罚高射速流;慢杖手感不变。
|
||||||
|
- wand_eternal 蓝空能卖血续命、单次 HP ≤ 15%;heavy_cost 卡生效。
|
||||||
|
- 魔力虹吸 Core 与法术卡两条路都能续航、可叠加、编辑器可调。
|
||||||
|
- HUD 蓝条有数字 + 低蓝/过热反馈。
|
||||||
|
- 基础杖续航手感调到位。
|
||||||
|
- `numerical_design §5.A`、`core_wand_design §3`(infinite_spells)、`game_design §4.1/§4.3` 的 Mana 现状 callout 更新。
|
||||||
Reference in New Issue
Block a user