diff --git a/addons/game_designer/attribute_tab.gd b/addons/game_designer/attribute_tab.gd index 6dd12db..b92c148 100644 --- a/addons/game_designer/attribute_tab.gd +++ b/addons/game_designer/attribute_tab.gd @@ -125,7 +125,13 @@ func _collect() -> Dictionary: # 存 key,不存双语显示串;selected 恒为 0..2(UI.opt 构造时已 clampi,本页此后不再赋值) entry["combine"] = COMBINE_KEYS[r["combine"].selected] var r2: Dictionary = _shop_rows.get(attr_id, {}) - if not r2.is_empty(): + # 「无 shop 段即不可售」是货架 C 的核心不变量(ShopManager.get_sellable_attrs 靠它筛选 + # 可售集合)。_shop_rows 对 ATTR_ORDER 里每个属性都无条件建了控件行(哪怕原本没有 shop + # 段,行以 0 值占位),所以不能只凭 r2 非空就写回;必须再确认 _data 里原本就有这一段, + # 否则会把 price_base=0 的空段写进 JSON——PriceFormula 把 0 价地板钳到 1G, + # 一个零效果属性从此以 1G 可无限购买,直接违反上述不变量。 + var had_shop: bool = _data.get(attr_id, {}).get("shop", null) is Dictionary + if not r2.is_empty() and had_shop: var shop_entry: Dictionary = entry.get("shop", {}).duplicate(true) shop_entry["mode"] = MODE_KEYS[r2["mode"].selected] # 存 key 不存显示串 shop_entry["step"] = _clean(float(r2["step"].value))