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:
1 parent
4e004cd832
commit
05509d3e61
3 files changed
+21
-10
No files matched your search
@@ -68,11 +68,11 @@ entities:
|
||||
owner: design/gdd/systems/排雷循环/行动经济.md
|
||||
attributes:
|
||||
table: ActionEconomyTable(数据配置 承载,单行全局;行动经济 为回填 owner;2026-09-07 三次回填(RAP 结构修订)——四字段删除 + rap_refresh_cost 新增,见 行动经济 Schema 定稿节)
|
||||
ap_per_round: 8(原型 v2 定稿,12 点已否决;双重身份:节奏 knob 兼停手 RAP 转存规模)
|
||||
ap_per_round: 6(2026-09-16 AP 压速批 8→6,用户拍板——无伤通关根因=标旗 rush 单轮兑付吞吐,AP 削均值为主阀门;原型 v2 定稿 8,12 点已否决;双重身份:节奏 knob 兼停手 RAP 转存规模;不够再降 4 待观察)
|
||||
dig_ap_cost: 1(连锁展开免费,计入清图进度)
|
||||
flag_place_ap_cost: 1(旗无实物资源/无数量上限——2026-09-07 用户修订,稀缺性由 AP 承载;限小人 8 向相邻)
|
||||
flag_pull_ap_cost: 1(移除棋盘标记、无返还物——OQ2 待原型补丁复核,knob 落点)
|
||||
rap_refresh_cost: 8(RAP 刷新门槛;默认 = ap_per_round,满停一轮 = 恰好一刷基线节拍)
|
||||
rap_refresh_cost: 6(2026-09-16 随 ap_per_round 8→6 同批随动,保持"满停一轮 = 恰好一刷基线节拍"耦合;解耦须单独立批)
|
||||
move_ap_cost: 0(冻结:P4 探索氛围承载,非经济杠杆)
|
||||
chain_ap_cost: 0(冻结:v2 定稿)
|
||||
rap_rules: RAP = 停手剩余 AP 1:1 转存(结构,非 knob);战斗域生命周期(battle_over 清零,跨轮跨图保留);来源唯一(停手)、支出唯一(刷新);刷新决策主体 = 玩家发起、挖掘期(Active 相位)当场换图——HUD框架 经组合根/战斗结算 refresh_board 编排调用(2026-09-12 音频 修订:原"结算编排期 Waiting 代理调用"退役);每轮上限 2 次(refresh_cap_per_round 结构位默认 2——HUD框架 提案采纳,RoundStart 重置;原"同一 Waiting 相位多次刷新合法/无结构上限"作废);旧板旗随旧板作废(零兑付、旗 AP 不返还——排雷玩法 EC11 承载);挖掘期当场刷新无结算发生(原"敌方时间税"自惩失效——行动经济 OQ3 阈值联动复核);cleared 轮恒 new_board、stopped/ap_exhausted 轮恒 same_board(战斗结算 回发违约 fail-fast 不变);刷新图不产生清图奖励;无战斗收益——原 ×2/×1 折算与 stop/clear_multiplier 已作废(2026-09-07 用户拍板)
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in new issue
Block a user