Files
spellforge/docs/handbook/06_spell_editor.md
T

6.5 KiB
Raw Blame History

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:动作种类[弹道 / zone 毒池 / summon 召唤] + 对应字段
        (伤害 / 速度 / 存活 / 半径 / 伤害类型▾ / 施加状态▾ / …)
MODIFIER / TRIGGER / LOGIClogic_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 本地化
  5. 元素标签(共鸣用,如 tag:lightning;多个用逗号)
  6. meta 字段——通用区(蓝耗/商店价/解锁价)常驻;下方动态区随类型(及 ACTION 动作种类 / LOGIC logic_op)自动列出对应字段,直接填数值即可
  7. ✓应用到列表 → 校验并写入内存
  8. 💾保存文件 → 写入 res://data/spells.json
  9. 运行游戏(F5)→ 新法术自动出现在商店池,可购买施放

改完不生效? 法术在游戏启动时由 SpellRegistry 加载,需要重启游戏F5 重新运行)。


4. meta 字段速查(按类型)

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

ACTION(弹道)

{ "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(地面效果,毒池等)

{ "action_kind": "zone", "radius": 200.0, "status_id": 3,
  "duration": 5.0, "tick_interval": 1.0, "shop_cost": 28 }

ACTION(召唤炮台)

{ "action_kind": "summon", "lifetime": 20.0, "range": 350.0,
  "fire_interval": 0.8, "base_damage": 4.0, "speed": 360.0, "shop_cost": 35 }

MODIFIER(修改施法)

{ "damage_add": 10.0, "damage_mult": 1.0, "spread_add": 1,
  "multicast": 1, "pierce": 2, "shop_cost": 20 }

TRIGGER(命中子母弹)

{ "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0,
  "damage_type": 0, "shop_cost": 30 }

LOGIC(条件/循环)

{ "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 一一对应,且与节点系统集成更紧。