62 lines
5.4 KiB
Markdown
62 lines
5.4 KiB
Markdown
# Bug Report
|
||
|
||
## Summary
|
||
**Title**: 浅深度战斗零敌人(d0/d1 遭遇 unit_count=0、round 1 即 victory)——遭遇骰/spawn 路径疑似掷出 0
|
||
**ID**: BUG-0002
|
||
**Severity**: S3-Minor(复核降级——原报 Medium;当前构建不可复现,遥测签名另有解释)
|
||
**Priority**: P3-Backlog(不变式回归已落地,无遗留行动)
|
||
**Status**: Closed
|
||
**Reported**: 2026-09-12(playtest-2026-09-12-designer 报告 Bugs 表 #1)
|
||
**Reporter**: 用户(设计师本人,试玩遥测);本档由 2026-09-13 会话按报告 Action Routing 建档并复核
|
||
|
||
## Classification
|
||
- **Category**: Gameplay(遭遇生成)/ 遥测可观测性
|
||
- **System**: B1 遭遇骰(C3 Core Rule 8 区间骰)× B2.spawn × settlement_snapshot 观测面
|
||
- **Frequency**: 原报两次真人局均现(d0 100%、20:13 另含 d1);当前构建复现 0/100 场
|
||
- **Regression**: No——遭遇骰批(2026-09-12)后无相关代码路径可产出 0
|
||
|
||
## Environment
|
||
- **Build**: 原报 = 垂直切片 · 2026-09-12 五区改造批;复核 = 2026-09-13 当前工作区(status_effects.tres defense_up=-30 批)
|
||
- **Platform**: PC · Win10 · Godot 4.7.2 · seed 42 固定
|
||
- **Scene/Level**: 第一关 d0/d1 战斗节点
|
||
- **Game State**: 战斗第 1 轮结算即 victory,快照 unit_count=0
|
||
|
||
## Reproduction Steps
|
||
**Preconditions**: 原报基于 playtest_42_20260912T201317.jsonl 遥测(快照面)。
|
||
|
||
1. seed 42 开局,进入 d0 战斗
|
||
2. 首轮挖满 8 AP 后结算
|
||
3. 快照显示 verdict=victory、unit_count=0(原报判为「零敌人空场」)
|
||
|
||
**Expected Result**: C3 Rule 8 区间 [unit_count, unit_count_max] 下限 1——不应出现 0 敌战斗。
|
||
**Actual Result(复核)**: **遥测误读——实为「首轮全灭」而非「空场」**。快照取在衰减段之后的结算末尾,`unit_count` 只计存活敌:英雄首轮爆发(基础攻击 + 伤害A 开格充能 + 爆裂粉尘 instant_aoe 全体)可在 round 1 全歼浅深度低 HP 敌群,快照同样呈现 unit_count=0 + round-1 victory。
|
||
|
||
## Technical Context
|
||
- **Likely affected files**: `core/battle_orchestrator.gd`(begin_battle 遭遇骰 / _emit_settlement_snapshot)、`core/unit_container.gd`(spawn 数量守卫)
|
||
- **Related systems**: C3 Core Rule 8(区间骰)、playtest_logger(JSONL 快照消费)
|
||
- **Possible root cause(复核结论)**: 非遭遇骰缺陷。当前实现掷骰 = `roll_lo + estream.randi_range(0, roll_hi - roll_lo)`,数学下限 = `unit_count` ≥ 1;B2.spawn 对 count<1 fail-fast 拒绝(双闸)。**seed 42 当前构建全关回放(damage_probe level 模式)复现同款遥测签名**:d0 spawn=1、d1 spawn=3,全部「round-1 胜利 = 首轮全灭(wipe)」——与 20:41 辅助局 d1 快照(3 只地精各剩 1 HP = 主角攻击斩首只 + 3 颗爆裂粉尘 ×4 AOE)逐点吻合。
|
||
|
||
## Evidence
|
||
- **探针**:`smoke/damage_probe.gd -- level 42`——d0 spawn=1(预测 1 ✓)首轮全灭 · d1 spawn=3(预测 3 ✓)首轮全灭 · 20 种子 × 5 深度 = 100 场 spawn 全域内、0 场空遭遇
|
||
- **遥测取证**:playtest_42_20260912T204636.jsonl d1 r1——unit_count=2 存活(3 只中 2 只各剩 1 HP)+ hero 承伤 −8,证明同种子 d1 在另一局正常刷出敌群(差异 = 真人挖掘路径不同的奖励抽取,非 RNG 流分歧)
|
||
- **回归断言**:smoke_all `_smoke_encounter_roll` 增「全深度 × 12 种子 spawn 全域内(60 场,∈[unit_count, unit_count_max] 且 ≥1)——空遭遇不可达」;settlement_snapshot 新增 `spawn_count` 字段 + `_smoke_playtest_logger` 字段/等值断言——unit_count=0 时可判别「首轮全灭」vs「空场」,同类误读不再依赖人肉推断
|
||
- **修复后验证**:冒烟 148/148 全绿
|
||
|
||
## Related Issues
|
||
- playtest-2026-09-12-designer 报告 Bugs 表 #1 / Top 3 Priorities #1(探针前置)
|
||
- BUG-0003(Boss 攻击零兑现——同一份遥测的姊妹误读,共用根因探针)
|
||
- BUG-0001(呈现层软锁——编号顺延基点,无关联)
|
||
|
||
## Notes
|
||
- 「单位数量 0」类观察的判别义务已机制化:任何后续 JSONL 快照携带 `spawn_count`(实例化总数,含死亡残位),`unit_count < spawn_count` = 有击杀,`spawn_count=0` 才是空场。
|
||
- 原报的怀疑对象(遭遇骰路径)经代码审读 + 100 场扫描证伪;真实可玩性议题「浅深度战斗可被首轮爆发无伤跳过(d0-d3 全部 round-1 通关)」属难度带问题,归 C3 F4/F5 复扫(BUG-0003 关联条目与本会话 Q1 基线数据),不在本缺陷档处置。
|
||
|
||
## Closure Record
|
||
**Closed**: 2026-09-13
|
||
**Resolution**: Rejected as coded——零敌遭遇在当前实现不可达(数学下限 + fail-fast 双闸 + 100 场扫描零越域);原观察为「首轮全灭」被快照盲区误读。沉淀 = settlement_snapshot.spawn_count 观测面 + 全域 spawn 回归断言(无游戏数值变更)。
|
||
**Fix commit / PR**: 不适用(非 git 管理;变更 = core/battle_orchestrator.gd 快照字段 + smoke/smoke_all.gd 回归断言 + smoke/damage_probe.gd 探针)
|
||
**Verified by**: 2026-09-13 会话(damage_probe level 模式 + smoke_all 148/148)
|
||
**Closed by**: 用户授权任务(playtest-2026-09-12 报告 Top3 执行会话)
|
||
**Regression test**: `smoke/smoke_all.gd` `_smoke_encounter_roll`(全域扫描)+ `_smoke_playtest_logger`(spawn_count 字段与等值);`smoke/damage_probe.gd -- level`(可复演证据面)
|
||
**Status**: Closed
|