90 KiB
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)直调(非 D2reload()路径:不过 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 |