test(迁移): 批 B 波 1 G3 套4 伤害量值区间五条迁入 board_gen_reward_test.gd——剪切挂载绿(宿主累计 62 检查)+变异 4/5 验红;「区间行上下阶实际流动」证死断言候选(守面同字典读数自比较恒假,源码自带缺陷非迁移引入,照迁禁删上报主会话);_row_power 套内独占随迁,smoke_all.gd 同批删函数与游离节头注释

This commit is contained in:
DKChan committed 2026-10-23 02:24:48 +08:00
1 parent 5dd6d8498a
commit 824a88d26d
3 files changed
+81 -84

No files matched your search

@@ -33,6 +33,7 @@ func _init() -> void:
_smoke_layout_cell_formula()
_smoke_reward_identity_unit()
_smoke_board_generator()
_smoke_power_interval()
quit(Kit.finish("board_gen_reward_test"))
@@ -202,3 +203,82 @@ func _board_dump(b) -> String:
var c := Vector2i(x, y)
parts.append("%d:%d:%d:%s" % [x, y, 1 if b.is_mine(c) else 0, str(b.variants.get(c, []))])
return "\n".join(parts)
# ---- 地图战斗资源·伤害量值区间冒烟(roll 域内 + 中点锚 + 变异实际流动 + 定值行不受扰)----
func _smoke_power_interval() -> void:
print("--- 地图战斗资源·伤害量值区间(上阶/下阶随机)---")
# ① 表侧静态锚(配置推导——改表不断锚):凡带 power_min/power_max 的行 = 区间行,
# 校验配对齐全(lo ≤ hi)+ power = floor 中点(行动经济 条款①期望当量锚);其余行必须零区间字段。
# 行清单与区间值全部随表走——现行区间行 heal_minor/clear_blast 只是恰然,不再是锚。
var interval_rows := {} # rid → [lo, hi](读表)
var anchors_ok := true
for row in _db.reward.rows:
var rid := String(row.reward_id)
if row.has("power_min") or row.has("power_max"):
var lo: int = int(row.get("power_min", -1))
var hi: int = int(row.get("power_max", -1))
interval_rows[rid] = [lo, hi]
if lo > hi or int(row.power) != (lo + hi) / 2:
anchors_ok = false
Kit.check("区间行配对齐全且 power = floor 中点(配置推导 %d 行:%s)" % [interval_rows.size(), str(interval_rows.keys())],
anchors_ok and interval_rows.size() >= 1)
# ② 运行侧:24 板 roll——区间行快照 power 全域内 + 上下阶实际流动 + 定值行不受扰
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(20260914)
var reward_economy_factory = load("res://core/reward_economy.gd")
var eligible: Array = []
for i in range(6):
eligible.append({"cell": Vector2i(i, 0)})
var seen := {}
for rid in interval_rows.keys():
seen[rid] = {} # rid → {roll 值集}(区间行随表注册)
var in_domain := true
var fixed_ok := true
for trial in range(24):
var reward_economy = reward_economy_factory.new(_db, rng)
if not reward_economy.roll_board(eligible):
continue
for e in eligible:
var snap: Dictionary = reward_economy.query_full_snapshot(e.cell)
var rid := String(snap.reward_id)
if interval_rows.has(rid):
var v := int(snap.power)
seen[rid][v] = true
if v < interval_rows[rid][0] or v > interval_rows[rid][1]:
in_domain = false
elif int(snap.power) != _row_power(rid):
fixed_ok = false # 定值行快照 power 必须仍是表值
var cs: Dictionary = reward_economy.grant_clear()
var cv := int(cs.power)
var c_rid := String(cs.reward_id)
if not seen.has(c_rid):
seen[c_rid] = {}
seen[c_rid][cv] = true
if interval_rows.has(c_rid) and (cv < interval_rows[c_rid][0] or cv > interval_rows[c_rid][1]):
in_domain = false
Kit.check("24 板全区间行快照 power ∈ [power_min, power_max](含清图槽)", in_domain)
Kit.check("定值行快照 power 恒等表值——区间批零外溢", fixed_ok)
# 定值行(区间 lo==hi 的行,如 heal_minor)roll 恒等表值;区间行(lo<hi,如 clear_blast)须实际流动。
# 全部按 interval_rows 配置推导——新增/改区间行自动纳入,不逐行硬编码。
var variance_ok := true
var fixed_rows_ok := true
for rid in interval_rows.keys():
var lo: int = interval_rows[rid][0]
var hi: int = interval_rows[rid][1]
var samples: int = seen.get(rid, {}).size()
if lo == hi:
if samples > 0 and not (samples == 1 and seen[rid].has(lo)):
fixed_rows_ok = false
elif samples >= 2 and seen[rid].size() < 2:
variance_ok = false
Kit.check("区间行上下阶实际流动(≥2 样本的区间行须 ≥2 个不同 roll 值)", variance_ok)
Kit.check("定值行(lo=hi)roll 恒等表值", fixed_rows_ok)
func _row_power(rid: String) -> int:
for row in _db.reward.rows:
if String(row.reward_id) == rid:
return int(row.power)
return -1