Files
gplan-2/design/gdd/analysis/b2-enemy-system.md
T
DKChan 85841f52be docs(gdd): 13 份系统 GDD 迁移为 design/analysis 两件套 v2
- design 件只装结论:v2 骨架(设计目的/系统范围/核心循环/领域章节/依赖与输出/P0 闭环/P1·P2 后置/调参表/GWT 验收/版本历史),AC/EC/OQ/义务台账编号全部保留
- 新建 design/gdd/analysis/ 13 份推演件:候选取舍/公式推导/数值锚定论证/已裁决争议按问题节组织,文末附去向映射表(零丢失审计)
- v1 原文备份于 design/gdd/legacy-2026-09-14-v1/(13 份)
- systems-index 文档树补 analysis 目录导航行
- gdd_lint 全量 PASS(14 文件 0 不通过);迁移零裁决——19+1 项待拍板已登记各 analysis 开放问题区
2026-09-14 20:39:11 +08:00

45 KiB
Raw Blame History

B2 敌人系统 设计推演

状态:concluded · 本文只装"为什么"——design/gdd/b2-enemy-system.md 只收本文的结论。 修订时新增问题节,不删旧节(历史即依据)。 原文头部复核注记(保留):lean 门禁下 systems-designer(Formulas)/ qa-lead(AC + 缺口预检 7 项)已委托起草;creative-director 与 art-director 未经咨询——生产前人工复核体验锚点情绪定位与 Visual/Audio、art-bible 一致性(art-bible §1–4 须在 D1 GDD 前创建,线索清单是其输入之一)。

问题:伏击量纲与单轮上限怎么定,才能让"它强是我喂的"成立?

广度分析

  • 候选 A:percent 量纲(按百分比放大敌人攻击)——收益:与 weaken/defense_up 同一语言;代价:atk=0 敌种下伏击恒零、量纲随敌种曲线漂移,条款 3 换算不可锚。
  • 候选 B:flat 固定值(每层 +N 点主角 HP)——收益:与敌种 atk 解耦、换算单一线性;代价:不同 atk 敌种间相对强度不平(由 C3 曲线承载)。
  • 候选 C:"每颗已开雷伤害加成"(按累计雷数而非本轮授予)——收益:账更简单;代价:跨轮存量 → 惩罚无自然边界,与"debuff 只活一结算"定稿冲突。
  • cap 候选:默认 8(旧)vs 4——8 使 min(雷数≤8, cap) 恒等、溢出协议死码;4 绑定单轮 5–8 雷灾难轮,溢出协议获真实消费域。

深度分析

合成序判别说理:伏击附加若进倍乘,heavy 拍会把"读怪规避"的收益放大到不可控(判别例 20 vs 32);后置加法让伏击与敌种基线正交、两份账各自可归因(P2)。池共享不消耗(同结算多敌读同一 L,非均分、非先到先得)是 side-wide 语义的自然推论——层数扣减唯一入口 = B3 轮末衰减(dur=1 轮末全清)。m_amb 变量卡:int flat ≥ 1、provisional 3、B3 行值、量纲 = 主角 HP 点数(本 GDD 定稿——registry OQ2 关闭条件兑现);锚验收归 B4/B1。

F2 验算表:

验算 读数 说明
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) 多敌共享读值例

F2 Output Range(默认表值,cap/atk/m_amb/mult 调参后随之重算):goblin attack ∈ [4, 16];bugbear attack ∈ [4, 16]、heavy ∈ [8, 20]、charge ≡ 0(cap=4 封顶 L=4)。极端:charge 拍零兑付 → 蓄力轮授予的伏击层当轮全部蒸发(合法推论;反向 = 读怪奖励"蓄力拍前放心贪雷"——D5 教学条目);无负值分支(clamp/地板归 B1)。边界注记:归 B1——L 读值、clamp/负值/溢杀、hero 侧减伤合成次序、死亡判定与"这一下是否兑现"。分量供给建议:B2 向 B1 供(基线, 伏击)二元组而非合后标量——结算明细"伏击 +N"的 P2 归因行需要分量边界。

F3 验算表:

场景 granted overflow 说明
cap=4、开雷 6 4 层 2 行 本结算每个攻击行为附加 +12
cap=4、开雷 5–8(灾难轮) 4 1–4 cap 反灾难护栏绑定域
cap=0、开雷 m 0 m 免疫极端——全溢出、伏击全无效但全部可见(P2 诚实)

