feat(slice): AP 压速批 8→6——标旗 rush 单轮兑付吞吐主阀门

- action_economy.tres: ap_per_round 8→6;rap_refresh_cost 8→6 随动,保持「满预算停手 = 恰好一刷」耦合不变式(解耦须单独立批)
- smoke_all.gd: 旗回归与轮内刷新两处断言改表驱动(不再写死 AP 值,压速批后自动适配)
- registry: action_economy 条目两值同步并批注(不够再降 4 待观察)
- 根因口径:无伤通关 = 标旗 rush 单轮堆满正向兑付;减伤幅度下调与护甲等级 AC+1 换装未动(见 06 清单)
- 冒烟 211/211 复跑通过(提交前本机验证)
This commit is contained in:
DKChan committed 2026-09-16 05:16:17 +08:00
1 parent 4e004cd832
commit 05509d3e61
3 files changed
+21 -10

No files matched your search

@@ -4,11 +4,20 @@
[resource]
script = ExtResource("1")
ap_per_round = 8
ap_per_round = 6
dig_ap_cost = 1
flag_place_ap_cost = 1
flag_pull_ap_cost = 1
rap_refresh_cost = 8
rap_refresh_cost = 6
refresh_max_per_round = 2
move_ap_cost = 0
chain_ap_cost = 0
; AP 压速批(2026-09-16 用户拍板):ap_per_round 8→6——无伤通关根因诊断(playtest_5678/1234 实录:
; 第 1 轮 8 AP 全标旗 = 8 份正向兑付 + 16 魔法充能,减伤/削弱单轮堆满 → "被减伤归零"零承伤通关)
; 的主阀门:削每轮兑付吞吐(标旗 rush 墙/归零轮覆盖率 ~50%→~35%)。单格兑付语义零改动(保留标中旗
; 正向兑付——雷格/安全格概率差异化设计的前提)。rap_refresh_cost 8→6 随动 = 保持 registry 登记
; "默认 = ap_per_round,满停一轮 = 恰好一刷基线节拍"耦合不变式;若有意解耦(刷新相对变贵推清图)
; 须单独立批。减伤幅度下调(-30 → 下调)为同根因配套项,待用户拍板数值后另行落表;
; 终局方案 = 减伤换装护甲等级 AC+1(随 AC 掷点定稿批 EV 中性换装)。
; 观察口径:AP 6 不够再降 4(墙覆盖率 ~19%,代价 = 12×12 板挖掘节奏拖长)。
@@ -139,8 +139,9 @@ func _smoke_flag_ap_exhausted() -> void:
settlement.round_started.connect(func(ri): rounds.append(ri))
check(settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp)}), "回归战斗启动(Boss 行——D0 20HP 级会被盲挖粉尘秒杀,无法承载旗回归场景)")
var minesweeper = settlement.minesweeper
# 恰花 7 点 AP 挖掘,留末点给旗
for i in range(7):
# 恰花 (AP-1) 点挖掘,留末点给旗(表驱动——2026-09-16 AP 压速批 8→6 不再写死)
var ap_total: int = int(_db.action_economy.ap_per_round)
for i in range(ap_total - 1):
if settlement.action_economy.phase != "Active" or settlement.action_economy.ap == 0:
break
var plan = AutoPlayer.choose_dig(minesweeper)
@@ -149,7 +150,7 @@ func _smoke_flag_ap_exhausted() -> void:
if plan.hero_cell != minesweeper.hero_pos():
minesweeper.settle_batch([{"action": "move", "cell": plan.hero_cell}])
minesweeper.settle_batch([{"action": "dig", "cell": plan.dig_cell}])
check(settlement.action_economy.phase == "Active" and settlement.action_economy.ap == 1, "7 次挖掘后恰剩 1 AP(phase=%s ap=%d)" % [str(settlement.action_economy.phase), settlement.action_economy.ap])
check(settlement.action_economy.phase == "Active" and settlement.action_economy.ap == 1, "%d 次挖掘后恰剩 1 AP(phase=%s ap=%d)" % [ap_total - 1, str(settlement.action_economy.phase), settlement.action_economy.ap])
# 末点 AP 花在插旗——轮次必须终结并结算进入第 2 轮
# 旗目标 = 挖掘策略的下一目标格(构造保证:未开、与小人邻接——先把小人移到其邻接已开格)
var plan2 = AutoPlayer.choose_dig(minesweeper)
@@ -435,10 +436,11 @@ func _smoke_active_refresh() -> void:
ct["waiting_refresh_rejected"] = not settlement.player_request_refresh())
check(settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp)}), "轮内刷新战斗启动(Boss 行 150HP——承载多轮样本)")
var minesweeper = settlement.minesweeper
# 轮 1–3:零挖掘停手攒 RAP 24(每轮 8 AP 全转存)
# 轮 1–3:零挖掘停手攒 RAP = 3×AP(每轮全转存;表驱动——2026-09-16 AP 压速批 8→6 不再写死)
for i in range(3):
minesweeper.settle_batch([{"action": "stop"}])
check(settlement.round_index == 4 and settlement.action_economy.rap == 24, "三轮停手攒 RAP=24(round=%d rap=%d)" % [settlement.round_index, settlement.action_economy.rap])
var rap_banked: int = 3 * int(_db.action_economy.ap_per_round)
check(settlement.round_index == 4 and settlement.action_economy.rap == rap_banked, "三轮停手攒 RAP=%d(round=%d rap=%d)" % [rap_banked, settlement.round_index, settlement.action_economy.rap])
check(settlement.action_economy.phase == "Active", "第 4 轮 Active 相位")
# 挖 1 格 → 刷 → 挖 1 格 → 刷 → 挖 1 格 → 第 3 刷拒(上限)
var plan = AutoPlayer.choose_dig(minesweeper)
@@ -451,7 +453,7 @@ func _smoke_active_refresh() -> void:
var ok1: bool = settlement.player_request_refresh()
check(ok1, "轮内第 1 次刷新受理")
check(settlement.action_economy.phase == "Active" and settlement.action_economy.ap == ap_before, "相位保持 Active、AP 保留不重置(ap=%d)" % settlement.action_economy.ap)
check(settlement.action_economy.rap == 16, "RAP -8(%d)" % settlement.action_economy.rap)
check(settlement.action_economy.rap == rap_banked - int(_db.action_economy.rap_refresh_cost), "RAP -刷新价(%d)" % settlement.action_economy.rap)
check(int(ct["board_swaps"]) == swaps_before + 1 and minesweeper.current_board() != board_before, "当场换新图(board_changed +1)")
var plan2 = AutoPlayer.choose_dig(minesweeper)
if plan2.hero_cell != minesweeper.hero_pos():