# 06 法术编辑器（可视化工具）

> **给策划/开发**：无需写一行代码，在 Godot 编辑器里用可视化表单新增、编辑、删除法术。这是 Godot 的 **EditorPlugin**（等同 Unity 的自定义 EditorWindow）。

---

## 1. 打开编辑器

法术编辑现已并入 **游戏设计器**（`res://addons/game_designer/`，默认已在 `project.godot` 启用）。

```
Godot 编辑器 → 底部面板 → 🎮 游戏设计器 → ✨ 法术 标签页
```

> 独立的「法术编辑器」左下停靠面板已移除，法术统一在游戏设计器内维护。修改插件后可能需**重启 Godot 编辑器**让面板刷新。

---

## 2. 界面说明

```
✨ 法术编辑器 — 字段化表单
┌────────────────────────┐
│ 法术列表（ItemList）     │  ← 所有 data/spells.json 中的法术
│  [ACTION] action_frost… │
│  [MODIFIER] modifier_pi… │
└────────────────────────┘
[➕新增] [⧉复制] [🗑删除]
────────────────────────
ID（唯一）/ 类型[动作 ACTION ▾]/ 显示名 / 描述
元素标签：[✓]火 [ ]冰 [✓]雷 [ ]水 [ ]毒  + 自定义标签框
── 通用 meta ──
蓝耗 mana_cost / 商店价 shop_cost / 解锁价 unlock_cost
── 动态字段（随类型/子类型自动切换）──
ACTION：动作种类[弹道 / 毒池 / 召唤] + 对应字段
        （伤害 / 速度 / 存活 / 半径 / 伤害类型▾ / 施加状态▾ / …）
MODIFIER / TRIGGER / LOGIC（logic_op▾ 子选择）各自字段
── 其它(JSON) ──  ← schema 之外的键，保留不丢
────────────────────────
[✓应用到列表] [💾保存文件] [↻重载]
状态：……
```

> **不再手写 meta JSON**：字段随「类型」及 ACTION 的「动作种类」/ LOGIC 的「logic_op」自动切换；只有 schema 未覆盖的非常规键才会出现在「其它(JSON)」框里（保留不丢）。

---

## 3. 新增一个法术（操作流程）

1. 点 **➕新增** → 列表出现 `new_spell`，表单自动填入 ACTION 模板
2. 改 **ID**（如 `action_lightning`，必须全局唯一）
3. 选 **类型**（ACTION / MODIFIER / TRIGGER / LOGIC）
4. 填 **显示名 / 描述**（建议填 `tr()` 键，如 `SPELL_LIGHTNING_NAME`，见 [04 本地化](04_localization.md)）
5. 勾选 **元素标签**（火/冰/雷/水/毒 复选框，可多选；共鸣用）；非元素标签填「自定义标签」框
6. 填 **meta 字段**——通用区（蓝耗/商店价/解锁价）常驻；下方动态区随类型（及 ACTION 动作种类 / LOGIC logic_op）自动列出对应字段，直接填数值即可
7. 点 **✓应用到列表** → 校验并写入内存
8. 点 **💾保存文件** → 写入 `res://data/spells.json`
9. 运行游戏（F5）→ 新法术自动出现在商店池，可购买施放

> **改完不生效？** 法术在游戏启动时由 `SpellRegistry` 加载，需要**重启游戏**（F5 重新运行）。

---

## 4. meta 字段速查（按类型）

> 下列字段现由表单**按类型自动呈现**，无需手写 JSON；本速查作为字段语义参考。`damage_type`（0物理/1火/2冰/3雷/4毒/5奥术）与 `apply_status_id`/`status_id`（0无/1燃烧/2冻结/3中毒/4潮湿/5沾油/6眩晕/7连击/8易伤）为整数枚举，表单以下拉呈现。

### ACTION（弹道）
```json
{ "base_damage": 5.0, "speed": 350.0, "lifetime": 4.0, "radius": 6.0,
  "damage_type": 0, "apply_status_id": 2, "pierce": 0, "shop_cost": 20 }
```
- `apply_status_id`：命中施加状态（1=燃烧 2=冻结 3=中毒…见 `status_id.gd`），可省略
- `action_kind`：`"zone"`（地面效果）/ `"summon"`（召唤物），省略=普通弹道

### ACTION（地面效果，毒池等）
```json
{ "action_kind": "zone", "radius": 200.0, "status_id": 3,
  "duration": 5.0, "tick_interval": 1.0, "shop_cost": 28 }
```

### ACTION（召唤炮台）
```json
{ "action_kind": "summon", "lifetime": 20.0, "range": 350.0,
  "fire_interval": 0.8, "base_damage": 4.0, "speed": 360.0, "shop_cost": 35 }
```

### MODIFIER（修改施法）
```json
{ "damage_add": 10.0, "damage_mult": 1.0, "spread_add": 1,
  "multicast": 1, "pierce": 2, "shop_cost": 20 }
```

### TRIGGER（命中子母弹）
```json
{ "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0,
  "damage_type": 0, "shop_cost": 30 }
```

### LOGIC（条件/循环）
```json
{ "logic_op": "every_n_shots", "n": 3, "reg": 0, "shop_cost": 24 }
```
`logic_op` 取值：`every_n_shots` / `if_hp_below`(threshold) / `if_enemy_nearby`(range) / `loop`(count)

---

## 5. 数据流（原理）

```
法术编辑器 tab   ──保存──▶  res://data/spells.json  ──游戏启动加载──▶  SpellRegistry
   （编辑器内）                  （纯数据，可 git 版本管理）        （注册到法术 VM）
                                                                      │
                                                  商店抽取 / 背包装备 / 法术 VM 编译施放
```

- `data/spells.json` 中的法术**优先级最高**，会覆盖 `wand_preset.gd` 里的同 ID 硬编码版本
- 不在 JSON 里的法术仍由硬编码提供（向后兼容，不会丢失现有法术）
- JSON 是纯文本，可纳入 git，多人协作改法术不冲突代码

---

## 6. 扩展方向（给开发）

同一套 EditorPlugin 模式可复制出更多可视化工具：

| 工具 | 数据文件 | 对应硬编码 |
|:---|:---|:---|
| **法术编辑器**（已实现，game_designer tab） | `data/spells.json` | `wand_preset.gd` |
| 敌人编辑器（可加） | `data/enemies.json` | `enemy_manager.gd` `_SPEED`/`_ARMOR` |
| 波次编辑器（可加） | `data/waves.json` | `wave_manager.gd` `WAVE_CONFIG` |
| Core 编辑器（可加） | `data/cores.json` | `wand_preset.gd` `make_*_core` |
| 共鸣配方编辑器（可加） | `data/resonance.json` | `spell_evaluator.gd` `_resonance_recipes` |

实现参考 `addons/game_designer/spell_tab.gd`（字段化表单）与 `core_tab.gd`：`@tool` 脚本 + 复用 `designer_ui.gd` 辅助 + schema 驱动的动态字段 + JSON 读写 + 对应 Manager 的 `_load_json_*()` 加载方法。

> **Godot 编辑器扩展能力**：`EditorPlugin`（停靠面板/工具栏/底部面板）、`@tool`（脚本在编辑器运行）、`EditorInspectorPlugin`（自定义检视器）、自定义 `Resource`（`.tres` 自带表单）、`EditorScript`（一次性脚本）。与 Unity 的 EditorWindow/CustomEditor/ScriptableObject 一一对应，且与节点系统集成更紧。
