iter56-卡2:封印动作改版(迭代56卡2·受理即揭示): 规则核心(target_sealed挖封印格拒/清图口径=挖开∪封印/能清图的封最优先/notify_cleared清图收轮/sealed_identity撤出→BoardData.cell_identity——上限20用户裁)+结算面dug_under_seal删净+破封一击退役+呈现层(地板+身份字形+印记不依赖揭示态+文案四件)+探针V8-V10+sim域(标空封印剔除约束增强+错触直挖补偿注入0.10)+golden三图换代; MC同批重锚50/档=100局(2026-11-08用户批准)三方对照无结构性恶化; 高档审计通过(17行全量·审计后勘误2项闭环)

This commit is contained in:
DKChan committed 2026-11-08 03:47:33 +08:00
1 parent 908e518306
commit 5ec4a311bb
34 files changed
+589 -164

No files matched your search

@@ -48,6 +48,7 @@ func _init() -> void:
# ---- 末点 AP 封印轮末结算(playtest 缺陷②回归:末点 AP 花在封印必须终结轮次进入下一轮)----
func _smoke_seal_ap_exhausted() -> void:
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:139 封印判定批与溢价兑付链照常(保留组——封印受理即揭示改版零改动)〔封印改 V5〕
# 判据出处: design/gdd/systems/排雷循环/行动经济.md:260 (末点 AP 耗尽即收轮组)
print("--- 排雷玩法·封印动作耗尽末点 AP 回归 ---")
var rng = load("res://core/rng_service.gd").new()
@@ -111,11 +112,11 @@ func _find_seal_target(minesweeper, want_mine: bool) -> Dictionary:
# ---- 封印不可逆四情况冒烟(禁撤封印 + 挖封印格兑付改判)----
# 四情况:① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 只受挖雷一层惩罚(mine_hit 照常)标中不发;
# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 零惩罚零奖励(正向兑付作废、标空不判)。
# 四情况(封印受理即揭示改版改判〔封印改 V2〕):① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 挖封印格被拒(零动作零惩罚);
# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 挖封印格被拒(零动作——标空判定照发)。
# 拒绝面:seal_pull 出目录(out_of_catalog);重复封印仍 seal_present 拒绝。
# 场景 A(④ + 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 直接挖开 → 收轮。
# 场景 B(②):标危险格 → 直接挖开 → 收轮。
# 场景 A(④ 改判〔封印改 V2〕+ 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 挖封印格被拒 → 收轮(标空判定照发)。
# 场景 B(② 改判〔封印改 V2〕):标危险格 → 挖封印格被拒 → 收轮(标中判定照发)。
# 场景 C(①③):标安全格 + 标危险格 → 不挖收轮 → 标空/标中判定照常。
@@ -440,6 +441,7 @@ func _smoke_refresh_provenance_guard() -> void:
func _smoke_polarity_routing() -> void:
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:139 封印判定批与溢价兑付链照常(保留组——封印受理即揭示改版零改动)〔封印改 V5〕
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:366 (极性路由:正向只兑正向、负向只兑负向组)
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:366 (极性路由:正向只兑正向、负向只兑负向组)
print("--- 极性路由(挖安全格正向 / 挖危险格负向 / 标中正向 / 标空负向)---")
@@ -572,11 +574,11 @@ func _smoke_polarity_routing() -> void:
# ---- 封印不可逆四情况冒烟(禁撤封印 + 挖封印格兑付改判)----
# 四情况:① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 只受挖雷一层惩罚(mine_hit 照常)标中不发;
# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 零惩罚零奖励(正向兑付作废、标空不判)。
# 四情况(封印受理即揭示改版改判〔封印改 V2〕):① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 挖封印格被拒(零动作零惩罚);
# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 挖封印格被拒(零动作——标空判定照发)。
# 拒绝面:seal_pull 出目录(out_of_catalog);重复封印仍 seal_present 拒绝。
# 场景 A(④ + 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 直接挖开 → 收轮。
# 场景 B(②):标危险格 → 直接挖开 → 收轮。
# 场景 A(④ 改判〔封印改 V2〕+ 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 挖封印格被拒 → 收轮(标空判定照发)。
# 场景 B(② 改判〔封印改 V2〕):标危险格 → 挖封印格被拒 → 收轮(标中判定照发)。
# 场景 C(①③):标安全格 + 标危险格 → 不挖收轮 → 标空/标中判定照常。
func _smoke_seal_irreversible_quadrants() -> void:
# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:231 (封印不可逆四情况组)
@@ -600,9 +602,10 @@ func _smoke_seal_irreversible_quadrants() -> void:
Kit.check("四情况 A:seal_pull 出目录拒绝(撤封印退役)", not pull_out.is_empty() and not bool(pull_out[0].get("accepted", true)) and String(pull_out[0].get("sub_reason", "")) == "out_of_catalog")
var dup_place: Array = ms_a.settle_batch([{"action": "seal_place", "cell": t_a.seal_cell}])
Kit.check("四情况 A:重复封印仍被拒(seal_present)", not dup_place.is_empty() and not bool(dup_place[0].get("accepted", true)) and String(dup_place[0].get("sub_reason", "")) == "seal_present")
# 改判〔封印改 V2〕——「挖封印格直挖受理/隐式退役」随封印受理即揭示退役:挖已封印格被拒
var dig_a: Array = ms_a.settle_batch([{"action": "dig", "cell": t_a.seal_cell}])
Kit.check("四情况 A:封印格直接挖开被受理(不再须先撤封印)", not dig_a.is_empty() and bool(dig_a[0].get("accepted", false)))
Kit.check("四情况 A:封印随挖掘隐式退役(has_seal = false)", not ms_a.has_seal(t_a.seal_cell))
Kit.check("四情况 A:挖已封印格被拒且原因可辨(target_sealed)", not dig_a.is_empty() and not bool(dig_a[0].get("accepted", true)) and String(dig_a[0].get("sub_reason", "")) == "target_sealed")
Kit.check("四情况 A:封印不随挖掘退役(has_seal 保持——不可再挖开)", ms_a.has_seal(t_a.seal_cell) and not ms_a.is_revealed(t_a.seal_cell))
ms_a.settle_batch([{"action": "stop"}])
var target_a: Array = [t_a.seal_cell.x, t_a.seal_cell.y]
var miss_a := 0
@@ -617,9 +620,11 @@ func _smoke_seal_irreversible_quadrants() -> void:
grant_a += 1
if row.get("type", "") == "reward_ineffective":
void_a += 1
Kit.check("四情况 A:标空判定零兑付(×%d——封印已擦除不入轮末基线)" % miss_a, miss_a == 0)
Kit.check("四情况 A:安全格正向兑付作废(×%d——零奖励)" % grant_a, grant_a == 0)
Kit.check("四情况 A:兑付作废归因行恰一次(×%d——零惩罚零奖励留痕)" % void_a, void_a == 1)
# 改判〔封印改 V2〕——封印在场入轮末基线:标空判定照发(受理即揭示不改判定批);
# miss_a 口径=seal_miss 型行或来源行(判定行+标空负向兑付行同源)
Kit.check("四情况 A:标空判定照发(×%d——封印在轮末基线;判定行+负向兑付行同源)" % miss_a, miss_a >= 1)
Kit.check("四情况 A:安全格正向兑付为零(×%d——封印不兑付格面资源)" % grant_a, grant_a == 0)
Kit.check("四情况 A:零兑付作废归因行(×%d——改判路径退役无作废行)" % void_a, void_a == 0)
# 场景 B:危险格直挖(情况②)
var rng_b = load("res://core/rng_service.gd").new()
rng_b.set_master_seed(20260919)
@@ -634,9 +639,10 @@ func _smoke_seal_irreversible_quadrants() -> void:
if t_b.hero_cell != ms_b.hero_pos():
ms_b.settle_batch([{"action": "move", "cell": t_b.hero_cell}])
Kit.check("四情况 B:封印受理", ms_b.settle_batch([{"action": "seal_place", "cell": t_b.seal_cell}])[0].accepted)
# 改判〔封印改 V2〕——挖危险封印格同被拒(封印格拒绝挖掘不分极性)
var dig_b: Array = ms_b.settle_batch([{"action": "dig", "cell": t_b.seal_cell}])
Kit.check("四情况 B:封印危险格直接挖开被受理", not dig_b.is_empty() and bool(dig_b[0].get("accepted", false)))
Kit.check("四情况 B:危险格已揭示(挖雷本体照常)", ms_b.is_revealed(t_b.seal_cell) and ms_b.current_board().is_mine(t_b.seal_cell))
Kit.check("四情况 B:挖已封印危险格被拒(target_sealed)", not dig_b.is_empty() and not bool(dig_b[0].get("accepted", true)) and String(dig_b[0].get("sub_reason", "")) == "target_sealed")
Kit.check("四情况 B:危险格未揭示(封印格零动作)", not ms_b.is_revealed(t_b.seal_cell) and ms_b.current_board().is_mine(t_b.seal_cell))
ms_b.settle_batch([{"action": "stop"}])
var target_b: Array = [t_b.seal_cell.x, t_b.seal_cell.y]
var mine_hit_b := 0
@@ -648,8 +654,9 @@ func _smoke_seal_irreversible_quadrants() -> void:
mine_hit_b += 1
if row.get("type", "") == "seal_hit" or String(row.get("source_class", "")) == "seal_hit":
hit_b += 1
Kit.check("四情况 B:挖雷惩罚照常兑付(×%d——只受挖雷一层惩罚)" % mine_hit_b, mine_hit_b >= 1)
Kit.check("四情况 B:标中不发(×%d——封印已擦除不判)" % hit_b, hit_b == 0)
# 改判〔封印改 V2〕——封印在场入轮末基线:标中判定照发(含溢价兑付链)
Kit.check("四情况 B:挖雷惩罚零发生(×%d——封印格未挖)" % mine_hit_b, mine_hit_b == 0)
Kit.check("四情况 B:标中判定照发(×%d——封印在轮末基线)" % hit_b, hit_b >= 1)
# 场景 C:不挖收轮(①③判定照常)
var rng_c = load("res://core/rng_service.gd").new()
rng_c.set_master_seed(20260919)
@@ -420,6 +420,8 @@ var _db
func _init() -> void:
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:362 (结算接线同种子逐项 golden 对拍组)
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:134 受理零兑付、改判路径死——流水零「奖励作废(封印格直接挖开)」行、
# 同种子驱动序 golden 实测零漂移零重录(挖封印格被拒——驱动序不含该路径)〔封印改 V6〕
_db = ConfigDBScript.new()
var load_ok: bool = _db.load_tables("res://data/tables", true)
Kit.check("前置:表加载零 error", load_ok and _db.diagnostics_count("error") == 0)