feat(resist): 设计器敌人页增元素抗性网格(6×5) + _save 写 resistances(全0省略)
主表下方加 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) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,8 @@ extends VBoxContainer
|
|||||||
const UI = preload("res://addons/game_designer/designer_ui.gd")
|
const UI = preload("res://addons/game_designer/designer_ui.gd")
|
||||||
const PATH = "res://data/enemies.json"
|
const PATH = "res://data/enemies.json"
|
||||||
const NAMES = ["杂兵 Basic", "快速 Fast", "护甲 Armored", "精英 Elite", "首领 MiniBoss", "终焉 Boss"]
|
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 _data: Dictionary = {}
|
||||||
var _rows: Array = [] # [{speed:SpinBox, armor:SpinBox, size:SpinBox, color:ColorPickerButton}]
|
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)
|
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})
|
_rows.append({"speed": sp, "armor": ar, "size": sz, "color": cp})
|
||||||
add_child(HSeparator.new())
|
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))
|
add_child(UI.btn("💾 保存 enemies.json", _save))
|
||||||
_status = UI.status_label()
|
_status = UI.status_label()
|
||||||
add_child(_status)
|
add_child(_status)
|
||||||
@@ -47,13 +69,21 @@ func _save() -> void:
|
|||||||
var out: Dictionary = {}
|
var out: Dictionary = {}
|
||||||
for i in 6:
|
for i in 6:
|
||||||
var r: Dictionary = _rows[i]
|
var r: Dictionary = _rows[i]
|
||||||
out[str(i)] = {
|
var entry := {
|
||||||
"name": NAMES[i],
|
"name": NAMES[i],
|
||||||
"speed": r["speed"].value,
|
"speed": r["speed"].value,
|
||||||
"armor": r["armor"].value,
|
"armor": r["armor"].value,
|
||||||
"size": r["size"].value,
|
"size": r["size"].value,
|
||||||
"color": [r["color"].color.r, r["color"].color.g, r["color"].color.b],
|
"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):
|
if UI.save_json(PATH, out):
|
||||||
UI.set_status(_status, "💾 已保存(重启游戏 F5 生效)")
|
UI.set_status(_status, "💾 已保存(重启游戏 F5 生效)")
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user