max_stack = 16 双重不可达论证:单轮 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 标错惩罚采纳时强制重验)。

综合判断

量纲定稿 = flat、单位 = 主角 HP 点数(provisional 3,锚验收归 B4/B1——A3 条款 2/3);cap 默认 4 定稿为反灾难护栏(绑定阈 = 单轮 5–8 雷灾难轮)。量级注记:atk=4 时 attack 拍 L≥2 伏击分量过半(6/10);heavy 拍因基线 ×mult 过半点后移(6/14 < 半)——支配边界 L* = ⌈atk×mult/3⌉ 与"过半"口径按拍别分别读取;常态支配的修正入口 = 敌种 atk 曲线(C3 所有权)或 m_amb 锚(B4/B1 验收),本 GDD 权限外、仅登记方向;cap=4 只治尾部灾难(5–8 雷轮)。量纲定稿注记按接口漂移回写 registry status_effect.ambush(AC-16④ 承载)。

问题:行为环为什么确定性轮转、"死亡即不动手"?

广度分析

  • 候选 A:半随机 AI(每拍掷行为)——收益:变化感;代价:不可学、不可规划,威胁归因断(P1/P3 双断)。
  • 候选 B:固定环(Peglin 式轮替)——收益:可学习、可规划,"抢在重击前击杀"成为技能;代价:内容量小(MVP 读怪对象最长 3 拍环)。
  • 死亡口径候选:死亡后指针继续推进(尸体走环)vs 就地冻结——冻结让"抢杀窗口"有真实兑付(重击永不兑现),且语义直白。

深度分析

同步性质定理证明:同种单位同指环首(初始化同一)且每结算各恰推进一次(B1 义务①)→ 任意结算序号下存活者 steps 相同 → beat 相同;死亡只冻结本人指针、不改变他人 steps——任何死亡时序都不会让幸存者乱拍(EC2)。

Output Range 与极端:指针恒 ∈ [0, 环长);环长 1(goblin)退化为恒等(EC10:每拍 attack、无自然空窗、兑付率 ρ=1——该敌种伏击威胁无衰减节拍)。Example:bugbear——结算 1 攻击(p→1)→ 结算 2 蓄力空拍(p→2)→ 结算 3 前被主角击杀 → 重击不兑现、指针冻结于 2;若结算 3 行动后才死 → 重击已兑现、p 回绕 0。边界注记:归 B2——指针所有权、存活校验、冻结不变式、环首初始化、跨轮跨图延续;归 B1——死亡判定时机、结算内先后次序、每结算恰一次推进(义务①)。

综合判断

定稿:确定性环 + 死亡即不动手(2026-09-09 用户拍板)+ 先作用后推进(与 B3"先兑付后衰减"同款时序哲学)。行为环敌单位专属——主角无环、推进域排除(full 评审 blocking⑧ 核销项);预留四拍(guard/boost/hinder/summon)启用 = GDD 修订非调参(枚举封闭性)。

问题:条款 3 供给口径取"每战上界"还是"单结算自然边界"?

广度分析

  • 候选 A:每战上界表值——收益:对账式整齐;代价:战斗长度是轨迹量,表值上界须假设战斗长度、口径造假。
  • 候选 B:单结算自然边界(debuff 只活一结算)——收益:无需战斗长度假设、与 dur=1 机制自洽;代价:跨结算累计无表值上界(须显式声明为轨迹量)。

深度分析

口径依据(用户定稿原话转写):"不设(每战)上界——踩雷的 debuff 只存在一回合:在一次结算中有效,之后就没有 debuff 了。"——debuff 单结算寿命 = 自然边界。F4 结构上界 min 收紧(full 评审批):unit_count × min(AP 上界, cap) × m_amb——cap > AP 界时 cap 腿松弛,默认 3×min(8,4)×3 = 36、cap ≥ 8 时真可达 72 而非 144、默认 unit_count=1 下 = 12。

