Files
spellforge/docs_dev/specs/2026-07-21-mana-complete-design.md

9.8 KiB
Raw Permalink Blame History

Mana 完整化设计规范(可发布)

日期2026-07-21 · 状态:设计已确认,待写实现计划 背景:Mana 精实 MVP(蓝池/逐节点扣蓝/蓝空停施/回蓝/HUD 蓝条/编辑器可调)已上线。本规范把 Mana 补成可发布的完整功能:加入 3 个 Mana 定义性机制 + UI 打磨 + 平衡。 数据驱动原则:所有可调数值入 balance.json(平衡页签可调)/ cores.jsonCore 编辑器)/ 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.jsonwand_eternal(传说):feature_tags = 5CoreFeatureTag.INFINITE_SPELLS,单选枚举值),mana_max 较低(如 40,逼迫卖血)。
  • spells.jsonmodifier_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

  • SpellContexthp_cost_accum: float = 0.0reset() 归零。
  • _apply_modifierif 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(...)infiniteheat_multexecute_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 HPcap 兜底)。

4. P3 魔力虹吸(多来源击杀回蓝)

4.1 状态与来源

  • PlayerStats.mana_leech: float = 0.0(计算值,装备/换牌时重算)。
  • CoreDefinition.base_mana_leech: float = 0.0cores.json.mana_leech,Core 编辑器加一栏,续航型 Core 带之;如 wand_eternal 给 2)。
  • 法术 meta.mana_leech(如新增「魔力虹吸」MODIFIER modifier_mana_leechmeta:{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_KILLEDgain_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_wandPlayerStats.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;停手若干帧 → 衰减回 0heat=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_leechgain_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 helperheat 乘算 + infinite 扣血);三处门控改调;heavy_cost 累加;施法末 HP 结算 + heat 堆积
scripts/domain/player_manager.gd 每帧衰减 mana_heatequip 清零 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.Acore_wand_design §3infinite_spells)、game_design §4.1/§4.3 的 Mana 现状 callout 更新。