From a17e3aa2af54c6282df047c6b198a7ab1ebebd3b Mon Sep 17 00:00:00 2001 From: Joywayer Date: Fri, 24 Jul 2026 12:08:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(resist):=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E6=95=8C=E4=BA=BA=E9=A1=B5=E5=A2=9E=E5=85=83=E7=B4=A0=E6=8A=97?= =?UTF-8?q?=E6=80=A7=E7=BD=91=E6=A0=BC(6=C3=975)=20+=20=5Fsave=20=E5=86=99?= =?UTF-8?q?=20resistances=EF=BC=88=E5=85=A80=E7=9C=81=E7=95=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主表下方加 6原型×5元素(火/冰/雷/毒/奥) SpinBox 网格(-0.9~0.9);_save 汇总 非零抗性写入 resistances,全0则省略键。读写往返 MCP 实测 FAILS=0 (读种子 fire0.5/ice-0.5,写非零、零值省略、负值保留)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- addons/game_designer/enemy_tab.gd | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/addons/game_designer/enemy_tab.gd b/addons/game_designer/enemy_tab.gd index 526a77f..c6558e3 100644 --- a/addons/game_designer/enemy_tab.gd +++ b/addons/game_designer/enemy_tab.gd @@ -5,6 +5,8 @@ extends VBoxContainer const UI = preload("res://addons/game_designer/designer_ui.gd") const PATH = "res://data/enemies.json" const NAMES = ["杂兵 Basic", "快速 Fast", "护甲 Armored", "精英 Elite", "首领 MiniBoss", "终焉 Boss"] +const ELEM_KEYS = ["fire", "ice", "lightning", "poison", "arcane"] +const ELEM_LABELS = ["火 Fire", "冰 Ice", "雷 Lightning", "毒 Poison", "奥 Arcane"] var _data: Dictionary = {} var _rows: Array = [] # [{speed:SpinBox, armor:SpinBox, size:SpinBox, color:ColorPickerButton}] @@ -35,6 +37,26 @@ func _ready() -> void: grid.add_child(sp); grid.add_child(ar); grid.add_child(sz); grid.add_child(cp) _rows.append({"speed": sp, "armor": ar, "size": sz, "color": cp}) add_child(HSeparator.new()) + add_child(UI.cell_label("元素抗性 Resistances(-0.9~0.9,负=弱点加伤)")) + var rgrid := GridContainer.new() + rgrid.columns = ELEM_KEYS.size() + 1 + add_child(rgrid) + var rhead := Label.new(); rhead.text = "原型"; rhead.modulate = Color(0.7, 0.8, 1.0) + rgrid.add_child(rhead) + for el in ELEM_LABELS: + var el_l := Label.new(); el_l.text = el; el_l.modulate = Color(0.7, 0.8, 1.0) + rgrid.add_child(el_l) + for i in 6: + var d2: Dictionary = _data.get(str(i), {}) + var res_d: Dictionary = d2.get("resistances", {}) + rgrid.add_child(UI.cell_label(NAMES[i])) + var res_spins := {} + for ei in ELEM_KEYS.size(): + var ename: String = ELEM_KEYS[ei] + var sp2 := UI.spin(-0.9, 0.9, 0.05, float(res_d.get(ename, 0.0))) + rgrid.add_child(sp2) + res_spins[ename] = sp2 + _rows[i]["resist"] = res_spins add_child(UI.btn("💾 保存 enemies.json", _save)) _status = UI.status_label() add_child(_status) @@ -47,13 +69,21 @@ func _save() -> void: var out: Dictionary = {} for i in 6: var r: Dictionary = _rows[i] - out[str(i)] = { + var entry := { "name": NAMES[i], "speed": r["speed"].value, "armor": r["armor"].value, "size": r["size"].value, "color": [r["color"].color.r, r["color"].color.g, r["color"].color.b], } + var rd := {} + for ename in ELEM_KEYS: + var v: float = r["resist"][ename].value + if absf(v) > 0.0001: + rd[ename] = v + if not rd.is_empty(): + entry["resistances"] = rd + out[str(i)] = entry if UI.save_json(PATH, out): UI.set_status(_status, "💾 已保存(重启游戏 F5 生效)") else: