编排(迭代39追加编卡): 技能池情境条件触发器卡(reports/需求卡片-技能池情境条件触发器批-2026-10-26.md v1.2,估时≈3.0d)追加编入迭代39排末位(主先副后不动)——迭代39总量≈7.15+3.0≈10.15个工作日,行内随带日期特批标记(先例迭代33/34/35);预计周期换代与当前位下一步行同步(三卡≈10.15——特批事实单点活在迭代行预计周期列,当前位散文行不复制标记);待办清单条目状态推进「已编迭代 39」(交叉核8链);编排四查凭据实核=敌人系统.md v1.2+战斗结算/难度曲线与Boss/数据配置三随动v1.0版本头+卡片零待裁点;同批补提上会话已产出未提交的文档设计闭合批(敌人系统v1.2百分比事实阈值式+技能表trigger行+三随动v1.0+待办条目凭据行)与写卡定稿件;在册未编三张呈报不编=卡⑤ESC浮窗(前置卡④退回美术设计段未闭)/冒险前资源配比预设(2026-10-05挂起冻结)/结算明细日志行序重锚(义务已并入迭代38卡T2,状态行滞后归批后收尾订正);pipeline_gate 绿(57条目/39行/8链/15卡)
This commit is contained in:
1 parent
2465a73b83
commit
f3b148ce44
7 files changed
+230
-15
No files matched your search
@@ -0,0 +1,213 @@
|
||||
# 需求卡片:技能池情境条件触发器批
|
||||
|
||||
> 来源:待办清单「技能池情境条件触发器」条目(2026-10-18 登记)
|
||||
> 唯一事实源:design/gdd/systems/战斗循环/敌人系统.md v1.2 §核心规则「触发条件」节(2026-10-26 文档设计已闭合;v1.0 立节·v1.1 单体寻址批随动·v1.2 百分比事实读数定阈值式——本卡依 v1.2)+ §技能行字段词汇表 trigger 行+ §池构成纪律+ §意图线索(半血解锁弹出规格)
|
||||
> 估时:≈3 个工作日(T0 0.4/T1 0.7/T2 0.8/T3 0.4/T4 0.7)
|
||||
> 状态:v1.2 定稿——grilling 两轮复核(一轮回炉:2 阻断+8 应修+5 建议全折入,含设计文档 v1.2 阈值式联动修订;二轮通过,附残留 R1-R5+S1-S3 已全部折入),零待裁点
|
||||
|
||||
## 一、目标与完成定义
|
||||
|
||||
**做什么**:把敌人系统 v1.2 定稿的触发条件机制实装——技能行加 `trigger` 字段({fact, op, value, latch} 封闭词表),开轮摇号前对每敌求值,条件不满足的技能不进可摇集合与保底集合(门槛过滤);三 Boss 半血解锁技 `unlock_hp_pct` 收编为闩型首用例(行为零变化);两个示范投放(地精池低血防御增益、钩爪恐魔池停手偷袭伤害技);事实面供给埋点(轮次/上轮结束方式/踩雷计数)。
|
||||
|
||||
**完成定义**:
|
||||
1. 六事实词+六算子求值器全实装,fact/op 出域与 latch 语义加载期校验,缺省无 trigger 字段=旧行为零变化。
|
||||
2. 三 Boss 解锁技(quake_smash/venom_curb/rockslide)迁移后同种子战斗行为逐位复现(解锁时点/归因行/enemy_hp_threshold 事件全部保持)。
|
||||
3. 新池构成纪律「每池至少一行无条件特殊技」入跨表校验。
|
||||
4. 两示范投放真实入口可验(低血时防御技可摇出、上轮停手后偷袭技可摇出)。
|
||||
5. 验证闸对照表全行绿,独立验收审计通过。
|
||||
|
||||
## 二、设计事实源
|
||||
|
||||
- `design/gdd/systems/战斗循环/敌人系统.md` v1.2(2026-10-26 文档设计闭合凭据,与待办清单条目实况所记一致):
|
||||
- §核心规则「触发条件:情境技与闩型解锁共用一套门槛」——机制(门槛过滤/求值时点/字段四键/闩语义/事实词表六词/算子六词与百分比阈值式求值/互作用表/半血解锁收编/首批落地);
|
||||
- §技能行字段词汇表 trigger 行(字段域);§池构成纪律(每池至少一行无条件特殊技);§调参表技能表 trigger 行(投值归难度曲线与Boss);§验收标准触发条件条。
|
||||
- 数值投值(权重/阈值终值)所有权:`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.0「技能池投值」节——本批只投 provisional 示范值。
|
||||
|
||||
## 三、现状事实(开工自行复核)
|
||||
|
||||
| # | 事实 | 位置 |
|
||||
|---|---|---|
|
||||
| 1 | 实例池快照:skill_id/weight/cooldown_left 三键+unlock_hp_pct 快照与 unlocked 闩标记 | game/core/unit_container.gd:84-96 |
|
||||
| 2 | 锁定判定 `_entry_locked`(unlock_hp_pct 且未过闩=锁定) | game/core/unit_container.gd:137-138 |
|
||||
| 3 | 可摇集合 `rollable_skills`(排除锁定+冷却中) | game/core/unit_container.gd:143-153 |
|
||||
| 4 | 保底特殊技集合 `special_skills`(排除锁定;type≠basic) | game/core/unit_container.gd:158-169 |
|
||||
| 5 | 半血解锁闩检查 `check_skill_unlocks`:threshold=round(max_hp×pct/100),hp≤threshold 过门、单向闩、返回新解锁 skill_id 列表 | game/core/unit_container.gd:172-186 |
|
||||
| 6 | 开轮摇号 `_roll_round_actions`:保底判定→roll→behavior_roll 统一流逐敌摇定→tick_cooldowns | game/core/battle_orchestrator.gd:952-991 |
|
||||
| 7 | 解锁归因明细行(skill_unlock 高光键)+enemy_hp_threshold 事件发射+target_attack_bonus 施加(pct 从池条目读) | game/core/battle_orchestrator.gd:962-983 |
|
||||
| 8 | round_index 编排器自有(1 基,开战置 1,轮末递增) | game/core/battle_orchestrator.gd:44,435,1083 |
|
||||
| 9 | 上轮结束方式记录 `_last_round_end={path_tag, continuation_hint}`,path_tag∈{cleared,stopped,ap_exhausted};`last_round_end` 只读属性已有 | game/core/action_economy.gd:32-34,274 |
|
||||
| 10 | 技能表 schema:行字段校验+pity_threshold;无池视野(池构成纪律在跨表通道) | game/data/schemas/skill_table.gd:3,19-97 |
|
||||
| 11 | 敌人表 schema:池条目 weight 校验+unlock_hp_pct 域校验 [1,99] | game/data/schemas/enemy_table.gd:108-116 |
|
||||
| 12 | 跨表池构成纪律校验(每池恰一普攻/增益≤1/妨害≤1/skill_id 悬空) | game/core/config_db_cross_validator.gd:117-156 |
|
||||
| 13 | 现行 8 处 unlock_hp_pct:50 池条目:quake_smash(:148,:176)/venom_curb(:416,:447)/rockslide(:659,:687,:715,:743) | game/data/tables/enemy.tres |
|
||||
| 14 | 三解锁技技能行(quake_smash ×2.5/CD4 · venom_curb ×2.0/CD3 · rockslide ×2.5/CD4) | game/data/tables/skills.tres:67,73,79 |
|
||||
| 15 | 地精池现状:attack w9+lunge w1(无增益行——加增益技不违 ≤1);钩爪恐魔池现状:attack w6+bite w2+charge w1(charge 是增益——加伤害技合规) | game/data/tables/enemy.tres:19-25,490-501 |
|
||||
| 16 | blast 分支统一受理点——**不只过雷**:负向 enemy_alert(雷,reward.tres:90)与正向 spark_aoe(:28)、清图奖励 clear_blast(:110)同走此分支;mines 计数埋点必须加「负向 blast(雷)」守卫,否则正向爆裂格误计入踩雷数 | game/core/battle_orchestrator.gd:861+game/data/tables/reward.tres:28,90,110 |
|
||||
| 17 | 既有测试锚:skill_unlock_test.gd(门谓词/闩不可逆/双面过滤/保底不逼/零扰动/确定性,期望值由表读值推导);round_flow_skill_pool_test.gd V4 池构成纪律复查 | game/tests/unit/battle_settlement/ |
|
||||
| 18 | 单测 manifest 显式注册制(新单测须登记行) | game/tests/run_all.gd:40-49 |
|
||||
| 19 | 减伤状态行先例:fortify(target_side enemy / magnitude −50 / percent / duration 2 / refresh / max_stack 1) | game/data/tables/status_effects.tres:71-79 |
|
||||
| 20 | 编排器经 action_economy 只读属性取上轮读数先例(ap_exhausted_last) | game/core/battle_orchestrator.gd:104 |
|
||||
|
||||
## 四、设计契约(🔴=违反即 L3 停机呈报)
|
||||
|
||||
1. 🔴 **门槛过滤唯一语义**:trigger 只作可摇集合排除项(rollable 与 special 双面);禁权重改写、禁强制触发、禁保底逼出条件不满足的技。摇号公式(权重份额归一)与 `behavior_roll` 流消费序零漂移。
|
||||
2. 🔴 **三 Boss 迁移零变化**:迁移后同种子战斗事件序列(解锁时点/归因行文本/enemy_hp_threshold 载荷)与迁移前逐位一致(target_attack_bonus 施加值不经本批改动面,由 V4 载荷 pct 键+V5 对拍承载)。百分比事实求值=阈值式(v1.2):先把 value 折算为绝对阈值 `round(对应 max_hp × value/100)`、再与当前 hp 作算子比较——六算子都在该阈值上定义,lte 与原解锁式逐位同;禁改为百分比读数取整后比较(取整读数与零变化在非整除血量上互斥)。
|
||||
3. 🔴 **求值时点**=每轮开轮摇号前、读当时快照;逐敌事实各自求值、全局事实全场一份;本系统零随机纪律不变。
|
||||
4. 🔴 **缺省零扰动**:无 trigger 字段的技能行与无 trigger 池条目行为逐位不变;旧表(除三 Boss 迁移行与两示范行外)零改动。
|
||||
5. 🔴 **fail-fast**:fact/op 出域、value 越域、latch 非布尔、键白名单外的 trigger 键——加载期报错并止动;新池构成纪律违规(每池无条件特殊技行数=0)同。
|
||||
6. 🔴 **数值单点**:trigger 行值与示范投放值只落 `game/data/tables/*.tres`;禁代码内数值字面量(表读值推导断言先例=skill_unlock_test)。
|
||||
7. 🔴 **每池增益≤1 纪律不动**:desperate_guard 计入地精池增益预算(现状 0→1 合规);sneak_ambush 为伤害技不计入。
|
||||
8. **闩型保留解锁弹出规格**;非闩型(瞬态)条件技零弹出、零新增呈现(明细行具名即因果承载——敌人系统「意图线索」节)。
|
||||
9. latch=true:首次求值真后整场保持为真(治疗抬血不回锁);latch 缺省=false(每轮重求值)。
|
||||
|
||||
## 五、范围边界
|
||||
|
||||
**做**:trigger 字段全套(schema/校验/求值/过滤/闩);三 Boss unlock_hp_pct 迁移;两示范投放+一个新减伤状态行;四项事实面供给(round_index/last_round_end/mines_hit_last/mines_hit_total)+self_hp_pct/hero_hp_pct 容器内直读;跨表新纪律;测试面与验证集清单重生成。
|
||||
|
||||
**不做**(去向):
|
||||
- hero_hp_pct/round_index/mines_hit_* 四词的投放数据行——机制承载即可,首批无投放内容(后续内容批)。
|
||||
- 权重改写/强制触发形态——设计已淘汰(2026-10-26 设计段裁决记录)。
|
||||
- 呈现新增(toast/归因标注)——非闩型零弹出;玩家反馈「感知不到因果」时另立批。
|
||||
- 全局特殊间隔旋钮、个体化变体池——待办清单独立条目,本批不触。
|
||||
- 数值终值投值——难度曲线调参批;本批示范值全标 provisional。
|
||||
|
||||
## 六、关联文档同步面(实现批禁写 design/ 与根规则文件,全部列反哺点)
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/gdd/systems/战斗循环/敌人系统.md v1.2 | §P1 表「情境条件触发器」行标注「设计已闭合待实装」→ 实装后应改「已实装(日期)」;§半血解锁收编段「字段换代与行值迁移归实装批」句随迁移完成摘除 | 反哺点:iterN-反哺点清单,文档批落文 |
|
||||
| design/gdd/systems/战斗循环/战斗结算.md v1.0 | 开轮摇号排除句已含触发条件指针——查实装后无新陈述漂移则记「无需改」 | 反哺点清单记行(结论「无需改」亦成行) |
|
||||
| design/engineering/architecture/architecture.md | UnitContainer 新公开方法(check_trigger_unlocks/事实组包口径)若属 API Boundaries 登记面 | 反哺点:架构登记行,文档批落文 |
|
||||
| design/gdd/systems/冒险曲线域(难度曲线与Boss.md v1.0) | 触发条件行值随实装登记读表口径——正文已写机制指针,无陈述变更 | 无需改(查无漂移则记「无」) |
|
||||
| 待办清单.md | 条目「技能池情境条件触发器」实现完成后的退役 | 收尾段义务(batch-closure),非实现批面 |
|
||||
| 体验验证清单.md | 停手被偷袭/低血防御的实机目检观测项入册 | 反哺点:入册观测项一条,文档批落文 |
|
||||
| game/tests/验证集清单.md | 新增断言全体入册 | 随批重生成(tools/extract_checks.py,机械产物) |
|
||||
|
||||
## 七、落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面判定 | 唯一面与分层 |
|
||||
|---|---|---|
|
||||
| 求值器(UnitContainer 内) | 不复用 effect_engine 的 FACTS/OPS:那边求值面=事件现场 payload,本面=开轮快照,语义不同;**复用的是校验范式**(封闭枚举 const+validate 出域 errs+键白名单——effect_words 同款) | 求值谓词归敌人系统语义层(unit_container,check_skill_unlocks 先例同构:谓词在容器、调用时点在编排器);词表常量落 skill_table.gd(表 schema 是字段域权威——敌人系统「调参表」) |
|
||||
| trigger schema 校验 | 复用 skill_table.validate() 既有 errs 模式(domain/enum/cross_field 类别) | 技能行字段校验在 SkillTable;池构成新纪律在 config_db_cross_validator.gd(池视野唯一处)——两处职责既有分界不动 |
|
||||
| mines 计数(本场累计+上轮值+当轮累计) | grep 全仓无现成战斗域踩雷计数(effect_engine fx_counters 是秘宝效果账,职责不同不复用);blast 受理点 :861 经**负向 blast(雷)守卫后**即每雷恰一次必经点 | battle 域编排事实,落 battle_orchestrator 私有状态(begin_battle 清零/负向 blast 受理累加/轮末转存 last——round_index 同款生命周期) |
|
||||
| round_index/last_round_end 事实 | 直接复用编排器 :44 与 action_economy.last_round_end :33(零新增状态) | facts 组包在编排器开轮摇号前一次成型(:104 ap_exhausted_last 组包先例同构) |
|
||||
| desperate_guard/sneak_ambush 技能行+defensive_stance 状态行 | 状态行复用 fortify 的消费路径(enemy_defense 池乘区——零新消费面);不复用 fortify 行本身(设计段裁「不复用硬化」) | 行落 tres 表本体;display_name 中文白话(「孤注守势」「趁隙偷袭」) |
|
||||
| trigger_cond_test.gd 新单测 | 复用 test_kit(Kit.check/finish)与 skill_unlock_test 的表读值推导范式 | 落 tests/unit/battle_settlement/,manifest 登记(run_all.gd 注册制) |
|
||||
|
||||
## 八、验证闸(改动—验收对照表)
|
||||
|
||||
尾缀〔触发器批 Vn〕;撤销证明=回退该 hunk→跑最窄套件→断言红→还原复绿。
|
||||
|
||||
| # | 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | trigger 立列+出域拒绝 | skill_table.gd 加 TRIGGER_FACTS/TRIGGER_OPS/TRIGGER_KEYS 常量+validate 校验段 | V1 正反六反例(fact 出域/op 出域/键白名单外/latch 非布尔/last_round_end 配非 eq·neq 算子/枚举事实 value 非法串均报错;合法行零 error)——trigger_cond_test.gd | 单元 | db.load_tables 真实加载含构造行夹具表 | 删校验段→V1 红 |
|
||||
| 2 | 门槛过滤双面 | unit_container rollable_skills/special_skills 增条件排除 | V2 断言:条件假时 rollable 与 special 均不含该技;条件真时含——trigger_cond_test.gd | 单元 | spawn 真实表→直调 rollable/special | 回退过滤→V2 红 |
|
||||
| 3 | 保底不逼条件不满足技 | _roll_round_actions 保底集合取 special_skills(已含排除) | V3 断言:合法构造池(无条件特殊技 A w1+条件假技 B w9999+普攻)basic_streak≥M 时,保底命中摇出的是 A——夹具经加载后内存改行(round_flow:637 白盒先例)注入;固定种子下确定性断言 | 接口 | special_skills 真实入口+SkillLottery.draw 真实摇号 | 回退 special 排除→选定经试跑验证使撤销态摇出 B 的固定种子(w9999 份额 99.99%,种子验证后钉死)→同种子必中 B→红 |
|
||||
| 4 | 闩型语义+归因保持 | check_skill_unlocks 改 check_trigger_unlocks(u, facts):self_hp_pct lte 闩型,返回新过闩列表 | V4 断言:过门恰一次、治疗抬血不回锁、enemy_hp_threshold 载荷三键(unit/pct/is_boss)保持——trigger_cond_test.gd+skill_unlock_test.gd 换代断言(迁移后跑原语义);阈值式判别由 V8 同数据两态承载(hp=3 触发/hp=4 不触发),本行不重复构造 | 单元+接口 | spawn 三 Boss 坐标真实表→直调→编排器事件断言(载荷观测带处刑台订阅夹具——adventure_feats_test 先例) | 回退闩标记→V4 红 |
|
||||
| 5 | 三 Boss 迁移零变化 | enemy.tres 删 8 处 unlock_hp_pct+skills.tres 三行加 trigger{self_hp_pct,lte,50,latch:true} | V5 同种子对拍:固定种子 Boss 战事件序列摘要(解锁时点/归因行文本/载荷)迁移前后逐位一致——trigger_cond_test.gd 存基线比对 | 集成 | begin_battle→逐轮 settle 真实战斗驱动 | 删 skills.tres 三行 trigger 键(表迁移半边)→check_trigger_unlocks 读不到条件→闩永不置→V4/V5 红 |
|
||||
| 6 | 事实面供给 | 编排器 facts 组包(round_index/last_round_end/mines_hit_last/mines_hit_total)+计数埋点(负向 blast 守卫累加/轮末转存/开战清零) | V6 断言:真实踩雷(负向 blast)递增、**正向 blast 格(spark_aoe)与清图奖励(clear_blast)不递增**、轮末转存、开战清零;facts 组包四键在位——trigger_cond_test.gd | 集成 | 真实 request_dig→settle 驱动踩雷与正向爆裂格 | 回退累加行→V6 红;漏守卫→反例断言红 |
|
||||
| 7 | 每池至少一行无条件特殊技 | config_db_cross_validator 加校验 | V7 正反:现行全表零违例;构造全条件池夹具→报 pool_composition 错——trigger_cond_test.gd | 接口 | 跨表校验真实入口 | 删校验段→V7 反例不红 |
|
||||
| 8 | 示范投放:低血防御 | skills.tres desperate_guard 行(buff/defensive_stance/duration 2)+status_effects.tres defensive_stance 行+地精两行池条目 w1+trigger{self_hp_pct,lte,35} | V8 断言:地精(hp 基线 8)按阈值式 T=round(8×35/100)=3——hp>3 时该技不入可摇集合、hp≤3 后入池可摇中——trigger_cond_test.gd | 集成 | spawn 地精行→压 hp→开轮摇号真实路径 | 删池条目→V8 红 |
|
||||
| 9 | 示范投放:停手偷袭 | skills.tres sneak_ambush 行(damage ×1.5/CD4)+钩爪恐魔三行池条目 w2+trigger{last_round_end,eq,"stopped"} | V9 断言:首轮(last=无)与 cleared/ap_exhausted 轮后该技不入集合;stopped 轮后入集合——trigger_cond_test.gd | 集成 | 真实 finish_round_stop→次轮摇号 | 删池条目→V9 红 |
|
||||
| 10 | 缺省零扰动 | trigger 全套对无字段行为零影响 | V10 断言:无 trigger 行的池快照逐键无新增(快照键策略钉死:无 trigger 行快照零新键)、摇号结果同种子不变——skill_unlock_test.gd 既有 _test_plain_rows_zero_drift 扩展 | 单元 | goblin 池真实快照 | 回归钉(防未来给普行塞键),撤销语义由 V2/V5 联合覆盖——如实申报,不单独配撤销 |
|
||||
|
||||
**测试方式两分法**:V1-V10 全部走调试接口直改数据面(构造夹具表/直改 hp/直发 finish_round_stop),归自动化;实机目检项=「上轮停手→下轮结算明细出现『趁隙偷袭』」「地精低血后摇出『孤注守势』」两项,登记实现报告实机目检总清单+体验验证清单反哺点,**登记不阻塞**。
|
||||
|
||||
**闸口径**:本批改动含 game/ 行为载体→按改动域跑 `tools/run_all_gates.sh` 对应域档全绿才合并;里程碑步(T 段)出口跑一次全套,波内修复只做出红最小单元最窄确认,新增测试先行孤立验证再并入。
|
||||
|
||||
**测试削弱申报**:①skill_unlock_test.gd 既有断言因 unlock_hp_pct 字段退役需改写读值来源(表读值路径从池条目改技能行 trigger)——断言语义全部保持,仅数据源换代;②round_flow_skill_pool_test.gd :604 expect_pools 逐行精确比对——地精两行与钩爪恐魔三行的期望值随 T3 投放改写(9/1→9/1/1、6/2/1→6/2/1/2),断言语义不变仍精确比对,消息串中「unlock_hp_pct 50」措辞随字段退役同步清理;③round_flow:654/:660 直调 rollable_skills(u) 原样保留(缺省参下单参调用合法,实现若取改仅限直调面补参);④round_flow V4 池纪律复查段随新纪律扩行(只增不删)。除此之外零删除断言。
|
||||
|
||||
**独立验收审计**:入口=没参与实现的子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;审计三查(对照表逐行/撤销证明抽查复现/削弱检查)未过禁合并。
|
||||
|
||||
## 九、任务卡
|
||||
|
||||
### 卡前·文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 | 验收行 |
|
||||
|---|---|---|---|
|
||||
| game/data/schemas/skill_table.gd(改) | trigger 词表常量+行校验 | 行为改动 | V1 |
|
||||
| game/core/config_db_cross_validator.gd(改) | 每池至少一行无条件特殊技 | 行为改动 | V7 |
|
||||
| game/core/unit_container.gd(改) | 快照 trigger/闩标记、双面过滤、check_trigger_unlocks 求值 | 行为改动 | V2/V4/V10 |
|
||||
| game/core/battle_orchestrator.gd(改) | facts 组包、mines 计数埋点、解锁调用迁移 | 行为改动 | V4/V5/V6 |
|
||||
| game/data/tables/skills.tres(改) | 三 Boss 行加 trigger+两新技能行 | 行为改动 | V5/V8/V9 |
|
||||
| game/data/tables/enemy.tres(改) | 删 8 处 unlock_hp_pct+五处示范池条目 | 行为改动 | V5/V8/V9 |
|
||||
| game/data/tables/status_effects.tres(改) | defensive_stance 新行 | 行为改动 | V8 |
|
||||
| game/tests/unit/battle_settlement/trigger_cond_test.gd(新增) | V1-V10 主体 | 新增测试 | 全行 |
|
||||
| game/tests/unit/battle_settlement/skill_unlock_test.gd(改) | T1 段随改名/签名/读值源换代(语义零变化)+零扰动扩展 | 测试维护 | V4/V10 |
|
||||
| game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd(改) | V4 池纪律复查扩行+expect_pools 期望值随投放改写+直调面 facts 适配 | 测试维护(含申报②③) | V7 |
|
||||
| game/tests/run_all.gd(改) | manifest 登记新套件 | 非行为改动(注册表) | — |
|
||||
|
||||
### T0 · 基线录制与表/ schema 迁移(≈0.4d)
|
||||
|
||||
取用:无(首卡)。
|
||||
产出:`TRIGGER_FACTS := ["self_hp_pct","hero_hp_pct","round_index","last_round_end","mines_hit_last","mines_hit_total"]`、`TRIGGER_OPS := ["eq","neq","gt","gte","lt","lte"]`、`TRIGGER_KEYS := ["fact","op","value","latch"]` 三常量(skill_table.gd);skills.tres 三 Boss 行 trigger 落位;enemy.tres 8 处键删除;V5 基线文件。
|
||||
|
||||
- [ ] 步骤 1(基线录制):迁移前用固定种子驱动三 Boss 各一场真实战斗(begin_battle→循环 settle 至战斗结束),把事件序列中 skill_unlock 归因行文本、enemy_hp_threshold 载荷、每轮各敌 pending_skill 序列摘要落 `game/tests/evidence/trigger_baseline.md`(批内凭据,非长期基线)——这是 V5 的「改前」半边。
|
||||
- [ ] 步骤 2(schema 校验段):skill_table.validate() 加 trigger 校验——四键白名单、fact∈TRIGGER_FACTS、op∈TRIGGER_OPS、**last_round_end 行 op 只许 eq/neq(枚举算子限域)、value 类型随 fact(数值事实必整数、百分比事实域 [1,99]、枚举事实必枚举串 {none,cleared,stopped,ap_exhausted})**、latch 必须 bool;普攻行禁配 trigger(普攻恒可摇的结构前提,与倍率/冷却禁配同款 cross_field)。V1 正反断言随本步骤落地(trigger_cond_test.gd 于本卡立件——V1 是本批首组断言,含算子限域与类型分派反例,先行孤立验证后并入 manifest)。
|
||||
- [ ] 步骤 3(表迁移):skills.tres quake_smash/venom_curb/rockslide 三行加 `"trigger": {"fact":"self_hp_pct","op":"lte","value":50,"latch":true}`;enemy.tres 删 8 处 `"unlock_hp_pct": 50` 行;enemy_table.gd:111-116 unlock_hp_pct 域校验段删除(字段退役);**enemy.tres:780 池注与 skills.tres:134-135 头注提及 unlock_hp_pct/解锁语义的措辞随字段退役同步清理**(J 面:注释不残留退役字段名)。
|
||||
- [ ] 步骤 4(加载验证):`python tools/run_smoke.py` 绿(表加载零 error——若红,红点即迁移漏项)。
|
||||
|
||||
### T1 · 求值器与实例池快照(≈0.7d)
|
||||
|
||||
取用:T0 的 TRIGGER_* 常量与已迁移表。
|
||||
产出:`UnitContainer.check_trigger_unlocks(u: Dictionary, facts: Dictionary) -> Array`(闩型条目求值,返回新过闩 skill_id 列表)、快照键 `trigger_latched: bool`(迁移原 unlocked);`rollable_skills(u, facts := {}) / special_skills(u, facts := {})` 增可选参(**缺省空字典——既有单参调用零破坏,skill_unlock_test/round_flow 直调面在 T2 前不红**)。
|
||||
|
||||
- [ ] 步骤 1(快照扩展):池快照循环节(unit_container.gd:85-96)——从 db.skill_row 读 trigger 存快照(技能行是字段权威);带 latch=true 行写 `trigger_latched:false` 初始;unlock_hp_pct/unlocked 双键退役。**百分比事实求值契约(v1.2 阈值式)在此钉死:六算子统一为「先折算绝对阈值 T=round(对应 max_hp × value/100),再以 hp op T 比较」——self_hp_pct/hero_hp_pct 两 fact 同式。**
|
||||
- [ ] 步骤 2(求值谓词):`_entry_blocked(e: Dictionary, u: Dictionary, facts: Dictionary) -> bool`——无 trigger 恒 false;latch 已闩恒 false(过闩即不再拦);否则按 fact 分派求值(self 类读 u 自身、hero 类读主角行、其余读 facts 键,枚举事实按字符串比较);**facts 缺键=条件假(拦)——fail-safe,缺省 {} 调用遇上非 self/hero 事实时不放行**;`_entry_locked` 退役由本谓词收编。
|
||||
- [ ] 步骤 3(双面过滤):rollable_skills/special_skills 接入 `_entry_blocked`(与冷却排除并列;facts 缺省 {} 对无 trigger 行为零差)。
|
||||
- [ ] 步骤 4(闩检查换代):check_skill_unlocks 改名 check_trigger_unlocks(u, facts)——只处理 latch=true 且未闩条目,求值真即置 trigger_latched 并收集返回;**本方法只读 facts 原值,last_round_end 的 none 映射不在本层(唯一落点=T2 facts 组包)**。同步改 skill_unlock_test.gd 全部直调面(改名+facts 签名)与读值源(unlock_hp_pct 池键→技能行 trigger.value),断言语义零变化——**本卡出口全套必须绿**(签名缺省值保证 round_flow:654/:660 单参调用不破)。
|
||||
- [ ] 步骤 5(V2/V4 并入):trigger_cond_test.gd 承接 T0 立件——V2 双面过滤、V4 闩语义(过门恰一次/抬血不回锁/阈值式判别例 max_hp=8/value=35:hp=3 触发 hp=4 不触发)断言落地,直跑本套件绿。
|
||||
|
||||
### T2 · 编排器接线与事实面供给(≈0.8d)
|
||||
|
||||
取用:T1 的 check_trigger_unlocks 与 facts 签名。
|
||||
产出:`_roll_round_actions` 内 facts 组包(`{round_index, last_round_end, mines_hit_last, mines_hit_total}`);编排器私有 `_mines_hit_total/_mines_hit_last/_mines_hit_round: int`(定名与步骤 1 一致);解锁调用点迁移完成。
|
||||
|
||||
- [ ] 步骤 1(计数埋点):battle_orchestrator 加三变量——`_mines_hit_total`(本场累计)/`_mines_hit_last`(上轮值)/`_mines_hit_round`(当轮累计);三条公式:负向 blast(雷)受理时 `_mines_hit_round` 与 `_mines_hit_total` 各 +1(**守卫:只计负向 blast 行——正向 spark_aoe 与清图奖励 clear_blast 同走 blast 分支不得计入,reward.tres 极性判读**);轮次真正结束后 `_mines_hit_last=_mines_hit_round`、`_mines_hit_round=0`(轮内部分结算不更新);begin_battle 三者清零。
|
||||
- [ ] 步骤 2(facts 组包):_roll_round_actions 开头组包 facts 字典(round_index 直读、last_round_end 经 action_economy.last_round_end——**空字典(首轮)映射 "none",否则 path_tag 原值;none 映射唯一落点在本组包处**、双 mines 键);hero 事实不进 facts(容器内直读主角行——T1 已定)。
|
||||
- [ ] 步骤 3(解锁调用迁移)::965 check_skill_unlocks(u) 改 check_trigger_unlocks(u, facts);:972-975 pct_v 读值源从池条目 unlock_hp_pct 改技能行 trigger.value;归因行文本/enemy_hp_threshold 载荷格式零改动。
|
||||
- [ ] 步骤 4(摇号接线)::984/:986 rollable_skills(u)/special_skills(u) 调用补 facts 实参。
|
||||
- [ ] 步骤 5(V5/V6 落地):V5 同种子对拍断言(与 T0 步骤 1 基线逐位比对——解锁时点/归因文本/载荷/pending 序列);V6 计数埋点断言(真实 request_dig 踩雷→settle→读数递增/转存/清零)。直跑本套件绿。
|
||||
|
||||
### T3 · 跨表纪律与示范投放(≈0.4d)
|
||||
|
||||
取用:T0-T2 全套机制。
|
||||
产出:config_db_cross_validator 新校验;desperate_guard/sneak_ambush/defensive_stance 三新行与五处池条目。
|
||||
|
||||
- [ ] 步骤 1(新纪律):config_db_cross_validator.gd 池构成段加「无条件特殊技行数 ≥1」校验(普攻不计;trigger 缺省行计数)——V7 正反断言(现行全表零违例+构造全条件池夹具报错)。
|
||||
- [ ] 步骤 2(状态行):status_effects.tres 加 defensive_stance 行(display_name「护身」/target_side enemy/magnitude −25 provisional/percent/duration_settlements 2/refresh/max_stack 1——fortify 同构消费路径)。
|
||||
- [ ] 步骤 3(技能行+池条目):skills.tres 加 desperate_guard(buff/「孤注守势」/buff_ref defensive_stance/duration 2/trigger{self_hp_pct,lte,35})与 sneak_ambush(damage/「趁隙偷袭」/damage_mult 1.5/cooldown 4/trigger{last_round_end,eq,"stopped"}——两行全部 provisional);enemy.tres 地精两行池加 desperate_guard w1、钩爪恐魔三行池加 sneak_ambush w2。
|
||||
- [ ] 步骤 4(V8/V9 落地):低血防御两态断言(hp 高于阈值不入集合/打低后入)、停手偷袭三态断言(首轮无/stopped 后有/cleared 后无)——真实 finish_round_stop 驱动。直跑本套件绿。
|
||||
|
||||
### T4 · 测试收口与产出物落位(≈0.7d)
|
||||
|
||||
取用:T0-T3 全部断言。
|
||||
产出:验证集清单重生成;实现报告/代拍板追认单/反哺点清单三件。
|
||||
|
||||
- [ ] 步骤 1(换代收尾):round_flow_skill_pool_test.gd V4 段扩「无条件特殊技 ≥1」行+expect_pools 期望值改写(申报②③);skill_unlock_test.gd 复核 T1 段换代后全套绿。
|
||||
- [ ] 步骤 2(清单):`python tools/extract_checks.py` 重生成 game/tests/验证集清单.md,diff 核对新增断言全数入册、零意外删改。
|
||||
- [ ] 步骤 3(撤销证明记录):按对照表逐行执行回退→红→还原→复绿,记录落实现报告(V5/V8/V9 三条必含)。
|
||||
- [ ] 步骤 4(全套闸):run_all_gates.sh 本批域档全绿。**MC 口径:本批含 provisional 池权重投放=数值改动——出口闸锚内子集(地精/钩爪恐魔行为面)同种子复放预期判红,按锚流程呈报用户、重锚归用户档位发起,实现批不自行重锚。**
|
||||
- [ ] 步骤 5(三产出物):实现报告(各卡状态+实机目检总清单两项+遗留读数义务)/代拍板追认单(见白名单)/反哺点清单(§六同步面各行逐条落点)。
|
||||
|
||||
## 十、异常分级
|
||||
|
||||
- **L1 自救**:测试夹具构造错误、断言消息措辞、注释与命名微调、tres 格式缩进。
|
||||
- **L2 记录继续**:示范 provisional 数值在同数量级内调整(记代拍板追认单);既有断言因读值源换代的等价改写(已申报范围)。
|
||||
- **L3 停机呈报**:契约任一条触红(尤其 V5 对拍不一致=迁移引入行为漂移);V5 基线无法录制;MC 对拍锚判红;schema 校验与文档词表冲突;行为_roll 消费序漂移嫌疑。
|
||||
|
||||
## 十一、代拍板白名单
|
||||
|
||||
1. 新技/状态行英文 id 与中文 display_name 定名(desperate_guard/sneak_ambush/defensive_stance 为推荐案)。
|
||||
2. 示范 provisional 数值(w1/w2、lte 35、−25、×1.5、CD4、duration 2)同数量级内取值。
|
||||
3. trigger_cond_test.gd 内部断言组织与夹具表构造方式。
|
||||
4. V5 基线摘要的哈希/序列化具体格式。
|
||||
5. 注释与措辞(符合 code-conventions §1.4.1 黑名单)。
|
||||
|
||||
## 十二、待裁点
|
||||
|
||||
零待裁点——机制/词表/收编/纪律/投放位全部经 2026-10-26 文档设计段裁定(敌人系统.md v1.0),本卡为其实现展开。开工门=U0 用户发令。
|
||||
|
||||
## 十三、禁为机检文本保留无效成员
|
||||
|
||||
本卡属机制新增批(兼含 unlock_hp_pct 退役迁移):unlock_hp_pct/unlocked/_entry_locked 等旧成员随迁移**删净**,禁为兼容既有测试文本保留别名或死键;机检/测试期望值与新契约冲突时停卡呈报(V5 对拍基线除外——它锚的就是旧行为的退役前快照,属本卡申报面)。
|
||||
Reference in new issue
Block a user