Files
gplan-2/design/gdd/b2-enemy-system.md
T
2026-09-14 18:18:49 +08:00

606 lines
90 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.
# B2 敌人系统(Enemy System / 战斗单位系统)
> **状态**:Approved · lean 格式
> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents
> **承载支柱**:P3 主(雷→敌方优势的收件人与同源兑付面)· P2(敌方增益行可归因)· P1(视觉推测型读怪 = 规划素材)· P4 间接(地牢住户)
> **一句话**:B2 定义战斗双方是谁、多强、带什么词条、如何受伤与死亡——雷的代价的收件人。
> **复核注记**:lean 门禁下 systems-designer(Formulas)/ qa-lead(AC + 缺口预检 7 项)已委托起草;creative-director 与 art-director 未经咨询——生产前人工复核体验锚点情绪定位与 Visual/Audio、art-bible 一致性(art-bible §1–4 须在 D1 GDD 前创建,本节线索清单是其输入之一)。
## 速览
| 关键问题 | 答案 |
|---|---|
| 定位 | 战斗域单位层(Layer 2 Core · MVP · 设计顺序第 7 位):定义"战斗双方是谁、各自多强、带什么词条、怎么受伤与死亡";持有 D2 EnemyTable 回填权,承载主角与敌人共用的战斗单位接口。缺本系统则踩雷优势无受益者(P3 断)、胜负判定无主体、难度曲线无施加对象 |
| 拥有 | 单位状态(hp/max_hp/存活/行为环指针)与查询/受击/推进接口 · EnemyTable/HeroTable schema 与双敌种行回填(行键 (level_index, node_depth, enemy_id))· 行为环语义 · 目标选择规则(固定顺位)· 伏击量纲定稿与 advantage_per_round_cap 表值 |
| 不拥有 | 结算编排与伤害消费语义(B1 SettlementTable)· 状态实例容器(B3)· 奖励内容与掉落(B4)· 棋盘规则(A1/A2)· 单位成长曲线与难度修饰(C3)· 遭遇构成(C1)· 呈现(D1/B5/D5)· 单位/词条类结构与事件载体实现(实现期 ADR 域) |
| 上游输入 | D2 EnemyTable/HeroTable 行值(ConfigDB 单点读取、R1 行解析)· hero hp 入参(编排方供给)——A2/A3/A1 事实均经 B1 结算编排转化,零直接接口 |
| 下游输出 | 单位状态查询/受击/推进接口(B1 消费)· 意图视觉映射键 enemy_id 与视觉状态清单(D1/B5 消费)· 伏击量纲 + cap 表值 + k 可算性(B1 条款 3 对账输入)· 行为环教学口径(D5) |
| 硬约束 | 零随机(rng_service 流封闭)· 零 UI 依赖 · 零主动事件订阅 · 悬空引用致命、零软回退 · 行为环敌单位专属 · 单位接口调用权集中归 B1 · 胜利路径 = 基础攻击(恒在)+ B4 奖励侧规划面伤害共同承载——"敌人全灭 → 战斗胜利"可判定 |
## 体验锚点
> 情绪目标一句话:**"对面是个看得懂的对手,不是一个血条"**——威胁可推测、可归因、可拆解;玩家不操作敌人,但每一轮都直接感受它。
| 支柱 | 关键词 | 机制承诺 |
|---|---|---|
| P3 同源的对面对象 | "赌桌对面的那个存在" | 结算明细"敌方获得伏击 +3(第 4 轮 · 雷)"的行可指认——敌人强度是扫雷决策的镜像,威胁有源可溯 |
| P1 可推测的威胁 | "它弓起背了,下一拍是重击" | 读怪推理进入挖掘决策(形态↔行为映射稳定可学,MVP 双环最长 3 拍);不预告精确数值——数字在结算明细兑现,结算前的世界靠观察而非读表 |
| P2/P3 的拆台兑现 | "它强是我喂的,它弱是我拆的" | 标中旗 weaken 与伏击行同框、同一呈现语言,落在同一个它身上 |
| P4 地牢住户 | "越下越险的刻度" | 深层敌人更凶(C3 施加),给下探氛围一个可见刻度 |
- 反向护栏:威胁绝不能是无源暗账——玩家说不出"它为什么变强 / 这一拳为什么这么重"即归因链失职(P2/P3)。
- 视觉推测型对偶护栏:线索必须稳定可学(形态↔行为映射每 run 恒定,D1 义务②);任何让线索重掷或不可学的呈现设计默认砍掉(P1)。
- 血条/攻击力数字可读性适用视觉锚 1(暗色底上高对比)。
- 参考感受合成:Peglin 固定招式轮替(威胁因可预测而可规划——确定性环是可学习性来源)× 怪物猎人读招(前摇姿态承载威胁信息、无数值面板——视觉推测的同构)→ 本作 = 确定性环 × 视觉推测;反向对照(要避开的感受)= 半随机、不可归因、重掷线索的"猜怪"呈现。
## 全局流程
B2 编排被动——调用权集中归 B1;下图从 B2 视角画单位级行为环与生命周期出口。
### 敌人行为环
```
战斗开始(B1 编排调用,B2 侧语义)
│ ① 解析遭遇行 (level_index, node_depth) —— D2 R1 进度键 floor + enemy_id 精确匹配(悬空致命)
│ ② 行值快照 → 实例化本战实际数量 n 个敌单位(行主序生成序——B1 encounter 骰 override;定值行 n = unit_count)+ 主角(hp 入参)
│ ③ 全部指针指向环首:beat = pattern[0]、steps = 0
▼
每次结算(B1 编排驱动——B2 零主动;推进域 = 每存活敌单位恰一次 advance,主角无行为环不在推进域)
│ ⓪ 主角先手攻击 → apply_damage(顺位最前存活敌, 伤害) [战斗段固定动作,非行为环]
│ ① 兑付读值:query_attack(u, L, m_amb) → {baseline, attach, total}
│ ② 受击上报:apply_damage(hero, 减伤后终值) —— 调用序钉死:倒序会读到下一拍(B1 义务①)
│ ③ 推进:advance(u) —— 存活才推进(先作用后推进)
▼
当前拍作用(每存活敌单位)
├─ attack:本结算对主角造成 atk 点伤害
├─ charge:本结算不作用(威胁空拍、规划窗口;不兑付伏击、不读池)
└─ heavy :atk × heavy_multiplier 对主角
▼
拍作用完成 → steps + 1 → beat = pattern[steps mod 环长](环尾回环首;跨轮次、跨扫雷图延续)
轮到前被杀 → 本拍不打、指针冻结(死亡即不动手;MVP 无复活 → 永久冻结)
▼
battle_over(B1 调 despawn_all)→ 全部单位 Despawned(状态消亡,不跨战斗)
```
### 出口分发
| 出口 | 触发 | 动作/去向 | 约束 |
|---|---|---|---|
| 单位死亡 | hp = 0(判定时机归 B1) | 移出顺位、不再作用、不计入"未灭";轮到前死 → 指针冻结、行动后死 → 已推进 | 不可逆(MVP 无复活);Dead 句柄保留只读可查(query_beat 冻结值) |
| 敌全灭 | 存活敌集 = ∅ | "敌人全灭"成立 → B1 胜利判定素材;单体/AOE 无有效目标;敌侧伏击池随轮末衰减自然清空 | 判定逻辑归 B1 |
| 主角死亡 | hero hp = 0 | 战斗失败判定素材(判定时机归 B1) | battle_over → 全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态 |
| battle_over | B1 编排 despawn_all | 全部单位状态消亡、不跨战斗;Despawned 后唯一出口 = 重新 spawn(新战斗) | 重复 despawn_all → false + 诊断;Despawned 为逻辑失效态(失效句柄查询空 + 诊断) |
## 核心规则
> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。
#### 规则 1:主角和敌人共用同一套受伤与死亡规则
**人话**:这条管的是战斗里所有"单位"的通用身体规则。战斗场上恰有两类单位:主角一个、敌人若干,共用同一套身体语义——每个单位有当前血量与血量上限,挨打就是血量往下减,血量到 0 即死亡。超上限、负数、一刀砍超的部分怎么处理,以及"这一下究竟何时算死",都归战斗结算系统(B1)的结算公式域裁决。
B2 只提供受伤上报与状态查询接口、如实记账,"谁在何时对谁造成多少"的流水账本也在 B1。主角血量归零 = 战斗失败的判定素材,敌人全部归零 = 战斗胜利的判定素材——判定本身同样归 B1。
**举证**:无计算。clamp/负值/溢杀语义与死亡判定时机的成文义务登记为 B1-③(B2 侧 out-of-scope);单位接口、胜负素材与越界拒绝验收见 AC-1/AC-2/AC-6。
#### 规则 2:一场战斗 1–3 个同种敌人,敌方效果对全体生效
**人话**:这条定的是"一场战斗有几个敌人、效果怎么作用"。MVP 每场战斗 1–3 个敌人,全部是同一种敌、属性完全相同——由敌人表同一行实例化,按行序排出先后;数量是敌人表里的调节旋钮。战斗中敌人只减不增(没有召唤/增援/分裂)。
敌方吃到的增益/减益是"对全体生效":作用于所有存活敌人,层数进一个共享池——这是与状态系统现接口零改动兼容的 MVP 路径。"只作用于某一个敌人"的单体寻址暂不开放,登记为状态系统的扩展位,等第一个单体效果上线时补列。
**举证**:无计算。构成/同质性/作用域/单调性细则见下方实现参照表;target_ref 扩展位义务登记为 B3(首个单体效果上线时补列,随批 B1 归集语义/D1 呈现裁决);战斗内不增员见 EC5;验收 AC-1/AC-5/AC-9。
### 规则 2 的实现参照——多敌模型
| 项 | 内容 |
|---|---|
| 构成 | 1–3 个同敌种单位(unit_count int [1,3] 表字段 knob);战斗开始实例化、行主序生成序 |
| 同质性 | 战斗内敌单位同种同属性——同一 EnemyTable 行实例化 |
| 效果作用域 | side-wide:enemy 侧效果作用全体存活敌单位——层数为 side 共享池(F2 池共享不消耗);B3 现接口零变更兼容 |
| target_ref | 单体寻址登记为 B3 扩展位义务(首个单体效果上线时补列;随批:B1 归集语义/D1 呈现裁决) |
| 单调性 | 战斗内敌单位数 = unit_count 不增(MVP 无 summon/增援/分裂——EC5) |
#### 规则 3:MVP 就两种敌人,每个关卡坐标只出一种
**人话**:这条定的是敌人名录。MVP 恰两种敌人:地精(goblin)与熊地精(bugbear),数值全部 provisional(临时占位),MVP 名录定稿走索引门禁。敌人在敌人表里按"关卡序号 × 节点深度"坐标存放:每个坐标的行集里只许出现一种敌人——这是表结构校验,配出两种就加载报错;由此既没有"同一点随机挑一种"的选择规则,也没有引用悬空的风险。
行集逐坐标判定,同一关内随深度换敌种合法。MVP 分布只是最平直的合法示例:第 1 关全深度地精、第 2 关全深度熊地精——占位示范、非范本,难度调参勿照抄(防多样性无护栏),遭遇分布调参所有权归难度域(C3)。名录扩容排垂直切片/Alpha;"同深度多敌种怎么选"归遭遇构成(C1)/难度域,目前只是预留结构位。
**举证**:无计算。"每行集恰一敌种"(加载期致命)与字段域校验验收见 AC-12/AC-14;敌种 id 集合定值断言 {goblin, bugbear, ogre_chief} 见 AC-14(C3 修订批扩容三敌种);registry 物种注记对账见 AC-16③。
#### 规则 4:敌人按排好的剧本轮流出招,走到哪一拍零随机
**人话**:每种敌人有一条排定的行动剧本(行为环):战斗开始指向剧本第一步,之后每结算一次走一格——轮到谁,谁先把当前这一拍的招打出去、再走格;走到剧本末尾回到开头;跨轮次、跨扫雷图延续,战斗结束随单位一起消亡。轮到它之前被打死:这一拍不出手、指针就地冻结("死亡即不动手")。全程零随机——走到哪一拍由结算次数唯一决定,同种敌人因此永远同拍。行为环是敌人专属:主角没有行为环,对主角调环接口一律拒绝。MVP 只启用攻击/蓄力/重击三种拍,后四类是预留位、配进表会被校验拒绝。
**举证**:无计算(推进是确定性函数)。指针/回绕/冻结/同步性质公式见 F1;"每结算恰一次推进"与结算内调用序登记为 B1-①;推进细则与预留值拒绝(fail-fast)见下方实现参照表;验收 AC-3/AC-4/AC-5/AC-15(预留值致命 manifest pattern_reserved)。
### 规则 4 的实现参照——行为环推进细则
| 项 | 细则 |
|---|---|
| 指针初始化 | 战斗开始指向环首:beat = pattern[0] |
| 推进时机 | 每次结算推进一格——先作用后推进(B3"先兑付后衰减"同款时序哲学);轮到该单位行动时仍存活才行动并推进 |
| 死亡口径 | 轮到前被杀 → 本拍不打、指针冻结("死亡即不动手",F1 承载;MVP 无复活 → 永久冻结、随 battle_over 消亡);行动完成后才死 → 已行动已推进 |
| 回绕与域 | 环尾回环首;指针 ∈ [0, 环长);环长 1(goblin)退化为恒等 |
| 延续 | 跨轮次、跨扫雷图延续(战斗域);battle_over 随单位消亡;除 despawn_all 外无任何重置入口 |
| 确定性 | 零随机——环推进是结算次数的确定函数(rng_service 流封闭,P1) |
| 专属域 | 行为环为敌单位专属:主角无行为环——advance/query_beat 等环接口对主角句柄一律拒绝(false / 空 + 诊断) |
| 实现域 | MVP 恰前三类 {attack, charge, heavy};guard/boost/hinder/summon 为预留语义位(垂直切片/Alpha),EnemyTable.pattern 校验拒绝预留值(fail-fast,A1 solver_rules 冻结先例)——启用走本 GDD 修订(枚举封闭性)非调参 |
#### 规则 5:每踩一颗雷敌方叠一层伏击——一轮封顶、超出可见不生效
**人话**:这条定的是踩雷对敌方的反噬。挖开雷格时,敌方全体获得一层"伏击"强化——MVP 伏击清单只有伏击这一条(状态系统表里 mine_hit 雷击来源的唯一效果行);将来加新词条要状态系统加行并连锁更新锚点,不属于 MVP。转化路径:棋盘上报"挖到雷"→ 结算编排把它转成一次伏击施加(作用全体敌人、共享层数池),每颗雷恰转化一次。单轮授予有上限(敌人表行值,默认 4):上限之内逐颗叠加;达到上限后,多踩的雷不生效,但逐颗记一行"溢出未生效"结算明细——惩罚不静默蒸发。
| 单轮伏击上限(cap 行值) | 行为 |
|---|---|
| 默认 4 | 前 4 颗雷各叠一层;第 5 颗起每颗记一行"溢出未生效"明细 |
| 调到 8 及以上 | 单轮雷数至多 8 颗、达不到上限——溢出协议自然不可达 |
| 0 | 该行敌种免疫伏击——每颗雷都记"溢出未生效",全部可见、全部无效 |
**举证**:计算见 F3:granted = min(当轮新开雷数, cap)、overflow = 差值(守恒、零静默蒸发)、L = granted(dur=1 轮末全清)。每雷恰一次转化登记为 B1-②、溢出行协议登记为 B1-⑥;cap 默认 4 定稿与反灾难护栏绑定域(单轮 5–8 雷灾难轮)见 F3;cap 表值同时是 A3 F1 条款 3 挖掘风险不等式的 B2 供给表值(单结算自然边界口径见 F4)。验收 AC-8。
#### 规则 6:一层伏击 = 敌人每次攻击多打 3 点固定伤害
**人话**:这条定的是伏击到底多疼:一层伏击 = 敌人每次攻击类行为(普攻或重击)额外多打 3 点固定伤害,按主角血量点数计。结算读法:某个敌人出手时,附加伤害 = 敌方池当前层数 × 3。两个要点:附加是后置加法、不进重击倍乘(倍率只乘基础伤害);蓄力拍不出手、不附加。伏击只活一轮——每轮结算清零、没有跨轮存量,所以跨轮累计没有表值上界;单次结算有自然上界(见举证)。
**举证**:上界算式:单结算单单位附加 ≤ cap × 3 = 12(默认);敌方全体结构上界 = unit_count × min(单轮开雷上界 8, cap) × 3(满配 3×4×3 = 36;默认单敌 = 12);跨结算累计 = 轨迹量、非表值、不设上界(dur=1 每结算清零)。伤害构成与合成序见 F2;等量换算与不等式闭合归 B1(F4);量纲定稿注记按接口漂移回写 registry status_effect.ambush(AC-16④)。
#### 规则 7:敌方打主角不用挑,玩家侧永远先打排最前的敌人
**人话**:这条定的是"打谁"。敌方一侧没有选择可言:所有存活敌人各自按自己行为环的当前拍作用于主角——主角是己方唯一单位,天然是唯一目标。玩家/道具一侧打敌人用固定顺位:单体效果默认打生成序最前的存活敌人,它死了顺延到下一个;范围效果(AOE)打全体存活敌人,同样无需选择。这套规则供结算编排消费;道具自带"指定目标"语义的扩展归道具系统(B4)/结算域。顺位必须对玩家可读——"下一个被打的是谁"要能推测出来,这是呈现层义务。
**举证**:无计算(纯规则)。固定顺位供给面、死亡顺延与 u_c=1 退化(AOE ≡ 单体、合法非错误)验收见 AC-10;顺位快照 = 生成序、单体/AOE 分流消费登记为 B1-⑤;顺位可读呈现义务登记为 D1-③(呈现契约表 #3)。
#### 规则 8:敌人要出什么招靠看图推测,不直接报数字
**人话**:这条定的是玩家怎么"读"敌人。界面上不直接显示敌人下一拍的行为与数值——威胁靠看图推测:它弓起背,下一拍就是重击。两条承重规格:"预告时序"(即将执行的一拍在挖掘阶段全程亮出)与"映射每局恒定"(禁止重掷,否则读怪退化成猜怪)——否则"抢在重击前击杀"窗口、"蓄力轮放心贪雷"教学、读怪幻想三者同时落空。精确数字只在结算明细兑现。线索清单与图像规格归呈现层(D1/B5),映射键 = enemy_id;MVP 读怪对象 = 两条环(最长 3 拍),学习成本低。
**举证**:无计算(规格非算式)。五条规格全文见下方实现参照表;线索清单/图像规格/映射全局恒定呈现义务登记为 D1-①②(登记 systems-index;映射键 = enemy_id,B3 effect_id→icon 同款契约);"不直接显示数值"的负空间 = 冒烟 API 封闭枚举(无意图数值 API);行为环可学性行为级证据 AC-3/AC-15。
### 规则 8 的实现参照——意图可见性五条规格(承重项)
| # | 规格 | 内容 |
|---|---|---|
| ① | 图像↔行为映射稳定可学 | 同一敌种同一行为恒同一视觉状态(如 bugbear 蓄力拍 = 蓄力姿态) |
| ② | 形态暗示强度 | 敌种形态承载强度档位与环长的直觉编码("大个子多半有重击"式) |
| ③ | 映射每 run 恒定 | 禁止重掷——否则"读怪"退化"猜怪"(违反 P1 裁剪判据);映射键 = enemy_id |
| ④ | 精确数值在结算明细兑现 | P2 归因不变——预告面是图像、数字面是明细 |
| ⑤ | 预告时序锁定 | 视觉状态呈现即将执行的一拍(当前拍预告)——挖掘阶段全程可见;结算时不另设独立意图播片(结算明细是数字兑现面、非意图预告面) |
#### 规则 9:主角数值在英雄表里——血量上限加恒在的基础攻击
**人话**:这条定的是主角这边怎么打。主角战斗数值单独放一张全局单行的"英雄表"(本 GDD 是回填 owner,走 D2 接口漂移规则回写),两个字段:
| 字段 | 域(knob) | MVP 值 |
|---|---|---|
| max_hp 血量上限 | int 1–999 | provisional,出处待查 |
| atk 基础攻击 | int 1–999;0 加载期校验拒绝 | 6(原型锚 HERO_BASE_ATK provisional,归 C3) |
基础攻击恒存在、不许为 0:零基线乘任何百分比增益恒为零,这个死锁从数据层就进不来、开发期任何内容态都不可能出现。战斗节奏:每次结算的战斗段,主角先手攻击顺位最前的存活敌人——先于敌方行动;攻击是固定动作、不是行为环一拍(主角无环),伤害算式/乘区/明细行协议归结算系统战斗段。攻击增益(attack_up,+50 percent)的唯一消费面就是这次先手攻击;道具伤害是恒定表值、不吃修正。
战斗开始时主角血量由编排方入参供给,跨战斗是否保留血量归关卡结构域、本文不定义(MVP 冒烟以血量上限入参);后续解锁成长归 C4、曲线调参归 C3。胜利路径 = 基础攻击 + 奖励侧规划面伤害(囤刀、抢杀、爆发时点的决策素材)共同兑付"敌人全灭 → 战斗胜利",每一分伤害逐行标注来源(hero_attack / 道具逐件实例)。
**举证**:无新计算——数值皆表值。schema 域/单行校验验收 AC-13/AC-14;hero hp 入参越界拒绝见 EC16(AC-2);attack_up 消费面口径(B4);跨战斗 HP 持久性归 C1/C2;atk 禁独立调参联动见 Tuning Knobs;HeroTable 新增的接口漂移回写义务 R-4 见依赖节。
#### 规则 10:开战按坐标读表生成敌人,数值是生成那一刻的快照
**人话**:这条定的是敌人从哪来、数值从哪来。战斗开始时,编排方给出遭遇坐标(关卡序号 + 节点深度),敌人系统据此从敌人表精确匹配一行,实例化"本战实际数量 n"个敌单位——n 由编排方开战掷的遭遇骰从表里的数量区间 [unit_count, unit_count_max] 定出(定值行取表值);主角同时以血量入参生成。
实例化拿到的是当时表值的快照:之后热重载改表,已生成的单位一概不受影响。难度成长走双通道:表值本身随坐标加深而变 + 难度系统(C3)的整体修饰——修饰施加点已定为"行值快照之前套乘",MVP 难度表为空、零修饰;B2 一律按实例化后的数值运作。
**举证**:无计算(数值皆快照表值)。行解析 = D2 R1 进度键 floor + enemy_id 精确匹配、悬空致命(EC13/EC14 → D2 通道);坐标越界前置守卫见 EC14;快照语义同 B3 EC9 先例、热重载与投影拷贝判别验收 AC-11(EC12);难度修饰接口已定——registry `difficulty_table` 条目(算式归 C3)。
#### 规则 11:敌人系统自己不主动做事,一切等结算编排来调
**人话**:这条管的是敌人系统的姿态:B2 不产生随机数、不碰界面、不订阅任何事件——挖雷、插旗等棋盘事实不直接通知 B2,而是经结算编排转化后由它来调用。B2 只摆出两组能力:查状态(血量、当前拍、顺位、存活),受动作(受击、推进、消亡);什么时候调、按什么顺序调,全部由结算编排(B1)说了算——与状态系统"授予集中在编排"是同一条原则。
**举证**:无计算。零随机行为级硬证据 = 同序列重放两遍逐位相同(AC-15);零 UI 依赖/零事件订阅/零 B3 符号引用静态扫描见 AC-17(A2 事件面 referenced_by 不含 B2 的代码侧对应);调用权集中与推进恰一次登记为 B1-①。
## 枚举
### 行为拍类型(封闭枚举,七类)
| 值 | MVP 状态 | 语义 |
|---|---|---|
| attack | 实现 | 本结算对主角造成 atk 点伤害 |
| charge | 实现 | 本结算不作用——威胁空拍、规划窗口;不兑付伏击(不读池) |
| heavy | 实现 | atk × heavy_multiplier |
| guard | 预留(校验拒绝) | 自防 |
| boost | 预留(校验拒绝) | 自体强化 |
| hinder | 预留(校验拒绝) | 妨害雷图——敌方向棋盘施加变异类妨害(Peglin"干扰弹板"的本作转译) |
| summon | 预留(校验拒绝) | 召唤增援 |
- pattern 环长 [1, 8];MVP 校验域 = {attack, charge, heavy};预留值校验拒绝(fail-fast);启用预留值走本 GDD 修订(枚举封闭性)非调参。
### MVP 双敌种内容行(值全部 provisional)
| 敌种 | 行为环 | 基线(provisional,出处待查) |
|---|---|---|
| goblin(地精) | [attack](平凡环,环长 1) | hp/atk 暂按原型参考 18/4 占位 |
| bugbear(熊地精) | [attack, charge, heavy](三拍环) | heavy_multiplier = 2 |
### EnemyTable schema(D2 回写义务——键 (level_index, node_depth, enemy_id))
- 进度键 floor(D2 R1)+ 实体键精确匹配;每行集恰一敌种(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命);本表是进度成长表(A1 BoardGenTable 同型,无 Rule 4 豁免);表非空(D2 Rule 6);精英/Boss 编码位预登记 OQ7——难度三维的精英/Boss 修饰在本键结构下无编码位,C1 定稿时强制核对。
| 字段 | 类型/范围 | 语义 |
|---|---|---|
| enemy_id | String(行集内主键) | 实体键精确匹配(D2 Rule 4);意图视觉映射键(Rule 8③) |
| display_name | String | 图例/HUD/明细用名(本地化归 D6) |
| unit_count | int [1, 3] | **遭遇区间下界**(knob;同敌种——C3 遭遇随机化:区间 [unit_count, unit_count_max] 经 B1 encounter 骰定本战实际数量) |
| unit_count_max | int [unit_count, 3],可省略 | 遭遇区间上界(缺省 = 定值,旧行零迁移——C3 修订批新增字段) |
| armor_type | enum {none, a, b},缺省 none | 护甲类型(克制矩阵 = SettlementTable.armor_effectiveness——伤害A/B 充能的克制消费面;MVP 映射 goblin=none / bugbear=a / ogre_chief=b) |
| hp | int [1, 999] | 单位最大生命基线(knob;难度修饰前) |
| atk | int [0, 999] | 攻击基线(knob;attack 行为伤害基值;0 合法 = 纯伏击伤敌种) |
| heavy_multiplier | int [1, 16] | heavy 倍率(knob;无 heavy 拍的敌种不消费——非校验项,B3 max_stack 先例) |
| pattern | StringList(环长 [1, 8]) | 行为环(元素 ∈ {attack, charge, heavy} 为 MVP 校验域;guard/boost/hinder/summon 预留、校验拒绝) |
| advantage_per_round_cap | int [0, 16] | 单轮伏击授予上限(knob,默认 4 定稿;F1 条款 3 表值;0 = 该行敌种免疫伏击授予的合法极端) |
### HeroTable schema(单行全局,D2 新增 schema 行——接口漂移回写义务见依赖节)
- 主角不随关卡自动成长,成长 = 天赋 C4 / 奖励侧;Rule 4 豁免同 ActionEconomyTable 先例。
| 字段 | 类型/范围 | 语义 |
|---|---|---|
| max_hp | int [1, 999] | 主角最大生命(knob,MVP 值 provisional 出处待查) |
| atk | int [1, 999] | 基础攻击(knob,MVP = 6 原型锚 provisional 归 C3;0 = 加载期校验拒绝——零基线死锁自 schema 层杜绝) |
## 数值结论与推导
> 全部公式零随机、同输入恒同输出(可回放前提);本节只含机制公式——平衡归属见文末显式排除声明。术语:拍 = 行为环里的一格行动(bugbear 环 [攻击, 蓄力, 重击] 有三拍);伏击池 = 敌方侧共享的伏击层数(本轮踩几颗雷就几层,轮末清零);溢出 = 单轮踩雷超过上限的部分,转化为明细行可见、不生效。
### F1 行为环推进(ring_advance)
**结论**:beat(u) = pattern[steps_u mod 环长]、行动完成后 steps_u + 1;指针恒 ∈ [0, 环长)、环长 1(goblin)退化为恒等;死亡即不动手——轮到前被杀本拍不打、步数冻结(永久,随 battle_over 消亡);同种单位同指环首且每结算各恰推进一次 ⇒ 存活者永远同拍(同步性质定理——任何死亡时序都不会让幸存者乱拍)。
#### 推导
```
beat(u) = pattern[steps_u mod 环长] 行动前读拍;战斗开始 steps_u = 0(指向环首)
steps_u' = steps_u + 1 行动完成后推进(先作用后推进)
轮到前被杀 → steps_u 冻结(死亡即不动手);行动完成后才死 → 已行动已推进
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 行为环 | pattern | StringList | 环长 [1,8];MVP 元素 ∈ {attack, charge, heavy} | EnemyTable 行值快照(Rule 10) |
| 已行动次数 | steps_u | int | [0, ∞) | 结算次数的确定函数(零随机) |
| 当前拍 | beat | enum | pattern 元素 | 本结算该单位的行动内容 |
- 同步性质(定理):同种单位同指环首、每结算各恰推进一次(B1 义务①)→ 存活者永远同拍——任何死亡时序都不会让幸存者乱拍。
- Output Range:指针恒 ∈ [0, 环长);环长 1(goblin)退化为恒等。极端:heavy 拍前被杀 → 重击永不兑现(冻结于该拍)——玩家"抢在重击前击杀"的读怪收益由此产生(P1)。
- Example:bugbear——结算 1 攻击(p→1)→ 结算 2 蓄力空拍(p→2)→ 结算 3 前被主角击杀 → 重击不兑现、指针冻结于 2;若结算 3 行动后才死 → 重击已兑现、p 回绕 0。
- 边界注记:归 B2——指针所有权、存活校验、冻结不变式、环首初始化、跨轮跨图延续;归 B1——死亡判定时机、结算内先后次序、每结算恰一次推进(义务①)。
### F2 攻击行为裸伤害构成(raw_attack_damage)
**结论**:attack 拍 D = atk + m_amb × L、heavy 拍 D = atk × heavy_multiplier + m_amb × L、charge 拍 D = 0(不读伏击池);伏击附加是后置加法、不进倍乘(合成序钉死);池共享不消耗(同结算多敌读同一 L);B2 向 B1 供 (基线, 伏击) 分量二元组。
#### 推导
```
attack 拍:D = atk + m_amb × L 基线 + 伏击附加(m_amb = StatusEffectTable.ambush.magnitude,provisional 3)
heavy 拍:D = atk × heavy_multiplier + m_amb × L
charge 拍:D = 0 不读伏击池——空拍零兑付
合成序:伏击附加 = 后置加法,不进倍乘
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 攻击基线 | atk | int [0,999](快照) | EnemyTable 行值 | 0 合法(纯伏击伤敌种) |
| 重击倍率 | heavy_multiplier | int [1,16](快照) | 仅 heavy 拍消费 | 无 heavy 拍不读(非校验项) |
| 伏击层数 | L | int [0, min(雷数, cap)] | 兑付时读值(B1 经 query_active) | dur=1 → L = 本轮受理授予数,无跨轮存量 |
| 伏击量纲 | m_amb | int flat ≥ 1;provisional 3 | B3 行值 | 量纲 = 主角 HP 点数(本 GDD 定稿);锚验收归 B4/B1 |
验算表:
| 验算 | 读数 | 说明 |
|---|---|---|
| bugbear(atk=4, mult=2)heavy 拍 L=4 | 4×2 + 12 = **20** | 合成序判别非平凡:塞进倍乘得 (4+12)×2 = 32 ≠ 20;L=4 = cap=4 默认下游戏态上界(域内判别值);query_attack 的 L 为调用方注入的判别探针、B2 不校验其游戏态域(游戏态域由 F3 预截流承载——探针取值与游戏态域分离,实现期若给 query_attack 加 L 域守卫须回改 AC-7) |
| goblin(atk=4)本轮开雷 3 颗 | D = 4 + 9 = **13** | attack 拍基础例 |
| 满编 3 goblin、L=4 | 各 4+12 = 16、合计 48(伏击分量 36) | 多敌共享读值例 |
- Output Range(默认表值,cap/atk/m_amb/mult 调参后随之重算):goblin attack ∈ [4, 16];bugbear attack ∈ [4, 16]、heavy ∈ [8, 20]、charge ≡ 0(cap=4 封顶 L=4)。
- 池共享不消耗:同一结算多个敌人的攻击各自读同一个 L(共享、非均分、非先到先得);层数扣减唯一入口 = B3 轮末衰减(dur=1 轮末全清)。
- 分量供给建议:B2 向 B1 供 (基线, 伏击) 二元组而非合后标量——结算明细"伏击 +N"的 P2 归因行需要分量边界。
- 极端:charge 拍零兑付 → 蓄力轮授予的伏击层当轮全部蒸发(合法推论;反向 = 读怪奖励"蓄力拍前放心贪雷"——D5 教学条目);无负值分支(clamp/地板归 B1)。
- 量级注记:"L≥2 伏击分量过半"仅 attack 拍成立(6/10);heavy 拍因基线 ×mult 过半点后移(6/14 < 半)——支配边界 L* = ⌈atk×mult/3⌉ 与"过半"口径按拍别分别读取。
- 边界注记:归 B1——L 读值、clamp/负值/溢杀、hero 侧减伤合成次序、死亡判定与"这一下是否兑现"。
### F3 伏击授予与溢出(ambush_grant_overflow)
**结论**:granted_r = min(当轮新开雷数, cap)(cap 判定在授予前——B1 预截流);overflow_r = 当轮雷数 − granted_r(每颗溢出雷一行"溢出未生效"明细、含来源);L_r = granted_r(debuff 只活一结算:当轮兑付一次、轮末全清、无跨轮存量);守恒 granted + overflow = 当轮雷数、零静默蒸发;max_stack = 16 结构不可达(双重不可达——死护栏非死字段)。
#### 推导
```
granted_r = min(当轮新开雷数, cap) cap 判定在授予前(B1 预截流)
overflow_r = 当轮新开雷数 − granted_r 每颗溢出雷一行"溢出未生效"明细(含来源)
L_r = granted_r debuff 只活一结算:当轮兑付一次、轮末全清、无跨轮存量
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| 当轮新开雷数 | mines_r | int | [0, 8](结构界 = AP) | round facts 经 B1 收集;复开不可能(A2 棋盘面语义) |
| 单轮伏击授予上限 | cap | int(行值 knob) | [0,16],默认 4 | 0 = 该行敌种免疫伏击(全溢出可见);F1 条款 3 供给值的来源字段 |
| 当轮授予数 | granted_r | int | [0, 4] | B1 编排期逐雷 apply_effect;每雷恰一次转化(义务②) |
| 溢出量 | overflow_r | int | [0, 8] | 明细行数;呈现归 B5/D1(义务⑥) |
验算表:
| 场景 | granted | overflow | 说明 |
|---|---|---|---|
| cap=4、开雷 6 | 4 层 | 2 行 | 本结算每个攻击行为附加 +12 |
| cap=4、开雷 5–8(灾难轮) | 4 | 1–4 | cap 反灾难护栏绑定域 |
| cap=0、开雷 m | 0 | m | 免疫极端——全溢出、伏击全无效但全部可见(P2 诚实) |
- cap 默认 4:反灾难护栏——绑定阈 = 单轮 5–8 雷灾难轮,溢出协议获真实消费域。
- 结构不可达验证:单轮 L ≤ min(8, cap=4) = 4 < 16,且 dur=1 无跨轮存量 → B3 满层拒绝对 ambush 行双重不可达(不可达性由 dur=1 ∧ AP ≤ 8 承载、与 cap 无关——M=16 是死护栏非死字段)。
- 重验触发:ambush.duration ≥ 2 ∨ AP 经济改动 ∨ ambush 新增非 mine_hit 授予源(旗源授予不计入 mines_r、cap 预截流漏账 → L 可达 16 触发 B3 满层拒绝、与 F3/B3 双溢出协议冲突——OQ6 标错惩罚采纳时强制重验)。
- 边界注记:归 B1——预截流编排、授予次序(行主序雷格序为建议序)、每雷恰一次、溢出行协议。
### F4 条款 3 供给口径(clause3_supply)
**结论**:每结算敌方伏击暴露 = k × L × m_amb(k = 本结算存活敌中攻击/重击拍的单位数,确定性可算);每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb(cap > AP 界时 cap 腿松弛);跨结算累计 = 轨迹量、非表值、不设上界(dur=1 每结算清零);B1 对账取"每结算"口径即可闭合、无需战斗长度假设。
#### 推导
```
每结算敌方伏击暴露(精确式)= k × L × m_amb k = 本结算存活敌中攻击/重击拍的单位数(确定性可算)
每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb
cap > AP 界时 cap 腿松弛——默认 3×min(8,4)×3 = 36;cap≥8 时真可达上界 72 而非 144
跨结算累计 = 轨迹量,非表值、不设上界 dur=1 每结算清零、无存量累积;战斗再长不叠加同一层
```
- 上界读数:默认满配 3×min(8,4)×3 = 36、cap ≥ 8 时真可达上界 72 而非 144;默认行值 unit_count=1 下 = 12。
- 口径依据(用户定稿原话转写):"不设(每战)上界——踩雷的 debuff 只存在一回合:在一次结算中有效,之后就没有 debuff 了。"——debuff 单结算寿命 = 自然边界。
- B3 红警闭环:ambush 量纲已由 F2 供给(registry OQ2 关闭条件);条款 3 左臂(安全格 buff 当量)载体 = 主角基础攻击(恒在,attack_up 复活)与 B4 奖励行值;闭合回执见 registry clause3_supply(B1 F4)。
方向性预检验算表(provisional——真实对账 = A1 actuals p10 + B1 归一表):
| 项 | 读数 | 说明 |
|---|---|---|
| 盲猜端单格 P(雷) | ≈ 0.5–0.7 量级 | 有信息挖掘端趋 0(A1 参考:密度 0.10 / target 0.95)——不等式真实战场在残余盲猜集 |
| 右臂(cap=4) | 0.64 × 12 ≈ 7.7 | 条款 3 右臂代理读数 |
| 左臂(条款 2 最低档锚 +50pp) | 0.36 × 50 = 18 | 条款 3 左臂代理读数 |
| 方向稳健裕度 | ≈ 2.3× | registry clause3_supply.direction_precheck 同步回写 |
- 量级注记(支配边界):atk=4 时 L ≥ 2 伏击分量即过半——常态支配的修正入口 = 敌种 atk 曲线(C3 所有权)或 m_amb 锚(B4/B1 验收),本 GDD 权限外、仅登记方向;cap=4 只治尾部灾难(5–8 雷轮)。
### 显式排除声明
| 对象 | 归属 |
|---|---|
| 伤害 clamp/地板/溢杀、乘区合成、减伤读法、死亡判定时机 | B1 SettlementTable |
| F1 条款 3 不等式闭合对账(输入 = A1 actuals p10,非 target 参数) | B1 单一 owner |
| m_amb(+3)行值锚验收、weaken 档位 | B4/B1(A3 条款 2/3) |
| 敌种 hp/atk/pattern 曲线数值、难度修饰 | C3 |
| 伤害道具/奖励池(hero 侧伤害来源) | B4 |
B2 只对"套路怎么转、一下打多少的两块拼图、一轮吃几层、交给 B1 对账的口径"负责。
## 状态
| 状态 | 进入条件 | 行为/出口 |
|---|---|---|
| Unspawned | 构造后未实例化 | 无接口副作用;唯一出口 = B1 编排实例化 |
| Alive | 实例化(行值快照 / hp 入参) | 可被指定目标(顺位)、按行为环作用、计入全灭判定;受击 hp 递减 |
| Dead | hp = 0(判定时机归 B1) | 移出顺位、不再作用、不计入"未灭";不可逆(MVP 无复活);句柄保留只读可查(query_beat 冻结值) |
| Despawned | battle_over(B1 编排 despawn_all) | 全部单位状态消亡、不跨战斗;逻辑失效态——失效句柄查询返回空 + 诊断、作用接口拒绝;唯一出口 = 重新 spawn(新战斗) |
不变式(debug 断言口径):hp ∈ [0, max_hp];敌单位数 = unit_count(战斗内不增——summon 未实现);行为环指针 ∈ [0, 环长)(Alive 期间按结算推进;charge 空过是环位置语义、非独立状态);违规 = debug 断言中止(进程致命保留给 D2 数据通道)。行为级证据 = AC-1(数)、AC-3(指针)、AC-4/AC-6(hp floor)。
## 边界情况
| 条件 | 行为 | 依据 |
|---|---|---|
| EC1 敌人在轮到它行动前被击杀 | 本拍不打、指针冻结("死亡即不动手");行动完成后才死 → 已行动已推进(heavy 已兑现) | F1 / Rule 4 |
| EC2 同种单位部分死亡 | 存活者永远同拍(同步性质定理)——幸存者轮转不受任何死亡时序干扰 | F1 |
| EC3 全体敌单位死亡 | 存活敌集 = ∅、"敌人全灭"成立、胜负判定归 B1;单体/AOE 无有效目标;敌侧伏击池随轮末衰减自然清空(无兑付者) | Rule 1 |
| EC4 主角 hp = 0 | 战斗失败判定素材(判定时机归 B1);battle_over → 全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态 | Rule 1 |
| EC5 战斗中敌单位数 ≠ 本战实际数量 n | 结构不可能(MVP 无 summon/增援/分裂;n = B1 encounter 骰定值——区间语义下实例化后仍不增)——出现即 debug 断言中止(进程致命保留给 D2 数据通道) | 实例不变式 |
| EC6 敌种行 cap = 0(免疫伏击的合法极端) | granted ≡ 0、每颗雷各一行"溢出未生效"明细(全部可见、全部无效——P2 诚实);该遭遇条款 3 右臂仅剩基线伤 | Rule 5 / F3 |
| EC7 单轮踩雷 5–8 颗(灾难轮) | granted = 4、溢出 1–4 行;本结算每个攻击行为附加恒 +12 | F3(cap 反灾难护栏绑定域) |
| EC8 全部存活敌同拍蓄力(charge 轮) | 零兑付(k=0);该轮新踩的雷照常授予、轮末照常全部蒸发(合法推论 + 读怪奖励——D5 教学条目已登记) | F2/F3 |
| EC9 敌单位在 heavy 拍前被杀 | 重击永不兑现、指针冻结于 heavy 拍——"抢杀窗口"读怪收益(P1) | F1 |
| EC10 敌种 pattern 环长 = 1(goblin) | mod 1 恒等 → 每拍 attack、无自然空窗(兑付率 ρ=1——该敌种伏击威胁无衰减节拍) | F1 |
| EC11 战斗跨多张扫雷图 | 单位状态(hp/指针)与敌侧伏击池跨图延续(换图/刷新不清空——B3 EC8 同款);雷格兑付资格随图消亡、新图新雷新资格(A3/A2 域,B2 无从感知也无须感知) | Rule 4 |
| EC12 战斗中热重载 EnemyTable/HeroTable | D2 战斗中 reload 拒绝门(D2 EC8);已实例化单位不受任何表重载影响(行值快照) | Rule 10 |
| EC13 行集缺行 / 请求敌种悬空 | D2 R1 实体键精确匹配 → 悬空引用致命(D2 Rule 6 通道);B2 无软回退(错误配置上线比崩溃更伤——P1/P2 信任底线) | D2 R1/Rule 6 |
| EC14 遭遇坐标越界(level_index < 1 / node_depth < 0) | D2 R1 前置守卫致命(D2 EC14)——B2 不自行 clamp | D2 EC14 |
| EC15 unit_count = 1 | 固定顺位顺延与 AOE 分流无消费者(Rule 7 空转)、AOE ≡ 单体——合法退化,非错误 | Rule 7 |
| EC16 主角 hp 入参越界(> max_hp 或 ≤ 0) | 拒绝实例化(false + debug 诊断,承 A3 拒绝口径;进程致命保留给 D2 数据通道)——编排方供给异常显式暴露、不静默吸收 | Rule 9 |
| EC17 同结算内"踩雷授予"与"敌攻击兑付"的先后 | 授予在编排期先于兑付 → 本轮踩的雷当轮即兑付(若该轮有攻击拍);读值语义半句归 B2(无内部缓存、无时间维度——AC-7 腿4)、次序半句归 B1(义务①②编排域) | F2/F3 |
## 依赖
**上游**:D2(hard)——EnemyTable schema + 双敌种行回填(本 GDD 为回填 owner)+ HeroTable 新增(走 D2 接口漂移规则回写其 Core Rules 表清单)+ ConfigDB 单点读取(R1 行解析)。无其他玩法上游;A2/A3/A1 的事实均经 B1 结算编排转化(零直接接口)。
**下游与邻接**:
| 依赖方 | 性质 | 接口 |
|---|---|---|
| B1 | hard(provisional——B1 未设计) | 单位状态查询/受击/推进接口(冒烟 API 面全表)+ B1 侧义务清单 6 项(缺项即 blocking,见义务台账):① 推进每结算恰一次 ② 雷→伏击恰一次 ③ clamp/死亡时机成文 ④ 条款 3 对账(cap 表值 + 量纲 + A1 actuals p10)⑤ 默认目标/AOE 分流 ⑥ 溢出行协议 |
| B3 | 相邻(零运行时依赖——验收锚关系非依赖边,B3 先例同款) | ambush/weaken 的量纲与作用域验收锚归 B2(Rule 6 兑现 registry OQ2);side-wide MVP 兼容(B3 接口零变更);target_ref 扩展位义务(首个单体效果上线时补列,随批:B1 归集/D1 呈现裁决) |
| B4 | soft(provisional) | 伤害道具默认目标消费(Rule 7 固定顺位);伏击清单扩展联动(新增 mine_hit 行时本 GDD 同步修订);B4 道具/增益 = 主角基础攻击之外的规划面伤害(非唯一伤害来源);attack_up 消费面 = 主角战斗段先手攻击(Rule 9 / B1 战斗段) |
| A2/A3 | 间接(零直接接口) | 雷/旗事实经 B1 转化;AP 界(单轮开雷 ≤ 8)= cap 默认值结构来源;weaken 档位锚归 B4/B1(A3 条款 2),B2 无表值 |
| A1 | 间接 | 雷数分布影响伏击吞吐——条款 3 对账消费 A1 actuals p10(B1 义务,非 B2 域) |
| C3 | 下游(soft,provisional) | 难度修饰施加点/算式归 C3 定稿(Rule 10);EnemyTable/HeroTable 曲线数值调参所有权归 C3(A1 参考行先例——MVP 默认值全部 provisional);多敌种同深度选择规则共裁;新敌种投放节奏 = 关卡命脉(MVP 敌信息总量 = 2 环 3 行为、L2 见底——每关须有新敌种或新环段投放;goblin 单拍环 playtest 证伪项 OQ8) |
| C1 | 下游(soft,provisional) | 遭遇构成(战斗触发、(L,D) 供给、unit_count 覆盖语义)归 C1;跨战斗 HP 持久性归 C1/C2 |
| D1 | soft | 视觉推测型呈现义务 4 项(缺项即 blocking,见义务台账);敌单位 HUD(血条/顺位/姿态)呈现;顺位标记资产需求(呈现契约表 #3) |
| B5 | soft | 行为环视觉状态表现(蓄力姿态等——预告时序 Rule 8⑤);结算明细敌方行呈现(数据源 = B1 流水;首个 heavy 兑付明细行分量高亮建议——首遇校准课,ux 注记非硬义务) |
| D5 | soft | 读怪教学(敌种环模式可学、顺位规则)+ "蓄力拍前放心贪雷"教学(charge 轮伏击池蒸发 = 读怪奖励的涌现素材——F2 极端行为)+ 首次蓄力姿态一次性提示候选("它在蓄力,这轮踩雷不挨打"——L1 goblin 无 charge 拍、首课在 L2;MVP 可先上一次性提示、不等垂直切片完整教学)——垂直切片期 |
- 双向一致性核对(systems-index 依赖分层表):B2 ← D2 ✅(索引仅此一条硬边,其余为事实读取不列边——D2 注记口径);B1 ← …B2 ✅ · C3 ← D2,B2 ✅ · C1 ← C2,C3,B2,B4 ✅。
### 义务台账(本 GDD 登记,缺项即 blocking——B3 对 B1 登记先例)
对外引用口径:B1 清单在 B1/registry 侧引用名为「B2 义务①–⑥」(b1-settlement 上游表同口径);D1 清单引用名为「D1 呈现义务①–④」。
| 编号 | 内容 | 对侧 | 状态 |
|---|---|---|---|
| B1-① | 单位接口调用集中在结算编排、行为环推进每结算恰一次(double-advance 无守卫——信任编排,B3 义务⑥同款);结算内调用序成文:兑付读值 query_attack → 受击上报 apply_damage → 推进 advance——倒序会读到下一拍(F2 依赖当前拍;比 double-advance 更常见的实现错误),B1 冒烟须回放结算步流 | B1 | 已登记 · 缺项即 blocking |
| B1-② | 雷→伏击事实转化恰一次(每颗雷格实例至多一次;B3 EC6 对侧同款) | B1 | 已登记 · 缺项即 blocking |
| B1-③ | 伤害 clamp/负值/溢杀语义与死亡判定时机成文(Rule 1 B1 域) | B1 | 已登记 · 缺项即 blocking |
| B1-④ | F1 条款 3 闭合对账:消费 B2 advantage_per_round_cap 表值 + 伏击量纲(Rule 6 换算)+ A1 actuals p10(非 target 参数——A1 登记口径) | B1 | 已登记 · 缺项即 blocking |
| B1-⑤ | 默认目标规则消费与单体/AOE 分流(Rule 7;顺位快照 = 生成序) | B1 | 已登记 · 缺项即 blocking |
| B1-⑥ | 伏击 cap 溢出的"溢出未生效"明细行协议(Rule 5 后半;呈现归 B5/D1) | B1 | 已登记 · 缺项即 blocking |
| D1-① | enemy_id→图像线索映射清单成文(形态/姿态↔行为状态;预告时序 = 下一拍预告、挖掘期全程可见〔Rule 8⑤〕;含强度档位与环长直觉编码说明〔Rule 8②〕;形状+色相双通道,art-bible 约束) | D1 | 已登记 · 缺项即 blocking |
| D1-② | 线索映射全局恒定(映射键 = enemy_id——跨 run 恒定、禁止重掷;Rule 8③ 的呈现侧承载) | D1 | 已登记 · 缺项即 blocking |
| D1-③ | 单位顺位与存活可读(固定顺位规则的推测前提——Rule 7;顺位标记资产需求见呈现契约表 #3) | D1 | 已登记 · 缺项即 blocking |
| D1-④ | 敌方 side 池状态呈现口径(伏击层数经 B1 流水——B3 敌侧延伸) | D1 | 已登记 · 缺项即 blocking |
### registry / 接口漂移回写义务
| 编号 | 内容 | 对侧 | 状态 |
|---|---|---|---|
| R-1 | B3 单敌假设回验结果 = 不成立(定多敌)→ 触发 B3 预登记的接口漂移条款("定多敌即触发 target_ref 接口漂移补列"):registry status_effect.single_enemy_assumption 注记更新 + systems-index 门禁记录登记(B3 GDD 正文不改,以其"以 registry 为准"先例承载) | B3 / registry | 待回写(Phase 5b/5d) |
| R-2 | 索引 B2 行描述为窄口径("敌人类型/词条、目标选择规则")→ Phase 5d 更新进度行时补战斗单位系统身份(CD 门禁扩容口径) | systems-index | 待回写(Phase 5d) |
| R-3 | registry status_effect.ambush 量纲定稿注记回写(F2 定稿——B3 registry OQ2 关闭条件) | B3 / registry | 待回写(Phase 5b) |
| R-4 | HeroTable 新增 → D2 Core Rules 表清单 + registry 接口漂移回写 | D2 / registry | 待回写 |
## 呈现与 UI 契约(数据面义务——B2 无自有渲染面,呈现归 D1/B5)
| # | 数据面义务 | 归属/呈现 |
|---|---|---|
| 1 | 敌种视觉身份(形状双通道):双敌种剪影必须一眼可辨(视觉锚 2 形状+颜色双通道、色弱可用性);敌种形态承载强度档位直觉编码("大个子多半有重击"式——Rule 8② 的呈现侧) | D1/B5,art-bible 约束 |
| 2 | 行为环视觉状态(承重规格):每个敌种的每类行为(attack/charge/heavy)对应恒定且互异的视觉状态——bugbear 蓄力拍 = 可辨识的蓄力姿态;映射每 run 恒定、禁止重掷(Rule 8③ 护栏;线索清单成文义务 = D1×4①)。MVP 敌种视觉状态清单:goblin 1 态(攻击)、bugbear 3 态(攻击/蓄力/重击) | D1/B5 |
| 3 | 资产需求下限(存活意图态之外三类):受击反馈(多敌同屏归因"谁挨了打"的 P2 前提——两敌种可共用通用受击反馈一组、须显式登记)、死亡表现("重击被掐灭""抢杀窗口"兑付可见性是 P1 兑付点——死亡瞬间须可辨识、不得直接消失)、顺位标记呈现元素(数据面 = B2 顺位查询;资产与呈现归 D1×4③、同等 blocking)——合称资产需求下限,D1/B5 照单生产、不得隐式缺席 | D1/B5 |
| 4 | 单位呈现数据供给:hp/max_hp(血条数字)、顺位(固定顺位目标的可读前提)、存活态、当前拍视觉状态——数据源 = B2 单位状态查询(经 B1 编排流水) | D1 |
| 5 | 敌方增益呈现:伏击池层数的 HUD 呈现口径(D1×4④——数据源 = B1 流水经 B3 投影);结算明细敌方行使用分量二元组("攻击 13 = 基线 4 + 伏击 9"——F2 供给建议)——P2 归因的敌侧兑付面 | D1/B5 |
| 6 | 视觉锚适用与双舞台陷阱:血条/伤害数字暗色底高对比(锚 1);B2 无棋盘渲染面——敌单位出现在棋盘上还是独立战斗场景 = B5 前的"战斗表现美术测试"锁定(game-concept 双舞台资产管线陷阱),B2 只锁数据面与状态清单、不预设舞台;敌人层绘制优先级:锚 3 优先级表(数字>小人>旗>变异纹理>底色)不含敌单位——art-bible 创建前须裁决敌人层插入位置(姿态精灵与数字/旗/小人的遮挡关系),随"战斗表现美术测试"一并锁定,否则"哪些数字可信"的心智模型分裂 | D1/B5 / art-bible |
| 7 | UI 三项义务(均为已登记义务的数据面):① 敌单位 HUD(血条/顺位/姿态——D1×4③)② 结算明细敌方行(分量二元组 + 伏击溢出行——B1 义务⑥协议、B5 呈现)③ 教学口径(读怪 + 蓄力贪雷——D5);MVP 无敌图鉴/敌人列表 UI(敌种名录 2 个、学习成本内),名录扩展时再议(垂直切片) | D1/B5/D5 |
| 8 | 音频:MVP 无需求(攻击/死亡/蓄力音效归 D4 Alpha;临时 SFX 随垂直切片——AD 项先例);蓄力拍的音频前摇是"读招"的潜在第二通道——登记为垂直切片可选项(非 MVP 义务) | D4 |
## Tuning Knobs
| Knob(表行值,D2 承载) | 默认 | 调过高 | 调过低 |
|---|---|---|---|
| EnemyTable.unit_count | 1(provisional) | 同步轮转下齐射爆发(全攻轮 side 伤 ×N,非平滑) | =1 时 AOE 分流/顺位顺延零消费者(Rule 7 空转) |
| EnemyTable.hp | 18(provisional,出处待查) | 战斗拉长 → 伏击跨轮累计放大 | 秒杀级 → 惩罚无兑现窗口、伏击机制名存实亡 |
| EnemyTable.atk | 4(provisional,出处待查) | 伏击稀释 → 踩雷无感(P3"风险与收益同源"断) | 支配边界 L*→1,惩罚接管战斗、敌种属性被 C3 曲线稀释 |
| EnemyTable.heavy_multiplier | 2(provisional) | heavy+伏击同拍成秒杀拍(读怪规避价值升、容错归零) | =1 时 heavy ≡ attack、三拍环退化两拍(读怪素材坍缩) |
| EnemyTable.advantage_per_round_cap | 4(本 GDD 定稿) | →8 时溢出协议死码回归、支配区扩大、条款 3 右臂膨胀 | ≤2 时 cap 常态绑定 → 边际惩罚归零("再多踩也不痛")、溢出行噪音、P3 归因梯度塌陷 |
| HeroTable.max_hp | provisional(出处待查) | 容错升、治疗道具贬值 | 灾难轮秒杀感(与 cap 交互) |
| HeroTable.atk | 6(原型锚 provisional 归 C3;域 [1,999]、0 加载拒绝) | 击杀预算贬值 → 道具供给/敌 hp 曲线联动重算(C3,禁止独立调参) | 战斗拖长、基础攻击存在感稀薄(道具侧支配) |
- 非 knob(结构冻结):行为枚举七类封闭(扩展 = GDD 修订非调参)、死亡即不动手、先作用后推进、伏击池共享读法、合成序后置加法、伏击量纲 = HP 点、固定顺位规则、每行集恰一敌种、零随机——修订走本 GDD 流程。
- Knob 交互:cap × atk(支配边界 L* = ⌈atk×mult/3⌉ 联动)禁止独立调参——联动评估归 B1 条款 3 闭合对账;unit_count × cap(单结算上界双线性);heavy_multiplier × atk(heavy 拍支配)。pattern 内容(环长/charge 占比 → 兑付率 ρ)属内容行调参,所有权归 C3。
- 零伤害死局组合护栏(OQ9):hero atk=0 已被 HeroTable schema 域下界杜绝([1,999]、0 加载拒绝)——"全场恒零伤害、战斗永不定局"结构不可能;残余退化 = 行 atk=0 且 cap=0 → 无威胁敌(战斗可胜但零风险——内容调参禁区注记,非死局);跨表量级护栏(atk×mult 上界 vs max_hp 域)owner = 实现期 ADR/D2;混编遭遇(多敌种同战斗)下 side 池 cap 取哪行值未定义——当前结构(每行集恰一敌种)恒单行值,混编引入时随 OQ7 改键一并裁决。
- 调参所有权:MVP 全部默认值 provisional、曲线数值归 C3(A1 参考行先例);B1 条款 3 对账落定前,cap 与伏击量纲相关联调须重跑方向性预检并同步 registry(接口漂移义务)。
## 验收标准
### 测试口径
| 口径 | 要点 |
|---|---|
| 测试载体 | B2 是单位层纯逻辑类——非 autoload、无场景依附、无自有渲染面。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB autoload 由脚本显式实例化);单位容器与两表 schema 经 class_name 直引实例化(每用例全新实例、无跨用例状态——AC-17 扫描对该实例化路径豁免);每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明) |
| 被测面与调用方 | B1 未实现(设计顺序第 9 位)——冒烟直接驱动 B2 最小 API 面(冒烟脚本扮演编排方,按"实例化 → 查询 → 受击 → 推进 → 消亡"结算编排序列驱动);B1 就绪后改走真实调用方(结算编排)、断言口径不变 |
| 时序口径 | B2 无结算 API——"一次结算"在冒烟中 = 调用方对每个存活敌单位恰一次 advance(含兑付读值与受击注入)的构造窗口(主角无行为环、不在推进域内——Rule 4);"每结算恰一次推进"是 B1 义务①——冒烟以构造序保证前提、不断言编排正确性;"轮到该单位之前被杀" = 同一构造窗口内 advance(u) 之前的 apply_damage(u, …);多步 GIVEN 均给出构造序列 |
| 只读观测量 | 敌单位投影七字段 enemy_id · hp · max_hp · atk · heavy_multiplier · pattern(快照)· advantage_per_round_cap(快照)+ beat(当前拍)+ 存活态;hero 投影 hp · max_hp · atk |
| 相位与投影 | Alive/Dead 由 query_alive 成员差分推断(Dead 句柄经 query_beat 冻结值可读);Despawned = 逻辑失效态(状态位实现——容器为 RefCounted 纯逻辑类、对象不提前释放;失效句柄上查询返回空 + 诊断、作用接口拒绝;瞬态纪律同 A3 RoundEnd);Unspawned 无观测量;投影一律为快照(pattern 等引用字段返回拷贝——原地改写返回值不影响容器,AC-11 腿 3);容器公开可写属性为零(hp 等仅经 apply_damage 变更——AC-17 扫描域);实例不变式(hp ∈ [0, max_hp]、敌单位数 = unit_count、指针 ∈ [0, 环长))为 debug 断言自守——违规路径不可由封闭 API 构造(负空间)、不经冒烟断言(进程致命保留给 D2 数据通道);行为级证据 = AC-1(数)、AC-3(指针)、AC-4/AC-6(hp floor) |
| 期望值纪律 | hp(18)/atk(4)/heavy_multiplier(2)/unit_count/max_hp 均为 provisional knob(Tuning Knobs 节)——各 AC 的 THEN 具体数值按当前 ConfigDB 表值推导、不写死;记号:h_g/a_g(goblin 行)、h_e/a_e/m_e(bugbear 行)、u_c、M_h、c_r(所在行 cap)、p_g/p_e(pattern 表读值)、m_amb = StatusEffectTable.ambush.magnitude 表读值(仅作 AC-7 注入值来源);pattern 环内容属内容行调参(C3 所有权)——轨迹断言一律按 p 表读值推导;L/mines_r/n 等入参为构造选择(显式登记)、期望值由表读值推导 |
| 结构定值断言 | 合法集:敌种 id 集 {goblin, bugbear, ogre_chief}(Rule 3 MVP 收窄——C3 修订批扩容三敌种)、pattern 元素域 {attack, charge, heavy}(枚举封闭)、每行集恰一敌种、HeroTable 单行、HeroTable.atk 域 [1,999](0 加载拒绝;MVP 值 6 provisional 不作定值断言) |
| 致命类收窄与 manifest | B2 冒烟设恰两根致命夹具(均为 B2 表特有校验类别):runner manifest 退出码行 rowset_dup→≠0 · pattern_reserved→≠0(独立 headless 进程、游戏通道,D2 AC-2b 协议同型);其余致命类别(D2 R1 悬空敌种/行集缺行〔EC13〕、遭遇坐标越界〔EC14〕、通用枚举域/域校验)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留——B2 冒烟仅以合法坐标驱动 spawn);HeroTable 单行类别条件性(可选根);schema 侧以程序构造断言域类别(AC-12/13) |
### 冒烟 API 面(provisional,封闭枚举——实现期 ADR 定名)
| API | 签名 | 语义与返回口径 |
|---|---|---|
| spawn | `spawn(level_index, node_depth, hero_hp, n) -> bool`(n = 本战实际数量 override——B1 encounter 骰;定值行/省略 n = unit_count 表值) | 解析遭遇行 → 行值快照 → 实例化 n 个敌单位(行主序生成序)+ 主角(hp 入参,MVP 冒烟以 max_hp 入参——Rule 9);Alive 相位重复 spawn → false + 诊断(相位守卫) |
| query_alive | `query_alive(side) -> Array` | side ∈ {hero, enemy};生成序稳定枚举;只读 |
| query_beat | `query_beat(u) -> String` | 当前拍 ∈ pattern 元素;Dead 句柄保留只读可查(冻结不变式的观测量);hero 句柄 → 空 + 诊断(主角无行为环——Rule 4);只读 |
| query_attack | `query_attack(u, L, m_amb) -> {baseline, attach, total}` | F2 分量供给面;L/m_amb 由调用方供值(B1 兑付读值的冒烟等价——B2 对 B3 零运行时依赖的边界由此保持);L 为判别探针入参、B2 不校验其游戏态域(游戏态域由 F3 预截流承载);Dead 句柄 → {0, 0, 0} + 诊断;只读 |
| apply_damage | `apply_damage(u, n) -> bool` | 受击上报;hp 递减、floor 0 → Dead;n ≤ 0 → false + 诊断(无伤害作用非法);Dead 句柄 → false + 诊断(MVP 无复活) |
| advance | `advance(u) -> bool` | 存活才推进("先作用后推进"的推进半);false 分两级:存活校验失败 = 轮到前被杀的预期冻结、无诊断(EC1 常态路径——抢杀窗口是设计卖点,诊断刷屏会淹没信号);相位/句柄失效 = false + 诊断;hero 句柄 → false + 诊断 |
| default_target | `default_target() -> u\|null` | 固定顺位供给面;只读 |
| ambush_grant_plan | `ambush_grant_plan(mines_r, cap) -> {granted, overflow}` | F3 机制算术纯函数——B1 预截流编排的消费面;只读 |
| despawn_all | `despawn_all() -> bool` | battle_over 消亡;重复调用 → false + 诊断(重复调用守卫) |
- 返回口径:全部布尔/计数返回 = 受理/拒绝(A3 全 API 布尔口径同款)——"拒绝"直接断言返回值,附 debug 诊断、非进程致命(进程致命保留给 D2 数据通道);五个 query 面(query_alive / query_beat / query_attack / default_target / ambush_grant_plan)只读、无副作用。
- 封闭枚举即负空间验收形态:无 summon/增援 API(EC5 负空间——战斗内不增员)、无复活 API(Dead 不可逆)、无重置/换图 API(EC11 跨图延续的结构前提)、无伏击池写 API(B2 无池——L 恒由调用方注入,EC17 读值语义);新增上述任何入口 = 接口漂移(GDD 修订非调参)。
- ADR 前置裁决项:query_attack / ambush_grant_plan 两 face 若实现期裁决归 B1(F2"供给建议"与 F3"预截流归 B1"边界注记存在张力),对应 AC 腿迁移至 B1 冒烟、断言口径不变(OQ①)。
### 夹具策略
| 根 | 构成 | 服务 |
|---|---|---|
| 默认根 | 干净检出:EnemyTable 双敌种行 + HeroTable 单行 | 全部分支行为 AC |
| enemy_multi_unit | D2 全表清单拷贝 + EnemyTable 仅将 (L_a, D_a) 行(bugbear——三拍环)unit_count 置 3(其余字段域内合法;登记值 u_c_f = 3) | 多敌 AC(AC-5 / AC-7 腿4 / AC-9 / AC-10 腿2) |
| enemy_reloaded | D2 全表清单拷贝 + EnemyTable 数值漂移(登记:hp/atk/advantage_per_round_cap 各 +1、pattern 不动——快照差分判定用) | AC-11 |
| enemy_rowset_dup_species(致命) | D2 全表清单拷贝 + EnemyTable 默认行 + 追加一行与 (L_g, D_g) 行同 (level_index, node_depth) 而 enemy_id 相异("goblin_twin",其余字段域内合法)→ 每行集恰一敌种违规 | B2 表结构致命校验的进程级落点——manifest rowset_dup→≠0(B3 status_effect_dup_key 同型) |
| enemy_pattern_reserved(致命) | D2 全表清单拷贝 + EnemyTable (L_g, D_g) 行 pattern 追加预留值 "guard"(其余合法)→ pattern MVP 校验域拒绝预留值 | Rule 4 fail-fast 的 loader 集成缝落点——manifest pattern_reserved→≠0(A1 solver_rules 冻结先例) |
| hero_extra_row(可选根) | HeroTable 置两行(域内合法——单行全局违规) | 单行校验落点若实现期 ADR/D2 裁定在 loader 缝则启用(manifest 行 hero_rows>1→≠0),否则程序构造承载(AC-13)——可选、两处恰一承载 |
- 行集登记常数协议(A1 黄金向量 / A2 板登记同源):(L_g, D_g) = goblin 行坐标、(L_a, D_a) = bugbear 行坐标,逐坐标手工推导记录入版本库;失效处置 = 先复核登记、登记无误即实现缺陷。
- 多敌根选 bugbear 行(三拍环)保证判别力:goblin 行环长 1 恒 attack → 混合拍 GIVEN 不可构造、同步断言零判别力、双单位读值不可构造;改 bugbear 行后混合拍经对单单位重复 advance 构造(冒烟构造序可越出"每结算恰一次"契约——B2 无守卫、构造自由度成立)。
- 显式声明:夹具值非 MVP 内容调参结论(Tuning Knobs 默认 unit_count = 1——多敌语义在默认根上零消费者,多敌根是 Rule 2 的测试承载、仅供冒烟)。
- 换根加载经 `load_tables(root, collect_only=true)` 直调(非 D2 `reload()` 路径:不过 set_reload_gate、不发 config_reloaded——门语义归 D2 AC-16/B1,B3 AC-15 同款);程序构造(AC-12/AC-13):两 schema 类 class_name 直引实例、不经 load()/preload();行为夹具根经 `--data-root=` 注入(仅 debug、不入 data/tables/——D2 夹具纪律);各 AC 声明其表根、用例间无顺序依赖。
### 覆盖声明(out-of-scope——deferral 生效条件 = B1×6 + D1×4 义务清单,均缺项即 blocking)
| deferral 项 | 生效条件 / 承载 |
|---|---|
| B1×① 行为环推进每结算恰一次与结算内先后次序(double-advance 无守卫——冒烟单调用方次序即构造序,B3 义务⑥同款) | B1 义务① |
| B1×② 雷→伏击事实转化恰一次 + 编排期授予/预截流调用次序(F3 编排半、EC17"先转化后兑付"次序半句) | B1 义务② |
| B1×③ 伤害 clamp/负值/溢杀语义与死亡判定时机(冒烟只断言 hp 递减、floor 0 与 Dead 翻转——"这一下是否兑现"归 B1) | B1 义务③ |
| B1×④ F4 条款 3 闭合对账(cap 表值 + 量纲 + A1 actuals p10——冒烟只供分量面与 k 可算性) | B1 义务④ |
| B1×⑤ 默认目标消费与单体/AOE 分流(冒烟只断言 default_target 供给面) | B1 义务⑤ |
| B1×⑥ 溢出"溢出未生效"明细行协议(呈现归 B5/D1——冒烟只断言 overflow 计数会计) | B1 义务⑥ |
| D1×①② 图像线索清单成文与映射每 run 恒定(Rule 8 视觉面——视觉映射不可 GIVEN-WHEN-THEN;验收形态 = 映射键契约〔enemy_id〕+ B2 侧行为级承载:行为环零随机可学〔AC-3/AC-15〕) | D1 义务①② |
| D1×③ 顺位与存活可读呈现 | D1 义务③ |
| D1×④ 敌方 side 池呈现口径(B3 敌侧延伸) | D1 义务④ |
| EC8 池蒸发腿(dur=1 轮末清池——B3 AC-8/AC-9 既有覆盖,跨引不重复;B2 侧零兑付半 = AC-7 腿3 / AC-9 腿1) | B3 AC 既有 |
| EC13/EC14 端到端致命(D2 R1/EC14 既有通道) | D2 AC-2(manifest 豁免) |
| Rule 10 后半难度修饰施加点(B2 以实例化后数值运作——修饰算式无表值可断) | C3 provisional |
| 跨战斗 HP 持久性 | C1/C2 |
| 曲线数值与遭遇分布定值(AC-14 显式不作分布定值断言) | C3 |
| atk 激活裁决——已退役:基础攻击恒存在,域断言由 AC-13/AC-14 承载 | 无遗留义务 |
| Rule 8"不直接显示数值"负空间(无意图数值 API——冒烟 API 封闭枚举承载) | API 封闭 |
| qa-lead 缺口预检 7 项处置:预检 1/2 入 OQ①②;预检 3/4 随批修正 F4 满配语境与 EC17 切分;预检 5–7 承载于 ADR 裁决项 / HeroTable 可选根 / 坐标登记协议 | 已处置 |
### AC 清单(Given-When-Then,编号不变)
| AC | Given | When | Then | 覆盖 |
|---|---|---|---|---|
| AC-1 | ConfigDB 默认根加载完成、全新 B2 容器(Unspawned) | `spawn(L_g, D_g, M_h)`(hero_hp = max_hp 表读值——MVP 冒烟口径);Alive 相位再 `spawn(同坐标, M_h)` | 首次 true;`query_alive(enemy)` 恰 u_c 个单位(u_c = unit_count 表读值)、全部同 enemy_id、每单位投影 hp = h_g、max_hp = h_g、atk = a_g、pattern = p_g、cap = c_r(行值快照五字段逐一 = 表读值——Rule 10 授予时快照基线);`query_alive(hero)` 恰 1、hp = 入参值;敌投影序 = 行主序生成序(默认根 u_c=1 平凡——多敌序断言由 AC-5 夹具根承载);再 spawn → false + 诊断、容器不变(相位守卫——B3 EC11 输入×相位矩阵同款) | Rule 2/9/10 |
| AC-2 | 默认根、全新实例 | `spawn(L_g, D_g, hero_hp)` 分别取 hero_hp ∈ {M_h+1, 0, −1}(越界三腿:> max_hp / ≤ 0——EC16 口径);随后 `spawn(L_g, D_g, 1)`(域内下界合法值) | 越界三腿均 false + 诊断且 `query_alive` 双侧恒空(拒绝原子性:无半实例化——失败腿不留任何单位);域内下界 → true——越界拒绝精确以域为界、不扩大拒绝域(编排方供给异常显式暴露、不静默吸收) | EC16 / Rule 9 |
| AC-3 | `spawn` 完成(bugbear 坐标 (L_a, D_a)) | 腿 1 读初拍;腿 2 连续 advance;腿 3(goblin 坐标)连续 3 次(构造选择)advance;腿 4 任意长 advance/受击序列 | 腿 1(环首初始化):`query_beat(u)` = p_e[0];腿 2(推进与回绕):均 true 且 beat 轨迹 = p_e[k mod \|p_e\|] 逐拍断言、\|p_e\| 次后回 p_e[0](环尾回环首——指针恒 ∈ [0, 环长) 的行为级证据);腿 3(环长 1 恒等):beat 恒 = p_g[0](mod 1 恒等——每拍 attack、无自然空窗、兑付率 ρ=1 的行为级形式;前提 \|p_g\| = 1 按表读值核对——pattern 内容属 C3 内容行调参,前提不满足时本腿显式 SKIP、不假失败);腿 4(跨轮跨图延续 + 无重置入口,EC11):hp 与 beat 投影 = 驱动序列的确定函数——除 despawn_all 外无任何 API 入口使单位状态重置(结构性裁决;"换图"事件对 B2 不可观测(零接口),端到端"真实换图下单位状态延续"归 B1 集成——编排契约仅 battle_over 调 despawn、非新增义务,B3 AC-10 裁决同款) | Rule 4 / EC10 / EC11 / F1 |
| AC-4 | 默认根;前提按 p_e 表读值核对:\|p_e\| ≥ 3 且 p_e[1] = charge 且 p_e[2] = heavy(默认表值满足;pattern 内容属内容行调参,前提不满足时本 AC 显式 SKIP、不假失败) | 腿 1 构造推进至 charge 拍后 `apply_damage(u, h_e + 5)` 再 `advance(u)`;腿 2 新实例构造至 heavy 拍 `advance(u)` 后 `apply_damage(u, h_e)`;腿 3 对 Dead 句柄 `apply_damage` | 腿 1(heavy 拍前被杀):apply_damage → true、hp 投影 = 0(溢杀 floor:hp ∈ [0, max_hp] 不变式自守——clamp/溢杀语义归 B1×③ 的声明不变);advance → false(预期冻结级——无诊断,API 面两级 false 口径)、`query_beat(u)` 仍 = p_e[1]——冻结于 heavy 前一拍、重击永不兑现("死亡即不动手"+"抢在重击前击杀"读怪收益的行为级证据);腿 2(行动后才死):advance → true、随后 Dead、`query_beat(u)` = p_e[0](已行动已推进——heavy 拍已消费、指针回绕);腿 3(不可逆):false + 诊断(MVP 无复活——States 不可逆) | EC1 / EC9 / F1 |
| AC-5 | 夹具根 enemy_multi_unit(u_c_f = 3 登记值,bugbear 行)`spawn(L_a, D_a, M_h)` 完成 | 腿 1 读三单位初拍;腿 2 定义结算步 = 按生成序对各存活敌单位 advance 恰一次(B1 义务①的冒烟构造等价——hero 无环不在推进域),在某步 advance(u2) 之前 `apply_damage(u2, h_e)` 杀之(h_e = bugbear 行 hp 表读值);腿 3 全程观测规模 | 腿 1(同拍基线):spawn 后三单位 `query_beat` 恒等(同种同指环首、同属性);腿 2(死亡时序不乱拍):u2 本步不打(advance false、指针冻结);步末 `query_beat(u1)` = `query_beat(u3)`、连续多步后幸存者 beat 恒相同(同步性质定理——任何死亡时序都不会让幸存者乱拍);腿 3(单位数单调递减):`query_alive(enemy)` 规模 ∈ {3, 2, 1} 严格递减、无增员(EC5 负空间的行为面——无 summon API) | Rule 2 / EC2 / F1 |
| AC-6 | 默认根 + AC-5 根 | 腿 1(默认根)u_c 个单位逐一 `apply_damage` 致死;腿 2(AC-5 根)`apply_damage(hero, M_h)` 后、`query_alive(enemy)` 仍含存活单位时 `despawn_all()`;随后重复 `despawn_all()`;随后重新 `spawn` | 腿 1(全灭,EC3):`query_alive(enemy)` = 空 Array(存活敌集 = ∅——"敌人全灭"成立,胜负判定归 B1);敌侧伏击池"无兑付者轮末清空"半 = B3 dur=1 decay(跨引 B3 AC,out-of-scope);腿 2(主角死亡与消亡,EC4):hero hp = 0(失败判定素材——判定时机归 B1);despawn_all → true、`query_alive` 双侧空(全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态);Despawned 句柄上 query_beat 返回空 + 诊断、advance/apply_damage → false(域闭);重复 despawn_all → false + 诊断(重复调用守卫——B3 EC11 同款);重新 spawn → true 且为新战斗(Despawned 后唯一出口——下一场重启、不跨战斗) | Rule 1 / EC3 / EC4 |
| AC-7 | 默认根 `spawn(L_a, D_a, M_h)` 完成、m_amb = StatusEffectTable.ambush.magnitude 表读值 | 腿 1 attack 拍 `query_attack(u, L=2, m_amb)`;腿 2 `query_attack(u, L=4, m_amb)` 合成序判别(判别非平凡前提 m_e ≥ 2——默认表值满足;m_e = 1〔合法 knob、heavy ≡ attack〕时负断言两边恒等、本腿显式 SKIP 标记输出——B3 AC-14 腿 3 先例);腿 3 beat 推进至 charge 拍后 `query_attack(u, L=c_r, m_amb)`(游戏态上界注入);腿 4(enemy_multi_unit 根承载——默认根 u_c=1 不可构造)同 L 连续两次 query + 两存活单位各自 query | 腿 1(attack 拍):{baseline = a_e, attach = 2×m_amb, total = a_e + 2×m_amb}(分量二元组——"攻击 13 = 基线 4 + 伏击 9"P2 归因行的数据源);腿 2(合成序判别):baseline = a_e×m_e、attach = 4×m_amb、total = a_e×m_e + 4×m_amb,且判别负断言 total ≠ (a_e + 4×m_amb)×m_e(伏击附加后置加法不进倍乘——默认表值 (4, 2, 3) 下 20 ≠ 32、非平凡性由表读值不等式保证;实现若把伏击分量塞进倍乘即在此暴露;L=4 为游戏态可达值〔cap=4 上界〕——探针不取域外值);腿 3(charge 零兑付——不读池,EC8 的 B2 半):{0, 0, 0}——L>0 下恒零 = "不读伏击池"的可判定形式(蓄力轮授予的伏击层当轮蒸发 = 读怪奖励;池蒸发本身归 B3 decay、out-of-scope 跨引);腿 4(共享不消耗 + 即时读值,EC17):同 L 连续两次 query 结果逐字相同、两存活单位同 L 各自 query 读值一致(共享、非均分、非先到先得);每次 query 前后 query_alive/query_beat 投影零变化(纯函数性——B2 无池写面、无内部缓存、无时间维度;"先转化后兑付"次序与每雷恰一次归 B1×①②、out-of-scope) | F2 / Rule 6 / EC8 / EC17 |
| AC-8 | 默认根、c_r = cap 表读值(全腿纯函数断言——编排期预截流调用与每雷恰一次授予归 B1×②,out-of-scope) | 腿 1 `ambush_grant_plan(mines_r = c_r + 2, c_r)`;腿 2 参数化对 mines_r ∈ {0, 1, c_r, c_r+1};腿 3 mines_r ∈ [5, 8];腿 4 `ambush_grant_plan(m, 0)` | 腿 1(守恒主式):{granted = c_r, overflow = 2}、恒等 granted + overflow = mines_r(零静默蒸发——P2 会计面;"溢出未生效"明细行呈现归 B1×⑥/B5);腿 2(预截流位):各腿 granted = min(mines_r, c_r)、overflow = mines_r − granted 恒成立(cap 判定在授予前);腿 3(灾难轮,EC7):默认 c_r=4 → granted = 4、overflow = mines_r − 4(cap 反灾难护栏绑定域);腿 4(cap=0 免疫,EC6):granted = 0、overflow = m(全溢出——免疫行全部可见、全部无效的会计半;cap=0 为域内合法行值的校验半归 AC-12) | F3 / EC6 / EC7 |
| AC-9 | 夹具根 enemy_multi_unit(u_c_f = 3) | 腿 1 以 advance 序构造混合拍(k 个单位处 attack/heavy 拍、其余 charge)并读暴露;腿 2 记号恒等式断言(AP_r = ActionEconomyTable.ap_per_round 表读值) | 腿 1(k 确定性可算):每结算敌方伏击暴露 = k × L × m_amb,k 经只读观测量导出(query_alive(enemy) ∩ query_beat ∈ {attack, heavy} 计数——确定性可算、无隐藏状态,B2 对 B1 条款 3 的供给面);全体 charge 轮 → k = 0、暴露 = 0(charge 轮零兑付——EC8 汇总);腿 2(结构上界记号):单结算 side 级结构上界 = u_c_f × min(AP_r, c_r) × m_amb(全参表读值/夹具登记值的记号恒等式断言——满配语境 3×min(8,4)×3=36 的记号化、默认行值 unit_count=1 下 = 12、非定值断言;min 项 = cap > AP 界时 cap 腿松弛);跨结算累计 = 轨迹量非表值——B2 投影字段无任何累计观测量(负空间,AC-1 观测量封闭枚举承载);不等式闭合对账(输入 = A1 actuals p10)归 B1×④、out-of-scope | F4 / EC8 |
| AC-10 | 腿 1 默认根(u_c=1)spawn 完成;腿 2 enemy_multi_unit 根;腿 3 承接腿 2 | 腿 1 `default_target()`;腿 2 `default_target()` 对照 `query_alive(enemy)[0]`;腿 3 杀 [0] 后再查、连续杀至空 | 腿 1(u_c=1 合法退化):default_target() = 该唯一存活单位(顺延与 AOE 分流无消费者、AOE ≡ 单体——合法退化非错误,Rule 7 空转);腿 2(行主序最前):default_target() = query_alive(enemy)[0](生成序最前——顺位快照 = 生成序);腿 3(死亡顺延):default_target() = 原 [1](顺延)、连续杀至空 → null(EC3 全灭腿在目标面的汇合);B1 消费侧单体/AOE 分流归 B1×⑤、顺位可读呈现归 D1×③、均 out-of-scope | Rule 7 / EC3 / EC15 |
| AC-11 | 默认根 `spawn(L_a, D_a, M_h)` 完成(快照字段 = 默认表值;坐标登记协议锚点)、存活与 Dead 单位并存 | 经测试通道换根加载 enemy_reloaded(load_tables(root, collect_only=true) 直调——非 D2 reload() 路径,门语义归 D2 AC-16/B1);随后 `despawn_all()` 后以同坐标重新 spawn;腿 3 对返回的 pattern 投影数组原地改写 | 存活与 Dead 单位的快照五字段 + beat + hp 逐字不变、hero 投影不变(授予时快照——实例不受任何表重载影响,B3 EC9 / A4 EC8 同款);新单位快照 = 漂移后表值(换根只影响后续实例化——"快照非活引用"的判别性后半);腿 3(拷贝判别):容器内单位 pattern 投影不变(快照拷贝非活引用——别名引用在换根加载下同样"逐字不变",本腿补足判别力) | Rule 10 / EC12 |
| AC-12 | EnemyTable schema 类(行级 + 表级校验)class_name 直引实例(不经 load()/preload()) | validate() 作用于越域代表值:unit_count ∈ {0, 4}、hp ∈ {0, 1000}、atk ∈ {−1, 1000}、heavy_multiplier ∈ {0, 17}、pattern 环长 ∈ {0, 9}、pattern 元素 = "guard"(预留值拒绝——MVP 校验域 fail-fast)、pattern 元素 = "nonsense"(未知枚举)、cap ∈ {−1, 17};表级构造同 (level_index, node_depth) 两行相异 enemy_id;域内代表值:unit_count ∈ {1, 3}、hp = 1、atk = 0(纯伏击伤敌种合法——F2 Variables)、atk = 999、heavy_multiplier ∈ {1, 16}、pattern ∈ {["attack"], ["attack","charge","heavy"]}(环长两界)、cap = 0(免疫极端合法——EC6)与 16 | 越域各含对应域错误类别(零静默);表级含每行集恰一敌种错误类别;域内零诊断(防过度约束锁死内容——atk=0 与 cap=0 两个合法极端是本断言承重点) | Rule 3/4 / EC6 |
| AC-13 | HeroTable schema 类直引实例 | validate() 作用于 max_hp ∈ {0, 1000}、atk ∈ {−1, 0, 1000};域内代表值 max_hp ∈ {1, 999}、atk ∈ {1, 999};表级构造两行(域内合法) | 越域各含对应域错误类别(atk=0 拒绝 = 基础攻击恒存在的 schema 承重腿——零基线死锁杜绝);域内零诊断;表级两行 → 单行全局约束错误类别(单行全局——Rule 4 豁免同 ActionEconomyTable 先例;若实现期 ADR/D2 裁决单行校验落 loader 缝,则本腿迁移至可选根 hero_extra_row 的 manifest 腿——两处恰一承载) | Rule 9 |
| AC-14 | ConfigDB 默认根加载完成 | 读 EnemyTable;读 HeroTable | EnemyTable 恰含三敌种行、enemy_id 集合 = {goblin, bugbear, ogre_chief}(定值——Rule 3 MVP 收窄,C3 修订批扩容);每 (level_index, node_depth) 行集恰一敌种(默认根数据通过其自身表级校验的行为断言);全部行 pattern 元素 ⊆ {attack, charge, heavy}(MVP 枚举封闭——结构定值);goblin 行 pattern 不含 "heavy"(heavy_multiplier 无 heavy 拍不消费的表数据前提——非校验项、B3 max_stack 先例);unit_count_max 仅在区间行出现(缺省 = 定值——C3 遭遇随机化字段语义);display_name 多值非空(精确值不作定值断言、本地化归 D6);遭遇分布(何 (L,D) 归何敌种)为 C3 域 knob——不作定值断言(provisional 示例非承诺);HeroTable 恰 1 行、atk ∈ [1,999] 域断言(MVP 值 6 = 原型锚 provisional 不作定值断言;0 = 加载拒绝)、max_hp ∈ [1, 999] 域断言(provisional knob 不写死) | Rule 3/9 |
| AC-15 | 全新 B2 实例 ×2(同 ConfigDB 默认根;每遍全新实例、无跨实例状态) | 同一定长序列驱动两遍(spawn → apply_damage(含一次"轮到前击杀"腿——冻结路径入回放)→ 交替 advance 全体存活敌单位 → query 投影(含生成序与逐单位 beat)→ apply_damage → advance → default_target → query 投影) | 两遍的 query_alive 投影序列(含生成序)、逐单位 beat 轨迹、default_target 返回序列逐项相同——零随机的行为级硬证据(rng_service 流封闭;D2 AC-15 的 B2 层前身,与 AC-3 腿 4"状态 = 驱动序列的确定函数"互证) | Rule 4/11 / F1 |
| AC-16 | ConfigDB 默认根加载完成 | 脚本解析 design/registry/entities.yaml 的 enemy 与 hero 条目(逐字段 YAML 键——机器对账前提,action_economy/status_effect 同构) | ① enemy.fields **十键**(enemy_id / display_name / unit_count / **unit_count_max / armor_type** / hp / atk / heavy_multiplier / pattern / advantage_per_round_cap——C3 修订批 +2)与 ConfigDB EnemyTable schema 字段名逐一相等、各键类型/域/枚举描述与 Schema 定稿相等(缺任一键即失败);② hero.fields 两键(max_hp / atk)同上;③ enemy 条目 MVP 内容注记物种 id 集合 = {goblin, bugbear, ogre_chief}、与表行 id 集合相等(非 knob 结构定值——C3 修订批扩容);④ status_effect.ambush 条目含 B2 量纲定稿注记(Rule 6 兑现 B3 registry OQ2 的接口漂移回写落点——注记存在性 + 键断言;量纲活值 m_amb 不作定值对账——knob 纪律,A4 AC-8 同款豁免);⑤ hero 条目"单行全局 Rule 4 豁免"注记与 enemy 条目"每行集恰一敌种校验"注记存在性断言;生效前提 = 本文定稿 Phase 5b/5d 回填完成(不写"若存在"软口径——条件化使一致性检查落空,B3 AC-18 同款) | Rule 6 / registry |
| AC-17 | B2 文件集(单位容器 / 两表 schema / 冒烟脚本 / 夹具规格)纳入 D2 AC-9 模式项目级扫描域 | 静态扫描 | randomize() / RandomNumberGenerator / ConfigDB 外 data 表加载 / extends Control / .tscn preload——零命中(schema 与容器的 class_name 直引实例化豁免——AC-12/13 前提,A4 AC-7 同款);另扫 B2 特有两项:事件订阅 API 零命中(Rule 11 零主动事件订阅——A2 事件面 referenced_by 不含 B2 的代码侧对应)与 B3 API 符号零引用(相邻零运行时依赖——import/call 面为零);D2 AC-14 人工三要素字面量扫描(引用不另设硬 THEN——F2 算式 a×m + 3L 类字面量随实现形态误报率高,D2 已定性 warning 级 + 人工复核;其"零玩法数值字面量"的行为级硬证据 = AC-1/AC-7 全表读值推导 + AC-16 registry 对账);零随机的行为级硬证据 = AC-15 | Rule 11 / D2 AC-9/10/14 |
### 覆盖矩阵(qa-lead 交付,验收评审用)
| 类别 | 映射 |
|---|---|
| Core Rules(11/11) | 1→AC-1/AC-6/AC-2(clamp·溢杀·死亡时机→OOS B1×③)· 2→AC-1/AC-5/AC-9(side-wide 兼容与 target_ref 扩展位→B3 接口漂移义务随批 B1/D1、非冒烟域)· 3→AC-12/AC-14/AC-13 · 4→AC-3/AC-4/AC-5/AC-15(预留值拒绝→AC-12+manifest pattern_reserved)· 5→AC-8(每雷恰一次→OOS B1×②;溢出明细行→OOS B1×⑥+B5)· 6→AC-7/AC-16④(量纲锚验收→B4/B1,排除声明)· 7→AC-10(消费分流→OOS B1×⑤;顺位可读→D1×③)· 8→映射键契约(enemy_id)+AC-3/AC-15(行为环可学性承载)+OOS D1×①②、"不显示数值"负空间=API 封闭 · 9→AC-1/AC-2/AC-13/AC-14 · 10→AC-1/AC-11(D2 R1 解析致命→OOS D2 通道;难度修饰→C3 provisional)· 11→AC-15/AC-17(调用权集中→OOS B1×①) |
| Formulas | F1→AC-3/AC-4/AC-5 · F2→AC-7 · F3→AC-8 · F4→AC-9(闭合对账→OOS B1×④) |
| EC(17 条) | EC1→AC-4 腿1/腿2 · EC2→AC-5 腿2 · EC3→AC-6 腿1+AC-10 腿3 · EC4→AC-6 腿2 · EC5→冒烟 API 封闭(负空间——无 summon API 不可 G-W-T,B3 Rule 8 先例)+AC-5 腿3+AC-17 · EC6→AC-8 腿4+AC-12(cap=0 合法腿)· EC7→AC-8 腿3 · EC8→AC-7 腿3+AC-9 腿1(池蒸发腿→B3 AC 既有覆盖,OOS 跨引)· EC9→AC-4 腿1 · EC10→AC-3 腿3 · EC11→AC-3 腿4(跨图结构裁决)+AC-2/AC-6(相位重复守卫,B3 EC11 同款)· EC12→AC-11 · EC13→OOS(D2 R1 通道,D2 AC-2 同类别夹具,manifest 豁免声明)· EC14→OOS(D2 EC14 通道,同前)· EC15→AC-10 腿1 · EC16→AC-2 · EC17→AC-7 腿4(读值即时性/纯函数半)+OOS B1×①②(次序半) |
| 无洞声明 | 17 条 EC 中 EC5/EC13/EC14 三处非 G-W-T 形态,分别以 API 封闭负空间声明与 D2 通道豁免承载(B3 Rule 8 负空间 + 致命收窄豁免先例同款);其余全部映射到 AC 或显式 OOS(deferral 生效条件 = B1×6/D1×4 已登记缺项即 blocking) |
## 开放问题
| # | 悬案 | owner | 时机 |
|---|---|---|---|
| 1 | query_attack / ambush_grant_plan 两 face 归属——B2 供给面 vs B1 编排消费(F2"供给建议"与 F3"预截流归 B1"边界注记的张力落点);裁决归 B1 则 AC-7/8/9 对应腿迁移至 B1 冒烟(断言口径不变)、回写 AC 前言 | 实现期 ADR 定名时同步裁决 | Technical Setup / 实现期 |
| 2 | 多敌语义默认零消费者复验——默认 unit_count=1 下多敌路径仅测试根可达(死码风险);C1 落地 unit_count>1 真实遭遇后复验 AC-5/9/10 夹具根是否升级为默认根内容;C1 须真实消费 unit_count>1(Boss/精英战最廉价的构成表达),且 Boss 表达不能只靠 unit_count——同种同拍 ×3 = 伤害乘法、非 Boss 幻想 | C1 遭遇分布定稿 | C1 GDD |
| 3 | 条款 3 左臂载体——基础攻击恒存在后"载体悬空、内容态不可通关"事实已闭环;残余 = 左臂当量换算口径(锚参照回迁 attack_up 当量——B4 F4 / registry anchor_warning)随 B1 对照表对账 | B1 | B1 GDD 强制检查点 |
| 4 | 原型参考值溯源——敌 18HP/4ATK、伏击 +3、hero max_hp 均 provisional 且出处待查(D2 Tuning Knobs 既有登记义务);回填定值前补原型 REPORT 溯源,查无出处则按 C3 调参所有权重定 | 本 GDD 回填定稿时 | EnemyTable/HeroTable 定值回填 |
| 5 | HeroTable 单行校验落点——schema validate() vs loader 缝两处恰一承载(AC-13 腿3 / 可选根 hero_extra_row manifest 行) | 实现期 ADR/D2 | Technical Setup |
| 6 | 标错惩罚候选与伏击清单联动——候选"敌方伏击+1"若实测采纳:事件源 = flag_judged{hit=false}(旗落非雷格)、不在 Rule 5 cell_revealed{kind=mine} 转化路径内;B3 需新增行且 source_class 需新枚举值(如 flag_miss)——source_class 枚举属 B3 结构冻结项、须走 B3 GDD 修订(接口漂移)非"加行";B2 侧伏击清单联动修订 + F3 重验触发(非 mine_hit 源)强制重跑;若错标为 mine_hit:P2 归因明细行来源失实(标错被记成踩雷) | A2 OQ1 实测会话 | A2 /design-review 核对在位 |
| 7 | 精英/Boss 遭遇编码位预登记——难度 = f(关卡序号, 节点深度, 精英/Boss 修饰);A1 BoardGenTable 已预留 elite_/boss_ 命名空间与改键退路;本表键冻结 (level_index, node_depth, enemy_id) 且"每行集恰一敌种"入结构冻结——若 C1 定稿分支地图使同深度并存普通与精英节点,精英编码无键位(同深度第二敌种行触发行集校验致命);届时改键(如追加 encounter_class 维度)走 D2 Rule 4 接口漂移修订,schema/AC-12/夹具/registry 连锁回写(A1 OQ6 镜像) | C1/C3 | C1 GDD 定稿强制核对 |
| 8 | goblin 单拍环体验证伪——goblin 环长 1、无前摇无空窗,玩家可能将其感受为"自动平砍的血条"(恰为体验锚点反向对照);MVP 实际读怪内容仅剩 bugbear 一环;预注册证伪项:playtest 采集"goblin 是否被读"信号;证伪则两拍环备用案(如 [attack, charge])由 C3 内容所有权处置、本 GDD 结构不变 | C3/playtest | 垂直切片 playtest |
| 9 | 零伤害死局组合与跨表量级护栏——hero 侧恒零伤害分支已被 HeroTable.atk 域下界([1,999]、0 加载拒绝)结构杜绝;残余 = 行 atk=0 ∧ cap=0 → 无威胁敌(内容调参禁区、非死局);atk×mult 上界与 max_hp 域无跨表量级护栏——遭遇行配置期跨字段校验落点裁决(ActionEconomyTable 跨字段校验先例),详见 Tuning Knobs Knob 交互注记 | 实现期 ADR/D2 | Technical Setup |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;规则/枚举/边界情况/义务清单/覆盖矩阵/AC 转表格;行为环转字符画;公式、Variables 与验算数据全保留;语义与 2026-09-09 定稿及 2026-09-11 基础攻击裁决对齐,零规则变更 |
| 基础攻击裁决批 | 2026-09-11 | HeroTable.atk = 基础攻击恒存在:域 [1,999]、0 加载期校验拒绝(零基线死锁自 schema 层杜绝)、MVP = 6(原型锚 provisional 归 C3);主角每结算战斗段先手攻击;B4 道具/增益转为规划面伤害(非唯一伤害来源);原"atk MVP=0 机制开关、胜利路径依赖 B4 先行"条款与 OQ3 左臂悬空投影退役;OQ9 恒零死局分支随之收窄 |
| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-7 回执,registry 同批):**spawn 增 override 参数 n**(B1 encounter 骰定本战实际数量——区间语义 [unit_count, unit_count_max] 实例化后不增,EC5 记号调和)· **Rule 10 DifficultyTable 接口已定**(registry `difficulty_table`——施加点 = 行值快照前套乘,MVP 空表零修饰)· **EnemyTable schema +2 字段**(unit_count_max / armor_type——护甲克制批,克制矩阵归 SettlementTable)· **物种集扩容三敌种 {goblin, bugbear, ogre_chief}**(AC-14/AC-16① 十键/AC-16③/结构定值断言随批;DND 更名批对齐)· 默认根遭遇分布 = C3 行值总表 v3(provisional) |
| Rev 1(full 评审批) | 2026-09-09 | lean 定稿同日 full 评审(六专员 + CD 终裁)8 项 blocking 同日核销后用户拍板收口(A3/A4/A1/B3 同日核销先例、免独立 re-review):① 胜利路径声明 ② AC-7 恒假判别前提 + SKIP ③ 多敌夹具根改 bugbear 行 ④ OQ6 事件源类更正 + F3 重验触发补支 ⑤ 精英/Boss 编码位预登记 OQ7 ⑥ Rule 8 预告时序 ⑦ 资产下限补受击/死亡/顺位 ⑧ 主角推进域排除;同批定稿四项口径:cap 默认 4(旧默认 8 使溢出协议不可达)、死亡即不动手、条款 3 单结算自然边界、C 节三处回写;F2 判别改域内值、F4 结构上界 min 收紧、方向性预检裕度改 2.3×——明细见 design/gdd/reviews/b2-enemy-system-review-log.md |
| v1(lean 定稿) | 2026-09-09 | 一次会话定稿:十一核心规则 + F1–F4 + 17 AC + 义务台账(B1×6 / D1×4);九项结构决策用户拍板(多敌 / HeroTable / 视觉推测型 / Peglin 行为环 / 每行集恰一敌种 / side-wide / 固定顺位 / unit_count 字段 / cap=4);lean 门禁:systems-designer 起草 Formulas、qa-lead 起草/验证 AC |