From 95af2e1db64c084cbfe62ef7b1b7ff2204ba0f36 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 22 Jul 2026 11:11:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(spell-editor):=20=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=94=B9=E5=A4=8D=E9=80=89=E6=A1=86=20+=20?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E5=8F=8C=E8=AF=AD=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/game_designer/spell_tab.gd | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/addons/game_designer/spell_tab.gd b/addons/game_designer/spell_tab.gd index c0be1e0..96a6dd3 100644 --- a/addons/game_designer/spell_tab.gd +++ b/addons/game_designer/spell_tab.gd @@ -7,11 +7,12 @@ extends VBoxContainer const UI = preload("res://addons/game_designer/designer_ui.gd") const PATH := "res://data/spells.json" -const TYPE_NAMES := ["ACTION", "MODIFIER", "TRIGGER", "LOGIC"] -const ACTION_KINDS := ["弹道", "zone 毒池", "summon 召唤"] # 0=默认(不写 action_kind) 1=zone 2=summon -const LOGIC_OPS := ["every_n_shots", "if_hp_below", "if_enemy_nearby", "loop"] -const DMG_LABELS := ["物理", "火", "冰", "雷", "毒", "奥术"] # index = damage_type 整数 -const ST_LABELS := ["无", "燃烧", "冻结", "中毒", "潮湿", "沾油", "眩晕", "连击", "易伤"] # index = status 整数 +const TYPE_NAMES := ["动作 ACTION", "修饰 MODIFIER", "触发 TRIGGER", "逻辑 LOGIC"] +const ACTION_KINDS := ["弹道 Projectile", "毒池 Zone", "召唤 Summon"] # 0=默认(不写 action_kind) 1=zone 2=summon +const LOGIC_OPS := ["every_n_shots", "if_hp_below", "if_enemy_nearby", "loop"] # 存储 key,不变 +const LOGIC_OP_LABELS := ["每 N 次 every_n_shots", "生命低于 if_hp_below", "附近有敌 if_enemy_nearby", "循环 loop"] # 下拉显示 +const DMG_LABELS := ["物理 Physical", "火 Fire", "冰 Ice", "雷 Lightning", "毒 Poison", "奥术 Arcane"] # index = damage_type 整数 +const ST_LABELS := ["无 None", "燃烧 Burn", "冻结 Freeze", "中毒 Poison", "潮湿 Wet", "沾油 Oily", "眩晕 Stun", "连击 Combo", "易伤 Vuln"] # index = status 整数 var _data: Dictionary = {} var _cur: String = "" @@ -21,7 +22,8 @@ var _id: LineEdit var _type: OptionButton var _name: LineEdit var _desc: LineEdit -var _tags: LineEdit +var _elem_checks: Array = [] +var _custom_tags: LineEdit var _mana: SpinBox var _shop: SpinBox var _unlock: SpinBox @@ -52,7 +54,14 @@ func _ready() -> void: _type.item_selected.connect(_on_type_or_sub_changed) _name = _row("显示名", UI.line("", "tr 键或文本")) _desc = _row("描述", UI.line("", "tr 键或文本")) - _tags = _row("元素标签", UI.line("", "逗号分隔,如 tag:fire")) + var erow := HBoxContainer.new() + erow.add_child(UI.cell_label("元素标签")) + _elem_checks.clear() + for i in UI.ELEM_LABELS.size(): + var cb := CheckBox.new(); cb.text = UI.ELEM_LABELS[i] + _elem_checks.append(cb); erow.add_child(cb) + add_child(erow) + _custom_tags = _row("自定义标签", UI.line("", "非元素 tag,逗号分隔")) add_child(HSeparator.new()) _mana = _row("蓝耗 mana_cost", UI.spin(0, 100000, 1, 0)) @@ -62,7 +71,7 @@ func _ready() -> void: _akind = UI.opt(ACTION_KINDS, 0) _akind.item_selected.connect(_on_type_or_sub_changed) _akind_row = _labeled_row("动作种类", _akind) - _lop = UI.opt(LOGIC_OPS, 0) + _lop = UI.opt(LOGIC_OP_LABELS, 0) _lop.item_selected.connect(_on_type_or_sub_changed) _lop_row = _labeled_row("逻辑 logic_op", _lop) @@ -208,7 +217,13 @@ func _on_select(idx: int) -> void: _type.selected = clampi(int(d.get("type", 0)), 0, 3) _name.text = String(d.get("display_name", "")) _desc.text = String(d.get("description", "")) - _tags.text = ",".join(d.get("element_tags", [])) + var etags: Array = d.get("element_tags", []) + for i in _elem_checks.size(): + _elem_checks[i].button_pressed = UI.ELEM_TAGS[i] in etags + var custom_list := [] + for t in etags: + if not (String(t) in UI.ELEM_TAGS): custom_list.append(String(t)) + _custom_tags.text = ",".join(custom_list) var ak := String(meta.get("action_kind", "")) _akind.selected = (1 if ak == "zone" else (2 if ak == "summon" else 0)) _lop.selected = maxi(0, LOGIC_OPS.find(String(meta.get("logic_op", "every_n_shots")))) @@ -287,9 +302,11 @@ func _on_apply() -> void: if not (meta is Dictionary): UI.set_status(_status, "✗ 其它(JSON) 不是合法对象", true); return var tags: Array = [] - for t in _tags.text.split(",", false): + for i in _elem_checks.size(): + if _elem_checks[i].button_pressed: tags.append(UI.ELEM_TAGS[i]) + for t in _custom_tags.text.split(",", false): var s := t.strip_edges() - if s != "": tags.append(s) + if s != "" and not (s in tags): tags.append(s) if _cur != "" and _cur != sid and _data.has(_cur): _data.erase(_cur) _data[sid] = {"type": _type.selected, "display_name": _name.text,