方向性预检验算表(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 同步回写

预检史:裕度曾按 +100 两层叠满取值得 4.7×,full 评审更正为 2.3×——旧值与"最低档下界"语言矛盾。左臂参照对象曾迁 defense_up 当量(attack_up 死行期),2026-09-11"基础攻击恒存在"裁决后回迁 attack_up 当量(registry status_effect.anchor_warning / clause3_supply.direction_precheck 两处迁移注记)。B3 红警闭环:ambush 量纲已由 F2 供给(registry OQ2 关闭条件);条款 3 左臂(安全格 buff 当量)载体 = 主角基础攻击(恒在,attack_up 复活)与 B4 奖励行值;闭合回执见 registry clause3_supply(B1 F4;含 2026-09-14 B1 重算批破线读数与联动约束网登记,以 registry 为准)。

综合判断

定稿 = 单结算口径:每结算暴露精确式 k × L × m_amb(k = 本结算存活敌中攻击/重击拍单位数,确定性可算)+ 每结算结构上界 + 跨结算轨迹量声明(不设上界)。B1 对账取"每结算"口径即可闭合、无需战斗长度假设。

问题:MVP 敌人名录与多敌模型怎么定?

广度分析

  • 单敌 vs 多敌:B3 单敌假设(target_side 无歧义)曾入文;B2 定敌人数模型时回验——用户 2026-09-09 拍板定多敌(1–3 同种),触发 B3 预登记接口漂移条款:registry status_effect.single_enemy_assumption 回验改写 + systems-index 门禁记录登记;B3 GDD 正文不改、以 registry 为准(A3 OQ5 收编先例)。
  • 效果作用域候选:单体寻址 vs side-wide 共享池——side-wide 与 B3 现接口零改动兼容,是 MVP 最便宜路径;单体寻址留 target_ref 扩展位(首个单体效果上线时补列,随批 B1 归集语义/D1 呈现裁决)。
  • 名录构成候选:每坐标多敌种随机 vs 每行集恰一敌种——后者把"配错"变成加载期致命,选择规则整体让渡给遭遇域(C1/C3),B2 零选择逻辑、零悬空风险。
  • unit_count 语义:定值 vs 区间 [unit_count, unit_count_max]——区间语义由 C3 遭遇随机化批引入(B1 encounter 骰定本战实际数量 n,实例化后不增——EC5 记号调和;定值行 = 缺省、旧行零迁移)。

深度分析

多敌模型的测试承载问题:默认 unit_count=1 下多敌语义零消费者(Rule 7 空转、AC-5/9/10 靠夹具根可达)——死码风险登记为 OQ2;多敌夹具根选 bugbear 行(三拍环)而非 goblin——goblin 环长 1 恒 attack,混合拍 GIVEN 不可构造、同步断言零判别力、双单位读值不可构造(full 评审 blocking③ 核销);夹具值非 MVP 内容调参结论,多敌根是 Rule 2 的测试承载、仅供冒烟。

精英/Boss 编码位(OQ7 预登记):难度 = f(关卡序号, 节点深度, 精英/Boss 修饰);现键 (level_index, node_depth, enemy_id) + "每行集恰一敌种"结构冻结下,若 C1 定稿分支地图使同深度并存普通与精英节点,精英编码无键位(同深度第二敌种行触发行集校验致命);届时改键(如追加 encounter_class 维度)走 D2 Rule 4 接口漂移修订,schema/AC-12/夹具/registry 连锁回写(A1 OQ6 镜像;A1 BoardGenTable 已预留 elite_/boss_ 命名空间与改键退路)。

综合判断

定稿:多敌 side-wide + 每行集恰一敌种 + 区间 unit_count。MVP 名录:原始定稿为双敌种(goblin/bugbear,数值占位 provisional),C3 修订批扩容为三敌种 {goblin, bugbear, ogre_chief}(DND 更名批对齐)——两阶段表述差异与 registry 现行行值的核对见开放问题 OQ-迁移-1。goblin 单拍环体验证伪预登记为 OQ8:玩家可能将其感受为"自动平砍的血条"(恰为体验锚点反向对照),MVP 实际读怪内容仅剩 bugbear 一环;证伪则两拍环备用案(如 [attack, charge])由 C3 内容所有权处置、本 GDD 结构不变。新敌种投放节奏 = 关卡命脉:MVP 敌信息总量小、L2 见底——每关须有新敌种或新环段投放(C3)。

问题:玩家怎么"读"敌人——数值预告还是视觉推测?

广度分析

  • 候选 A:界面直接显示下一拍行为与数值——收益:信息零损耗;代价:读怪幻想死亡、规划退化为读表,P1 断。
  • 候选 B:视觉推测型(图像承载行为线索、数字只在结算明细兑现)——收益:观察成为技能、可归因可学习;代价:呈现层承重(D1×4 义务、art-bible 约束),线索不可学即塌。
  • 参考感受合成:Peglin 固定招式轮替(威胁因可预测而可规划——确定性环是可学习性来源)× 怪物猎人读招(前摇姿态承载威胁信息、无数值面板——视觉推测的同构)→ 本作 = 确定性环 × 视觉推测;反向对照(要避开的感受)= 半随机、不可归因、重掷线索的"猜怪"呈现。

深度分析

体验锚点(情绪目标一句话):"对面是个看得懂的对手,不是一个血条"——威胁可推测、可归因、可拆解;玩家不操作敌人,但每一轮都直接感受它。

支柱 关键词 机制承诺
P3 同源的对面对象 "赌桌对面的那个存在" 结算明细"敌方获得伏击 +3(第 4 轮 · 雷)"的行可指认——敌人强度是扫雷决策的镜像,威胁有源可溯
P1 可推测的威胁 "它弓起背了,下一拍是重击" 读怪推理进入挖掘决策(形态↔行为映射稳定可学,MVP 双环最长 3 拍);不预告精确数值——数字在结算明细兑现,结算前的世界靠观察而非读表
P2/P3 的拆台兑现 "它强是我喂的,它弱是我拆的" 标中旗 weaken 与伏击行同框、同一呈现语言,落在同一个它身上
P4 地牢住户 "越下越险的刻度" 深层敌人更凶(C3 施加),给下探氛围一个可见刻度

护栏:威胁绝不能是无源暗账——玩家说不出"它为什么变强 / 这一拳为什么这么重"即归因链失职(P2/P3);线索必须稳定可学(映射每 run 恒定,D1 义务②),任何让线索重掷或不可学的呈现设计默认砍掉(P1);血条/攻击力数字可读性适用视觉锚 1(暗色底上高对比)。

五条规格为何是承重项:①②③ 任一断裂 → "抢在重击前击杀"窗口、"蓄力轮放心贪雷"教学、读怪幻想三者同时落空;⑤ 预告时序锁定的理由——挖掘阶段是决策发生地,预告必须全程在场;结算时不另设独立意图播片(结算明细是数字兑现面、非意图预告面)。"不直接显示数值"的负空间 = 冒烟 API 封闭枚举(无意图数值 API)。双舞台陷阱:敌单位出现在棋盘上还是独立战斗场景 = B5 前"战斗表现美术测试"锁定(game-concept 双舞台资产管线陷阱),B2 只锁数据面与状态清单、不预设舞台;敌人层绘制优先级(锚 3 优先级表:数字>小人>旗>变异纹理>底色,不含敌单位)须在 art-bible 创建前裁决插入位置(姿态精灵与数字/旗/小人的遮挡关系),随美术测试一并锁定,否则"哪些数字可信"的心智模型分裂。音频:蓄力拍的音频前摇是"读招"的潜在第二通道——登记为垂直切片可选项(非 MVP 义务)。

综合判断

定稿 = 视觉推测型(用户拍板):不直接显示行为/数值、映射键 = enemy_id(B3 effect_id→icon 同款契约)、映射每 run 恒定禁重掷、数字在结算明细兑现。MVP 视觉状态清单:goblin 1 态(攻击)、bugbear 3 态(攻击/蓄力/重击);学习成本低(最长 3 拍环)。

问题:主角数值放哪、基础攻击为什么必须恒在?

广度分析

  • 候选 A:atk MVP=0 机制开关(伤害全走 B4 道具侧)——旧定稿;后果:零基线乘任何百分比增益恒为零,"当前内容态结构性不可通关、B4 先行 = 任何可通关验证的先决"(胜利路径声明,CD 排序 #1)。
  • 候选 B:基础攻击恒存在(atk ≥ 1 自 schema 层杜绝零基线)——2026-09-11 用户裁决采纳:死锁从数据层进不来、开发期任何内容态都不可能出现。
  • 表形态候选:随关卡成长表 vs 单行全局表——主角不随关卡自动成长(成长 = 天赋 C4 / 奖励侧),单行全局 + Rule 4 豁免(ActionEconomyTable 先例)。

深度分析

裁决的连锁退役:原"atk MVP=0 机制开关、胜利路径依赖 B4 先行"条款与 OQ3 左臂悬空投影退役;attack_up 复活(+50 percent,消费面 = 主角战斗段先手攻击——B1 战斗段同批增补 hero_attack 来源值),锚参照从 defense_up 回迁 attack_up 当量;OQ9 恒零死局分支收窄——hero 侧恒零伤害已被 HeroTable.atk 域下界([1,999]、0 加载拒绝)结构杜绝,残余 = 行 atk=0 ∧ cap=0 → 无威胁敌(战斗可胜但零风险——内容调参禁区注记、非死局);跨表量级护栏(atk×mult 上界 vs max_hp 域)owner = 实现期 ADR/D2(ActionEconomyTable 跨字段校验先例)。

战斗节奏定位:每次结算的战斗段主角先手攻击顺位最前的存活敌人——先于敌方行动;攻击是固定动作、不是行为环一拍(主角无环);伤害算式/乘区/明细行协议归 B1 战斗段。道具伤害是恒定表值、不吃修正。战斗开始血量由编排方入参供给(越界拒绝 = EC16,承 A3 拒绝口径——编排方供给异常显式暴露、不静默吸收);跨战斗是否保留归 C1/C2(MVP 冒烟以血量上限入参);解锁成长归 C4、曲线调参归 C3。

综合判断

定稿:HeroTable 单行全局两字段(max_hp + atk);atk 域 [1,999]、0 加载期校验拒绝;MVP = 6(原型锚 HERO_BASE_ATK provisional 归 C3)。胜利路径 = 基础攻击(恒在)+ B4 奖励侧规划面伤害(囤刀、抢杀、爆发时点的决策素材)共同兑付"敌人全灭 → 战斗胜利",每一分伤害逐行标注来源(hero_attack / 道具逐件实例)。

问题:各调参旋钮的方向风险怎么定(Tuning Knobs 论证)?

广度分析

原 Tuning Knobs 表("调过高/调过低"两列即方向风险论证):

Knob 默认 调过高 调过低
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 交互:cap × atk(支配边界 L* = ⌈atk×mult/3⌉ 联动)禁止独立调参——联动评估归 B1 条款 3 闭合对账;unit_count × cap(单结算上界双线性);heavy_multiplier × atk(heavy 拍支配)。pattern 内容(环长/charge 占比 → 兑付率 ρ)属内容行调参,所有权归 C3。

零伤害死局组合护栏(OQ9):hero atk=0 已被 HeroTable schema 域下界杜绝——"全场恒零伤害、战斗永不定局"结构不可能;残余退化 = 行 atk=0 且 cap=0 → 无威胁敌(内容调参禁区注记,非死局);混编遭遇(多敌种同战斗)下 side 池 cap 取哪行值未定义——当前结构(每行集恰一敌种)恒单行值,混编引入时随 OQ7 改键一并裁决。

综合判断

MVP 全部默认值 provisional、曲线数值归 C3(A1 参考行先例);B1 条款 3 对账落定前,cap 与伏击量纲相关联调须重跑方向性预检并同步 registry(接口漂移义务)。非 knob(结构冻结):行为枚举七类封闭、死亡即不动手、先作用后推进、伏击池共享读法、合成序后置加法、伏击量纲 = HP 点、固定顺位规则、每行集恰一敌种、零随机——修订走 GDD 流程。

开放问题

原 OQ1–OQ9(编号保留)

# 悬案 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 跨字段校验先例),详见 analysis 问题 6 实现期 ADR/D2 Technical Setup

迁移登记(两件套迁移发现的冲突——未自行裁决,待拍板)

# 冲突 说明
OQ-迁移-1 MVP 名录表述漂移 原文 Rule 3 人话"MVP 恰两种敌人" + 双敌种内容行(goblin 18hp/4atk 原型占位、bugbear heavy_multiplier=2)与 同文 AC-14/AC-16③ 定值断言及版本历史 C3 修订批"物种集 = {goblin, bugbear, ogre_chief}"、registry enemy.mvp_content 三敌种六行具体行值(如 goblin L1 D0 24hp/7atk ×[1,2]、ogre_chief L1 D4 150/9 ×1、heavy_multiplier=2 全员)不一致。新 design 按数值单一事实源纪律以 registry 为准写三敌种(未自行裁决最终表述);原 18/4 占位行值与 registry v3 行值不一致——OQ4 原型溯源时应一并核对哪组为定值候选。
OQ-迁移-2 registry 敌方攻击区间批未入 GDD registry enemy.fields 已登记 atk_min/atk_max 可选配对 int [0,999](上阶/下阶区间随机;缺省 = 定值行向后兼容;atk = (min+max)/2 中点锚;roll 时机 = 遭遇骰同流、spawn 期整战持久;B1.begin_battle roll → B2.spawn enemy_atk_override 收确定值;MVP 六行 ±3 provisional 归 C3;验收 = 完美策略档 0 加成通关 ≤40%〔registry OQ7〕),注记"正式侧 GDD/registry 修订批随 ADR-0009 同批"。本 GDD 原文尚无该字段与 spawn 参数;本次格式迁移不发明内容、未写入 design——待 ADR-0009 修订批正式落地时补入 schema/AC/spawn 签名。

附录

附录 A: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 待回写

双向一致性核对(systems-index 依赖分层表):B2 ← D2 ✅(索引仅此一条硬边,其余为事实读取不列边——D2 注记口径);B1 ← …B2 ✅ · C3 ← D2,B2 ✅ · C1 ← C2,C3,B2,B4 ✅。

附录 B:验收支撑材料(原 lean 件验收节承载,全文保留)

B-1 测试口径

口径 要点
测试载体 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)

B-2 冒烟 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 冒烟、断言口径不变(OQ1)。

B-3 夹具策略

根 构成 服务
默认根 干净检出: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 声明其表根、用例间无顺序依赖。

B-4 覆盖声明(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 可选根 / 坐标登记协议 已处置

B-5 覆盖矩阵(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)

附录 C:显式排除声明(数值与机制平衡归属)

对象 归属
伤害 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 对账的口径"负责。

附录 D:去向映射(零丢失可审计证据)

原文节 落点
头部(状态/版本/承载支柱/一句话/复核注记) design 头部(状态/版本/一句话/推演件);承载支柱 → design 设计目的定位段;复核注记 → analysis 文首注记
速览(定位/拥有/不拥有/上游/下游/硬约束) design 设计目的 + 系统范围 + 依赖与输出;硬约束 → design 系统范围
体验锚点(情绪目标/支柱表/护栏/参考合成) 承诺 → design 设计目的编号体验承诺 + 反向护栏;论证全文 → analysis 问题 5
全局流程(行为环字符画 + 出口分发表) design 核心循环
核心规则 1 / 11 design 单位与状态·规则 1–2
核心规则 2 / 3 + 规则 2 实现参照(多敌模型表) design 敌人构成与名录·规则 1–2 + 名录表
核心规则 4 + 规则 4 实现参照(推进细则表) design 行为环·规则 1 + 细则表
核心规则 5 / 6(含 cap 行为表) design 伏击·规则 1–2 + cap 表
核心规则 7 / 8 + 规则 8 实现参照(五条规格表) design 目标选择与读怪·规则 1–2 + 规格表
核心规则 9 / 10 design 主角与实例化·规则 1–2
枚举(行为拍七类 + pattern 域注记 + MVP 双敌种内容行) design 行为环枚举表 + 敌人构成名录表;双敌种占位行值与三敌种表述漂移 → analysis OQ-迁移-1
EnemyTable / HeroTable schema design 数据表 Schema
数值结论与推导 F1–F4(结论/推导/Variables/验算/Output Range/边界注记/术语) 结论 + 表达式 + 术语 → design 数值公式;推导论证/验算表/Output Range/量级注记 → analysis 问题 1–3
显式排除声明 design 系统范围不负责清单 + analysis 附录 C
状态(四态表 + 不变式) design 单位与状态
边界情况 EC1–EC17 design 规则内联边界(EC 编号随文保留:规则句尾/出口表/AC 覆盖列)+ analysis 附录 B-5 映射
依赖(上游/下游表 + 双向一致性核对) design 依赖与输出表;核对记录 → analysis 附录 A
义务台账(B1×6 / D1×4) design 依赖与输出·义务台账(活契约)
registry / 接口漂移回写义务 R-1–R-4 analysis 附录 A(历史审计台账)
呈现与 UI 契约(数据面义务 8 行) design 依赖与输出·呈现契约
Tuning Knobs(knob 表/非 knob/交互/所有权) 字段·域·默认·owner → design 调参表;调过高/调过低方向论证 → analysis 问题 6
验收标准·测试口径 / 冒烟 API 面 / 夹具策略 analysis 附录 B-1/B-2/B-3(design 验收标准口径摘要指针)
验收标准·AC 清单(AC-1–AC-17) design 验收标准 GWT 表(编号不变)
验收标准·覆盖声明 / 覆盖矩阵 analysis 附录 B-4/B-5
开放问题 OQ1–OQ9 analysis 开放问题(编号保留、全文保留)
版本历史(5 行) design 版本历史(原行全保留 + 追加 v2 行)