写卡(全局特殊间隔闸批·设计闭合卡成立): 待办清单「全局特殊间隔旋钮」条备选转正——敌人特殊技公共冷却(任一特殊技兑现后该敌K拍强制普攻,堵异名背靠背),三裁点用户2026-11-09计划批准在案(K=1/每敌独立计数/双面过滤+保底顺延)。落文: 敌人系统.md v1.9→v2.0(两道闸→三道闸+取值域special_interval行+P1备用行删除+摇号时序/举证/验收口径换代+池节奏三联动→四联动), 难度曲线与Boss.md v1.7→v1.8(技能池投值表增特殊间隔K行), 待办清单条目推进「文档设计已闭合+已写卡」。卡片: reports/需求卡片-全局特殊间隔闸批-2026-11-09.md(T0-T3估时1.75日/对照表A1-A8/验收档高/零待裁点/开工门=U0), 对抗复核1轮8发现(3补写5自判)全落卡内复核记录节。能力表增行「全局特殊间隔闸」。区内凭据: 流水线闸PASS(34条目/57行/2链/6卡全过)+文档域闸【验收通过】无新增红

This commit is contained in:
DKChan committed 2026-11-09 17:02:31 +08:00
1 parent 57f28922a1
commit a62d79efa6
5 files changed
+184 -20

No files matched your search

