W5: sim一轮裁定落地+二轮校准 — 冤煞独立表(wrath_layers 22行)/宿慧渐近封顶F-1/跳过钳制F-2/验收门#2#3#10#13#14修订;二轮4/5 FAIL转PASS,#13 R4残留0.396(带外0.021),硬门#5#10不回归,红线9.5e15→7.007B,test_runner 750检查8/8用例

This commit is contained in:
程基岩(engineering-lead) committed 2026-10-21 17:41:21 +08:00
1 parent c534e95458
commit c0a5c52cb7
37 files changed
+49293 -153

No files matched your search

+45
View File
@@ -20,6 +20,7 @@ const SHEET_FILES: Array[String] = [
"generators", "upgrades", "halls", "hall_palettes",
"boss_battles", "events", "meta_upgrades", "balance_tuning",
"camera", # W3:per-hall 相机 rig 行(camera.csv;每殿恰一行)
"wrath_layers", # W5:冤煞层 22 行(wrath_layers.csv;[B§12] 漏登补登,G-1)
]
var generators: Array[GeneratorDef] = []
@@ -30,6 +31,7 @@ var palettes: Array[PaletteDef] = []
var bosses: Array[BossDef] = []
var events: Array[EventDef] = []
var cameras: Array[CameraDef] = [] # W3:per-hall 相机 rig
var wrath_layers: Array[WrathLayerDef] = [] # W5:冤煞层 22 行(一层一行)
var load_errors: Array[String] = []
@@ -43,6 +45,7 @@ var _camera_by_hall := {}
var _palette_by_hall := {}
var _event_by_id := {}
var _tune := {} # id -> {"kind": String, "num": float, "text": String}
var _wrath_by_index := {} # W5:layer_index -> WrathLayerDef
## 从目录载入全部表(缺表 = load_errors,不静默)
@@ -72,6 +75,7 @@ static func load_from_dir(dir: String) -> BalanceData:
"events": bd._load_events(rows)
"meta_upgrades": bd._load_meta(rows)
"balance_tuning": bd._load_tuning(rows)
"wrath_layers": bd._load_wrath_layers(rows)
bd._build_indexes()
bd.load_errors.append_array(bd.check_references())
return bd
@@ -245,6 +249,16 @@ func _load_tuning(rows: Array) -> void:
}
func _load_wrath_layers(rows: Array) -> void:
for r in rows:
var d := WrathLayerDef.new()
d.id = str(r.get("id", ""))
d.layer_index = int(r.get("layer_index", 0))
d.effect = float(r.get("effect", 0))
d.cost = int(r.get("cost", 0))
wrath_layers.append(d)
# ----------------------------------------------------------------------------
# 索引与查询
# ----------------------------------------------------------------------------
@@ -267,6 +281,8 @@ func _build_indexes() -> void:
_palette_by_hall[d.hall_id] = d
for d in events:
_event_by_id[d.id] = d
for d in wrath_layers:
_wrath_by_index[d.layer_index] = d
func generator(id: String) -> GeneratorDef:
@@ -307,6 +323,20 @@ func event(id: String) -> EventDef:
return _event_by_id.get(id)
## W5:冤煞层行(layer_index 1 起;越界返回 null——buy_wrath_layer 先查上限)
func wrath_layer(layer_index: int) -> WrathLayerDef:
return _wrath_by_index.get(layer_index)
## W5:前 layers 层的 effect 合计(全局乘区加法;recompute 非热路径,逐行求和)
func wrath_layer_effect_sum(layers: int) -> float:
var sum := 0.0
for d in wrath_layers:
if d.layer_index <= layers:
sum += d.effect
return sum
## 全局调参数(balance_tuning.csv);缺失返回 default 并记 load_errors
func tune_num(key: String, default_value: float) -> float:
var row: Variant = _tune.get(key)
@@ -368,4 +398,19 @@ func check_references() -> Array[String]:
for c in cameras:
if _hall_by_id.get(c.hall_id) == null:
errs.append("camera.%s.hall_id 引用了不存在的殿:%s" % [c.id, c.hall_id])
# W5:冤煞层表完整性(wrath_layers.csv;G-1 补登)
# ① tune_wrath_layers 与表行数交叉校验(双源必须一致)
# ② layer_index 从 1 连续递增(一行一层,无跳号/重号——x-unique 已挡重号)
var wrath_total := 0
if _tune.has("tune_wrath_layers"):
wrath_total = int(_tune["tune_wrath_layers"].num)
if wrath_total != wrath_layers.size():
errs.append("wrath_layers:tune_wrath_layers=%d 与表行数 %d 不一致(改层总数 = 加行 + 同步调参,走 ADR)" % [
wrath_total, wrath_layers.size()])
for i in wrath_layers.size():
var wl := wrath_layers[i]
if wl.layer_index != i + 1:
errs.append("wrath_layers:第 %d 行 layer_index=%d(应从 1 连续递增)" % [i + 1, wl.layer_index])
if wl.effect < 0.0:
errs.append("wrath_layers.%s:effect 为负(%f)" % [wl.id, wl.effect])
return errs