test(迁移): 批 B 波 1 G3 套4 伤害量值区间五条迁入 board_gen_reward_test.gd——剪切挂载绿(宿主累计 62 检查)+变异 4/5 验红;「区间行上下阶实际流动」证死断言候选(守面同字典读数自比较恒假,源码自带缺陷非迁移引入,照迁禁删上报主会话);_row_power 套内独占随迁,smoke_all.gd 同批删函数与游离节头注释
This commit is contained in:
1 parent
5dd6d8498a
commit
824a88d26d
3 files changed
+81
-84
No files matched your search
@@ -1331,9 +1331,6 @@ func _ms_digest(ms, ae) -> Array:
|
||||
return [[int(ms.hero_pos().x), int(ms.hero_pos().y)], rev, seals, ae.ap, ae.phase, ms.seal_count()]
|
||||
|
||||
|
||||
# ---- 地图战斗资源·伤害量值区间冒烟(roll 域内 + 中点锚 + 变异实际流动 + 定值行不受扰)----
|
||||
|
||||
|
||||
# ---- 排雷玩法 封印动作耗尽末点 AP 回归(playtest 缺陷②——v1 冒烟盲区:自动玩家不用封印)----
|
||||
|
||||
func _smoke_seal_ap_exhausted() -> void:
|
||||
@@ -2023,87 +2020,6 @@ func _auto_play_round(settlement, out: Dictionary) -> void:
|
||||
|
||||
|
||||
|
||||
# ---- 地图战斗资源·伤害量值区间冒烟(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
|
||||
check(anchors_ok and interval_rows.size() >= 1,
|
||||
"区间行配对齐全且 power = floor 中点(配置推导 %d 行:%s)" % [interval_rows.size(), str(interval_rows.keys())])
|
||||
# ② 运行侧: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
|
||||
check(in_domain, "24 板全区间行快照 power ∈ [power_min, power_max](含清图槽)")
|
||||
check(fixed_ok, "定值行快照 power 恒等表值——区间批零外溢")
|
||||
# 定值行(区间 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
|
||||
check(variance_ok, "区间行上下阶实际流动(≥2 样本的区间行须 ≥2 个不同 roll 值)")
|
||||
check(fixed_rows_ok, "定值行(lo=hi)roll 恒等表值")
|
||||
|
||||
|
||||
func _row_power(rid: String) -> int:
|
||||
for row in _db.reward.rows:
|
||||
if String(row.reward_id) == rid:
|
||||
return int(row.power)
|
||||
return -1
|
||||
|
||||
|
||||
|
||||
|
||||
# ---- 行动经济·轮内刷新冒烟(方案 A:Active 相位当场换图继续挖)----
|
||||
|
||||
func _smoke_active_refresh() -> void:
|
||||
|
||||
@@ -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
|
||||
Reference in new issue
Block a user