Files
gplan-2/design/gdd/b1-settlement.md
T
2026-09-14 18:18:49 +08:00

693 lines
99 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# B1 战斗结算规则(Combat Settlement Rules)
> **状态**:Designed · **版本**:v2 · 2026-09-14
> **一句话**:B1 把每轮扫雷的结果逐行兑现为战斗结果,并判定胜负。
> **推演件**:`design/gdd/analysis/b1-settlement.md`(本文件只收结论,理由在那里)
> **承载支柱**:P2 主("扫雷的因、战斗的果"的兑现面)· P3(雷的双面兑付)· P1(条款③掌控感的经济侧验收)
## 设计目的
战斗域编排与结算中枢、轮次生命周期唯一 owner。少了它,扫雷每一格的结果没有战斗兑付面,"扫雷的因、战斗的果"无从兑现。
1. 玩家能在结算明细里逐行看到每行来自哪格/哪旗/哪雷(P2"都是我算出来的");无来源行 = 断言失败。
2. 挖掘决策的风险不等式与"推到底"支配性由本系统闭合签字(P1"挖下去值得")。
3. 敌方伏击行与标中旗削弱行同框、同呈现语言(P3"赌桌不是陷阱")。
4. 完美排雷双份兑付、标中旗行高光("完美被加倍兑现")。
## 系统范围
负责:
- 轮次编排:战斗开始序列、每轮七段结算、出口分发(继续/换图/挖掘期刷新/战斗结束/关卡结束)
- 结算触发与段序;伤害消费侧语义(池合成、clamp、溢杀、死亡判定时机)
- 明细流水协议(13 类行 + 字段分层)——呈现/回放/导出共读的唯一数据源
- 统一当量换算(F1)、乘区/地板/取整语义(F2)、clamp/溢杀/死亡判定数值边界(F3)、条款③⑤闭合判据与配对口径(F4/F5)、伤害A/B 充能与甲效结算(F6)、明细行协议的数值字段
- 上游义务账本(B3×8 / B2×6 / A2×3 / B4×6);A3 条款①②③⑤闭合签字
不负责:
- 单位状态、hp 递减与 floor 0、Dead 翻转、指针冻结(B2)
- 状态实例 L×m 合成——B3 原样输出不 clamp,B1 只做池 clamp 收口(B3)
- 奖励行值/权重/tier/C 量级与差异化分支(B4/C3);库存内容(B4)
- 行动价目与 RAP 经济(A3);棋盘规则、雷密度/可推理率/雾负担 actuals 分布(A1/A2)
- 敌我表值曲线 atk/hp/cap/unit_count/pattern(C3,B2 行值供给)
- 呈现与交互形态(D1/B5)、音频(D4)、教学(D5)
- 全部 provisional 数值调参(C3);m_w 终值(B4/B1 锚 owner 共裁);P_perfect 数值(C3)
- 清图总预算"够不够"的判、战斗长度/轮数曲线、遭遇构成(A1/A3 契约、C1/C3)
## 核心循环
```
begin_battle(encounter)
│ ① set_reload_gate(true) [D2] 调试门置位
│ ② notify_battle_start() [B3] 容器开域
│ ③ encounter 骰 [RngService] unit_count 区间均匀骰定本战实际数量(封闭流,恰一 scope)
│ ④ spawn(L, D, hero_hp, n) [B2] 行值快照实例化(n = 实际数量 override;定值行 n = unit_count)
│ ⑤ install_board + roll_board [A2/B4] 恰一次;资格格清单 = S ∖ R₀
│ ⑥ notify_round_start() [A3] → Active
▼
RoundActive(挖掘期,B1 只缓冲事件流)
▼
轮末触发:Waiting 相位编排点(只读 A3 相位观测量,不依赖事件到达序)
▼
①授予段 ──── cell_revealed 批 → flag_judged 批 → 清图奖励(仅 cleared 轮)
▼
②道具使用窗口 ─ 玩家至多选一件或跳过(全流程唯一玩家输入点)
▼
③增益/减益段 ─ query_active 双侧读值 → 语义映射 → 效果明细行
▼
④道具段 ───── 伤害道具:恒定表值打 default_target;治疗包:clamp 回复
▼
⑤战斗段 ───── 主角先手攻击(D_hero 三分量——F3⓪/F6)→ 逐存活敌(行主序):query_attack → apply_damage → advance
│ ※ hero hp=0 → 立即短路,剩余敌不作用,直入 ⑦
▼
⑥衰减段 ───── decay_round() 恰一次(含末轮;先兑付后衰减的时序契约)
▼
⑦判定段 ───── hero hp=0 → 失败 │ 存活敌=∅ → 胜利 │ 否则 → 下一轮
```
| 结局 | 触发 | 动作序列 | 约束 |
|---|---|---|---|
| 继续 | 判定=下一轮 | `notify_settlement_done(same_board)` → `notify_round_start()` | 同图续轮 |
| 换图 | cleared 轮 | `retire_board` → `retire_mapping` → A1 `generate` → `install_board` → `roll_board` 恰一次 → `notify_settlement_done(new_board)` → `notify_round_start()` | stopped/ap_exhausted 恒 same_board,违约 fail-fast |
| 挖掘期刷新 | 玩家经 D1 发起 | A3 `request_refresh` 扣费 → 换图全序(无结算段、无 round_end、轮次不终结) | RAP 不足→拒绝上抛;**每轮 cap 2(RoundStart 重置)**——与 A3 `refresh_cap_per_round` / registry `rap_rules` / D1 同口径,非"每图";刷新图无清图奖励 |
| 战斗结束 | 判定=胜/负 | `retire_mapping` → `despawn_all` → `notify_battle_end` → `notify_combat_end` → `set_reload_gate(false)` | 库存不清(关内延续) |
| 关卡结束 | 上层显式调用 | `clear_inventory()` 恰一次,清空前快照计数返回 | victory/defeat 皆然 |
## 编排与触发
### 状态
| 状态 | 进入条件 | 行为/出口 |
|---|---|---|
| Uninit | 冷启动 / 清理完成 | 唯一出口 `begin_battle` |
| BattleSetup | `begin_battle` 受理 | 战斗开始序列;任一步拒绝 = fail-fast 上抛 |
| RoundActive | `notify_round_start` | 不干预挖掘,只缓冲事件流 |
| RoundWaiting | 轮次结束事务达成 | 执行七段结算;窗口段为唯一玩家输入点 |
| BattleOver | 判定段产胜负 | 战斗结束序列 → Uninit |
编排不变式:
- 同一时刻至多一个结算事务在飞(窗口为事务内暂停点非并发入口)。
- 段序恒全序执行(战斗段短路是段内规则非跳段)。
- 全部跨系统调用集中在 B1——任一下游被 B1 以外调用 = 架构违约(AC-43 静态扫描域)。
### 规则
- **规则 1**:B1 一家发起战斗域全部跨系统调用,B2/B3/B4 相互零直调,绕过 = 架构违约;结算本体三约束 = 零随机、零 UI 依赖、禁 await。唯一随机例外 = 战斗开始 encounter 骰(unit_count 区间均匀骰、封闭流恰一 scope,在结算步骤流之外,可回放性不受影响);将来结算本身若需随机数,必须走数据层新增增流通道并过评审(通道定义见 D2 Rule 5 与 D2 流枚举 encounter)。
- **规则 2**:每轮挖掘结束、回合状态机进入轮末等待相位时,B1 自动发起一次整轮结算;触发只读 A3 相位读数与 last_round_end 标记,不依赖事件到达序;事件订阅 vs 相位轮询留实现期 ADR。
- **规则 3**:挖掘期挖格/插旗事件不立即兑奖,按轮进缓冲区,轮末按 A2 事件规范序统一转化;每条事实从记录到授予恰好处理一次——B3 不去重、B4 幂等仅兜底,正常路径不重复发奖不漏发。
- **规则 4**:每轮结算严格按 ①授予→②道具使用窗口→③增益/减益→④道具→⑤战斗→⑥衰减→⑦判定 全序执行;核心相对次序 = 增益/减益先于道具、道具先于战斗;段序结构冻结(改须走 GDD 修订,不属于调参);窗口每次选择是回放输入的一部分;段序常量存 SettlementTable `segment_order`,加载期恒等断言。
- **规则 16**:结算用到的全部数值(当量、clamp 界、乘数、段序常量)都在 SettlementTable,B1 代码零数值字面量,调数值只改表不动代码;战斗开始 B1 落下热重载闸门、战斗结束抬起(B1 是唯一调用方),战斗中途的热重载请求被闸门拒绝。
设计意图:编排唯一 + 触发只读相位 + 段序冻结,是可回放性与跨系统归因的结构前提。
## 授予与高光
### 规则
- **规则 5**:授予段把挖掘期缓冲的事实分三批兑换,每格受理、每雷转化、每旗判定恰好一次:①挖格批——踩雷格逐颗转化为敌方伏击强化,带奖励资格的安全格按类别分流兑付;②旗判定批——判中 → 敌方削弱当轮生效(每颗雷资格只兑一次),判空 → 零兑付只记"标旗未中"归因行;③清图批——清图奖励恰好发一次,全板零误标且有标中 → 追加第二份同身份兑付。兑付数值读 D2 表值、无新公式。
- **规则 6**:挖开雷格时 B1 向 B2 请求一次伏击授予计划 `ambush_grant_plan(mines_r, cap)`,恰一次调用;granted = min(mines_r, cap),超出的雷不生效只记"溢出未生效"行(含来源);伏击聚成一个池,同一结算多个敌人攻击读同一池值——共享、不均分也不消耗;伏击只活一轮,轮末随衰减清零。
- **规则 7**:道具使用窗口是全流程唯一玩家输入点;窗口清单 = B4 库存投影 + B1 逐件可用性守卫预判;玩家至多选一件或跳过,空库存可整体不弹窗;完整选择序列(含跳过)记入回放;一次提交多件 → 只受理第一件、其余退回并记编排违例诊断。
- **规则 13**:授予段埋两个强制高光检查点(见下表),条件满足必须兑现;呈现分工 = 事件型高光(完美排雷)发独立高光行,属性型强调(标中旗、清图奖励)用行字段标记。
| 窗口里看到 | 能否选用 |
|---|---|
| 伤害类道具 | 恒可选(结构前提 = 窗口只在仍有存活敌的轮打开) |
| 治疗包 | 满血禁选;未满血可选 |
| 空库存 | 可整体不弹窗,按跳过记 |
### 规则 5 实现参照——三批转化
| 批 | 输入 | 转化 | 产出 |
|---|---|---|---|
| cell_revealed | `kind=mine` | 调 `ambush_grant_plan(mines_r, cap)`,事件规范序逐颗 `apply_effect(ambush, source={mine_hit, origin_cell, round_index})` | 伏击池 L;溢出颗产"溢出未生效"行(含来源) |
| cell_revealed | `kind=safe ∧ reward_eligible` | 按 category 分流(见下方奖励分流表) | 每格受理恰一次(B4 幂等仅兜底) |
| flag_judged | `hit=true` 且该雷实例资格未消费 | `apply_effect(weaken, source={flag_hit, origin_cell, round_index})` + 资格消费入集合 | 标中旗兑付行(highlight=`flag_hit`) |
| flag_judged | `hit=true` 且资格已消费 | 去重跳过(资格以雷格实例为键、跨轮累积;换图后新实例自然重置) | 零新增行(+debug 诊断可选) |
| flag_judged | `hit=false` | 零兑付;每雷实例一次去重(A2 逐轮重报零新增行,防惩罚轰炸) | "标旗未中"零值行(source=`flag_miss`、highlight=`perfect_broken`) |
| cleared 轮 | — | `grant_clear()` 恰一次;完美板(零误标 ∧ ≥1 标中)追加第二份同身份兑付(走既有授予通道) | 清图奖励行;完美高光行 |
### 规则 5 实现参照——奖励分流
| category | 兑付方式 | 拒绝语义 |
|---|---|---|
| buff | `apply_effect`(入池,结算段生效) | 满层 → "奖励未生效"行(可聚合计数),无折算 |
| instant_aoe | 全体存活敌各 `power` 点(逐个 apply_damage、受击即死) | 当场兑付,不进库存不出窗口 |
| instant_heal | 主角回复 `power`(clamp) | 满血 → "奖励未生效"行零兑付 |
| damage_item / heal_pack | `stock()` 入关卡域库存 | 窗口选用时兑付 |
- `reward_eligible=false`(initial 通道)格不入奖励库——B1 判定只读 reward_eligible、`channel` 字段零特判;连锁批量授予溢出 = 显式接受(无转换补偿)。
- 标错惩罚未上线——标旗未中行是归因痕迹非惩罚;预留语义走接口漂移补(A2 实测后)。
### 规则 13 实现参照——高光兑现节点(强制检查点)
| 节点 | 判定 | 兑付 | 呈现 |
|---|---|---|---|
| #2 完美排雷(perfect_sweep) | 板级谓词:本板自 install 起全部 flag_judged 中 hit=false 计数 = 0 ∧ hit=true ≥ 1(雾内插旗计入误标、零特判;计数随 install 重置) | 清图奖励身份第二份兑付:道具类 → `stock(同源身份快照)` 第二次;buff 类 → `apply_effect(同身份)` 第二次(满层拒绝照旧);`grant_clear` 本身仍恰一次;当量 = power × P_perfect ÷ 100(载体域 {100, 200}) | 独立高光行,value = 实际有效兑付(首份 + 第二份被接受部分)、禁记名义值;首份即零兑付 → 高光行不发(完美谓词仍成立) |
| #3 标中旗高光 | hit=true 且资格未消费(授予段判定) | weaken 当轮即兑付(dur=1 本就当轮生效)——chord 缺席的节拍缺失以"当轮兑付 + 明细强调"组合补偿 | 兑付行 highlight=`flag_hit` 字段标记;深度形态(即时 HUD 动画)归 D1/垂直切片 |
设计意图:每格事实恰一次兑付 + 双高光强制检查点,是"扫雷的因"在战斗里可见可归因的兑付面。
## 合成、道具与战斗
### 规则
- **规则 8**:增益/减益段把主角与敌人身上活跃效果一次性合成——从 B3 读两侧活跃效果,按 SettlementTable 语义映射换算成各自修正池并池内加算,供道具段与战斗段使用;每条效果按授予流水逐条记明细行并标注来源授予;敌方侧减益作用于全体存活敌人(side-wide)。
- **规则 9**:道具段执行窗口选中件:伤害道具按表恒定值打默认目标(顺位最前存活敌人),不吃任何池修正;治疗包按表值回复、超出上限 clamp(归 B1 执行);满血使用治疗包 → 拒绝、不消耗;施加时已无存活目标 → 照常消耗、记"已消耗未生效"行(存活判定读 B2 存活集)。
- **规则 10**:战斗段主角先攻击一次(D_hero 三分量——F3⓪/F6),再按行序逐个存活敌人行动:每个敌人依次走 query_attack → apply_damage → advance 三步、恰好推进一次,主角不在推进范围;已死敌人不再行动;主角中途倒下 → 剩余敌人全部停手、直接跳到判定段;伏击池共享读值、多敌攻击互不消耗。
- **规则 11**:衰减段调用一次 `decay_round()`,把到期临时效果移除并记衰减行;每轮恒定恰好一次,末轮也照跑——"先兑付清图奖励、后衰减"的时序契约由段序保证;容器已空时衰减返回零属合法结果(零明细行)。
- **规则 12**:判定段防御性顺序——先判主角是否倒下(倒下即失败),再判存活敌人是否清空(清空即胜利),都不满足回发"继续"进下一轮;判定结果写成终局判定行(同时是胜负画面的数据锚)。
设计意图:先合成后动刀、主角先手、hero 先判——三步防御性次序让任何结局都可归因。
### F2 percent→乘数换算与合成地板(B3 义务③收口)
**结论**:池内加算 → 每池独立 clamp [−100, +100] → 池间乘算 → floor 单一取整(结构性非 knob);免伤轮(D'=0)是合法设计态——不调 apply_damage、产零值伤害行;Output Range D' ∈ [0, ∞) 整数、零负值分支,MVP 实际域 [0, 20](B2 参考带)。
```
结算语义映射(effect_pool_map,effect_id 为键):
attack_up → hero_offense(只乘主角先手攻击基础分量)· defense_up → hero_defense
weaken → enemy_output · ambush → flat 附加(后置加法、不入乘区)
敌→主单伤害实例(每结算、逐攻击行为):
P_pool = Σ(同池实例 L×m);P_pool ← clamp(P_pool, −100, +100);M_pool = 1 + P_pool ÷ 100(域 [0, 2])
D' = floor( D_raw × M_hero_defense × M_enemy_output )
(整数域 = D_raw × (100+P_h) × (100+P_e) ÷ 10000 向下取整)
D_raw = query_attack(u, L, m_amb).total(charge 拍 = 0;乘区作用于含伏击分量的全裸伤害)
```
| 例 | 合成值 | 池 clamp 后 | 乘数 | 读法 |
|---|---|---|---|---|
| weaken AP 界(L=8 × m_w,修订后 65) | −520% | −100 | **0** | 该结算全体存活敌输出归零;第 3–8 层边际瞬时当量 = 0(地板吸收)——明细行如实显示合成值与终值两端 |
| weaken 表界(L=16 × m_w) | −1040% | −100 | **0** | 同上——地板规则不区分越域来源,越域深度仅入合成值显示与诊断计数 |
| defense_up 叠满(L=2 × m_d,现行 −30) | −60% | −60(域内,未触地板) | **0.4** | 该结算 hero 承伤按 0.4× 结算——免伤轮不再由 defense_up 单侧可达 |
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total 分量(charge 拍恒 0) |
| 池合成值 | P_pool | int(pp) | 越域可达 ±1040(修订后);clamp 后 [−100, +100] | B3 原样输出 → B1 clamp 收口 |
| 池乘数 | M_pool | 有理数 | [0, 2] | 1 + P_pool/100 |
| 终值 | D' | int | [0, D_raw × 4](结构上界,MVP 不可达) | floor 取整 |
归口:B3 管 L×m 原样输出不 clamp;B1 管池归属映射、clamp、乘区次序、取整方向;C3 管池值强度评估。
### F3 伤害合成、clamp/溢杀与死亡判定(B2 义务③成文)
**结论**:三分支全序(主角先手 → 逐敌循环 → 道具段)+ 负值分支禁令(零负伤害/负治疗/负当量)+ 死亡判定:Dead ⇔ hp=0(无负 hp 中间态)、受击即死、hero 死亡战斗段短路、判定段 hero 先判;Output Range 双向伤害 D ∈ [0, ∞)、hp ∈ [0, max_hp]、零转移零存续。
```
⓪ 主→敌(战斗段段首,主角先手攻击——基础攻击恒存在〔HeroTable.atk 域 [1,999]、0 加载拒绝〕):
目标 = B2 default_target()(固定顺位最前存活敌——与道具段同源)
D_hero_raw = HeroTable.atk ×(1 + attack_up 载荷) + F6 充能分量
D_hero = 三分量逐项 floor 后相加(基础分量经 hero_offense 池 clamp 地板——F2);D_hero = 0 → 零值伤害行
D_hero > 0 → apply_damage(target, D_hero);hp 归 0 → Dead(受击即死)
明细行 source_class = hero_attack;存活敌清空 → 敌方循环空转(零行动行),径入衰减段
① 敌→主(逐存活敌,行主序;调用序钉死 query_attack → apply_damage → advance):
D_raw = query_attack(u, L, m_amb).total(L = 本结算伏击池读值;charge 拍 = 0)
D' = F2 换算;D' = 0 → 不调 apply_damage,产零值伤害行(分量二元组 + 终值 0)
D' > 0 → apply_damage(hero, D');hp' = max(hp − D', 0)
溢杀部分(D' − 受击前 hp)丢弃——无存续、无转移、无负 hp 态
hero hp' = 0 → 战斗段立即短路(剩余敌不作用、不产行动明细行)
② 主→敌(道具段,窗口选定件——至多一件,单件制):
D = power(恒定表值,不吃任何 percent 修正;零乘区);目标 = B2 default_target()(死亡后顺延)
apply_damage(u, power);hp 归 0 → Dead;溢杀丢弃、不转移下一敌
施加时已无存活敌 → 照常消耗(Used 不可逆)+ "已消耗未生效"明细行
③ 负值分支禁令:任何公式分支不得产生负伤害/负治疗/负当量——percent 池地板 [−100, +100]、
flat 值 ≥ 0、hp ∈ [0, max_hp]、治疗 clamp 上界 max_hp(hp' = min(hp + power, max_hp))、
apply_damage 入参 n ≤ 0 = B2 API 拒绝 + 诊断
④ 死亡判定数值边界:Dead ⇔ hp = 0(无负 hp 中间态);时机 = 受击即时(敌)/ 战斗段短路(hero);
判定段 = 防御性优先级 hero 先判(双死结构不可达的纵深防御)
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total;分量二元组 {baseline, attach} 进伤害行(P2 归因) |
| 乘区终值 | D' | int | [0, ∞) | F2 输出;floor 取整 |
| 目标 hp | hp | int | [0, max_hp] | B2 单位状态;递减与 floor 由 B2 承载 |
| 道具威力 | power | int | [1, 999] | RewardTable 授予时快照(恒定) |
| 溢杀量 | — | int | [0, D') | 丢弃(明细行 value = D'、击杀标记布尔——不记溢出量) |
归口:B2 管递减/floor 0/Dead 翻转/指针冻结;B1 管本式全序、调用序、零值行、溢杀丢弃语义、死亡判定时机。
### F6 伤害A/B 充能与护甲克制结算(机制与结算归 B1,四字段数值投值归 C3)
**结论**:伤害A/B 为挖掘期充能、战斗段主角先手攻击一次性消费的 flat 附加分量——池内加算、不吃任何 percent 修正、逐分量查 `armor_effectiveness` 甲效表后 floor 相加;充能池单轮生命周期(挖掘期累积 → 本轮战斗段消费 → 轮末归零,跨轮零存量);Output Range D_hero ∈ [0, ∞) 整数、零负值分支。
```
累积(B1 facts 缓冲承载——零新事件、零特判):
A 池 = min(本轮 cell_revealed{kind=safe} 事件数 × damage_a_per_cell, damage_a_cap)
(initial/chain/dig 全通道同待遇;cap=0 = 不封顶结构位;damage_a_per_cell=0 = 机制关闭合法极端)
B 池 = 本轮 flag_judged{hit=true ∧ 资格未消费} 事件数 × damage_b_per_flag
(与 weaken 兑付同源判定、每雷实例一次去重;无 cap 字段——标中旗吞吐由 AP 预算天然限界)
消费(战斗段主角先手攻击,单结算一次性清池):
base = floor( atk × (1 + clamp(P_hero_offense, −100, +100)/100) )
dmg_a = floor( A 池 × 甲效[dmg_a][target.armor_type] ÷ 100 )
dmg_b = floor( B 池 × 甲效[dmg_b][target.armor_type] ÷ 100 )
D_hero = base + dmg_a + dmg_b
甲效表键集 {base, dmg_a, dmg_b} × {none, a, b} 结构冻结;armor_type 映射归 EnemyTable
轮末:A/B 池清零(与 decay 段同拍——跨轮零存量)
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| A 池 / B 池 | — | int | [0, damage_a_cap] / [0, ∞) | 本轮充能池读值(B1 自持,公开可读——P2 还原面) |
| 伤害A 三参数 | damage_a_per_cell / damage_a_cap | int ≥ 0 | 默认 1 / 8(provisional 归 C3) | SettlementTable knob;cap=0 = 不封顶 |
| 伤害B 参数 | damage_b_per_flag | int ≥ 0 | 默认 2(provisional 归 C3) | SettlementTable knob |
| 甲效值 | e | int percent | {50, 100, 150}(现行默认矩阵取值域) | armor_effectiveness 查表;base 行恒 100 |
- cap 截断腿:连锁轮 A 池溢出零充能、无"溢出未生效"行(充能非奖励、无兑付语义),截断仅入诊断计数。
- P2 归因:明细行 = hero 伤害行分量二元组 {baseline = 基础分量, attach = dmg_a + dmg_b 合计}(A/B 拆分经充能池公开读值可还原);A 池来源 = 开格、B 池来源 = 首次标中旗(与 weaken 同判定批)。
## 当量换算与条款闭合
### 术语表
| 术语 | 白话定义 |
|---|---|
| 乘区 | 伤害公式里相乘的各段修正(本作两段:主角减伤池 × 敌方削弱池) |
| 池 | 同一侧百分比修正的加总桶 |
| 地板 | 数值不许越过的下界——本节地板 = 池最低 −100 百分点,即乘数最低 0 |
| 免伤轮 | 主角该结算受到的伤害为 0 的结算 |
| 充能池 | 伤害A/B 的单轮加法分量来源——开格/首次标中雷按表值累积、战斗段主角先手攻击一次性消费、轮末清零 |
| 溢杀 | 一刀超出目标剩余 HP 的部分——直接丢弃,不转移到下一个敌人 |
| 当量 | 统一价值单位,1 当量 = 1 点主角 HP 的期望净变化 |
| 瞬时口径 | 只数一个结算里兑现的价值(裁决口径) |
| 全寿命口径 | 乘上它存活的结算次数(仅作派生量,不作锚) |
| 残余盲猜端 | 图上推理不出、只能赌的那一小块 |
| 完美排雷(P_perfect) | 一张板上没插错一面旗、且至少标中一面时,清图奖励翻倍的乘数 |
| 挖穿计价 | 把残余盲猜区全部安全格挖完时平均会踩到多少雷——按雷与安全格在池中均匀随机交错计算,不是每挖一格按初始比例独立重赌 |
### F0 当量归一口径(weaken 锚裁决)
- **结论**:采用"每结算瞬时当量"口径(每 AP 总暴露分支排除);m_w 值域 [60, 85]、默认 −65;地板交叉层数 = ⌈100/m_w⌉ = 2(值域全域恒 2);B4 参照零漂移,B3 仅行值域修订(registry 回写)。
- 连带:F2 越域界 = AP 界 8×m_w / 表界 16×m_w(合成值 B3 原样输出、B1 池 clamp 收口);单结算 weaken 池 HP 当量上界 = min(L×m_w, 100)/100 × D_inst(该结算实际裸伤害敞口)。
- 修订效果量(provisional @ D_ref=12):腿一 7.8 vs 6.0 HP/结算(attack_up 当量,+30%,严格大于 ✓);腿二 7.8 vs E_dig 4.5 HP(+73% ✓);池内字面最低档读法(defense_up 3.6)裕度 2.17×。
### F1 效果档位当量对照表(A3 条款①)
**结论**:单一线性换算全四源共用(分源改率 = 条款①契约违约);E(·) 单位 = 主角 HP 点;Output Range E ∈ [0, +∞)、全表零负值(percent 池饱和后边际 E = 0);weaken 修订后每旗 7.8 HP > defense_up 6.0(条款②腿一通过)。
```
flat / 道具类(刀、治疗包、ambush): E = 值本身(ambush 按 k 个攻击拍线性展开)
percent 类(每结算、每层): E_inst = |L × m| ÷ 100 × D_exp(对照表取参考敞口 D_ref)
完美乘数(显式 ÷100,运行时真实双份载体): E_clear(perfect) = power × P_perfect ÷ 100
时长(显式乘子,非分源改率): E_life = E_inst × 兑付结算数
D_ref = SettlementTable.equivalence_ref_damage(单行全局 knob,provisional 默认 12)
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 参考敞口 | D_ref | int | [1, 999] | SettlementTable 配置值(D2 回写义务,本 GDD owner);provisional 12;变更触发全对照表 + 条款③⑤重跑 |
| 层数 | L | int | [1, max_stack] | B3 实例字段(授予快照) |
| 行值 | m | int | percent ∈ [−100,100]∧≠0 / flat ≥ 1 | StatusEffectTable 行值快照 |
| 兑付结算数 | — | int | [1, duration_settlements] | 剩余结算次数轨迹;对照表按满寿命取 |
| 道具威力 | power | int | [1, 999] | RewardTable 行值快照(恒定表值——已锁) |
| 攻击拍数 | k | int | [0, unit_count] | 该结算存活敌中 attack/heavy 拍单位数(B2 F4 供给,确定性可算) |
| 完美乘数 | P_perfect | percent | **{100, 200}**(域外加载致命) | SettlementTable 配置值;provisional 200(换算入账恒 ÷100) |
| 行 | 源(source_class) | 类别 | 换算式 | E_inst(每结算/层) | 全寿命 E | 注 |
|---|---|---|---|---|---|---|
| defense_up_basic | safe_cell | buff → defense_up | E_inst = 0.30 × D_ref;E_life = ×duration 1 | **3.6** | **3.6** | 池内字面最低档 buff 当量(减伤墙批 −30 现行值) |
| attack_up_basic | safe_cell | buff → hero_offense | E_inst = 0.50 × D_ref | **6.0** | 6.0 | **锚对照实物(条款②参照对象——registry 回迁口径)**;消费面 = 主角战斗段先手攻击基础分量(F3⓪) |
| spark_aoe | safe_cell | instant_aoe | E = power | —(当场兑付) | 4 | 全体存活敌各 4 点 |
| heal_minor | safe_cell | instant_heal | E = min(power, max_hp − hp) | — | ≤ 4 | clamp 后真实当量;面值 4 = 上界读法 |
| knife_t1 | 注入池(active_inject) | damage_item | E = power | —(库存轨迹量) | 8 | 供给控制器注入——非单格期望摊入 |
| knife_adv | 注入池(active_inject) | damage_item | E = power | — | 16 | 雾档升级刀 |
| heal_pack | 注入池(active_inject) | heal_pack | E = min(power, max_hp − hp) | — | ≤ 12 | 注入池稀缺强治疗 |
| clear_blast | clear_default | instant_aoe | E = power ×(perfect 板 ? P_perfect ÷ 100 : 1) | —(当场兑付) | 40(完美板 80——**真实双份**) | 条款④⑤载体(F5 消费) |
| weaken | flag_hit | debuff → enemy_output | E_inst = m_w/100 × D_ref | 修订后 65 → **7.8** | 7.8(dur=1) | 修订值域/默认见 F0 |
| ambush | mine_hit | 敌方增益(flat) | E = m_amb × k | k=1 → 3;满配 k=3 → 9 | 同左(dur=1 单结算自然边界) | 量纲已定稿(registry `ambush_unit_definition`) |
| 伤害A 充能 | safe_cell(开格——SettlementTable knob,非 RewardTable 行) | flat 附加分量 | E = min(开格数 × damage_a_per_cell, damage_a_cap) × 甲效/100 | 每轮 ≤ 8 × 甲效/100(对甲A 12 / 无甲 8 / 对甲B 4) | 同左(单轮充能单轮消费) | 充能规格见 F6;逐分量查表后 floor |
| 伤害B 充能 | flag_hit(首次标中——与 weaken 同判定批) | flat 附加分量 | E = 首次标中雷数 × damage_b_per_flag × 甲效/100 | 每雷 2 × 甲效/100(对甲B 3 / 无甲 2 / 对甲A 1) | 同左 | 同 F6;"标中旗双收益线"归 W12③ 对账清单 |
- 锚两腿:weaken 修订后每旗 7.8 > attack_up 6.0(严格大于 ✓,裕度 +30%);7.8 ≥ E_dig 4.5 ✓;池内字面最低档 defense_up_basic 3.6 读法裕度 2.17×——三读法均通过。
- 结构性边界:腿二可满足上界 = m_w=100 ↔ 相对每结算百分点档 ≈1.96:1(percent 瞬时档被 schema 域封顶);处置 = C3 板形参数与 m_w 联动约束,非数值修订可解。
- 归口:B1 管本表与换算维护、D_ref 与 P_perfect 承载;B4 管行值/权重/tier/C 供给;C3 管全部 provisional 数值;B3 管 L×m 合成原样输出。
### F4 条款③挖掘风险不等式闭合(B1 单一闭合 owner;B2 义务④兑现)
**结论**:现行值链(duration=1 × m_d=−30 × C3 v3 曲线 d0.25/t0.88)下两参考板形破线(锚行口径 L1 ≈0.48× / L2 ≈0.47×;期望口径 0.60×/0.58× 同向);满配 unit_count=3 深度破线(≈0.16×);旧"通过"回执退役为历史记录;破线升格 C3 默认曲线级约束;actuals p10 交付后强制重跑。
```
配对口径:决策单位 = 单格挖掘;评估点 = 残余盲猜端最坏点(信息端平凡通过,一并登记)
主式:P(安全) × V_safe > P(雷) × V_mine
适用域守卫:(1 − ι) × |S| < 1(残余盲猜集为空)⇒ 主式不评估、信息端平凡腿接管(P(雷) 式在空池退化,禁代入)
P(雷) = |M| ÷ (|M| + (1 − ι) × |S|) (残余盲猜端上界)
P(安全) = 1 − P(雷)
V_safe = E_life(最低档安全格 buff) = (|m_d|/100) × D_ref × duration_d(现行值链:0.30 × 12 × 1 = 3.6)
V_mine = k_max × m_amb = unit_count × m_amb(默认行值 1×3 = 3;cap 溢出使第 cap+1 颗雷边际当量 = 0)
信息端检查(平凡腿):P(安全) = 1 → V_safe > 0 恒成立
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 实际雷数 | \|M\| | int | [1, W×H−9] | A1 产物指标/行参数推导 |
| 安全格数 | \|S\| | int | ≥ min_safe_count | 同上 |
| 可推理率 | ι | float | [0.85, 1] | **actuals p10(A1 F4 报告 C)**——未交付前以行 target 代 = 判式面的保守代理;重跑义务(对账清单 #6) |
| 防御行值/时长 | m_d / duration_d | int / int | −30 / 1(provisional——减伤墙批/两级奖励批现行值) | StatusEffectTable defense_up 行 |
| 参考敞口 | D_ref | int | [1, 999] | provisional 12 → V_safe = 3.6 |
| 伏击量纲/单位数 | m_amb / unit_count | int | 3(provisional)/ [1,3] | B2 行值 |
| 板形 | ι(target 代 p10) | P(雷) | 左臂 = P(安全)×3.6 | 右臂 = P(雷)×3 | 裕度 | 判定 |
|---|---|---|---|---|---|---|
| L1(v3:10×10 d0.25,\|M\|=23,\|S\|=77) | 0.88 | 23/32.24 ≈ 0.713 | 1.03 | 2.14 | **≈0.48×** | **✗ 破线** |
| L2 腿(v3:12×12 d0.25,\|M\|=34,\|S\|=110) | 0.88 | 34/47.2 ≈ 0.720 | 1.01 | 2.16 | **≈0.47×** | **✗ 破线** |
| 满配语境(unit_count=3,V_mine=9,L1 板) | 0.88 | 0.713 | 1.03 | 6.42 | **≈0.16×** | **✗ 破线(深度)** |
- 结论①:现行值链下两参考板形破线——旧"通过"回执(≈2.0×/2.6×,系 duration=2 / m_d=−50 / v1 曲线旧输入产物)失效;信息端平凡腿不变。
- 结论②:满配语境 unit_count=3 深度破线(≈0.16×)——原 C3 调参约束维持并升格(见④)。
- 结论③(敏感性):buff 饱和的结构性零兑付使 V_safe 名义值高估——按 0.6 折减(provisional)复算 L1:左 0.62 vs 右 2.14 → 裕度 ≈0.29×(更薄);折减系数与饱和率随 playtest 重校。
- 结论④(破线升格——曲线级约束):约束升格为**默认曲线的 V_safe 侧杠杆重议**——候选杠杆 = m_d 回调 / duration 恢复跨轮 / D_ref 联动上调 / 板形侧密度×ι 联动对 / m_amb 下调;全部处"禁独立调参"联动网络(m_w↔D_ref↔m_d↔duration_d),修正方向须 C3 提案 + B1 闭合对账共裁。
### F5 条款⑤清图 vs 弃图支配性闭合(B1 单一闭合 owner)
**结论**:条款⑤未闭合——挖穿残余池计价下主判式两态为负(L1 仅完美双份翻正 +11.3,非完美态被支配),实现率折减与多敌语境更差;"推到底"的支配性只在残余集小时自然成立;判据函数角色 = C3/B4 调参约束生成器,AC-40 断言输出与登记约束包一致。
```
主判式(决策点 = "确定格挖完";策略对 = 推到底清图 vs 停手攒 RAP 刷新):
Δ_clear = [R_res + C_eff] − [X_res + Δr × s_ref] ≥ 0
n_s = (1 − ι) × |S|(适用域守卫:n_s < 1 ⇒ 主判式不评估、信息端平凡腿接管)
E[踩雷] = |M| × n_s ÷ (n_s + 1)(均匀交错模型;n_s 增大时趋近 |M|)
R_res = n_s × E_dig
C_eff = C × (perfect ? P_perfect ÷ 100 : 1)(C = 清图奖励当量 = power 恒等〔clear_blast = 40〕)
X_res = E[踩雷] × V_mine(V_mine 同 F4)
Δr = ⌈(n_s + E[踩雷]) ÷ AP_r⌉(安全格 + 踩雷格均耗 AP;雾态增量叠算见注)
s_ref = D_ref(同一 D_ref,单一换算)
E_dig = (20×6.0 + 16×3.6 + 16×4 + 15×4) ÷ 67 ≈ 4.5 HP(格子池加权;刀/强治疗已移出格子池入注入池不摊入)
显式假设登记:停手侧 RAP 机会收益按零计价(零价假设对"推到底"偏利一分;本假设下 verdict 已为负)
保守地板式:C_eff ≥ X_res + Δr × s_ref
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 残余盲猜安全格 | n_s | float | [0, \|S\|] | (1−ι)×\|S\|;**域守卫:n_s < 1 ⇒ 主判式不评估**(零赌博板形不误判) |
| 挖穿期望踩雷 | E[踩雷] | float | [0, \|M\|] | 均匀交错模型 \|M\|×n_s/(n_s+1) |
| 清图奖励当量 | C | int | ≥ 1(A3 条款④) | B4 供给(clear_blast power=40,provisional) |
| 完美乘数 | P_perfect | percent | **{100, 200}** | SettlementTable 配置值;provisional 200(换算入账恒 ÷100) |
| 单格奖励期望 | E_dig | float | (0, ∞) | 格子池加权推导(现行 4.5;评审口径带 ≈4.3–5.1;实现率折减敏感性同 F4③) |
| 轮行动点 | AP_r | int | [1, 32] | A3 ActionEconomyTable(默认 8) |
| 雾负担比 | fog_burden_ratio | float | [0, 1] | A1 产物指标(付费格分母口径)——雾态 Δr 修正输入 |
| 板形 | n_s | E[踩雷] | X_res | Δr(代价) | R_res | Δ_clear(C=40 / 完美 80) | 判定 |
|---|---|---|---|---|---|---|---|
| L1 无雾态(v3:10×10 d0.25,ι=0.88,\|M\|=23,\|S\|=77) | 9.24 | 20.8 | 62.3 | 4(48) | 41.6 | **−28.7 / +11.3** | ✗ / ✓ |
| L2 腿(v3:12×12 d0.25,ι=0.88,\|M\|=34,\|S\|=110) | 13.2 | 31.6 | 94.8 | 6(72) | 59.4 | **−67.4 / −27.4** | ✗ / ✗ |
| L1 × 满配语境(unit_count=3,V_mine=9) | 9.24 | 20.8 | 186.8 | 4(48) | 41.6 | **−153.2 / −113.2** | ✗ / ✗ |
| L2 腿 × 满配语境 | 13.2 | 31.6 | 284.5 | 6(72) | 59.4 | **−257.1 / −217.1** | ✗ / ✗ |
- 实现率折减口径(E_dig′ = 2.70 provisional):L1 = −45.3 / −5.3;L2 = −91.2 / −51.2——同向更差(完美翻正腿亦被折减吞没)。
- 雾态增量:链不可达雾格全价 AP 抬高轮数——Δr 增量 = \|U\| × dig_ap_cost ÷ AP_r(v3 曲线复算 (29.99 + 4) ÷ 8 = 4.25 → 上取整 5,较无雾基线 Δr=4 **+1 轮**);actuals fog_burden_ratio p50/p90 交付后重跑(对账清单 #6)。
| 项 | 约束 | 裁决方 |
|---|---|---|
| ① C 量级上调整向 | 保守地板需求 L1 ≥ 110.3 / L2 ≥ 166.8(v3 曲线重推;现值 C=40 / 完美 80——缺口 **70.3 / 126.8**;原 46.1/91.8 需求系 v1 曲线旧值链产物,退役为历史记录);任何上调与护栏 B 口径联动复核 | B4/C3 |
| ② 或裁"清图非严格支配"为设计态 | 与 A4 定价硬约束②同向;如裁设计态,A3 条款⑤注记的 P1 对冲弱化须同步声明,弃图率雾板分层观测加权监控 | C3(①②二选一) |
| ③ 多敌联动 | 满配语境深度为负与 F4 破线同向——unit_count > 1 行的放行判据 = 条款③⑤在全部登记行组合下同时成立(判据自动收紧至曲线级重议——与 F4 结论④并案) | C3(双条款并案) |
| C3 裁决回执 | **② 采信(非支配设计态)+ 计价基元换位重推**:clear_default 槽 clear_knife→clear_blast(instant_aoe 当场兑付全体存活敌,C = power = 40)——缺口重推 = 46.1−40 = **6.1**(L1)/ 91.8−40 = **51.8**(L2,v1 曲线口径);C 量级不上调 ✓;P1 对冲弱化同步声明已落 C3 OQ4、弃图率加权监控持续;actuals 交付后按 clear_blast 语义强制重跑(AC-40 同批口径,registry clause5_dominance.c3_ruling) | C3(已裁——①②二选一落定) |
| B1 重算批重推回执 | v3 曲线 × E_dig=4.5 重推:主判式 L1 −28.7/+11.3(完美翻正)、L2 −67.4/−27.4、满配 −153.2/−113.2 与 −257.1/−217.1;保守地板需求 110.3/166.8(缺口 70.3/126.8);**裁决② 维持**(非完美态负、完美态 L1 翻正、L2 全负——真人零弃图初裁 OQ4 不受读数漂移影响);护栏 A/B 读数挂旧值链——W2 复核随 C3 收口批三选一落档 | B1(重算回执登记) |
| 护栏 | 判据 | 读数 | 突破条件 |
|---|---|---|---|
| A 雾板净当量优势带(B4 pricing_constraints③ 的 B1 判据) | 每链不可达雾格净优势 = (E_fog − E_dig) − s_ref ÷ AP_r | 登记读数 (11.1 − 7.2) − 1.5 = **+2.4 ∈ (0, 3]**(v1 曲线/旧格子池口径);重算批方向性复核:E_dig 修正 4.5 + 雾池构成变更 → 读数 ≈ **−1.1 < 0,越下界**(雾纯税化风险);E_fog 正式重推随 W2 批 | E_fog > 11.7 → C3 雾池联动禁区,禁独立调参(判据式不变——阈值随重推复核) |
| B 防钓鱼——退化板刷清图奖励 | 上界判据 = ⌈(\|S\|_min − \|R₀\|_max) ÷ AP_r⌉ × s_ref ÷ 2 ≈ ⌈(50−20)/8⌉ × 12 ÷ 2 = **24**(D_ref 口径——与敌 DPS 无关,读数不受 v3 换锚影响) | 登记双读数(v1 曲线口径):D_ref 口径上界 24 → C_eff = 16 ≤ 24 ✓ / DPS 严格读数上界 ≈8 → C_eff = 16 越(clear_knife C=8/完美 16 口径);**W2 复核事项**:C 提至 clear_blast 40/完美 80 后对两上界越线 1.7–10×——三选一裁决(上界改判/接受+强化监控/回调 C)随 C3 收口批落档 | 结构承载 = A1 min_safe_count + 布雷数下限 + A2 R₀≠S 三闸(B1 侧判据为对账复核,非运行期校验) |
- 护栏 B 输入登记:\|S\|_min = min_safe_count 是 A1 行级 knob,调参按当期行集重算、禁写死 50;\|R₀\|_max = 20 系参考带经验值、无登记供给方 → 登记 A1 产出义务 R₀ 规模分布上界(F4 报告 C 扩列,缺口预检 9);DPS 严格读数参照系 v1 曲线 atk 值,v3 atk 上探后正式重推随 W2 批。
- P_perfect 默认值:×2(SettlementTable.p_perfect = 200,provisional,调参所有权 C3;运行时载体域 {100, 200})——现参数下唯一使 L1 翻正的杠杆(+8.0);非完美态仍负 → C 量级上调约束不因 P_perfect 消解;上界受护栏 B 约束(完美加成不得触碰钓鱼线)。
设计意图:两个不等式判据函数是 C3 调参的约束生成器——把"挖下去值得/推到底不吃亏"从口号变成每笔调参必须重跑的对账。
## 明细流水协议
### 规则
- **规则 14**:结算过程中每一件事写一行明细流水;行型封闭为 13 类、不允许私自增加;每行带公共字段,各行型再补特有字段;这份流水是界面呈现、回放对账、数据导出共读的唯一数据源契约;任何一行找不到来源 = 断言失败(宁炸勿混)。
- **规则 15**:结算完全可回放——同样的随机种子加同样的输入(事件序列 + 窗口选择序列),跑出的步骤流逐行相同;成立前提 = 零随机、确定性输入、数值全部来自表值快照、attempt 重试不额外取随机流号;录像回放、断言复测、切点续玩都建立在它之上(切点见 AC-34)。
### 明细行类型(封闭枚举,13 类)
| 行类型 | 特有字段 | 产出点 | 说明 |
|---|---|---|---|
| 效果行 | `effect_id` `pool_value` | 增益/减益段 | value=该次授予贡献值;pool_value=池合成值(防 −130%×2 行误读为 −260%) |
| 伤害行 | `target` | 道具段 / 战斗段 | 分量二元组 + 减伤终值 + 击杀标记 |
| 治疗行 | — | 道具段 | clamp 后真实回复量 |
| 道具行 | `target` | 授予段 / 道具段 | 入库 / 生效 / 语境注记 |
| 奖励未生效行 | 聚合计数 | 授予段 | 满层拒绝、满血、雾板等合法例外 |
| 已消耗未生效行 | — | 道具段 | 施加时已无存活敌(Used 不可逆) |
| 使用被拒行 | — | 道具段 | 满血治疗包守卫 |
| 溢出未生效行 | — | 授予段 | 伏击/奖励族同名协议 |
| 标旗未中行 | highlight=`perfect_broken` | 授予段 | 零值归因行;每雷实例一次去重 |
| 蓄力行 | — | 战斗段 | charge 拍零作用 |
| 衰减行 | — | 衰减段 | 移除数 k(呈现聚合归 D1) |
| 判定行 | — | 判定段 | 胜负 / 继续 |
| 高光行 | — | 授予段(清图) | 完美排雷;value=实际有效兑付,禁记名义值 |
公共字段(13 类全必有):`type` `source_class` `origin_cell`(板级行可空)`round_index` `display_name` `value` `highlight?`。断言:无来源行 = 失败(AC-42)。新增行类型/新字段均为输入的确定函数——回放逐行相等断言语义不受损。
### source_class(封闭枚举)
| 值 | 来源 |
|---|---|
| safe_cell / flag_hit / mine_hit / clear_default | B3 既有四源 |
| 道具/判定扩展 | B4 交付语义 |
| enemy_action | 敌方行动行(伤害/蓄力) |
| flag_miss | 标旗未中零值行 |
| hero_attack | 主角先手攻击伤害行 |
新增值 = 接口漂移,须同步 `source_label_map` 键集。
### highlight(可空枚举)
| 值 | 含义 |
|---|---|
| `flag_hit` | 标中旗削弱兑付行强调 |
| `clear_reward_h2` | 清图奖励行强调 |
| `perfect_broken` | 本板完美谓词已破的归因锚 |
新增值 = 接口漂移。
设计意图:13 类封闭行型 + 无来源即炸,让"合并到看不出来源"的呈现优化在数据层就过不了断言。
## 边界情况
| 条件 | 行为 |
|---|---|
| 末图清图即胜利(cleared 与 battle_over 同结算) | 授予段先兑付清图奖励(含完美判定)→ 窗口当轮可选用 → 道具段照常 → 战斗段空转(无行动行)→ 衰减照常执行 → 判胜 → battle_over 清理;未选用件随 clear_inventory 消亡 + 反馈行(依据:B4 E15) |
| 战斗段 hero hp=0 | 立即短路——剩余敌不作用、不产行动明细行,径入判定段判负;短路后衰减段照常执行(结算完整性优先)(依据:Core Rule 10) |
| 判定时 hero 与最后敌同时 hp=0 | 结构不可达(我方伤敌均先于敌方行动兑付);防御规则 = hero 先判 → 判负(纵深防御)(依据:Core Rule 12) |
| 减伤/削弱合成后 D'=0 | 不调 `apply_damage`(B2 对 n≤0 拒绝),改产零值伤害行(分量二元组 + 终值 0)——免伤与零输出必须可见(依据:负值分支禁令) |
| 伤害超过目标剩余 hp(溢杀) | 溢出丢弃——无存续、无转移、无负 hp 态;行 value=D'、击杀标记为布尔(不记溢出量)(依据:F3) |
| 敌为 charge 拍而本轮踩雷 | 伏击授予照常执行(授予段先于战斗段);query_attack 返回零作用 → 本结算伏击池全部蒸发(dur=1 轮末清零);战斗段零伤害;明细 = 授予行 + 蓄力行("这轮踩的雷白喂了"可对照)(依据:B2 EC8) |
| 全体存活敌同拍 charge | N 行蓄力行、零 apply_damage、hero 承伤 0——合法状态非错误(依据:B2 EC) |
| 伏击池 L=0 时敌攻击 | D_raw = 纯基线 atk(分量二元组 {atk, 0})——零伏击是 L=0 的自然读值非缺失分支(依据:B2 F2) |
| 同窗提交多件 | 仅首件受理生效,余件零调用 + 编排违例诊断;满血使用守卫保留为纵深防御(跨结算场景仍可达)(依据:Core Rule 7 / AC-16) |
| 治疗包 power 超过当前缺血 | hp' = min(hp + power, max_hp) 部分回复、不拒绝(满血 = 零收益拒、超量 = 部分收益——两分支语义互斥)(依据:F3) |
| 选定刀施加时已无存活敌 | 照常消耗(Used 不可逆)+ 逐件"已消耗未生效"明细行(零效果判定读 B2 存活集);单件制下不可达、逻辑保留为防御分支;战斗段照常空转推进(依据:B4 E10 / AC-20) |
| 窗口打开时库存为空 | 跳过恒合法;呈现面 D1 可整体不弹窗;结算段序零停顿继续(依据:B4 E8) |
| 挖掘期刷新 RAP 不足 | `request_refresh` 返回 false、状态不变 → `refresh_board` 原样上抛拒绝(刷新拒绝不是编排错误,是玩家决策的合法结果)(依据:A3 EC13) |
| 同轮多次刷新成功(cap 内) | 每次成功独立走 `refresh_board` 全序(retire → generate → install → roll_board 恰一次/图)——挖掘期当场连刷合法;每次 generate/roll_board 消费新 scope;第三次提交 → cap 拒绝(依据:A3 EC15) |
| stopped/ap_exhausted 轮 | 出口分发恒 same_board(本编排无刷新提交面);回发 new_board = B1 违约(绕过 RAP"支出唯一")→ fail-fast 上抛(依据:A3 Rule 11) |
| 换图生成产物带非法产物标记 | 编排不拒绝产物(玩家永不卡死),上抛玩家侧呈现请求(数据面 = 非法标记;提示/补偿/回退形态归 D1);A2 `install_board` 若拒绝(不变式违例)= 程序级错误 → fail-fast(非玩家域)(依据:A1 EC5) |
| battle_over 清理序列中某调用被拒 | debug 诊断 + 编排纪律修复;幂等守卫(各侧 false + 诊断)兜底,不中断清理序列剩余步骤(防半清理态跨战斗泄漏)(依据:编排纪律) |
| 战斗中表热重载请求 | `set_reload_gate(true)` 已置位 → D2 门拒绝返回 false(依据:D2 EC8) |
| 衰减段调用时容器已空 | `decay_round()` 返回 0——合法结果、零明细行或聚合零计数(依据:B3 EC13) |
| 清图槽身份为 buff 且授予时已满层 | 零兑付 + "奖励未生效"行(合法例外);完美板高光行降级不发(完美谓词仍成立,当量入账 = 实际兑付 0);若仅第二份被拒(首份已落地)→ 高光行照发、value = 首份当量 + "奖励未生效"行一条(依据:B4 E11 / Core Rule 13#2) |
| 完美排雷谓词在 RAP 刷新图上 | 刷新图不产生清图奖励(无兑付点)→ P_perfect 不触发;板级 flag 计数随每次 board install 重置(跨图不累积)(依据:Core Rule 13) |
| 板内既有标中又有误标 | 完美谓词不成立 → 正常兑付(无高光行)+ 本轮首个误标判定产"标旗未中"零值行(highlight=`perfect_broken`;重复上报去重)——零误标是全有或全无谓词、无部分完美档(依据:Core Rule 5.2) |
| 多敌(unit_count=3)同结算攻击 | 行主序逐敌执行循环、共享同一 L(池共享不消耗);任一敌作用后 hero 死亡 → 短路中止剩余敌(顺位即威胁序的可观测面)(依据:Core Rule 10) |
| 道具段击杀造成死亡即不动手 | 该敌 Dead 后战斗段 `query_alive` 已不含它——不出现行动行(缺席即指针冻结的明细面);抢杀兑付 = 击杀标记进流水(感知数据前置)(依据:Core Rule 9) |
| 零威胁组合(行 atk=0 ∧ cap=0) | 战斗可胜但零风险 = 内容态配置错误(hero atk=0 已被 HeroTable 域下界结构杜绝,战斗恒可定局);护栏 owner = 实现期 ADR/D2 跨字段校验;B1 观测锚 = 战斗轮数异常遥测(进 C3/OQ 清单)(依据:B2 OQ9 并案) |
| 结算开始时 hero hp=0 | 结构不可达(hp=0 只产生于战斗段 → 短路直入判定段);防御断言:窗口打开前置检查 hero 存活,违反 = debug 断言(编排违例显式暴露)(依据:编排自守) |
## 依赖与输出
| 方向 | 系统 | 性质 | 接口要点 | 状态 |
|---|---|---|---|---|
| 上游 | D2 | hard | SettlementTable schema 承载(B1 回填 owner)+ ConfigDB 读取 + `set_reload_gate()` 唯一调用方;零结算随机流(流封闭不变) | Approved |
| 上游 | A3 | hard | F1 五条款下游契约(B1 = 条款①②③⑤闭合 owner)+ `refresh_board` 挖掘期刷新编排 + `notify_settlement_done`/`notify_combat_end` 回发 + `last_round_end` 读取 | Approved |
| 上游 | A2 | hard(订阅) | 三事件流订阅(facts 缓冲;A2 唯一回边的订阅端)+ `install_board`/`retire_board` 调用方 + Waiting 相位观测量 = 结算触发条件;事件到达序不承载语义 | Approved |
| 上游 | B2 | hard | 单位接口全调用面(spawn/query_*/apply_damage/advance/default_target/ambush_grant_plan/despawn_all)+ B2 义务①–⑥ | Approved |
| 上游 | B3 | hard | 状态容器五 API 全调用面 + B3 义务①–⑧;weaken 锚红警裁决 owner(F0 检查点) | Approved |
| 上游 | B4 | hard | 奖励/库存十 API 全调用面 + B4 义务①–⑥(roll_board 恰一次 / 关卡末清库快照计数 / usable_now 组装) | Approved |
| 上游 | A1 | 间接 hard 接线 | `generate(L, D)` 换图编排调用方 + actuals 分布 p10 对账输入(F4 报告 C)+ attempt 边界非 scope 事件 + EC5 零合法板 B1 半边上抛 | Approved |
| 上游 | A4 | 对账锚(零运行时接口) | 条款⑤三腿入账(雷险消解/信息双向/AP 腿)+ 两方向性护栏 + 雾格零特判(B1 无变异分支) | Approved |
| 上游 | C1/C2 | provisional | encounter 上下文 (L, D, hero_hp) 供给(begin_battle 入参);跨战斗 HP 持久性;战斗触发 | 未设计——MVP 冒烟直供(入参封装隔离) |
| 下游 | D1 | hard(数据供给,未设计——第 10 位) | 结算明细流水 = 统一数据源契约(规则 14 行协议);承接呈现义务台账:A2×6 / B2×4 / B3×4 / B4×5 / B1 新增 ×3(高光行强调、完美排雷呈现、EC5 零合法板提示)——缺项即 blocking,随 D1 GDD 门禁评审核对 | — |
| 下游 | B5 | soft(垂直切片) | 结算步骤流 = 战斗动画回放脚本源;溢出行/origin_cell 玩家可读形态(B3×B5×2 数据源) | — |
| 下游 | D4 | soft(Alpha) | 音频挂点 = 明细行类型流(B4 音频挂钩点事件源) | — |
| 下游 | D5 | soft(Alpha) | 教学口径数据源(来源标注/RAP 清零/库存清空/满层溢出/蓄力拍贪雷——经 B1 流水兑现) | — |
| 下游 | C3 | soft(provisional) | 条款③⑤对账结果 = 调参约束输入(unit_count>1 破线约束 / 保守地板缺口 / 护栏 A/B 突破条件);P_perfect/D_ref 调参所有权 | — |
- 双向一致性核对(systems-index 依赖分层表):B1 ← A3,B2,B3,B4,D2(第 3 Feature 层)· D1 ← A2,A3,B1 · B5 ← B1,D1 · D4 ← A2,B1 · D5 ← A2,A3,B1 · A2 事件面 referenced_by 含 B1(订阅边)。
- C3 消费 B1 对账结论的事实依赖成立——C3 GDD 定稿时须回写索引(对账输出 = 调参约束清单,非运行时接口)。
- B1 是项目首个全部玩法上游均已 Approved 的系统(除 C1/C2 外),无 provisional 上游假设。
### 呈现数据面义务(B1 无自有渲染面,呈现归 D1/B5)
| 编号 | 数据面义务 | 归属/呈现 |
|---|---|---|
| 1 | 结算明细屏 = MVP 战斗本体:数据源 = 规则 14 流水行协议;每行 `value` 数值在暗色底上须高对比(明细屏是 MVP 数字密度最高的屏) | 屏级布局/节奏/滚动形态归 D1/B5 |
| 2 | 行类型区分 = 形状+色相双通道:未生效四类行(奖励未生效/已消耗未生效/使用被拒/溢出未生效)必须携带形状冗余(icon/划线等),防色弱玩家把"没生效"误读为普通行 | D1/B5 |
| 3 | 高光行数据面:perfect_sweep 高光行、标中旗 `highlight` 标记、清图奖励行 H2 强调标记——B1 只锁行字段;未生效类行按聚合计数呈现(数据可聚合字段已入协议) | 强调形态归 D1;`target`/`effect_id` 是多敌归因呈现与 icon/极性映射的直接数据源 |
| 4 | 零值伤害行可见性:免伤轮/零输出轮的零值行不得被"零值不显示"优化吞掉(归因链断点) | D1/B5 |
| 5 | 音频挂钩点(D4,Alpha)= 明细行类型流:道具(入库)/效果/伤害/判定/高光行 + 负反馈聚合(未生效类行数 >0 时单次结算至多一次——防逐行惩罚轰炸) | 挂点事件源归 B1 流水 |
| 6 | 道具使用窗口载荷 = B4 `query_inventory` 投影 + B1 组装的 `usable_now` 预判字段(满血治疗包禁选);选择序收集/跳过/窗口时机指示/触发政策归 D1;窗口选择序列 = 回放输入事件;窗口期输入与棋盘不竞争(单意图帧先例) | D1 |
| 7 | 结算明细屏数据锚 = 终局判定行(胜负画面的数据锚) | D1 |
| 8 | UX Flag:本系统有 UI 贡献(结算明细屏 + 道具使用窗口)——Phase 4 运行 /ux-design 为其创建 UX 规格先于编写 epics,引用 design/ux/[screen].md 而非本 GDD | systems-index 备忘(Phase 5d) |
## P0 最小闭环
1. `begin_battle(encounter)` 六步开战斗:gate 置位 → 容器开域 → encounter 骰 → spawn → install+roll 恰一次 → round_start。
2. 挖掘期 B1 只缓冲 A2 三事件流,玩家挖格/插旗/停手。
3. 轮末 Waiting 相位自动触发七段结算(触发只读相位与 last_round_end)。
4. 授予段三批兑现:雷→伏击、安全格→奖励分流、旗→削弱/标旗未中行、清图→奖励(完美双份)。
5. 窗口段玩家至多选一件道具或跳过(唯一输入点,选择入回放)。
6. 增益合成 → 道具 → 战斗段主角先手 + 逐敌还手 → 衰减恰一次。
7. 判定段:hero 先判负 / 敌清空判胜 / 否则回发 same_board 进下一轮;cleared 轮换图续轮。
8. 胜负 → battle_over 清理序列(库存关内延续)→ 明细流水回流 D1 呈现与回放对账。
## P1 / P2 后置
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P1 | flag_miss 标错惩罚源路径(候选"敌方伏击 +1":flag_judged{hit=false} 转化 + B3 source_class 新枚举 + 惩罚重复性裁决) | A2 OQ1 实测采纳后才上;当前标旗未中行仅为归因痕迹(缺口预检 12 / OQ8) |
| P1 | 深度高光形态(#3 标中旗即时 HUD 反馈动画/音画同步;旗落格高亮/姿态反馈) | MVP 已落数据面标记 + 当轮兑付;形态随 art-bible 与战斗表现美术测试定(OQ7) |
| P1 | EC5 零合法板玩家侧呈现形态(提示/补偿/回退三选一;"确定性回退已知好种子"候选归实现期 ADR) | B1 数据面已就绪,形态归 D1 裁决(OQ5) |
| P1 | C1/C2 真实遭遇供给接线(begin_battle 入参改真实遭遇上下文 + 跨战斗 HP 持久性) | C1/C2 未设计,MVP 冒烟直供(缺口预检 5 / OQ6) |
| P2 | 回放切点续玩端到端(快照恢复驱动) | 生效条件 = D3 实现(AC-34 deferral) |
| P2 | 真 A1 端到端集成冒烟(换图 generate 真实集成、attempt 重试语义、非法产物真分布) | 生效条件 = A1 实现落地(缺口预检 10) |
## 调参表
### SettlementTable schema(单行全局,B1 回填 owner——Rule 4 豁免:单行全局常量/结构表,HeroTable/ActionEconomyTable 先例)
| 字段 | 类型/域 | 默认 | owner | 说明 |
|---|---|---|---|---|
| equivalence_ref_damage(D_ref) | int [1, 999] | 12 | C3(provisional) | 当量参考敞口(F1);变更触发全对照表 + 条款③⑤对账重跑(联动义务,禁独立调参) |
| p_perfect | percent **{100, 200}** | 200 | C3(provisional) | 完美排雷清图奖励第二份兑付触发(100 = 仅高光无第二份、200 = 真实双份交付);非整数倍数乘数无运行时载体,域外加载致命;上界受护栏 B 约束(双读数 24 / ≈8——裁决归 C3) |
| segment_order | StringList | [grant, item_window, buff_debuff, item, combat, decay, verdict] | ✗ 结构冻结 | 段序骨架的零字面量载体;加载期校验恒等于拍板段序,违例致命(防实现乱序静默漂移) |
| source_label_map | Dictionary(source_class → 文案键) | 封闭枚举全覆盖 | ✗ 结构冻结 | source_class → D1 呈现文案映射键(P2 归因呈现侧数据源);键集 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack};新增键 = 接口漂移 |
| effect_pool_map | Dictionary(effect_id → pool) | attack_up→hero_offense · defense_up→hero_defense · weaken→enemy_output · ambush→flat_attach | ✗ 结构冻结 | 效果语义映射(F2);新 effect_id 上线须随批登记映射,悬空 effect_id = 加载期致命(引用型字段 dangling_ref_policy) |
| pool_clamp_lo / pool_clamp_hi | int(pp) | −100 / +100 | ✗ 结构冻结 | percent 池地板域(F2);乘数域随之 [0, 2] |
| round_direction | enum {floor} | floor | ✗ 结构冻结 | 乘区取整方向(F2——单一取整规则,结构性非 knob) |
| damage_a_per_cell | int ≥ 0 | 1 | C3(provisional) | 伤害A 开格充能/格(护甲克制批——充能与结算归 B1 战斗段) |
| damage_a_cap | int ≥ 0 | 8 | C3(provisional) | 伤害A 单轮充能封顶(0 = 不封顶——防连锁轮失控) |
| damage_b_per_flag | int ≥ 0 | 2 | C3(provisional) | 伤害B 标雷充能/首次标中雷(每雷实例一次去重) |
| armor_effectiveness | Dictionary {base, dmg_a, dmg_b} × {none, a, b} | 特化 ×150 / 无甲 ×100 / 对位 ×50 | 键集 ✗ 结构冻结 / 数值 C3(provisional) | 伤害类型 × 护甲克制矩阵——主角攻击三分量各自查表后 floor 相加;敌种甲型映射归 EnemyTable.armor_type |
- 加载校验:effect_id 主键唯一(ConfigDB 既有);effect_pool_map 键 ⊆ StatusEffectTable 活行集(跨表悬空致命——B4→B3 首引激活先例同款);segment_order 违例致命;p_perfect ∈ {100, 200}(载体域,域外加载致命;100 = 完美必须 ≥ 不加倍的机制语义下界)。
### Knob 表
| Knob | 默认 | 调过高 | 调过低 |
|---|---|---|---|
| equivalence_ref_damage | 12 | 全当量表膨胀 → 条款③左臂虚高、锚裕度失真(重跑强制) | 当量坍缩 → weaken 锚第二腿破线(m_w ≥ 60 下界的前提失效) |
| p_perfect | 200 | 载体域封顶 200(C 量级上调走 B4 clear 池 knob,须与护栏 B 口径联动复核:防钓鱼线 D_ref 读数 24 / DPS 严格读数 ≈8) | =100 → 第二份兑付不触发(完美仅剩高光行、无实质增量——情绪奖励感最弱档,机制空转) |
- 非 knob(结构冻结,修订走 GDD 流程非调参):段序骨架、乘区结构(两池乘算)、floor 取整、池 clamp 域、明细行协议、零随机、结算触发 = Waiting 相位、调用序(query_attack→apply_damage→advance)、衰减恒执行。
- Knob 交互:D_ref × m_w × m_d × duration_d(锚两腿与条款③ V_safe 共用 D_ref——defense_up.magnitude/duration 已纳入"禁独立调参"联动网络;B4/B1 共裁 m_w、C3 投 m_d 时须同步核对 D_ref 并重跑条款②③⑤);p_perfect × C(clear 池当量)——护栏 B 联动;D_ref × 条款⑤ s_ref(同值引用——改 D_ref 即改结算强度参考,两条款重跑);damage_a/b × armor_effectiveness × EnemyTable.armor_type——C3 联动网络 #6(敌种甲型变更须复算 Boss/普通战 K 区间)。
- 调参所有权:全部 knob provisional 归 C3;每次调参须重跑 F1 对照表 + 条款②③⑤预检并同步 registry(接口漂移义务——B2/B4 同款条款);actuals p10 交付后的强制重跑义务见对账清单 #6。
### 边界参数总表
| 参数 | 边界 | 默认 | 出处 |
|---|---|---|---|
| percent 池 clamp | [−100, +100] pp,每池独立收口 | — | F2 |
| 池乘数域 | [0, 2](= 1 + pp/100) | — | F2 |
| m_w(weaken 行值) | [60, 85] | −65 | F0 裁决(瞬时当量口径) |
| 地板交叉层数 | ⌈100/m_w⌉ = 2(值域内恒 2) | — | F0 |
| P_perfect 载体域 | **{100, 200}**,域外加载致命 | 200(×2 双份交付) | 规则 13 |
| D_ref(当量参考敞口) | [1, 999] | 12 | SettlementTable |
| HeroTable.atk | [1, 999],0 加载拒绝 | 6 | 2026-09-11 拍板 |
| 伤害 D' | 整数 [0, ∞),零负值分支 | — | F3 |
| D' = 0 | **不调** apply_damage,产零值伤害行 | — | 负值分支禁令 |
| 取整 | floor,单一规则(结构性,非 knob) | — | F2 |
| 溢杀 | 丢弃,不转移、无负 hp 态 | — | F3 |
| 治疗 | hp' = min(hp + power, max_hp) | — | F3 |
| 伤害A 充能 | 单轮池 ≤ damage_a_cap(0 = 不封顶);轮末清零 | 1/格 · cap 8 | F6 / SettlementTable |
| 伤害B 充能 | 首次标中雷每雷一次去重;无 cap(AP 预算天然限界);轮末清零 | 2/雷 | F6 / SettlementTable |
| 甲效矩阵 | 键集 {base, dmg_a, dmg_b} × {none, a, b} 结构冻结;逐分量查表 floor 后相加 | 特化 ×150 / 无甲 ×100 / 对位 ×50 | F6 / SettlementTable |
## 验收标准
### 测试口径
| 口径 | 要点 |
|---|---|
| 测试载体 | Core-Battle 全集成冒烟:`godot --headless --script`(脚本 extends SceneTree 以获得 quit(code);ConfigDB/RngService autoload 由脚本显式实例化) |
| 真假声明 | 真 A3(相位机全 API)+ 真 B2/B3/B4(class_name 直引实例化;多敌腿复用 `enemy_multi_unit` 夹具根)+ 真 A2 规则引擎(板走既有登记规格 b_spawn/b_flag/b_batch/b_chain/b_fog/b_mine_walk;挖掘/插拔/停手经 `settle_batch` 真驱动——冒烟扮演 D1 提交意图) |
| A1 桩 | 程序构造产物桩:换图 generate 调用点按登记序列返回 schema 坐标级程序构造板;每次调用经 `open_stream("board_gen")` 取号恰一次(与真 A1 取号契约同构,scope 轨迹断言真实);attempt 重试不重开 scope 的语义归真 A1(deferral);真 A1×A2×B1 端到端集成冒烟与 A1×A2 双包含端到端同槽(生效条件 = A1 实现落地) |
| C1/C2 | provisional:`begin_battle(encounter)` 入参冒烟直供(encounter 坐标复用 B2 行集登记 (L_g,D_g)/(L_a,D_a);hero_hp 按腿直供 max_hp/低值/缺血压值) |
| D1/B5 断言面 | 未设计 → 步骤流捕获列表(主断言面)+ 回发捕获(notify_settlement_done/notify_combat_end)+ set_reload_gate 调用捕获;窗口选择与刷新意图 = 冒烟扮演 D1 经 B1 提交面注入 |
| A2 事件载体 | 事件外发载体(signal vs 回调)归实现期 ADR——依赖真 A2 事件流驱动的 THEN 子集在 ADR 落地前为纸面契约;备选 = A2 半真(事件注入面直喂 facts 缓冲 + A3 真,断言口径不变);本节优先真 A2 全集成,半真仅为 ADR 前过渡载体 |
| 被测面 | `begin_battle(encounter)` · 窗口选择提交面 · 刷新意图提交面(refresh_board 挖掘期刷新编排)· 结算事务(内部触发,经 A2/A3 驱动到达);段序断言 = 步骤流行序(授予类行 < 窗口标记 < 效果行 < 道具行 < 伤害/蓄力行 < 衰减行 < 判定行——全序断言) |
| 只读观测量 | A3 ap/rap/phase/last_round_end · B2 query_alive/query_beat/query_attack/default_target · B3 query_active(六归因字段+快照载荷)· B4 query_identity/query_inventory · RngService 公开 scope 计数器(board_gen/reward_roll 双流——roll_board/generate 恰一次的观测面)· 诊断收集器 |
| 期望值纪律 | 全部 knob 按当前 ConfigDB 表读值推导、不写死;记号:D_ref(equivalence_ref_damage)/ P_pf(p_perfect)/ m_w(weaken.magnitude)/ m_d/D_a/M_a(defense_up)/ m_amb(ambush.magnitude)/ c_r(所在行 cap)/ a_g/h_g(goblin)/ a_e/h_e/m_e/u_c_f(bugbear)/ M_h(HeroTable.max_hp)/ A_h(HeroTable.atk)/ p_i(RewardTable.power)/ AP_r |
| 结构定值断言 | 合法集:segment_order = 拍板序、pool_clamp_lo/hi = −100/+100、round_direction = floor、effect_pool_map 四键、armor_effectiveness 键集 {base, dmg_a, dmg_b} × {none, a, b}、行类型封闭枚举 13 类、公共字段 + 行类型特有字段分层、source_label_map 键集封闭(含 enemy_action/flag_miss/hero_attack) |
| SKIP 与生效前提 | 依赖修订后基线的腿(如 m_w ≤ −51 使 2 层即越域;m_d=−30 使 defense_up 叠满脱离地板边界读法)前提不满足时输出显式 SKIP 防 CI 静默、不假失败;registry 对账 AC(AC-41)在回执落地前失败 = 裁决未兑现的正确信号(不写软口径)——现行回执在案(F0 裁决批 + 重算批),AC-36/41 按现行值链断言 |
| 登记常数 | A2 板登记常数与 B2 行集登记坐标直接复用不重制;B1 新增 σ 登记轨迹(身份依赖腿——如"双治疗包""刀全灭敌""清图槽身份",master=42、经 derive_at 测试通道推导、预推进按 B4 时序口径)+ 登记构造序列(板 × 意图序 × 期望行数);登记后第二人独立推导复核,失效处置 = 先复核登记、无误即实现缺陷;每用例先 `reset_diagnostics()` |
| 夹具策略 | 默认根 b1_default = D2 全表清单 + SettlementTable 默认行(D_ref=12 / P_pf=200 / 拍板段序 / source_label_map 封闭全覆盖 / effect_pool_map 四键 / clamp −100/+100 / floor / 充能三参数 1·8·2 / 甲效矩阵默认值);致命根 ×3 独立进程:b1_segorder_bad(段序置换)/ b1_poolmap_dangling(ghost_effect 键)/ b1_pperfect_oob(p_perfect=99);SettlementTable schema 程序构造承载域校验全谱;板 = A2 既有板规格复用;行为夹具根经 `--data-root=` 注入(仅 debug、不入 data/tables/);各 AC 声明其板/根、用例间无顺序依赖 |
| 致命类收窄 | 恰三行致命 manifest(独立 headless 进程、游戏通道):segorder_violation → ≠0 · poolmap_dangling → ≠0 · pperfect_oob → ≠0;负空间声明(编排自守 fail-fast 断言——new_board 违约守卫、窗口打开前置 hero 存活断言、一事件双转化守卫、单一结算事务在飞——违规路径不可由公开 API 构造)不经冒烟断言、不入 manifest,行为级证据 = 正腿断言 + AC-43 静态扫描;其余致命类别由 D2 AC-2 同类别 loader 级夹具承载 |
| out-of-scope | D1 呈现全域(生效条件 = D1 义务台账 A2×6/B2×4/B3×4/B4×5/B1×3 登记,缺项即 blocking)· B5 消费与可读形态 · D4/D5 音频教学(数据源 = 本节流水行)· C3 全部 provisional 数值(每次调参重跑 AC-35/36/37/39/40/44 对账族——D_ref × m_w × m_d × duration_d 禁独立调参)· A1 actuals p10 重跑 · 条款⑤护栏 playtest 观测面(弃图率雾板分层/速杀退化/零伤害死局遥测——B1 仅供遥测锚)· m_w 修订终值 · flag_miss 惩罚源路径 · C1/C2 真实供给 · 深度高光形态 · 事件外发载体 ADR · attempt 重试细节 |
### AC 清单(Given-When-Then,编号不变)
| AC | Given | When | Then | 覆盖 |
|---|---|---|---|---|
| AC-1 | `b1_default` 经 `--data-root` 注入干净加载 | 冒烟脚本读 SettlementTable | 八字段在位:segment_order ≡ 拍板序 `[grant, item_window, buff_debuff, item, combat, decay, verdict]`(结构定值恒等断言);effect_pool_map 四键逐一 = 定稿映射;clamp −100/+100、round_direction=floor;D_ref 仅域断言 [1,999]、P_pf 域断言 {100,200};source_label_map 键集 ⊇ B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack};同根跑 B4/B3/B2 默认根加载零跨表冲突诊断 | 规则 16 / schema 定稿 |
| AC-2 | segment_order 置换根 `b1_segorder_bad`(如 item_window 与 combat 互换) | 独立 headless 进程游戏通道加载(collect_only=false) | 进程非 0 退出且错误清单含 segment_order 类别(防实现乱序静默漂移的进程级落点) | 规则 16/4 |
| AC-3 | 映射含 `ghost_effect` 键根 `b1_poolmap_dangling` | 独立进程游戏通道加载 | 非 0 退出、错误含跨表悬空类别(引用型字段 dangling_ref_policy) | 规则 16 |
| AC-4 | SettlementTable schema 类直引实例 | `validate()` 作用于 p_perfect ∈ {99, 150, 1000} | 各含域错误类别(载体域 {100,200}——非整数倍数无运行时载体);p_perfect = 100 与 200 零诊断;腿 2:`b1_pperfect_oob` 独立进程加载 → 非 0 退出(manifest `pperfect_oob`) | 规则 16/13 |
| AC-5 | 全新 B1(Uninit)+ 真 A3(Idle)+ 真 B2/B3/B4 全新实例 + A1 桩登记首板 b_spawn + master=42 | `begin_battle(encounter)` | 步骤流/调用捕获全序恰一次:set_reload_gate(true) → B3 notify_battle_start → **encounter 骰(unit_count 区间定本战实际数量——遭遇随机化增补)** → B2 spawn(override 数量)→ A2 install_board + B4 roll_board → A3 notify_round_start(phase=Active);**encounter scope = +1**、reward_roll scope = +1、board_gen scope = +1(各恰一 scope);query_alive(enemy) = 本战实际数量个行值快照单位(默认根 unit_count=1 定值行骰退化为 u_c);A2 事件捕获含初始展开批;B3 query_active 双侧空 | 编排专章战斗开始序列 / 规则 16① / B4 义务⑥ / C3 修订批 X-6 |
| AC-6 | 构造至 A3 Waiting 且 last_round_end 可用(stopped 轮——经真 A2 `settle_batch([stop])` 到达) | 腿 1:结算事务受理;腿 2:装载层置换 {flag_judged 批, round_end} 两组到达先后分别驱动(捕获-重放,不增设 B1 注入 API) | 腿 1:触发判定只读 A3 相位与 last_round_end(事件捕获序 = A2 管线序,结果正常);腿 2:两遍结算步骤流逐行相同(到达先后不承载语义) | 规则 2 / A2 义务① |
| AC-7 | b_flag 满构造结算(挖掘 ≥1 奖励格 + 插 (1,4) hit 旗 + 停手收轮;σ 登记使奖励格含道具类身份) | 结算事务解析 | 步骤流行序全序断言:授予段行 < 窗口标记(open——段界锚)< close/skip < 效果行 < 道具行 < 伤害/蓄力行 < 衰减行 < 判定行;任一段缺行以段界锚与行类型域断言序(空段合法);窗口标记恒存在(零选择 = skip 恒登记);segment_order 表值经 AC-2 恒等拍板序——实现读表驱动非硬编码 | 规则 4 / B4 义务① / 规则 14 |
| AC-8 | b_batch 部分挖掘后 stopped 收轮、结算完成(判定行 = 继续) | 出口分发 | 回发捕获恰一条 notify_settlement_done(same_board) → A3 notify_round_start(Active、ap=AP_r 硬重置、rap 保留);A2 板状态延续(旗集/已开集不变);board_gen/reward_roll scope 计数器零变化 | 编排专章继续腿 / A3 Rule 5 |
| AC-9 | b_flag 登记构造轮(挖掘 n 格含 m₀ 雷格 + 插 f 旗含 h₀ hit) | 轮末结算;同轮事件批重复投递(装载层故障注入) | 每格受理恰一次:B4 grant 恰 n_safe 次、B2 ambush_grant_plan 恰 1 次、apply_effect(weaken) 恰 h₀ 次、apply_effect(ambush) 恰 granted 次;处理序 ≡ A2 cell_revealed/flag_judged 行主序(B3 义务①落地);重复投递 → 步骤流与容器终态 = 单次投递结果(缓冲去重);B3 不去重、B4 幂等仅兜底(诊断零"重复受理") | 规则 3/5 / B3 义务①② / B2 义务② / B4 义务② |
| AC-10 | σ 登记挖掘格身份含 buff 类与道具类各 ≥1(腿 1);b_spawn install 后首轮(初始展开 35 格已发生——channel=initial、reward_eligible=false)(腿 2) | 授予段解析 | 腿 1:buff 格 → apply_effect(effect_id, source={safe_cell, origin_cell, round_index})(六归因字段逐一 = 调用实参);道具格 → stock(item)(库存逐件来源 {cell, round} 可归);即时类当场兑付:instant_aoe = 逐存活敌 apply_damage(u, power) + 单条伤害行(target=all_enemies + count 字段)、instant_heal = clamp 回复 + 治疗行(满血 → "奖励未生效"行零兑付)——零 stock 零窗口;B4 只定"给哪行"、层数语义归 B3 合并(同轮双 buff 格 → 单实例 L=2);腿 2:grant/stock/apply_effect 捕获全零(R₀ 不入奖励库);channel 字段零特判(同板 chain/dig 格正常入库成对照) | 规则 5.1 / A2 义务② |
| AC-11 | σ 登记使同轮/邻轮 defense_up 达 M_a 层满 | 第 M_a+1 层授予受理(B3 apply 返回 false) | 产"奖励未生效"行:零折算、携带可聚合计数/批次字段、source 归因完整;B3 容器逐字不变(拒绝原子);连锁批量授予溢出 = 显式接受(b_chain 13 格批量腿:溢出件逐件入行、零转换补偿) | 规则 5.1 / B4 义务② / B3 义务⑧邻接 |
| AC-12 | b_flag 插 (1,4) hit 收轮(腿 1);续轮再停手(A2 重报 {(1,4), true})(腿 2);拔 (1,4) 重插再收轮(腿 3);AC-28 换图后新板同坐标旗靶(腿 4);插 (0,3) miss 旗收轮(腿 5) | 结算 | 腿 1:apply_effect(weaken, source={flag_hit, (1,4), round_index}) 恰一次 + 效果行携带 highlight 标记 + 资格消费入集合;腿 2:零 weaken 兑付、零明细行(重复兑付从未发生)+ debug 诊断可选、资格集合不变;腿 3:仍零兑付(资格以雷格实例为键);腿 4:兑付恢复(新实例资格重置);腿 5:"标旗未中"零值行恰 1 条(source=flag_miss、value=0、highlight=perfect_broken、聚合计数)+ 续轮重报零新增行(每雷实例一次去重)+ 换图新板重新产行 | 规则 5.2 / A2 义务③ / 规则 13 |
| AC-13 | b_spawn 挖尽未开 8 格触发 cleared + σ 登记清图身份(腿 1);σ 登记清图身份 = defense_up 且已满层(腿 2);AC-28 场景 refresh 图(腿 3) | 结算授予段 | 腿 1:grant_clear() 恰一次(同批次重调幂等兜底——诊断零新增)、兑付分流同 AC-10(source=clear_reward)、当轮窗口即可选用;腿 2:零兑付 + "奖励未生效"行 + 完美板高光行捕获零次(首份即零兑付不发高光;完美谓词仍成立,对账入账 = 实际兑付 0);对照腿:仅第二份被拒(首份落地)→ 高光行在案且 value = 首份实际当量 + "奖励未生效"行一条;腿 3:refresh 图 grant_clear 捕获零次(roll 照常、兑付不调) | 规则 5.3 / B4 义务③ / B3 OQ4 |
| AC-14 | b_flag 登记构造轮:单轮挖掘雷格 mines_r = 6(登记走位序列;cap = c_r = 4 表读值) | 结算授予段 | ambush_grant_plan(6, c_r) 恰 1 次 → {granted=4, overflow=2}(守恒);前 4 颗(事件规范序)逐颗 apply_effect(ambush, source={mine_hit, origin_cell, round_index})(B3 伏击池 L=4);overflow 2 颗逐颗产"溢出未生效"行(含来源 + 聚合计数);战斗段各敌伤害行 attach 分量 = 4×m_amb(池读值即时性);轮末衰减行 k 含伏击实例(dur=1 蒸发);重复投递判别同 AC-9 | 规则 6 / B2 义务②⑥ / B3 义务⑧ |
| AC-15 | 战斗中 hero 满血 + σ 登记库存含治疗包(腿 1);扮演 D1 强制提交满血治疗包(腿 2);提交多件 [刀₂, 刀₁] / 单件 / 零选择(腿 3);无库存轮(腿 4) | 结算到达窗口段 | 腿 1:窗口清单 = query_inventory 投影 + B1 组装 usable_now(治疗包 false——B1 读 B2 hero hp 判定,B4 诊断零"血量查询"新增);伤害道具恒 true(窗口打开时存活敌 ≥1);腿 2:"使用被拒"行 + 包 InStock 不变(use 未调);腿 3:多件 → 仅首件受理(违例诊断、刀₂生效刀₁不消耗);单件 → 生效;skip → 窗口标记 close/skip、段序零停顿、库存不变;腿 4:窗口标记照常 skip(呈现政策归 D1——数据面 = 窗口清单空) | 规则 7 / B4 义务④前半 / D1 义务②对侧 |
| AC-16 | begin_battle hero_hp = M_h − 2 + σ 登记库存含治疗包 ×2(power = p_i) | 窗口提交 [包₁, 包₂] | 仅包₁受理生效(治疗行 hp' = min(M_h−2+p_i, M_h)——部分回复钳满)、包₂零调用(InStock 不变)+ 编排违例诊断("窗口至多选用一件");满血守卫保留为纵深防御(跨结算场景仍可达:本结算被拒后下一结算窗口再判) | 规则 7/EC / B4 义务④ |
| AC-17 | 同轮两次 weaken 授予(互异 origin_cell)(腿 1);defense_up 行与 weaken 行同轮(腿 2);`enemy_multi_unit` 根同轮 weaken L=1(腿 3) | 增益/减益段解析 | 腿 1:效果行恰 2 条(按 apply_effect 调用流水展开、非按容器单实例),每行 origin_cell 逐一 = 授予值、effect_id=weaken、value = 该次授予贡献值(L×m_w 投影)、pool_value = 池合成值(两行各 −65 贡献、pool_value = −130——合成值不入 value 字段);腿 2:效果行 pool 字段经 effect_pool_map 自 effect_id 派生 = hero_defense / enemy_output;腿 3:全体存活敌伤害行均含减伤合成且 target 逐一可归(side-wide 多敌兼容读法) | 规则 8 / B3 义务③⑤⑦ |
| AC-18 | 同结算 weaken L=1 存活 + σ 登记库存含刀(腿 1);`enemy_multi_unit` 根 + σ 登记刀 ×3(每结算至多一件、跨结算序列)(腿 2);hp=2 残敌 + p_i=4 刀(腿 3) | 道具段 | 腿 1:伤害行 value = p_i 恒定、零乘区(分量字段无池修正项——"不吃任何 percent 修正"的行级判别);腿 2:每条伤害行 target = default_target() 返回(顺位最前存活敌)、击杀标记出现于目标 hp ≤ p_i 的件、[0] 死后下一结算顺延 [1]→[2]、击杀标记共 3 个;query_beat 冻结(指针冻结进流水);后续结算战斗段 query_alive 不含它、零行动行;腿 3:死、行 value = p_i、击杀标记布尔、无溢出量字段、零转移(下一件打 default_target 后继) | 规则 9 / B2 义务⑤ / B4 义务④ |
| AC-19 | hero 满血 + 库存治疗包(腿 1);AC-20 场景敌已全灭 + 满血 + 提交治疗包(对照腿) | 提交选择 | "使用被拒"行、零 use 调用(不烧包);满血守卫 = 表局部判定(max_hp 对比)、敌全灭构造下仍拦截(守卫不读存活集的不对称可判定形式);clamp 部分回复见 AC-16 | 规则 9 / B4 义务④ / EC |
| AC-20 | 单件制 + 窗口结构推论(窗口打开时存活敌 ≥1 ∧ 单件恒打顺位最前存活敌) | 负空间声明(违约路径不可由公开 API 构造) | 窗口提交的刀恒有目标——"已消耗未生效"行在单件制下不可达;零效果判定逻辑保留为防御分支(读 B2 存活集),恢复多件制时本 AC 随批复活;击杀标记断言由 AC-18 腿 2 承载 | 规则 9 / B4 义务④ / EC |
| AC-21 | encounter=(L_g,D_g) 单 goblin(腿 1);(L_a,D_a) 连续结算(腿 2);全结算 advance 捕获(腿 3);`enemy_multi_unit` 根(腿 4) | 战斗段解析 | 腿 1:调用捕获序 = query_attack → apply_damage → advance(每存活敌恰一次 advance)+ 衰减行前完成;腿 2:beat 轨迹 = p_e 序、每结算 advance 恰 1;腿 3:advance 捕获实参 ∈ 敌句柄集、零 hero 句柄(B2 对 hero 句柄拒绝为兜底);腿 4:行动/伤害行序 = 生成序且每行 target 字段可归至对应单位 | 规则 10 / B2 义务① |
| AC-22 | b_mine_walk 单雷轮(L=1)+ goblin attack(腿 1);登记构造轮 L_amb=2 + weaken L=1 同轮(腿 2);b_flag 双 hit 旗同轮(weaken L=2;非平凡前提 m_w ≤ −51——F0 修订回写后恒满足,不满足时 SKIP 标记)(腿 3);defense_up 叠满同结算 P_pool = 2×m_d(腿 4) | 战斗段攻击拍 | 腿 1:伤害行携带 {baseline=a_g, attach=m_amb, 终值}、source_class=enemy_action、target = 受击单位句柄;L=0 轮 attach=0(自然读值);腿 2:D' = floor(D_raw × (100+P_e)/100 × …) 按表读值推导;腿 3:效果行显合成值 2×m_w 与终值两端、伤害行 value=0、apply_damage 捕获零次、B2 hero hp 不变、诊断零新增;weaken dur=1 轮末蒸发(下轮恢复常态伤害);腿 4:现行 −30 下 P_pool = −60 域内、乘数 0.4 无 clamp 腿——D' = floor(D_raw × 0.4 × …) 按表读值推导(免伤轮现行可达路径 = 腿 3 weaken 饱和;地板恰边界读法 P_pool = −100 由 F2 判据函数输入断言承载——AC-37) | 规则 10 / F2 / F3 / B3 义务③ / EC |
| AC-23 | (L_a,D_a) 结算 1 attack 后结算 2 构造挖雷 ×1(L_amb=1)(腿 1);`enemy_multi_unit` 根同步轮转至 charge 拍(腿 2) | 战斗段(charge 拍) | 腿 1:蓄力行(数字兑现面)+ query_attack 读值零作用 + 零伤害行、hero hp 不变;授予段伏击授予行在案(先授予后蒸发对照);轮末衰减清池(下轮 attach=0);腿 2:恰 u_c_f 条蓄力行、零 apply_damage、hero 承伤 0(合法状态非错误) | 规则 10/EC / B2 EC8 对侧 |
| AC-24 | `enemy_multi_unit` 根 + begin_battle hero_hp = 4 直供 | 首结算战斗段(敌[0] attack 分量 ≥ 4) | 敌[0] 伤害行后 hero hp=0 → 短路:敌[1]/[2] 零行动行、零 advance 捕获、径入衰减段(照常)→ 判定行 = 战斗失败(hero 先判防御腿——双死结构不可达不构造,判定行次序字段可读);battle_over 序列触发 | 规则 10/12 / EC / B2 义务③ |
| AC-25 | `enemy_multi_unit` 根 + 登记轮 L_amb = 2(双雷) | 战斗段逐敌解析 | 敌[0]/敌[1]/敌[2] 伤害行 attach 分量均为 2×m_amb(共享、非均分/消耗——每敌 query_attack 读同一 L);中途无池写捕获 | 规则 10 / B2 F2 |
| AC-26 | 任一 AC 场景(腿 1);末图清图胜利结算(AC-13 腿 1 场景 + 敌已全灭构造)(腿 2);全 dur=1 上轮清空后的结算(腿 3) | 结算 | 腿 1:衰减行恰 1 条/结算(k 记入行值)、decay_round 调用捕获恰 1 次;腿 2:判定行 = 胜利之前衰减行在案(先兑付后衰减时序契约;battle_end 全清兜底使两序同终态、次序钉死为段序);腿 3:衰减行 k=0(合法零行/聚合零计数) | 规则 11 / B3 义务④⑥ |
| AC-27 | 敌全灭结算(腿 1);失败(腿 2);继续(腿 3) | 判定段 | 腿 1:判定行 = 战斗胜利 → battle_over 序列(AC-31);腿 2/3:见 AC-24/AC-8;判定行公共字段 + 终局行在案(胜负画面数据锚) | 规则 12 |
| AC-28 | b_spawn cleared 判定 + A1 桩登记板序列 [板₂](程序构造、坐标级登记)(腿 1);桩登记返回带非法产物标记板(腿 2) | 出口分发 / install | 腿 1:调用捕获全序恰一次:A2 retire_board → B4 retire_mapping → A1 generate(board_gen scope +1——attempt 重试零额外取号)→ A2 install_board → B4 roll_board(reward_roll scope +1——每图恰一次)→ notify_settlement_done(new_board) → notify_round_start;新板资格格 roll 照常、grant_clear 零调用;完美计数随 install 重置;腿 2:install accepted(编排不拒产物)→ B1 上抛玩家侧呈现请求(回发捕获含呈现请求事件 + 数据面 = 非法标记,形态归 D1);A2 install 拒绝(不变式违例)= fail-fast 上抛(程序级非玩家域) | 编排专章换图腿 / B4 义务⑥ / EC |
| AC-29 | Active 且 rap ≥ rap_refresh_cost(腿 1);同轮第二次提交(腿 2);第三次提交(腿 3);rap < cost(腿 4) | 扮演 D1 经 `refresh_board` 提交刷新 | 腿 1:A3 request_refresh → true、rap=0、phase 不变(无结算段、无 round_end)→ 换图全序恰一次(A2 retire → A1 generate → A2 install → B4 roll_board;board_gen/reward_roll scope 各 +1);同轮续挖可证新图;腿 2:第二次完整编排;腿 3:拒绝(resource_face——refresh_cap_per_round=2);腿 4:false、状态不变(非编排错误) | 编排专章 / A3 Rule 11/EC13/EC15 |
| AC-30 | stopped 轮与 ap_exhausted 轮(各构造)(腿 1);cleared 轮(腿 2) | 出口分发 | 腿 1:notify_settlement_done(same_board) 恰一条、new_board 回发零次、retire/generate/roll 捕获全零(本编排无刷新提交面);fail-fast 守卫半 = 自守 debug 断言(内部违约路径不可由公开 API 构造——负空间,契约源 = registry action_economy.rap_rules,存在性由 AC-43 扫描域 + 代码评审承载);腿 2:cleared ⇒ new_board 恰一(AC-28 全序——两腿合成契约全貌) | 编排专章 / A3 rap_rules / 强制检查点③ |
| AC-31 | 判定行 = 胜/负任一(腿 1);末层 victory 或 defeat(腿 2);清理序列注入重复调用(诊断注入构造)(腿 3) | battle_over 序列 / `level_clear()` / 清理中 | 腿 1:捕获全序恰一次:B4 retire_mapping → B2 despawn_all(query 双侧空)→ B3 notify_battle_end(query 双侧空)→ A3 notify_combat_end(phase=Idle、rap=0)→ set_reload_gate(false);clear_inventory 不在 battle_over 序列中(缺席本身为断言腿:battle_over 后 query_inventory 逐字不变);腿 2:clear_inventory 恰一次 + 返回清空前快照计数("剩余道具 ×N 随关卡结束清空"反馈行数据面;折算结构位归 C2);此后 stock/use → false + 诊断;腿 3:debug 诊断 + 序列剩余步骤照常完成(幂等守卫兜底 false);后续 begin_battle 正常受理(防半清理态泄漏尾腿) | 编排专章 battle_over/level_clear 腿 / B4 义务⑤ / EC |
| AC-32 | AC-5 战斗开始序列完成后(gate 捕获 = true 在案)(腿 1);AC-31 battle_over 完成后(腿 2) | 经 ConfigDB `reload()`(debug 构建) | 腿 1:返回 false、ConfigDB 值不变、config_reloaded 不发("战斗中真的被置位"由编排真调用承载);战斗中经测试通道换根直调 load_tables(collect_only=true) 读值不受门约束(通道区分);腿 2:reload() → true 且 config_reloaded 恰一次 | 规则 16 / D2 EC8 / 强制检查点① |
| AC-33 | 两套全新全栈实例(同 master=42、同根、同板登记序列、同 encounter);判别腿:仅窗口选择序列不同(同意图) | 同一意图序列 + 窗口选择序列驱动两遍(定长场景:含挖掘/连锁/插旗/停手/窗口选用/刷新换图至少各一) | 两遍步骤流逐行相同(行数/行序/全字段含 value 与归因——target/effect_id/pool_value 均为输入的确定函数,逐行相等断言域含之);判别腿:仅窗口选择序列不同 → 步骤流在窗口标记处分歧、其前逐行相同(窗口选择序列确为回放输入);确定性来源行为面:B1 全程零 RNG 调用(AC-43)+ 表值快照 + attempt 非 scope 事件 | 规则 15 / 强制检查点② / D2 AC-15 |
| AC-34 | AC-29 腿 2 连环刷图场景 | 任一结算回放切点取快照(master_seed + 双流 scope 计数器 + 意图序列 + 窗口选择序列) | 无在飞流实例跨界(切点时刻双流计数器 = 已完成 install 数);续玩快照恢复驱动 = 端到端集成冒烟 deferral(生效条件 = D3 实现) | 编排专章回放切点 / 规则 15 |
| AC-35 | b_flag 构造零误标 ∧ ≥1 标中(仅插 (1,4) hit 旗)→ 挖尽 cleared(腿 1);同构造 + 插 (0,3) miss 旗(腿 2);全板零旗 cleared(腿 3);AC-28 换图后新板零 flag_judged(腿 4);b_fog 雾内插旗(腿 5) | 清图兑付 / 结算 | 腿 1:高光行在案(value = 实际有效兑付当量)+ 清图奖励身份第二份兑付捕获恰一次(道具类身份 → stock 恰 2 次 / buff 类身份 → apply_effect 恰 2 次——玩家实得两件;grant_clear 本身仍恰 1 次;等价入账 = power × P_pf ÷ 100 记号推导);腿 2:无高光行、正常兑付 + "标旗未中"零值行在案(highlight=perfect_broken)(全有或全无谓词、无部分完美档);腿 3:无高光行(hit=true = 0 不满足谓词);腿 4:完美谓词域 = 本板自 install 起(跨图不累积——构造前板含误标 + 换图后新板零误标有标中 → 新板 cleared 触发高光,重置判别正腿);刷新图本身零 grant_clear 无兑付点;腿 5:雾内插旗计入误标(hit=false)→ 破完美(无变异分支) | 规则 13 / EC×2 |
| AC-36 | 默认根 + 登记构造(每活行一 B3 实例:defense_up L=1 / weaken L=1 / ambush L=1×k=1;clear_blast 经 grant_clear 快照) | 结算兑付读值(query_active 快照载荷 / grant_clear power)经统一换算式 E(·)(SettlementTable D_ref 读值) | E_inst 结论与登记对照表一致(F1 重算回执版):E_defense = \|m_d\|/100 × D_ref、E_attack = 0.50 × D_ref、E_weaken = \|m_w\|/100 × D_ref、E_ambush(k=1) = m_amb、E_clear = power ×(perfect ? P_pf ÷ 100 : 1)(真实双份——完美板两件实得、总当量 = 2×power;单一线性换算——各行共用同一 D_ref 读值);锚两腿断言:E_weaken > E_attack ∧ E_weaken ≥ E_dig 推导值(登记常数——重算批回执值);attack_up 活行:hero_offense 池映射在位 ∧ 主角先手攻击伤害行 hero_offense 消费点在案(F3⓪ 基础分量——规则 10 / F3 对账;attack_up 活行口径) | F1 / 规则 13 / B3 义务⑤ |
| AC-37 | F2 闭合判据函数(语义映射 → 池加算 → clamp → 乘区 → floor)+ 登记构造 | 以登记构造跑 F2 三例读法(weaken AP 界 8×m_w / 表界 16×m_w / defense_up 叠满 2×m_d——全表读值记号) | 判据结论逐一与 F2 表一致:两越域例 clamp 后 M=0;叠满例 M = 1 + 2×m_d/100 域内(现行 −60 → 0.4,无 clamp 腿);地板恰边界读法(M=0 未越域)以判据函数对 −100 输入断言承载;地板交叉层数 = ⌈100/\|m_w\|⌉ = 2(表读值推导);取整方向 = floor 单一规则(半值例断言);行为级交叉锚 = AC-22 腿 3 | F2 / B3 义务③ |
| AC-38 | F3 判据函数(三分支全序 + 负值禁令 + 死亡边界)+ 登记例(goblin L=2 → weaken → floor 3 记号 / knife_adv p_i vs hp=6 残敌 / D'=0 分支) | 以登记例跑判据 | 结论与 F3 一致:零负值(任意输入组合判据函数输出域 ≥ 0——参数化扫描)、Dead ⇔ hp=0 零负 hp 中间态、hero 先判优先级;行为级交叉锚 = AC-18/20/22/24 | F3 / B2 义务③ |
| AC-39 | F4 闭合判据函数 + 登记常数(C3 v3 行值总表:10×10 d0.25 → \|M\|=23/\|S\|=77、12×12 d0.25 → \|M\|=34/\|S\|=110;ι = 行 target 代 p10 乐观代理;m_d/D_a、m_amb、D_ref 全表读值/登记推导) | 对 L1/L2 两板形与满配语境(unit_count=3)跑配对主式 | 结论与登记一致(双口径断言——重算批回执):L1 裕度 ≈0.48× ✗ / L2 ≈0.47× ✗(锚行口径;期望口径 E_dig=4.5 → ≈0.60×/0.58× 同向破线——双口径登记)/ 满配语境 ≈0.16× 深度破线 ✗ → C3 曲线级约束输出(V_safe 侧杠杆重议——联动网络,F4 结论④);适用域守卫腿:登记构造 n_s < 1(残余集为空)→ 主式不评估、信息端平凡腿接管;信息端平凡腿 P(安全)=1 → V_safe > 0 恒真;registry clause3_supply 重算回执存在性断言;A1 actuals p10 交付后强制重跑 | F4 / B2 义务④ / 强制检查点条款③ |
| AC-40 | F5 闭合判据函数(修后模型:n_s = (1−ι)×\|S\|、E[踩雷] = \|M\|×n_s/(n_s+1)、X_res = E[踩雷]×V_mine、Δr = ⌈(n_s+E[踩雷])÷AP_r⌉、C_eff = C×(perfect ? P_pf ÷ 100 : 1))+ 登记常数(v3 曲线板形同 AC-39 / ι / E_dig 格子池加权推导 / C=clear_blast power / P_pf / AP_r / fog_burden_ratio 登记代表值) | 主判式对 L1 无雾态/L2 两板形 × {unit_count=1, unit_count=3} 四态组合 × {完美/非完美} 分支跑 | 结论与登记约束包一致(重算批回执):L1 −28.7/+11.3、L2 −67.4/−27.4、L1 满配 −153.2/−113.2、L2 满配 −257.1/−217.1——条款⑤未闭合(verdict = 未证明的约束生成器;L1 完美翻正腿在案);实现率折减腿(E_dig×0.6)读数在案(L1 −45.3/−5.3、L2 −91.2/−51.2);保守地板需求输出(L1 ≥ 110.3 / L2 ≥ 166.8);停手侧 RAP 零价假设登记存在性(判据函数输入分解可读);护栏 A/B 行断言 = 登记存在性 + 旧值链待重推注记(护栏 A 方向性复核 −1.1 越下界 / 护栏 B C=40 越线——W2 三选一裁决随 C3 收口批,本 AC 不断言其数值);A4 三腿入账核对(雷险消解/信息双向/AP 腿)逐腿在输入分解中可读;全条为对账断言——非 playtest | F5 / 强制检查点条款⑤ |
| AC-41 | 默认根加载 | 脚本解析 `design/registry/entities.yaml` | ① status_effect.anchor_warning 含 F0 裁决回执注记(瞬时口径 / 值域 [60,85] 默认 65 / 交叉层数 2 / attack_up 参照回迁口径重跑兑现——重算批注记);② weaken 值域修订注记 + clause3_supply.direction_precheck 闭合回执注记(含 2026-09-14 重算回执——现行值链破线读数);③ clause5_dominance 注记存在(含 C3 裁决 + 重算回执);④ settlement_table 条目存在且十二字段名与 SettlementTable schema 逐一相等(pool_clamp_lo/hi 两字段 + 充能三参数与 armor_effectiveness——W3 字段);⑤ knob 活值(D_ref/P_pf/m_w/m_d)不作定值对账 | F0(registry 对账形态)/ 规则 16 / 对账清单 |
| AC-42 | 全部 AC 场景步骤流捕获全集(冒烟汇总断言) | 逐行校验 | type ∈ 封闭枚举 13 类(封闭枚举即负空间:新增行类型 = 接口漂移);每行公共字段 type/source_class/origin_cell/round_index/display_name/value/highlight? 全在(origin_cell 板级行可空;highlight 可空枚举 {flag_hit, clear_reward_h2, perfect_broken});行类型特有字段:伤害行/道具行(生效)携 target、效果行携 effect_id + pool_value 且 value = 单次授予贡献值语义;source_class 值域 ⊆ source_label_map 键集 ∪ 判定/道具扩展 ∪ {enemy_action, flag_miss}(新增 = 接口漂移的表侧闸);无来源行 = 断言失败(P2 兜底的机器可判定形式);未生效四类 + 标旗未中行各携带聚合计数/批次字段(非空) | 规则 14 |
| AC-43 | B1 文件集(编排器/判据函数/步骤流/冒烟脚本/夹具规格)与全项目非 tests/ 文件集 | 静态扫描 | ① 零 randomize()/RandomNumberGenerator/自建 RNG;② 零 extends Control/Node2D、零 .tscn preload + AC-5 headless 实跑通过(合成判定);③ 结算路径 await 零命中(逐字面 warning 级 + 人工复核);④ 编排唯一性单向扫描:全项目非 tests/ 文件集中 B2/B3/B4 API 符号命中文件 ⊆ B1 文件集;⑤ D2 AC-14 人工三要素字面量扫描(行为级硬证据 = AC-22/36/39/40 全表读值推导 + AC-41 registry 对账);⑥ A2/B3/B4 相互直调零命中 | 规则 1 / 编排不变式③ |
| AC-44 | b1_default + 登记构造轮(挖掘 ≥10 安全格〔含连锁——cap 腿 >8〕+ 首次标中旗 2 枚 + 目标甲型三腿:goblin none / bugbear a / ogre_chief b;attack_up 授予 ×1 腿与非授予腿对照) | 结算战斗段主角先手攻击(表读值记号:da/ca/dbf/甲效矩阵) | 三分量读法逐腿与 F6 一致:A 池 = min(开格数×da, ca)、B 池 = 首标数×dbf;base = floor(atk×(1+P_offense/100))、dmg_a/b = floor(池×甲效/100)、D_hero = 三分量相加(表读值推导不写死);甲效三腿读数 = 特化 ×1.5 / 无甲 ×1.0 / 对位 ×0.5(甲B 对策 = dmg_b 腿——C3 联动网络 #6);attack_up 零泄漏腿:P_offense 变更只移动 base、A/B 分量逐字不变;敌方侧 percent 池零作用(hero→敌方向);cap 截断腿:15 格轮 A 池 = ca(截断入诊断计数、零明细行);轮末清零腿:下一结算 A/B 池 = 0;明细行 {baseline, attach} 分量可还原(充能池公开读值) | F6 / W3 / C3 联动网络 #6 |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v2 | 2026-09-14 | 两件套迁移:按 v2 骨架重排(设计目的/系统范围/核心循环/领域章节/依赖与输出/P0 闭环/P1·P2 后置/调参表/验收标准)——设计推演(F0–F6 推导、候选取舍、体验锚点论证)与审计元数据(复核注记/对账登记义务清单/AC 覆盖矩阵/缺口预检/开放悬案)迁出至 `design/gdd/analysis/b1-settlement.md`;规则/数值/AC/EC/依赖零变更,AC 编号沿用 |
| 跨评审 B1 重算批 | 2026-09-14 | /review-all-gdds 🔴-1 后半(registry 同批重登回执):**F0/F1/F4/F5 按现行三输入重推**(duration=1〔两级奖励批〕、m_d=−30〔减伤墙批〕、C3 v3 曲线 d0.25/t0.88 换锚——原 A1 参考行退役)——**条款③两参考板形翻为破线**(锚行 ≈0.48×/0.47×、期望口径 E_dig=4.5 → 0.60×/0.58×;满配 ≈0.16×),旧"通过"回执(≈2.0×/2.6×)退役为历史记录、破线升格 C3 曲线级约束(V_safe 侧杠杆重议——禁独立调参联动网络);E_dig 重推 7.2→4.5(格子池加权,注入池不摊入)· 条款⑤四态重推(L1 −28.7/+11.3 等;保守地板需求 110.3/166.8,C3 裁决②维持)· **F1 对照表按现行行集重登**(两级行值 8/16/40 + 注入池 + clear_blast;attack_up 死行注记清除——与 Core Rule 10 先手攻击对账;锚对照实物改 attack_up 行〔registry 回迁口径重跑兑现〕)· **F6 充能与护甲克制结算规格**(W3——累积时点/单轮 cap/不吃 percent/逐分量甲效查表 floor + AC-44 + F1 对照两行)· W6 挖掘期刷新改**每轮 cap 2**(RoundStart 重置——A3/registry/D1 同口径)· defense_up.magnitude/duration 纳入禁独立调参联动网络 · AC-22/36/37/39/40/41 改写 · 护栏 A/B 读数挂旧值链注记(W2 复核随 C3 收口批)· 悬案 9/缺口预检 3·7 闭合 · 核心规则表增依据列(lint R8 引用列迁移) |
| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-6 回执,registry 同批):战斗开始序列增 **encounter 掷骰步**(RngService 封闭流恰一 scope——unit_count 区间骰定本战实际数量,spawn 增 override 参数 n)· Core Rule 1 零随机扩界注记(实例化骰在结算步流之外,可回放性不受影响)· AC-5 增 encounter scope 腿 · SettlementTable +4 字段(damage_a_per_cell / damage_a_cap / damage_b_per_flag / armor_effectiveness——护甲克制批转正,机制与结算归 B1、C3 投值)· 条款⑤ C3 裁决回执行(约束包② 采信 + clear_blast C=40 缺口重推 6.1/51.8)· 敌种键更名 goblin/bugbear(DND 批对齐) |
| v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;散文/枚举/边界情况/AC 转表格;流程转字符画;公式、Variables 与验算数据全保留;语义与 Rev 1 及后续拍板批对齐,零规则变更 |
| D4 修订 | 2026-09-12 | 刷新决策前移挖掘期:新增"挖掘期刷新"出口(refresh_board 编排——request_refresh 扣费 → 换图全序,无结算段、轮次不终结),原 Waiting 期刷新代理调用弃用 |
| 2026-09-11 拍板批 | 2026-09-11 | 主角先手攻击(hero_attack 来源 + F3⓪)、两级奖励裁决(instant_aoe/instant_heal 当场兑付)、道具窗口单件制(>1 件 = 编排违例取首件)、库存关内延续(battle_over 不清库、新增关卡末 level_clear 清库编排) |
| Rev 1 | 2026-09-10 | design-review 8 项 blocking 核销:完美排雷落真实双份交付载体 + 高光行有效兑付语义/零兑付降级;条款⑤计价模型重推为挖穿残余池口径、verdict 翻转 → C3/B4 约束包 + 多敌验算腿 + ι→1 域守卫 + 护栏 B 输入登记与双读数;流水协议 target/effect_id/pool_value 字段分层 + enemy_action/flag_miss 来源枚举;hit=false"标旗未中"零值行(每雷实例一次去重);P_perfect ÷100 换算成文 + 载体域收窄 {100,200};AC-18 腿 2 改写;F4 V_safe 标签更正 + 期望口径敏感性读数;clamp 统一八字段——明细见 reviews/b1-settlement-review-log.md |
| v1 | 2026-09-10 | 一次会话定稿:F0–F5 + 43 条 AC + 23 条上游义务落位;F0 归一口径裁决(每结算瞬时当量,m_w 值域 [60,85]/默认 −65)与高光双落(完美排雷 / 标中旗标记)即定 |