diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index 17461eca..412fd9b7 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -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 用户拍板) diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/action_economy.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/action_economy.tres index faf31620..d9eea51f 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/action_economy.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/action_economy.tres @@ -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 板挖掘节奏拖长)。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd index 7966d925..fb51a39e 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd @@ -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():