From 7bc13a7be65f29663f1b82acc6f9a96a5daa0fa6 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 21 Jul 2026 10:31:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(mana):=20=E6=B8=B8=E6=88=8F=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E6=94=AF=E6=8C=81=20mana=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=88=E8=A1=A5=20Mana=20MVP=20=E9=85=8D=E5=A5=97?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Core 编辑器加「蓝上限/回蓝」两栏(_on_select 读 / _on_apply 写 / _on_new 默认), 修复此前编辑 Core 保存会静默丢失 mana_max/mana_regen 的数据丢失洞 - 法术编辑器 4 个 meta 模板加 mana_cost,新法术默认有合理蓝耗 - handbook 07 补 Core 蓝池字段 + 法术 mana_cost 说明 Co-Authored-By: Claude Opus 4.8 (1M context) --- addons/game_designer/core_tab.gd | 10 +++++++++- addons/spell_editor/spell_dock.gd | 8 ++++---- docs/handbook/07_game_designer.md | 5 ++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/addons/game_designer/core_tab.gd b/addons/game_designer/core_tab.gd index 5ce4f85..890c981 100644 --- a/addons/game_designer/core_tab.gd +++ b/addons/game_designer/core_tab.gd @@ -16,6 +16,8 @@ var _slots: SpinBox var _topo: OptionButton var _cpu: SpinBox var _interval: SpinBox +var _mana_max: SpinBox +var _mana_regen: SpinBox var _feat: OptionButton var _rows: SpinBox var _cols: SpinBox @@ -39,6 +41,8 @@ func _ready() -> void: _topo = _row("拓扑", UI.opt(TOPO, 0)) _cpu = _row("CPU 上限", UI.spin(1, 40, 1, 5)) _interval = _row("施法间隔(s)", UI.spin(0.05, 5, 0.05, 0.5)) + _mana_max = _row("蓝上限(Mana Max)", UI.spin(0, 1000, 5, 100)) + _mana_regen = _row("回蓝/秒(Mana Regen)", UI.spin(0, 100, 0.5, 5)) _feat = _row("特性", UI.opt(FEAT, 0)) _rows = _row("矩阵行(MATRIX)", UI.spin(1, 8, 1, 1)) _cols = _row("矩阵列(MATRIX)", UI.spin(1, 16, 1, 5)) @@ -81,6 +85,8 @@ func _on_select(idx: int) -> void: _topo.selected = int(d.get("topology", 0)) _cpu.value = float(d.get("cpu_limit", 5)) _interval.value = float(d.get("cast_interval", 0.5)) + _mana_max.value = float(d.get("mana_max", 100)) + _mana_regen.value = float(d.get("mana_regen", 5)) _feat.selected = int(d.get("feature_tags", 0)) _rows.value = float(d.get("grid_rows", 1)) _cols.value = float(d.get("grid_cols", 5)) @@ -99,6 +105,7 @@ func _on_apply() -> void: "display_name": _name.text, "slot_count": int(_slots.value), "topology": _topo.selected, "cpu_limit": int(_cpu.value), "cast_interval": _interval.value, "feature_tags": _feat.selected, + "mana_max": int(_mana_max.value), "mana_regen": _mana_regen.value, "grid_rows": int(_rows.value), "grid_cols": int(_cols.value), "edges": edges, } _cur = cid @@ -110,7 +117,8 @@ func _on_new() -> void: var i := 1 while _data.has(cid): cid = "new_core_%d" % i; i += 1 _data[cid] = {"display_name": cid, "slot_count": 5, "topology": 0, - "cpu_limit": 5, "cast_interval": 0.5, "feature_tags": 0, "edges": []} + "cpu_limit": 5, "cast_interval": 0.5, "feature_tags": 0, + "mana_max": 100, "mana_regen": 5, "edges": []} _refresh() func _on_delete() -> void: diff --git a/addons/spell_editor/spell_dock.gd b/addons/spell_editor/spell_dock.gd index 8799ad6..6813815 100644 --- a/addons/spell_editor/spell_dock.gd +++ b/addons/spell_editor/spell_dock.gd @@ -8,10 +8,10 @@ const TYPE_NAMES: Array = ["ACTION", "MODIFIER", "TRIGGER", "LOGIC"] ## meta 模板(按类型“插入模板”用) const META_TEMPLATES: Dictionary = { - 0: '{ "base_damage": 5.0, "speed": 350.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "shop_cost": 20 }', - 1: '{ "damage_add": 10.0, "shop_cost": 20 }', - 2: '{ "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "shop_cost": 30 }', - 3: '{ "logic_op": "every_n_shots", "n": 3, "reg": 0, "shop_cost": 24 }', + 0: '{ "base_damage": 5.0, "speed": 350.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "mana_cost": 5, "shop_cost": 20 }', + 1: '{ "damage_add": 10.0, "mana_cost": 10, "shop_cost": 20 }', + 2: '{ "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "mana_cost": 10, "shop_cost": 30 }', + 3: '{ "logic_op": "every_n_shots", "n": 3, "reg": 0, "mana_cost": 0, "shop_cost": 24 }', } var _spells: Dictionary = {} # { id: {type, display_name, description, element_tags, meta} } diff --git a/docs/handbook/07_game_designer.md b/docs/handbook/07_game_designer.md index 2ff816c..6fd642c 100644 --- a/docs/handbook/07_game_designer.md +++ b/docs/handbook/07_game_designer.md @@ -32,7 +32,8 @@ 新增/编辑/删除法术,最丰富的玩法配置。详见 [06 法术编辑器](06_spell_editor.md)(meta 字段速查表)。 - 列表 → 选中编辑;➕新增 / ⧉复制 / 🗑删除 - 字段:ID / 类型(ACTION/MODIFIER/TRIGGER/LOGIC) / 显示名 / 描述 / 元素标签 / meta(JSON) -- 「插入该类型 meta 模板」一键填入起始参数 +- 「插入该类型 meta 模板」一键填入起始参数(模板已含 `mana_cost` 蓝耗、`shop_cost` 售价) +- 💧 **蓝耗**:每个法术的 `meta.mana_cost` 决定施放消耗的魔力(0=免蓝);权威数值见 `numerical_design §2` ### 👾 敌人(enemies.json) 6 种敌人原型的数值表格,**直接拖动数字框**调整: @@ -70,6 +71,8 @@ | 拓扑 | LINEAR(线性) / MATRIX(矩阵邻接) / CIRCUIT(电路分叉) | | CPU 上限 | 单次施法最大执行步数 | | 施法间隔 | 自动施法冷却(s) | +| 蓝上限(Mana Max) | 法杖蓝池上限(基础 100) | +| 回蓝/秒(Mana Regen) | 每秒回复的魔力(基础 5) | | 特性 | 无 / PERSISTENT_MEMORY(寄存器跨帧) / … | | 矩阵行·列 | MATRIX 专用网格尺寸 | | 电路边 | CIRCUIT 专用,JSON 有向边 `[{"from":0,"to":1}]` |