@@ -1,7 +1,7 @@
# 难度曲线与Boss # 难度曲线与Boss
> 一句话:难度曲线、期望值带与 Boss 设计 > 一句话:难度曲线、期望值带与 Boss 设计
> 状态:已定稿;现行为 v1.7 > 状态:已定稿;现行为 v1.8
## 设计目的 ## 设计目的
@@ -282,13 +282,14 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表)。Bos
群伤负向 = 警觉(敌方护甲等级 +1);一轮踩雷数由行动点预算天然封顶。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。 群伤负向 = 警觉(敌方护甲等级 +1);一轮踩雷数由行动点预算天然封顶。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。
技能池投值(池权重/冷却/保底/触发条件的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional): 技能池投值(池权重/冷却/保底/特殊间隔/触发条件的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional):
| 参数 | 说明 | | 参数 | 说明 |
|---|---| |---|---|
| 池权重 | 权重即旋钮:抬特殊技权重 = 抬输出频率,EV 随之重锚;各敌种行集读表 | | 池权重 | 权重即旋钮:抬特殊技权重 = 抬输出频率,EV 随之重锚;各敌种行集读表 |
| 技能冷却(拍) | 逐技能行读表;普攻冷却恒 0 不可配(空池不可能的结构前提——域校验锁死);撕咬 = 与突刺同倍率错开冷却轴的高频小爆发轮廓;毒爆 = 蛛化卓尔精灵专属池独占技 | | 技能冷却(拍) | 逐技能行读表;普攻冷却恒 0 不可配(空池不可能的结构前提——域校验锁死);撕咬 = 与突刺同倍率错开冷却轴的高频小爆发轮廓;毒爆 = 蛛化卓尔精灵专属池独占技 |
| 保底 M | 全局单旋钮,读技能表 pity_threshold;连续 M 拍执行普攻 → 下拍必出特殊技;单特殊技低权重池受保底支配 | | 保底 M | 全局单旋钮,读技能表 pity_threshold;连续 M 拍执行普攻 → 下拍必出特殊技;单特殊技低权重池受保底支配 |
| 特殊间隔 K | 全局单旋钮,读技能表 special_interval;任一特殊技兑现后该敌连续 K 拍只能执行普通攻击(闸期内特殊技不进可摇与保底集合,保底顺延),0=关闭;与保底 M 同读一表、合闸期口径见敌人系统「三道闸」表 |
| 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行。**已投放两示范(provisional)**:地精池孤注守势(self_hp_pct lte 35,纯增益技)+ L2/L3 群行位趁隙偷袭(last_round_end eq 停手,伤害技)——fact 阈值、权重、倍率与冷却逐行读表,本表零复制;地精池投放稀释含闸长期速率,EV 抽样锚已换代(带宽注记随 `enemy.tres` 表注) | | 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行。**已投放两示范(provisional)**:地精池孤注守势(self_hp_pct lte 35,纯增益技)+ L2/L3 群行位趁隙偷袭(last_round_end eq 停手,伤害技)——fact 阈值、权重、倍率与冷却逐行读表,本表零复制;地精池投放稀释含闸长期速率,EV 抽样锚已换代(带宽注记随 `enemy.tres` 表注) |
| 池 EV 锚 | 静态份额与含闸长期速率实测读数登记于调参日志(EV 重锚与权重投值随本表修订)。节奏实测判读口径:种子数下限 50 判读;20 种子以下批次有种子偏置假象;过旱按用户判读带集中在短命杂鱼(生存时长问题非池配置——见待办清单 Alpha 条目移交注记) | | 池 EV 锚 | 静态份额与含闸长期速率实测读数登记于调参日志(EV 重锚与权重投值随本表修订)。节奏实测判读口径:种子数下限 50 判读;20 种子以下批次有种子偏置假象;过旱按用户判读带集中在短命杂鱼(生存时长问题非池配置——见待办清单 Alpha 条目移交注记) |
+13 -12
View File
@@ -1,7 +1,7 @@
# 敌人系统 # 敌人系统
> 一句话:敌人数据、技能池出招、意图呈现 > 一句话:敌人数据、技能池出招、意图呈现
> 状态:已定稿;现行为 v1.9 > 状态:已定稿;现行为 v2.0
## 设计目的 ## 设计目的
@@ -110,19 +110,20 @@
池构成纪律(加载校验,违规拒绝入表):**每池恰一行普通攻击**(普攻冷却恒 0 → 可摇集合恒非空,"空池不可能"由结构保证,最坏情况怪物平砍等待——那是玩家的反打窗口而非死拍);**每池增益类技能 ≤1**(非 RPG,怪物连出不同增益显得呆);**每池妨害类技能 ≤1**;**每池至少一行不带触发条件的特殊技**(普攻不算——保底特殊技集合恒非空的结构保证);池条目 skill_id 悬空致命;权重 > 0、冷却 ≥ 0。 池构成纪律(加载校验,违规拒绝入表):**每池恰一行普通攻击**(普攻冷却恒 0 → 可摇集合恒非空,"空池不可能"由结构保证,最坏情况怪物平砍等待——那是玩家的反打窗口而非死拍);**每池增益类技能 ≤1**(非 RPG,怪物连出不同增益显得呆);**每池妨害类技能 ≤1**;**每池至少一行不带触发条件的特殊技**(普攻不算——保底特殊技集合恒非空的结构保证);池条目 skill_id 悬空致命;权重 > 0、冷却 ≥ 0。
两道闸(表值 provisional,投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),行值读技能表): 三道闸(表值 provisional,投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),行值读技能表):
| 闸 | 语义 | | 闸 | 语义 |
|---|---| |---|---|
| 技能冷却 | 每技能行带冷却拍数;施放后连续 N 拍不可摇中——普攻恒 0 不可配,其余行值读技能表 | | 技能冷却 | 每技能行带冷却拍数;施放后连续 N 拍不可摇中——普攻恒 0 不可配,其余行值读技能表 |
| 保底 | 连续 M 拍执行的都是普通攻击 → 下一拍必出特殊技(特殊技内按权重,不受冷却限制);M 读技能表 pity_threshold | | 保底 | 连续 M 拍执行的都是普通攻击 → 下一拍必出特殊技(条件满足且不在间隔闸期内的特殊技内按权重,不受冷却限制;闸期内保底顺延);M 读技能表 pity_threshold |
| 全局特殊间隔 | 任一特殊技兑现后,该敌接下来 K 拍只能执行普通攻击——闸期内特殊技不进可摇集合与保底集合;K 读技能表 special_interval,0=关闭 |
结构红利:增益存续期内下一拍必是伤害技(池里其余全是伤害技、增益自身还在冷却)——**增益不可能白白过期**,"连出不同增益"被池构成纪律结构性消除。同一技能连发不可能(自身冷却杜绝);异名特殊技背靠背概率低(是变化不是失控,全局特殊间隔闸登记 P1 备用旋钮)。 结构红利:特殊技兑现后强制普攻 K 拍(全局特殊间隔闸),增益窗首拍必有普攻承接——**增益不可能白白过期**;"连出不同增益"被池构成纪律结构性消除(增益 ≤1、自身进冷却)。同一技能连发不可能(自身冷却杜绝);异名特殊技背靠背不可能(闸期内特殊技不进可摇集合)。
开轮摇号时序(随机消费全部在[战斗结算](战斗结算.md)换算层): 开轮摇号时序(随机消费全部在[战斗结算](战斗结算.md)换算层):
``` ```
开轮(轮次开始):排除冷却中与触发条件不满足的技能 → 按行序逐敌摇定本拍行动(behavior_roll 封闭流,每敌独立子流)→ 冷却递减 开轮(轮次开始):排除冷却中、间隔闸期内与触发条件不满足的技能 → 按行序逐敌摇定本拍行动(behavior_roll 封闭流,每敌独立子流)→ 冷却与间隔闸计数递减
挖掘期:按摇定结果播类型级动画(特殊技)/ 零表示(普通攻击) 挖掘期:按摇定结果播类型级动画(特殊技)/ 零表示(普通攻击)
结算段:按技能行兑现——掷点、乘区、增益挂接、明细落行 结算段:按技能行兑现——掷点、乘区、增益挂接、明细落行
判定段之后进入下一轮开轮…… 判定段之后进入下一轮开轮……
@@ -136,7 +137,7 @@
Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错峰两轨口径**:**Boss 轨** = L1 酋长池含独占增益技"硬化"〔敌方防御池词汇载体〕+ 半血解锁伤害技"震地怒击";L2 卓尔池独占妨害技"蛛网束缚"+伤害技"毒爆"+ 半血解锁"遏毒";L3 石君王池独占妨害技"大地脉动"+ 半血解锁"岩崩"——独占技随关错峰投放,三行解锁技=每 Boss 一行新独占伤害技〔用户裁案甲,2026-10-04〕;**普通敌轨** = L2/L3 普通敌种技能随关错峰投放(巨蜘蛛族+毒吐〔(2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投〕、灰矮人族+盾击〔(3,0)/(3,5)/(3,7)〕)——第一关不见的招式第二/三关普通战可见;增益 ≤1 纪律下蓄力拍不进 Boss 池)。 Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错峰两轨口径**:**Boss 轨** = L1 酋长池含独占增益技"硬化"〔敌方防御池词汇载体〕+ 半血解锁伤害技"震地怒击";L2 卓尔池独占妨害技"蛛网束缚"+伤害技"毒爆"+ 半血解锁"遏毒";L3 石君王池独占妨害技"大地脉动"+ 半血解锁"岩崩"——独占技随关错峰投放,三行解锁技=每 Boss 一行新独占伤害技〔用户裁案甲,2026-10-04〕;**普通敌轨** = L2/L3 普通敌种技能随关错峰投放(巨蜘蛛族+毒吐〔(2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投〕、灰矮人族+盾击〔(3,0)/(3,5)/(3,7)〕)——第一关不见的招式第二/三关普通战可见;增益 ≤1 纪律下蓄力拍不进 Boss 池)。
举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。 举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中、间隔闸期内与触发条件不满足的技能(保底命中时 = 条件满足且不在间隔闸期内的全部特殊技——闸期内保底集合可为空,保底不兑现、顺延到闸后)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。
### 精英行:现役敌种的强化版,池=继承基础池+附加技 ### 精英行:现役敌种的强化版,池=继承基础池+附加技
@@ -176,7 +177,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
| 机制 | 规则 | | 机制 | 规则 |
|---|---| |---|---|
| 冷却 | 照常——条件与冷却各自独立排除,同一拍可叠加 | | 冷却 | 照常——条件与冷却各自独立排除,同一拍可叠加 |
| 保底 | 保底特殊技集合同样排除条件不满足的技能(保底禁止逼出条件不满足的技);池构成纪律"每池至少一行无条件特殊技"保证该集合恒非空 | | 保底 | 保底特殊技集合同样排除条件不满足的技能(保底禁止逼出条件不满足的技);池构成纪律"每池至少一行无条件特殊技"保证该集合闸外恒非空——间隔闸期内可被闸排空,保底顺延(见「三道闸」表) |
| 死亡作废 | 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数 | | 死亡作废 | 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数 |
| 意图呈现 | 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节) | | 意图呈现 | 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节) |
@@ -184,7 +185,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
首批落地(已实装):①三 Boss 解锁技为闩型条件;②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。 首批落地(已实装):①三 Boss 解锁技为闩型条件;②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。
举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。 举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中、间隔闸期内与触发条件不满足的技能(保底命中时 = 条件满足且不在间隔闸期内的全部特殊技)。
### 伏击(已退役)与群伤负向现况 ### 伏击(已退役)与群伤负向现况
@@ -237,7 +238,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
## P0 最小闭环 ## P0 最小闭环
1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(池模板快照成实例池、冷却全零),主角以血量入参生成。 1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(池模板快照成实例池、冷却全零),主角以血量入参生成。
2. 开轮摇号:战斗结算换算层排除冷却中技能、按行序逐敌摇定本拍动作写入实例池,随后冷却递减(首轮同样摇;轮内刷新换图不重摇)。 2. 开轮摇号:战斗结算换算层排除冷却中与间隔闸期内技能、按行序逐敌摇定本拍动作写入实例池,随后冷却与间隔闸计数递减(首轮同样摇;轮内刷新换图不重摇)。
3. 挖掘期踩雷:事实经战斗结算转化为警觉施加——每颗雷恰一次、逐层记账(无上限)。 3. 挖掘期踩雷:事实经战斗结算转化为警觉施加——每颗雷恰一次、逐层记账(无上限)。
4. 每轮结算战斗段:主角先基础攻击顺位最前的存活敌人,随后每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率,增益技 = 施放行 + 状态授予);地图奖励与惩罚的伤害兑付殿后到战斗段末统一落地(案C 2026-10-06 用户裁,见战斗结算)。 4. 每轮结算战斗段:主角先基础攻击顺位最前的存活敌人,随后每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率,增益技 = 施放行 + 状态授予);地图奖励与惩罚的伤害兑付殿后到战斗段末统一落地(案C 2026-10-06 用户裁,见战斗结算)。
5. 受击上报、血量递减;归 0 即移出顺位(摇定后兑现前死亡 → 本拍作废不进账)。 5. 受击上报、血量递减;归 0 即移出顺位(摇定后兑现前死亡 → 本拍作废不进账)。
@@ -252,7 +253,6 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
| P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 已实装(三 Boss 闩型+两示范投放,见「触发条件」节与「首批落地」段) | | P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 已实装(三 Boss 闩型+两示范投放,见「触发条件」节与「首批落地」段) |
| P1 | 个体化变体池(同种个体分型:A 型好斗 / B 型守势) | 共识点 A 的 A2 案;排期 Beta,登记[待办清单](../../../../待办清单.md) | | P1 | 个体化变体池(同种个体分型:A 型好斗 / B 型守势) | 共识点 A 的 A2 案;排期 Beta,登记[待办清单](../../../../待办清单.md) |
| P1 | 精英遭遇接线、精英底座光环与描边变色、精英钥石掉落 | 精英行已落表静置(见「精英行」节);接线归[待办清单](../../../../待办清单.md)「战斗节点遭遇编排方式」条目,视觉二件随怪物设定批,钥石随接线批 | | P1 | 精英遭遇接线、精英底座光环与描边变色、精英钥石掉落 | 精英行已落表静置(见「精英行」节);接线归[待办清单](../../../../待办清单.md)「战斗节点遭遇编排方式」条目,视觉二件随怪物设定批,钥石随接线批 |
| P1 | 全局特殊间隔旋钮 | 特殊技背靠背实测仍嫌时的备用闸;登记[待办清单](../../../../待办清单.md) |
| P1 | 新效应词汇(妨害技 + 必中附加分量已实装——实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) | 妨害类型 + rider_mult 字段已落地;登记[待办清单](../../../../待办清单.md)(已解决移除,去向见状态记录) | | P1 | 新效应词汇(妨害技 + 必中附加分量已实装——实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) | 妨害类型 + rider_mult 字段已落地;登记[待办清单](../../../../待办清单.md)(已解决移除,去向见状态记录) |
| P1 | 敌种扩容与投放节奏(含第二关池与投放) | 投放节奏是关卡命脉,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | | P1 | 敌种扩容与投放节奏(含第二关池与投放) | 投放节奏是关卡命脉,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
| P1 | 单体寻址("只打某一个敌人"的目标指定) | 归集语义与呈现已裁定(语义归[增益状态](增益状态.md)〈单体寻址扩展位〉节);实现随首个单体效果的内容批落地 | | P1 | 单体寻址("只打某一个敌人"的目标指定) | 归集语义与呈现已裁定(语义归[增益状态](增益状态.md)〈单体寻址扩展位〉节);实现随首个单体效果的内容批落地 |
@@ -291,6 +291,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
| cooldown_beats | [0, 99] | 施放后连续 N 拍不可摇中;普通攻击恒 0 不可配(域校验锁死——空池不可能的结构前提) | | cooldown_beats | [0, 99] | 施放后连续 N 拍不可摇中;普通攻击恒 0 不可配(域校验锁死——空池不可能的结构前提) |
| buff_ref / buff_duration | 效果引用 / [1, 99] | 仅增益与妨害技(target_side 路由);悬空引用加载期拒绝 | | buff_ref / buff_duration | 效果引用 / [1, 99] | 仅增益与妨害技(target_side 路由);悬空引用加载期拒绝 |
| pity_threshold(保底 M) | [1, 99] | 全局单旋钮:连续 M 拍执行普攻 → 下拍必出特殊技 | | pity_threshold(保底 M) | [1, 99] | 全局单旋钮:连续 M 拍执行普攻 → 下拍必出特殊技 |
| special_interval(特殊间隔 K) | [0, 99] | 全局单旋钮:任一特殊技兑现后该敌连续 K 拍只能执行普通攻击,0=关闭(旧口径等价);投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
| trigger | {fact, op, value, latch},词表见核心规则「触发条件」节;value 类型随 fact(数值事实整数、百分比事实域 [1,99]、枚举事实枚举串) | 全部可省,缺省=无条件技;出域加载期拒绝;情境技与解锁阈值的行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | | trigger | {fact, op, value, latch},词表见核心规则「触发条件」节;value 类型随 fact(数值事实整数、百分比事实域 [1,99]、枚举事实枚举串) | 全部可省,缺省=无条件技;出域加载期拒绝;情境技与解锁阈值的行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
主角表(单行全局): 主角表(单行全局):
@@ -305,13 +306,13 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。 各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。
结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、**行集构成纪律(行集内 enemy_id 唯一 + 同带键多行文件内相邻且行序 = 声明序 = 生成序 + 行集实例总数 ≤ 4)**、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步登记册(登记 [待办清单](../../../../待办清单.md))。 结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、**行集构成纪律(行集内 enemy_id 唯一 + 同带键多行文件内相邻且行序 = 声明序 = 生成序 + 行集实例总数 ≤ 4)**、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底 × 特殊间隔(池节奏四联动)禁止独立调参,联调须重跑方向性预检并同步登记册(登记 [待办清单](../../../../待办清单.md))。
## 验收标准 ## 验收标准
- 开战生成:按遭遇坐标取出该坐标行集(一行或多行,逐行实例化——行序 = 文件序),实例化数量与数值投影同行值快照;行集实例总数(各行骰后)≤ 4;池模板快照成实例池且冷却全零;主角以血量入参,越界(高于上限或不超过 0)拒绝且不留半实例。 - 开战生成:按遭遇坐标取出该坐标行集(一行或多行,逐行实例化——行序 = 文件序),实例化数量与数值投影同行值快照;行集实例总数(各行骰后)≤ 4;池模板快照成实例池且冷却全零;主角以血量入参,越界(高于上限或不超过 0)拒绝且不留半实例。
- 摇号确定性:同种子回放逐位复现(步骤流与各实例摇定动作序列逐位相同);单敌轨迹独立复放——只喂该敌子流(scope = 生成序 × 派生向量 + 摇号序)即可逐位重建其出招序列、互不穿插。 - 摇号确定性:同种子回放逐位复现(步骤流与各实例摇定动作序列逐位相同);单敌轨迹独立复放——只喂该敌子流(scope = 生成序 × 派生向量 + 摇号序)即可逐位重建其出招序列、互不穿插。
- 池节奏:中签率 = 权重 ÷ 可摇权重合计(排除冷却中与触发条件不满足的技能后归一);施放后连续 N 拍不可摇中;连续 M 拍执行普攻 → 下拍必出特殊技(条件满足的特殊技内按权重、不受冷却限制);同技能连发不可能;首轮摇号、每轮恰摇一次、轮内刷新不重摇。 - 池节奏:中签率 = 权重 ÷ 可摇权重合计(排除冷却中、间隔闸期内与触发条件不满足的技能后归一);施放后连续 N 拍不可摇中;任一特殊技兑现后该敌连续 K 拍只执行普通攻击(K=0 关闭=旧口径);连续 M 拍执行普攻 → 下拍必出特殊技(条件满足且不在间隔闸期内的特殊技内按权重、不受冷却限制,闸期内顺延);同技能连发不可能;异名特殊技背靠背不可能(K ≥ 1);首轮摇号、每轮恰摇一次、轮内刷新不重摇。
- 触发条件:条件不满足的技能不进可摇集合与保底集合(保底禁止逼出条件不满足的技);条件求值零随机、同种子回放逐位复现;闩型条件首次为真后整场保持(治疗抬血不回锁);每池至少一行无条件特殊技(加载校验);缺省无 trigger 字段=无条件技,旧表零变化。 - 触发条件:条件不满足的技能不进可摇集合与保底集合(保底禁止逼出条件不满足的技);条件求值零随机、同种子回放逐位复现;闩型条件首次为真后整场保持(治疗抬血不回锁);每池至少一行无条件特殊技(加载校验);缺省无 trigger 字段=无条件技,旧表零变化。
- 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。 - 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。
- 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。 - 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。
+1
View File
@@ -84,6 +84,7 @@ tests/
| 效果发射端口单点 | 战斗结算 | `BattleOrchestrator.begin_battle()`(真实装配链端口接线+合成行闭面守卫经 `DamageController.flush_submit()` 承伤路径) | `effect_port_test.gd:_smoke_effect_port_wiring`;`effect_port_test.gd:_test_business_classes_engine_free`;`effect_port_test.gd:_test_biz_fact_face_closed` | | 效果发射端口单点 | 战斗结算 | `BattleOrchestrator.begin_battle()`(真实装配链端口接线+合成行闭面守卫经 `DamageController.flush_submit()` 承伤路径) | `effect_port_test.gd:_smoke_effect_port_wiring`;`effect_port_test.gd:_test_business_classes_engine_free`;`effect_port_test.gd:_test_biz_fact_face_closed` |
| 轮内流与结算五段全序 | 战斗结算 | `BattleOrchestrator.begin_battle()` | `round_flow_skill_pool_test.gd:_smoke_full_battle`;`round_flow_skill_pool_test.gd:_smoke_settlement_segments`;`settle_segments_test.gd:_init`;`settlement_wiring_snapshot_test.gd:_init`;`encapsulation_sweep_test.gd:_init` | | 轮内流与结算五段全序 | 战斗结算 | `BattleOrchestrator.begin_battle()` | `round_flow_skill_pool_test.gd:_smoke_full_battle`;`round_flow_skill_pool_test.gd:_smoke_settlement_segments`;`settle_segments_test.gd:_init`;`settlement_wiring_snapshot_test.gd:_init`;`encapsulation_sweep_test.gd:_init` |
| 技能池数据面与回放独立 | 敌人系统 | `BattleOrchestrator.begin_battle()`(技能池抽号/校验) | `round_flow_skill_pool_test.gd:_smoke_skill_pool_data`;`round_flow_skill_pool_test.gd:_smoke_skill_pool_replay_independence`;`trigger_cond_test.gd:_init`;`pool_case_d_test.gd:_init` | | 技能池数据面与回放独立 | 敌人系统 | `BattleOrchestrator.begin_battle()`(技能池抽号/校验) | `round_flow_skill_pool_test.gd:_smoke_skill_pool_data`;`round_flow_skill_pool_test.gd:_smoke_skill_pool_replay_independence`;`trigger_cond_test.gd:_init`;`pool_case_d_test.gd:_init` |
| 全局特殊间隔闸 | 敌人系统 | `BattleOrchestrator.begin_battle()`(开轮摇号池节奏闸——特殊技兑现后强制普攻) | `round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_gate`;`round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_pity`(计划——需求卡片「全局特殊间隔闸批」2026-11-09 锚定) |
| Boss 半血解锁技门控 | 敌人系统 | `BattleOrchestrator.begin_battle()`(Boss 行) | `skill_unlock_test.gd:_test_gate_predicate`;`skill_unlock_test.gd:_test_latch_irreversible` | | Boss 半血解锁技门控 | 敌人系统 | `BattleOrchestrator.begin_battle()`(Boss 行) | `skill_unlock_test.gd:_test_gate_predicate`;`skill_unlock_test.gd:_test_latch_irreversible` |
| 封印与极性路由/不可逆 | 地图战斗资源×战斗结算 | 效果引擎 × `BattleOrchestrator.begin_battle()` | `seal_polarity_test.gd:_smoke_seal_ap_exhausted`;`seal_polarity_test.gd:_smoke_seal_irreversible_quadrants`;`seal_polarity_test.gd:_smoke_polarity_routing` | | 封印与极性路由/不可逆 | 地图战斗资源×战斗结算 | 效果引擎 × `BattleOrchestrator.begin_battle()` | `seal_polarity_test.gd:_smoke_seal_ap_exhausted`;`seal_polarity_test.gd:_smoke_seal_irreversible_quadrants`;`seal_polarity_test.gd:_smoke_polarity_routing` |
| 状态效果施加与行值(减伤/持续/叠层读表) | 战斗结算 | `BattleOrchestrator.begin_battle()`(状态施加段) | `round_flow_skill_pool_test.gd:_check_defensive_stance_values`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | | 状态效果施加与行值(减伤/持续/叠层读表) | 战斗结算 | `BattleOrchestrator.begin_battle()`(状态施加段) | `round_flow_skill_pool_test.gd:_check_defensive_stance_values`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) |
@@ -0,0 +1,161 @@
# 需求卡片:全局特殊间隔闸批(2026-11-09)
> 来源:待办清单「全局特殊间隔旋钮」条目(2026-10-18 登记)。
> 验收档:高(数值表结构校验+敌人出招行为随结算传播)。
> 来源:设计事实源见下节(唯一事实源声明)。
## 1. 目标与完成定义
给敌人加**特殊技公共冷却**(全局特殊间隔闸):任一特殊技兑现后,该敌接下来 K 拍只能执行普通攻击——堵死「不同大招背靠背接力」(现行各技能自己的冷却只堵同招连发)。
完成定义(全部满足才算完):
1. 技能表新字段 `special_interval`(全局单旋钮,域 [0,99],0=关闭)在 schema 域校验与 `skills.tres` 行值两处落位,K=1。
2. 敌人实例带间隔闸计数,闸期内特殊技不进可摇集合与保底集合(双面过滤,保底顺延)。
3. 验证闸对照表 A1–A8 全部在当轮真实跑批执行并通过;代码域闸全绿。
4. 同种子回放契约保持(新行为下逐位复现);EV 锚按新行为换代。
## 2. 设计事实源
`design/gdd/systems/战斗循环/敌人系统.md` v2.0「三道闸」表(全局特殊间隔行)+同文档「调参表」`special_interval` 行+同文档「验收标准·池节奏」;投值所有权=`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.8「调参表」特殊间隔 K 行。与待办清单条目闭合凭据一致(该条目状态=文档设计已闭合+已写卡)。
三裁点已随设计闭合裁死(用户 2026-11-09 批准在案,卡内不再开裁):**K=1**;**每敌独立计数**(全部敌人含 Boss);**双面过滤+保底顺延**。
## 3. 现状事实(开工自行复核)
- 开轮摇号主体在 `game/core/settlement/round_cycle.gd:91` `roll_round_actions(ri)`——逐存活敌:可摇集合(`units.rollable_skills`)→ 保底判定(`basic_streak >= pity_m` 时 `special_skills` 非空则整体替换)→ `SkillLottery.draw` 取号(behavior_roll 流,每敌每轮恰一次)→ 末尾 `tick_cooldowns()`(递减在摇号读值之后)。
- 可摇集合过滤在 `game/core/unit_container.gd:227` `rollable_skills`——条目级排除触发条件不满足(`_entry_blocked`)与冷却中(`cooldown_left <= 0` 判断)。保底集合在 `game/core/unit_container.gd:242` `special_skills`——type≠basic 全部非锁定条目,不受冷却限制(注释明示「锁定条目双面过滤」先例)。
- 执行上报在 `game/core/unit_container.gd:300` `commit_action`——按 `cooldown_beats` 置 `cooldown_left`(施放行),普攻 `basic_streak +1`/特殊技归零;摇定后兑现前死亡不经本方法=作废不进账。
- 冷却递减在 `game/core/unit_container.gd:324` `tick_cooldowns`——时序口径(`:320` 注记):摇号按当前值排除、递减在其后=「施放后连续 N 拍不可摇中」的等价实现。间隔闸计数沿用同一时序口径。
- 实例状态初始化在 `game/core/unit_container.gd` `_spawn_rowset`(`basic_streak = 0` 同点);保底读数 `basic_streak` 在 `:289`。
- 表值:`game/data/tables/skills.tres` `pity_threshold = 4`;schema 在 `game/data/schemas/skill_table.gd`(`@export var pity_threshold: int = 4`,域校验 [1,99] 越域报 category=domain 止动,同函数即本卡新增校验的落点)。
- ConfigDB 装配单点在 `game/core/config_db.gd`(`combat.skill` 整容器挂载)——新表字段零装配改动。
- 既有测试面:`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd`(`_smoke_skill_pool` 总入口、`_smoke_skill_pool_data` 表数据面、`_smoke_skill_pool_replay_independence` 同种子回放、`_smoke_skill_pool_ev_anchor` 5000 拍 EV 对锚〔内含保底替换逻辑复刻〕、`_smoke_skill_pool_death_void`、`_smoke_skill_pool_validation_reject`);`trigger_cond_test.gd`(保底不逼条件不满足技);`skill_unlock_test.gd`(保底不逼锁定技)。系统测试与探针无敌人出招节奏断言(`skill_rhythm_probe.gd`/`rhythm_batch.gd` 为零断言取数件,不在本卡面)。
## 4. 设计契约(违反即返工)
- 🔴 **双面过滤**:闸期内特殊技不进可摇集合、也不进保底集合——保底禁止逼出闸中技;闸期内保底集合可为空,保底不兑现、顺延到闸后满 M 首拍。
- 🔴 **数值单点**:K 只存 `skills.tres` `special_interval`,经 ConfigDB 单点读;禁数值字面量、禁自建 load 路径。
- 🔴 **随机零新增**:不加随机源、不改取号次数(每敌每轮恰一次 behavior_roll);过滤发生在取号前的集合组装面。同种子回放契约=新行为下逐位复现(旧种子轨迹因行为换代不续用,属预期换代非回归)。
- 🔴 **两计时器独立**:`special_lock` 与各条目 `cooldown_left` 互不读写;死亡作废(未经 commit_action)不进闸、不清闸。
- 🔴 **Core 零 UI**:改动全部落在 core/数据层与单元测试;零呈现面、零场景改动。
- 🔴 **fail-fast**:`special_interval` 越域 [0,99] 加载期 domain 错误止动,无软回退。
## 5. 范围边界
做什么:上列 T0–T3。不做什么:呈现面(不碰);MC/verifier 重跑(读数类不属改完即测域,是否重测全冒险期望=合回后用户按 MC 档位表裁);池权重/冷却/倍率重投值(EV 重锚仅指测试锚换代,投值调参归难度曲线批);术语表增删(无新术语)。明示不收件去向:实测节奏读数需求归 `skill_rhythm_probe.gd`/`rhythm_batch.gd` 既有取数件,不在本卡。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/gdd/systems/战斗循环/敌人系统.md` | 「三道闸」表与「调参表」special_interval 行(v2.0 已落文) | 设计权威文档——实现批禁直改;实现与条款失配→列 `reports/iter<N>-反哺点-<日期>.md` 由用户裁决后归文档批 |
| `design/gdd/systems/冒险循环/难度曲线与Boss.md` | 「调参表」特殊间隔 K 投值行(v1.8 已落文) | 同上 |
| `game/tests/README.md` | 能力表增行「全局特殊间隔闸」 | 本写卡批已随卡增行(机械面);实现批禁写,批末只核对表上名字与实际落地一致 |
| `待办清单.md` | 「全局特殊间隔旋钮」条目状态 | 流水线面——实现批禁写;实现批完成入库后按退役规则整条删除(归收尾段) |
## 7. 卡前·文件结构图(全部既有件,零新增文件)
| 文件 | 职责 | 改动性质 |
|---|---|---|
| `game/data/schemas/skill_table.gd` | 技能表 schema:加 `special_interval` 字段与域校验 | 行为改动(A4、A5) |
| `game/data/tables/skills.tres` | 技能表行值:`special_interval = 1` | 行为改动(A1 全部行为的表值源) |
| `game/core/unit_container.gd` | 实例闸计数与双面过滤(rollable/special_skills/commit/tick/初始化) | 行为改动(A1、A2、A3) |
| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | 新增节奏断言、数据面与校验扩展、EV 锚换代 | 行为改动(A1–A7 的测试面) |
| `game/tests/README.md` | 能力表增行(本写卡批已做) | 非行为改动 |
## 8. 任务卡
估时总计 ≈1.75 个工作日(区间 1.5–2.0)。T 卡间接口:T1 产出 `special_lock` 实例键与双过滤行为(T2/T3 取用);T0 产出表字段与读数路径(T1 的 `db.combat.skill.special_interval` 取用)。
### T0 表与 schema(0.25d)
- [ ] `skill_table.gd` 加 `@export var special_interval: int = 1`(pity_threshold 同区;注释一行口径:全局特殊间隔 K——任一特殊技兑现后该敌连续 K 拍只能执行普通攻击,0=关闭;provisional 归难度曲线与Boss)。
- [ ] `_validate_table_invariants` 加域校验:`special_interval` 出 [0,99] → `{"category": "domain", ...}` 止动(pity 同款句式)。
- [ ] `skills.tres` `[resource]` 区加 `special_interval = 1`(pity_threshold 行下)。
- [ ] `_smoke_skill_pool_data` 扩展:断言 `db.combat.skill.special_interval == 1`(表实一致读数面)。
- [ ] 验证步:直跑单元套件(`--script res://tests/run_all.gd`)全绿,读数记录。
### T1 实例闸(0.5d)
- [ ] 实例创建处(`_spawn_rowset` 内 `basic_streak = 0` 同点)增 `special_lock = 0` 初始化。
- [ ] `rollable_skills`:`int(u.get("special_lock", 0)) > 0` 时,非 basic 条目跳过(type 经 `db.combat.skill.row_by_id` 查——`special_skills` 同款查法);签名为既有签名零改。
- [ ] `special_skills`:lock>0 时返回空数组(含注释一行:闸中特殊技不进保底集合——保底顺延)。
- [ ] `commit_action`:`srow.type != "basic"` 分支置 `u.special_lock = int(db.combat.skill.special_interval)`;普攻分支不动 lock。
- [ ] `tick_cooldowns`:逐敌 `u["special_lock"] = maxi(0, int(u.get("special_lock", 0)) - 1)`(与池条目冷却递减同轮同点)。
- [ ] 验证步:直跑单元套件全绿,读数记录。
### T2 节奏断言(0.5d)
- [ ] 新增 `_smoke_skill_pool_interval_gate`:真实入口 `BattleOrchestrator.begin_battle()` → `roll_round_actions()`。**夹具钉死**:单敌实例、池=恰一普攻+恰一无条件特殊技、且该特殊技 `cooldown_beats = 0`(排除冷却混淆归因——无闸时背靠背才机制可能,有闸时交替的排除唯一来自闸)。调试接口设 `pity_threshold = 1`、`special_interval = 1`:断言执行行序列严格「特殊技/普攻」逐拍交替(保底每拍触发+闸强制普攻的合成节奏);再设 `special_interval = 0`:断言出现背靠背特殊技(连续两拍 special)=旧口径等价(种子与权重按本文件既有种子狩猎惯例定)。判据绑定面=行动执行行的 skill_id 逐拍序列(单特殊技池 → id 级确定)。测试毕恢复表值。
- [ ] 新增 `_smoke_skill_pool_interval_pity`:`pity_threshold = 4`、`special_interval = 6`:断言特殊技兑现后 6 拍内零特殊技(其中 streak≥4 的拍保底不兑现)、第 7 拍保底兑现出特殊技。判据绑定面同上;表值直改收尾恢复(凡直改共享表值的测试函数一律收尾恢复——泄漏即污染同套件下游读数)。
- [ ] 每敌独立断言(并入 `_smoke_skill_pool_interval_gate`):双实例同池(同 T2 首条钉死的零冷却池),容器 API 对 u1 先 `set_pending_action(u1, 特殊技 id)` 再 `commit_action`(无 pending 则 commit 空转——前置必写),断言 u1 可摇集合排除特殊技、u2 可摇集合含特殊技。
- [ ] `_smoke_skill_pool_validation_reject` 扩展:`special_interval` 越域(−1 与 101 两例)加载期 domain 止动断言。
- [ ] `_smoke_skill_pool_death_void` 扩展:摇定后兑现前死亡作废拍后断言 `special_lock` 保持 0(死亡作废不进闸)。
- [ ] 验证步:直跑单元套件全绿,读数记录。
### T3 锚换代与收尾(0.5d)
- [ ] `_smoke_skill_pool_ev_anchor`:测试内保底替换复刻补 lock 过滤(与实现同口径);5000 拍重锚——新阈值按新行为实测读数推导(换代申报见「测试削弱申报」节)。
- [ ] `_smoke_skill_pool_replay_independence` 复闸:观测窗覆盖保底与间隔闸共存段,同种子逐位复现绿。
- [ ] 里程碑步(T 段)出口跑一次全套代码域闸;波内修复只做出红最小单元的最窄确认。
- [ ] 产出物落位卡:轻闸全绿后、合并前写齐 `reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单〔本批零呈现面,目检清单登记「无」〕+遗留读数义务+实现决定记录)与 `reports/iter<N>-反哺点-<日期>.md`(同步面四条的落点逐条交代:两份 GDD 本卡批已落文无需同步、README 已增行、待办清单归收尾段删除)。
## 9. 验证闸(改动—验收对照表)
| # | 需求点(含判据出处锚) | 改动(文件/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| A1 | 兑现后 K 拍强制普攻、K=0 等价旧口径——`design/gdd/systems/战斗循环/敌人系统.md「技能池:每敌种一张带权技能池,每拍开轮摇号出招」全局特殊间隔 | `unit_container.gd` rollable/commit/tick+`skills.tres` 表值 | `round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_gate` | 单元 | `BattleOrchestrator.begin_battle()` → 开轮摇号(调试接口 pity=1 配 K=1 与 K=0 两档;夹具零冷却单特殊技池) | 行动执行行 skill_id 逐拍序列(交替/背靠背两判据;单特殊技池 id 级确定) | 新增:全局特殊间隔闸 |
| A2 | 保底顺延(闸期不兑现、闸后满 M 首拍兑现)——`design/gdd/systems/战斗循环/敌人系统.md「技能池:每敌种一张带权技能池,每拍开轮摇号出招」保底顺延 | `unit_container.gd` special_skills 排空+保底替换路径 | `round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_pity` | 单元 | 同上(调试接口 pity=4 配 K=6) | 执行序:兑现后 6 拍零特殊技、第 7 拍保底兑现 | 新增:全局特殊间隔闸 |
| A3 | 每敌独立计数——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | per-instance `special_lock` | `_smoke_skill_pool_interval_gate` 内独立断言 | 单元 | `UnitContainer` 容器 API(commit→rollable 对照) | 双实例可摇集合返回差异 | 新增:全局特殊间隔闸 |
| A4 | 越域加载期止动——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | `skill_table.gd` 域校验 | `_smoke_skill_pool_validation_reject` 扩展 | 单元 | 表加载校验链(ConfigDB 装载) | category=domain 错误+止动 | 既有:技能池数据面与回放独立 |
| A5 | 表实一致(字段在库、读数路径通)——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | `skills.tres`+`skill_table.gd` | `_smoke_skill_pool_data` 扩展 | 单元 | `BattleOrchestrator.begin_battle()` 表读数 | `db.combat.skill.special_interval == 1` | 既有:技能池数据面与回放独立 |
| A6 | 同种子回放契约保持——`design/gdd/systems/战斗循环/敌人系统.md「验收标准」摇号确定性 | 全部改动面 | `_smoke_skill_pool_replay_independence` 复闸 | 单元 | `begin_battle()` 同种子双跑 | 逐实例摇定轨迹逐位相同 | 既有:技能池数据面与回放独立 |
| A7 | EV 锚随行为换代——`design/gdd/systems/冒险循环/难度曲线与Boss.md「调参表」特殊间隔 | 行为换代→测试内期望复刻同步 | `_smoke_skill_pool_ev_anchor` 重锚 | 单元 | `begin_battle()` 5000 拍模拟 | 复刻期望与模拟频率对锚通过 | 既有:技能池数据面与回放独立 |
| A8 | 死亡作废不进闸——`design/gdd/systems/战斗循环/敌人系统.md「验收标准」死亡即不动手 | 作废路径零 lock 副作用 | `_smoke_skill_pool_death_void` 扩展 | 单元 | `begin_battle()`(摇定后兑现前击杀路径) | 作废拍后 `special_lock == 0` | 既有:技能池数据面与回放独立 |
测试方式两分法:A1–A7 全部走调试接口直改表值(能力验证),无正常流程体验项;实机目检登记「无」(零呈现面)。
**测试削弱申报**:`_smoke_skill_pool_ev_anchor` 对锚阈值换代(行为换代所致,断言形态不变)——此外零删零宽。
**独立验收审计**:入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不得合并。验收档=高(审计深度按 test-conventions §8.7 高档执行)。
**回归措辞**:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
## 10. 异常分级
- **L1 自救**:断言夹具表值恢复遗漏、测试函数内变量遮蔽之类自净问题——当场修,读数进提交信息。
- **L2 记录继续**:EV 重锚一次不中(实测读数与推导偏差)——按读数修正推导再锚,连续 3 次不中升 L3。
- **L3 停机呈报**:①闸语义与 GDD 条款失配(退回上游);②机检预算互斥=上游缺陷停卡退回写卡段;③保底×间隔时序出现设计未预见的死锁形态(保底永不兑现类)——停机写报告等用户。
## 11. 代拍板白名单
测试夹具的池配置(池构成纪律内的最小池);断言消息文案;EV 锚新阈值的具体推导取值(按实测读数);闸内代码注释措辞;提交信息措辞。超清单决定记入实现报告「实现决定记录」节。
## 12. 待裁点
零待裁点,开工门=U0。三裁点(K=1/每敌独立/双面过滤+保底顺延)已随设计段闭合由用户裁死(2026-11-09 计划批准在案),卡内不再重开。
## 13. 落位与可复用性预检
- **新增面清点**:零新增文件;新增 schema 字段 1 个(`special_interval`)、实例字典键 1 个(`special_lock`)、单元测试函数 2 个。
- **复用面**:字段落点复用 `pity_threshold` 同区同款(全局单旋钮先例);实例闸计数复用 `basic_streak`/`cooldown_left` 的实例字典键与「commit 置值→tick 递减→摇号读值排除」既有三段式时序(`:320` 注记口径),不新增计时器机制——**为什么不是复用冷却本身**:冷却按技能行条目计,堵不住异名接力(本闸语义恰是跨条目),实例级单键是唯一落点。
- **唯一面**:K 读数只在 `db.combat.skill.special_interval` 一处定义、`skills.tres` 一处存值;`special_lock` 读写集中在 `unit_container.gd` 四处(init/rollable+special_skills 过滤/commit 置值/tick 递减),无第二落点。
- **分层与交互面**:改动全在 core 与数据层——ConfigDB 单点取值、零 UI、零事件、随机消费面不变(RngService/SkillLottery 零触碰);测试经既有 `begin_battle()` 真实装配链驱动。
## 14. 实现规范预算
零新增文件,新件三查不适用。存量触面:`skill_table.gd`(+1 export、+1 校验分支)、`unit_container.gd`(rollable +1 分支、special_skills +1 早退、commit +1 分支、tick +1 行、init +1 键)——增量均在 gdstyle 默认阈值内,S13 键较登记值只降不升预期;测试文件新增 2 函数(单函数分支 ≤8 内)。
## 15. 复核记录
| 轮次 | 复核者 | 发现 | 去向 | 处置结果 |
|---|---|---|---|---|
| 1 | 只读子代理(未参与撰写) | 锚 8 行全实读命中、现状 file:line 全对、时序推演严格等价(K=1 恰覆盖下拍/M4+K6 第 7 拍兑现/死亡路径零触碰 lock)、引擎面三查过、落位预算自洽 | 自判 | 核实为真,零改 |
| 1 | 同上 | A1 双臂缺「夹具特殊技冷却=0」前提——K=0 臂机制不可能绿、K=1 臂排除归因被冷却混淆 | 补写 | T2 首条钉死夹具(恰一普攻+恰一无条件特殊技、cooldown_beats=0);A1 绑定面补「单特殊技池 id 级确定」 |
| 1 | 同上 | A3 双实例对照受冷却冒领风险;commit 前置 set_pending_action 未写明 | 补写 | T2 独立断言条补零冷却夹具与 pending 前置 |
| 1 | 同上 | `_interval_pity` 直改共享表值缺恢复义务(泄漏污染同套件下游) | 补写 | T2 补「凡直改共享表值的测试函数一律收尾恢复」 |
| 1 | 同上 | K=0 臂背靠背是种子/权重依存非结构保证 | 自判 | 不改——种子狩猎=本文件既有惯例且在代拍板白名单,实现期定 |
| 1 | 同上 | 回放观测窗可能整窗零特殊技(闸未被行使) | 自判 | 不改——种子狩猎惯例可解,T3 义务在卡 |
| 1 | 同上 | A4/A5 真实入口措辞与直构 validate/直读 db 惯例有出入 | 自判 | 不改——既有单元面惯例内,语义不失真 |
| 1 | 同上 | A7 锚行与 EV 重锚义务有语义距离(重锚落文在相邻表行) | 自判 | 不改——锚词命中节内、所有权读法成立 |
+6 -6
View File
@@ -143,14 +143,14 @@
#### 全局特殊间隔旋钮(2026-10-18 登记,来源=会话提及) #### 全局特殊间隔旋钮(2026-10-18 登记,来源=会话提及)
**实况**:异名特殊技背靠背现行概率低(是变化不是失控);若实测仍嫌,备用闸=全局「特殊技后至少隔 N 拍」——登记备用,未实测不启用。 **实况**:全局特殊间隔闸设计闭合——任一特殊技兑现后该敌连续 K 拍只能普攻,杜绝异名特殊技背靠背;K=1、每敌独立计数、双面过滤(可摇集合+保底集合,保底顺延),域 [0,99] 0=关。关联文档:
- [敌人系统](design/gdd/systems/战斗循环/敌人系统.md) v2.0(三道闸·机制与取值域)
- [难度曲线与Boss](design/gdd/systems/冒险循环/难度曲线与Boss.md) v1.8(投值所有权)
- [需求卡片-全局特殊间隔闸批](reports/需求卡片-全局特殊间隔闸批-2026-11-09.md)(已写卡凭据,复核记录在卡内)
**缺口**:还差备用闸的条款设计(N 值与作用域)——仅当实测读数支持时才启动讨论。 **改动面**:文档+游戏代码
- 相关文档:[敌人系统](design/gdd/systems/战斗循环/敌人系统.md) 与[难度曲线与Boss](design/gdd/systems/冒险循环/难度曲线与Boss.md)(P1)
**改动面**:文档 **状态**:文档设计已闭合+已写卡
**状态**:待文档设计(备选)
#### 敌方技能图鉴 / 学习呈现(2026-10-18 登记,来源=会话提及) #### 敌方技能图鉴 / 学习呈现(2026-10-18 登记,来源=会话提及)