60 KiB
Dungeon Sweeper · 垂直切片(v2:第一关完整关卡)
// VERTICAL SLICE - NOT FOR PRODUCTION // Validation Question(v2,2026-09-11):线性第一关(战×2→道具→战×2→恢复→Boss)能否承载 // "数值提升→通关期望改善"的 Roguelike 元进度验证——基线属性应该难到打不过、天赋数值提升把 // 通关期望拉回可玩带,且这条曲线能用数值调整板 + 批量模拟测量出来 // (通关攻击期望 / 败北血量数学期望);v1 的单战斗循环问题(逐行归因 P2 / Core headless 可跑) // 已于 2026-09-10 验证并保持回归(smoke_all 前 46 项)。 // Date: 2026-09-10(v1)· 2026-09-11(v2 关卡扩展)· 引擎 Godot 4.7.2 · 本目录仅作设计验证参考,禁止 import 进生产代码
运行
- 用 Godot 4.7.2 打开本目录(含
project.godot的文件夹) - 按 F5 运行(主场景
presentation/main.tscn) - 主入口:
▶ 第一关 · 苔藓回廊——线性节点链:战→战→赏(随机主动道具)→战→战→疗(血量恢复点)→王(Boss 遗迹守卫) 测试用 · 角色数值调整板:攻击/生命百分比加成(模拟天赋树解锁)+ 批量模拟(输出通关率/承伤期望/败北节点分布)
headless 冒烟(55 项断言,含关卡线性推进/满配通关/裸装败北/回放确定性,约 30 秒):
Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/smoke_all.gd
场景级 UI 探针(项目运行模式实例化 main.tscn 驱动第一关,断言棋盘真实渲染——D1 教训"呈现层零测试承载"的原型兑现):
Godot_v4.7.2-stable_win64_console.exe --headless --path . res://smoke/ui_probe.tscn
数值调整板场景探针(缺陷⑤回归:打开可见性/滑条联动/应用写表/重置/批量模拟全链路):
Godot_v4.7.2-stable_win64_console.exe --headless --path . res://smoke/ui_tune_probe.tscn
关卡期望扫描(C3 调参期关卡侧批量工具原型——atk%×hp% 网格,每格输出通关率/承伤期望/败北节点):
Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/level_monte_carlo.gd -- [N] [seed0]
可选类供给跨种子扫描(playtest-2026-09-12 Top1 复核——每局治疗包/小刀/精工短刀获取数、构成占比对 9:1 配比、"≥3 治疗包"局数分布;单种子坏抽与系统性偏置由此分割):
Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/supply_scan.gd -- [N] [seed0]
日志合规(2026-09-12 用户要求):任何模拟运行与真人试玩均落全量 JSONL(user://logs/)——逐操作(op/cell/accepted/round)、逐结算明细行、轮次状态快照、battle_end、level_end。模拟(level_monte_carlo / 调整板批量模拟 / supply_scan)一文件多局,run 行携带种子/档位切分局次。
单关诊断:--script res://smoke/level_debug.gd -- [seed] [atk%] [hp%]。
战斗级工具(v1 遗产):dump_battle.gd(结算流水)/ monte_carlo.gd(战斗期望)/ experiment_density.gd(密度调参)。
范围(v1 范围 + v2 追加,用户 2026-09-10/11 确认)
- v1 在范围内:D2(10 表 + ConfigDB + RngService)· A1(single_subset 求解器 + 双判据验收)· A2 · A3(AP8/RAP)· A4(迷雾,L2)· B1(七段结算 + 13 类行协议 + 高光双落)· B2(grub/ambusher/伏击池 cap4)· B3(四行状态容器)· B4(install 预分配/F5 保底/道具窗口)· D1-lite 程序化呈现
- v2 追加:LevelTable(线性节点链数据表)· C1-lite 关卡推进器
level_runner.gd(原 c1_level_runner,2026-09-11 领域命名批更名)(关卡域生命周期:共享 B4 关内延续 + HP 跨战斗携带 + 奖励/恢复节点兑付 + 关卡末清库)· Boss 遭遇行(Dmax=4)· 节点奖励 API(B4grant_node_active)· 测试用角色数值调整板(atk%/hp% 覆盖 + 批量模拟,模拟天赋树——正式侧归 C4) - 裁剪不变:A5 / C1 路径分支选择(用户拍板线性)· C2–C4 / B5 战斗动画 / D3–D6 / A1 黄金向量与 F4 批量工具 / gdUnit / 标错惩罚(A2 OQ1)
2026-09-11 可选类供给控制器(用户拍板批——修改记录)
背景:供给控制器批前实测每关可选类 ≈24.8 件(≈18.5 把刀,刀总伤 ≈180 > Boss 130 HP)——"道具获取期望太高"定量坐实。用户重新定义三尺度指标并拍板实现:
| 尺度 | 指标 | 实现机制 |
|---|---|---|
| 安全格 | 期望极小(全图摊平 < 0.01/格) | 可选类退出格子权重池——格子池只剩即时类四行 |
| 雷图 | ≈0.78/板 | 战斗首件保证 ÷ 每战板数(≈1.28)折算 |
| 战斗 | 期望 ≈1,首件保证:获取首件前每张新板必注入 1 件;之后按 p0×decay^(j-1) 指数递减(永不绝育) | RewardSupplyController(B4 私有组合件,战斗域计数) |
拍板四条 → 落点:① 注入占比 小刀 60% / 精工短刀 30% / 治疗包 10%(治疗资源宝贵)→ reward.tres active_inject 池;② 清图奖励改一次性高额伤害(clear_knife 入库刀 → clear_blast instant_aoe 40,当场兑付全体存活敌,不入库、不占可选类供给——清图与供给脱钩);③ 注入选格均匀随机(雾格不加权);④ 指数递减(active_p0=0.4 / active_decay=0.5 → 0.4/0.2/0.1/0.05…,RewardConfigTable 新参数,provisional 归 C3 标定)。
实现结构(对象封装——伪代码审阅后落地):
core/reward_supply_controller.gd(新):notify_battle_start()(计数清零)/should_inject(stream)(j==0 恒真;否则randf < p0×decay^(j-1),取号经传入封闭流)/notify_granted()/granted_count()。行值快照抗热重载;零自有随机数。B4RewardEconomy(改造):_supply组合件 ·notify_battle_start()(B1.begin_battle 转发)·roll_board重写(身份批即时类单遍 → 清图槽 → 注入判定/选格;旧 F5 草稿重 roll 循环删除)·grant()挂钩notify_granted()(发放即获取——预分配未挖到不计数;去重幂等天然防双计)·supply_granted_count()观测面。B1BattleOrchestrator:begin_battle 门序列增b4.notify_battle_start()(编排唯一性不变)。- 表/护栏:RewardTable
POOL_TAGS+active_inject;RewardConfigTable +active_p0/active_decay、k_dmg 1→0(F5 休眠);ConfigDB 跨表护栏更新(clear_no_value 含即时类 / no_damage_row 扫描全池活行 / 新增 inject_pool 护栏:非可选类拒绝 + 空池致命)。
实测(N=200 板/深度,工具 reward_expectation.gd):注入 1.00 件/板(j=0,多件板 0)· 占比 小刀 59–65% / 精工 25–29% / 治疗包 7–17%(名义 60/30/10)· 格池零可选类泄漏 ✓。实际获取期望(level_monte_carlo「可选类/战」列,N=15):基线 0.88 → +200% 攻击 0.68 件/战(低于分配保证 1.0 的机理 = 注入格均匀随机,落在残余格/速杀未挖区时该件不获取;战斗末无兜底补发——是否加"战斗末 j==0 补发 1 件"待用户拍板)。每关合计 ≈ 4.5–6.5 件(原 24.8)✓ 拍板目标达成。
⚠️ 供给侧副作用(本轮扫描发现,待拍板):可选类退出格子池后,其 25% 概率质量被动流向即时类——攻防 buff 每格频率从 44% 升至 59%,基线通关率 55%→80%(N=15)、整关承伤 127→80:难度不降反升方向反了。即时类是"每格必有货"锁定设计下无法清空的(除非引入空白格 = 违反锁定事实)。候选杠杆:① 接受更快的 buff 节奏,敌 HP 曲线上调对冲(C3 主杠杆)② 下调 attack_up/defense_up 在即时池内的相对权重(压 buff 频率)③ buff 幅度下调(触碰 B3 表值)。
正式侧义务:B4 GDD「install 期 roll / F5」章节修订(F5 → 战斗首件保证语义)+ registry reward_table/reward_config 条目改写 + RewardConfigTable knob 登记(active_p0/active_decay)——接口漂移批随实现落位。
2026-09-12 轮内刷新(方案 A,用户拍板批——修改记录)
背景:用户发现刷新实现(仅 Waiting 结算窗口受理)与设计预期不符——预期为扫雷阶段遇到推理死路时,有剩余 AP 且 RAP 足够即可当场刷新继续挖。影响分析(三方案对比 + 16 代码触点 + 8 文档 + 5 数值连锁)后用户拍板方案 A。
拍板语义:① Active 相位可刷(RAP ≥ 8 且本轮未达上限)→ 当场 retire+install 换新图,轮次继续:AP 保留不重置、相位不动、不触发结算(敌方时间税语义变更——GDD 修订义务);② Waiting 相位刷新保持现状(登记意图,exit_distribution 换图);③ 每轮兜底上限 2 次(Active/Waiting 合计,ActionEconomyTable.refresh_max_per_round = 2 表值);④ RAP 来源不变(停手 1:1 转存)。
实现落点:A3 request_refresh_active()(仅扣 RAP,相位/AP 不动)· A2 install_board/retire_board 增 during_round 显式参数(Active 通道,其余相位守卫不变——fail-fast 保留)· B4 query_full_snapshot() · B1 can_request_refresh() 查询面 + player_request_refresh() 双相位重写 + _refresh_used_this_round 计数 + facts 身份快照隔离(缓冲期捕获身份快照、授予走快照——防旧图已挖格在轮末错拿新图同坐标身份;_grant_cell 增 snap_override)· 呈现层按钮"弃图刷新(RAP -8 · 每轮至多 2 次)"。
核心实现难点(分析批未暴露):轮内换图后旧图已挖未结算格与新图坐标重叠——轮末授予 b4.grant(cell) 会错拿新图身份。解法 = facts 缓冲期用 query_full_snapshot 冻结身份,授予段直通快照(绕过现行 mapping/_granted,批次隔离;库存语义不变)。
验证:冒烟 88/88(+14 轮内刷新断言:当场换图/相位 AP 保留/RAP 扣减/上限拒绝/跨图 facts 完整兑现〔4 格跨三图快照授予〕/回放确定性)· 三探针全 PASS · 期望扫描与刷新前持平(80%/0.88——模拟策略不主动刷图,真人专用出口)。调试教训(规范 4.6 补充案例):蛆虫 HP 已调 24 而"18 未掉血"误判——排查数值问题先核对当前表值;GDScript lambda 对局部 int 按值捕获(计数器必须用容器)。
正式侧义务(GDD/registry 修订清单):A3 GDD Rule 11(受理相位 Waiting → Active∪Waiting + 相位机表 + 时间税语义注记)· A2 GDD install 四不变式轮内场景 · B1 GDD 编排专章(轮内换图 + facts 快照协议)· B4 GDD E5/E6(query_full_snapshot/grant 快照直通)· game-concept 轮次流程 + "战斗:扫雷图 = 1:M"措辞(一轮跨多图新形态)· registry action_economy(refresh_max_per_round)· 数值连锁重跑(清图支配性条款⑤/获取期望——模拟不覆盖真人刷图行为,需 playtest 实测)。
2026-09-11 关卡扩展批 · 切片级偏差登记(实现期决策,正式化时须回 GDD/ADR)
- C1 线性推进器 provisional:节点链来自 LevelTable(结构位 = 未来 C1 的数据承载面);路径分支/奖励点分布定稿权归 C1/C3。节点类型 closed enum {battle, reward, rest, boss};末节点必须 Boss(LevelTable schema 校验)。
- B4 新增
grant_node_active()(接口漂移):关卡奖励点在可选类活行 {damage_item, heal_pack} 中 roll 一件直接入库;消耗reward_roll恰一 scope(与 board install 批同流异 scope,流集合封闭不变)。正式侧应走 B4 GDD 修订(节点奖励 = clear_reward 插槽族的新来源候选)。 - B2 spawn max_hp 语义修复(切片 bug):原实现
max_hp = hero_hp 入参——跨战斗携带 HP 时 max_hp 被压扁成当前 HP,恢复点/治疗包满血守卫失效。修复为max_hp = HeroTable.max_hp(接口语义澄清,正式侧回 B2 GDD Rule 注记)。 - A4 迷雾纪律遵守:L1 全程无雾(迷雾
unlock_level=2已锁事实——迷雾自第二层解锁);Boss 板以 12×12 大板区分。 - 属性覆盖 = 测试专用:调整板直接写运行时 HeroTable(atk 域 [1,999] 内 clamp ≥1);关卡结束/回菜单恢复基线。正式天赋树归 C4,禁止生产代码引用本机制。
- UI 复用 b1 引用:关卡模式下呈现层
b1 = runner.b1(与调试模式共用 HUD/棋盘路径);runner 在关卡结束置b1 = null。 - runner 信号时序(playtest 缺陷①修复登记):
node_entered必须先于begin_battle发出——后发时首板安装的board_changed到达呈现层时b1尚未接手,首战棋盘不渲染。场景级探针smoke/ui_probe.tscn为该缺陷的回归断言载体。 - A2 旗动作末点 AP 软锁(playtest 缺陷②修复登记——A2 核心 bug,v1 即存在):
_do_flag_place/_do_flag_pull花完末点 AP 后 A3 相位翻 Waiting 但不发 round_end——B1 的 Waiting 结算点依赖 round_end 到达,事件缺席 = 整局软锁(Boss 图插旗多,末点 AP 花在旗上即触发)。修复 = 旗动作检查相位翻转并补发_emit_round_end_flags_and_payload()(与_do_dig同款)。v1 冒烟盲区根源:自动玩家不用旗。回归断言入 smoke_all(旗动作耗尽 AP 必须进入第 2 轮)+ 行为探针smoke/ui_click_probe.tscn(合成鼠标事件走真实 UI 路径,随机混合插旗/拔旗/停手/窗口刷新/无效点击,4 种子全关通扫)。正式侧义务:A2 GDD F4 事件序契约须补"旗动作路径的 round_end 发射"措辞(接口漂移)。 - 呈现层固定分区(playtest 缺陷③修复登记):侧栏全部动态区(RAP/敌人/增益/库存/悬停状态)固定槽高 +
clip_contents——悬停文案切换与库存增长不再推挤整体布局(此前"第 N 轮"库存行被挤出视口 + 全 UI 抖动)。区域独立,超长裁剪不回流。 - L1 12×12 板生成余量:D2–D4(及 L2)
max_gen_attempts16→24(F2c 24×144=3456 ≤ 16384 合法)——16 次尝试下偶发"重试耗尽接受最优"(best≈0.85–0.87 < target 0.88);24 次后仍偶发(best 0.866),密度×推理率的根本解归 C3。 - 道具使用后不消失(playtest 缺陷④修复登记——UI 层契约违例):B1 窗口选择契约 =
_window_items位置(义务④"选定序"),UI 选用按钮却传item.index(库存数组句柄)——未消耗过时二者巧合相等;一旦消耗过一件,已耗条目仍占库存数组位,后续窗口条目"句柄 = 位置 + 已耗数"错位 → 选中件不消耗、邻件被误耗(可用次数语义本身存在且正确:use()一次性标记 Used 不可逆)。修复 = UI/行为探针一律传窗口位置;探针加"选用必生效"断言(选用件库存态变 Used,失效即退出码非零)。 - 数值调整板被遮挡不可见(playtest 缺陷⑤修复登记 + 专属测试补建):调整板覆盖层在场景树中位于不透明的开始覆盖层之前,
_show_tune_panel只置 visible 不隐藏开始层 → 面板被完全遮住 = "点击无反应"。修复 = 打开隐藏开始层 / 关闭(含"应用并关闭")恢复。专属测试:smoke/ui_tune_probe.tscn(场景级全链路:打开可见性〔缺陷⑤回归〕/ 滑条→生效预览联动 / 应用写 hero 表 12/75 / 重置回基线 6/50 / 批量模拟 N=10 全链路〔与 headless 扫描同口径〕/ 关闭回开始界面 / 加成跨模式持久)。 - 呈现层模块化重构(2026-09-11 用户批——"上帝对象"拆分):
main.gd随功能追加长成 ~1100 行上帝对象(棋盘渲染/HUD/日志/四种覆盖层/调整板/模拟器/关卡流程全糊在一个类)。拆分为 9 个单一职责单元(总行数不变,最大单类 433 行):views/board_view.gd(棋盘渲染+输入意图翻译,动作经信号外发)·views/hud_view.gd(侧栏纯视图,setter+定长槽)·hud_presenter.gd(核心状态→文案装配,MVP 静态装配器)·views/battle_log_view.gd(13 类行协议格式化)·views/item_window_overlay.gd(窗口,选择=位置语义收口)·views/node_overlay.gd·views/level_strip_view.gd·views/tune_panel.gd(调整板自持加成语义+批量模拟)·views/ui_kit.gd(共享小部件)。组合根纪律:main.gd(433 行)= 模式流转 + 信号接线,核心写调用(settle_batch/submit_window_selection/runner 推进)只在此处发生;视图零核心写、装配器无状态。回归验证:冒烟 74/74 + ui_probe/ui_tune_probe PASS + 行为探针 2 种子(通关 + 选用生效 1/2 失效 0)。
切片调参登记 v2(2026-09-12 起已由 C3 GDD 转正为 MVP 默认曲线——下方登记保留作溯源)
EnemyTable L1 深度轴(D0–D4,Boss=Dmax=4——A1 第三轴登记约定),设计意图 = 基线难、天赋拉回可玩带:
| 节点 | 行 | 敌种×数量 | hp | atk | 环 |
|---|---|---|---|---|---|
| 战1 | (1,0) | 蛆虫×1 | 24 | 4 | [attack] |
| 战2 | (1,1) | 蛆虫群×2 | 24 | 4 | [attack] |
| 战3 | (1,2) | 伏击兽×1 | 36 | 6 | [attack,charge,heavy] |
| 战4 | (1,3) | 伏击兽群×2 | 26 | 4 | [attack,charge,heavy] |
| Boss | (1,4) | 遗迹守卫×1 | 130 | 7 | [attack,attack,charge,heavy] |
首版(敌 HP 总量 208:18/36/26/40/88)实测基线通关率 73%——预警⑥速杀退化在关卡尺度依旧成立,与"基线非常难"意图相反;v2 上调至 290(24/48/36/52/130)+ Boss atk 7。群战对价:unit_count=2 行单位 hp/atk 下调(B1 条款③满配语境约束;C3 正式调参须按 clause3_supply 复算——registry 已登记 unit_count>1 行须降密度或降 m_amb)。
BoardGenTable L1 深度行:D0/D1 = 10×10、D2/D3/D4 = 12×12,全部 d0.25/t0.88。登记:d0.28/t0.87 首测不达标(best≈0.805–0.817,降级告警"接受最优出图")——密度轴上调与求解器能力一起解,留给 C3。
奖励获取期望实测(问题2 汇报批,工具 smoke/reward_expectation.gd,N=200 板/深度,走真实 B4 roll 管线含 F5 保底条件化):
| 深度 | 板面 | 资格格均(min/max) | 可选类/板 均 | 其中刀 | 治疗包 |
|---|---|---|---|---|---|
| D0 | 10×10 | 12.4(1/36) | 3.32 | 2.57 | 0.75 |
| D1 | 10×10 | 11.1(2/32) | 3.00 | 2.40 | 0.60 |
| D2 | 12×12 | 22.8(4/63) | 5.70 | 4.42 | 1.27 |
| D3 | 12×12 | 23.8(5/61) | 5.87 | 4.55 | 1.31 |
| D4 | 12×12 | 24.1(6/64) | 5.87 | 4.54 | 1.33 |
公式:每资格格 P(可选类) = 25/100 = 25%(小刀 15% / 精工短刀 4% / 治疗包 6%);每板期望 ≈ 25%×|资格格| + F5 保底条件化加成(k_dmg=1 整批重 roll 至少 1 刀——12×12 板无刀概率 0.81²³<1%,加成可忽略;10×10 板 ≈+0.2);清图奖励 clear_knife 仅真清图兑付(理性策略不整清 ≈0);完美排雷 ×2 条件苛刻不计基线;节点奖励恒为 1 件可选类。
每关合计 ≈ 23.8(板)+ 1(节点奖励)≈ 24.8 件可选类(≈18.5 把刀 + ≈5.3 治疗包)——刀总伤 ≈180,超过 Boss 单体 130 HP。用户"道具获取期望太高"的定量坐实:关内不清库(2026-09-11 裁决③)× 每格必有货(B4 锁定)× 12×12 深板资格格翻倍,三者相乘。候选杠杆(全部 C3 所有权,等拍板再动):① 可选类占比 25%→8–12%(改 knife_t1/knife_adv/heal_pack 权重)② 敌 HP 曲线上调对冲 ③ 刀伤下调 ④ 库存上限(触碰 B4 E 节结构,需修订)。
期望扫描数据(N=20/格,种子 4200+20,工具 level_monte_carlo.gd;理性玩家策略近似):
| atk% / hp% | 通关率 | 整关承伤 均/p90 | 通关剩余HP均(胜) | 进BossHP均 | 平均轮数 | 败北节点分布 |
|---|---|---|---|---|---|---|
| +0 / +0(基线) | 55% | 126.8 / 190 | 33.1 | 44.6 | 18.4 | 蛆虫群×4 · 伏击兽×2 · 伏击兽群×3 |
| +0 / +100 | 100% | 165.8 / 219 | 61.5 | 88.7 | 26.1 | — |
| +50 / +0 | 70% | 109.8 / 155 | 27.1 | 45.5 | 17.1 | 分散(含 Boss×1) |
| +100 / +0 | 100% | 96.3 / 121 | 33.5 | 47.4 | 17.4 | — |
| +200 / +0 | 95% | 61.1 / 99 | 36.6 | 49.0 | 12.9 | 伏击兽群×1 |
读法:基线=明显吃紧(55%,死亡集中在前中期群战)→ 攻击+100% 即满通关带;HP 翻倍是独立有效的第二杠杆(战斗拖长 → 承伤期望上涨 165 但预算翻倍)。v1 敌数值(HP 208)时基线通关 73%——预警⑥速杀退化在关卡尺度坐实,v2(HP 290)压到 55%。注意:模拟者 = 理性策略近似(免费链式开格、无避雷推理),真人基线通关率应显著低于 55%——目标带定在哪儿(30%?10%?)待 playtest 拍板,杠杆 = EnemyTable hp/atk 深度曲线(C3)。
已知热点(playtest 观察项)
- 基线难度体感:基线(无面板加成)应"明显吃紧、可能打不过";如果基线就能轻松通关 → 敌数值仍偏弱(找 C3 杠杆:EnemyTable hp/atk 曲线);如果 +100% 攻击还打不过 → 奖励供给或恢复点数值偏弱。
- 奖励点随机主动道具的体感:roll 池 = 小刀 8 / 精工短刀 16 / 治疗包 12(等权);到手的刀是否改变了 Boss 战规划(囤刀 vs 即用)。
- 恢复点(30% max_hp)时机:位于战4 与 Boss 之间——是否制造"要不要省治疗包给 Boss"的决策。
- Boss 战节拍:遗迹守卫环 [attack,attack,charge,heavy]——蓄力拍是否被玩家用作"安全挖掘拍";重击 14 点是否构成规划压力。
- 节点进度条/奖励恢复覆盖层可读性;v1 遗留观测项(结算逐行归因、雾池体感、完美排雷可达性)继续有效。
2026-09-11 用户拍板(四条,已落地本切片)
| # | 拍板 | 切片实现落点 |
|---|---|---|
| ① | 基础攻击恒存在:atk 域 [1,999]、0 拒绝加载、MVP=6;战斗段主角先手攻击顺位最前敌,attack_up 唯一吃修正 | hero.tres atk=6 · hero_table.gd 域校验 · B1 战斗段⓪先手(hero_attack 行);attack_up 经 effect_pool_map → hero_offense 活行 |
| ② | 奖励两类:即时 75%(当场兑付不进库存)/ 可选 25%(刀/治疗包入库走窗口);heal_pack 稀缺化 w6 p12 | reward.tres 行集 w75/25;B1 _resolve_instant |
| ③ | 库存关内延续:跨战斗不清,关卡末 level_clear 清空 | B1 _battle_over 不清库;v2 起由 C1 runner 在关卡末统一调用 |
| ④ | 道具窗口至多选一件 | B1 submit_window_selection 截断 slice(0, 1) |
文档对齐:四条拍板的 GDD/registry 回写已由文档会话先行完成(b1/b2/b4 GDD、registry、systems-index、d2、game-concept、b3);本切片程序与文档逐项对齐核查通过(详见 session-state 条目 16)。语义注:本切片为参考实现,与文档冲突以 GDD/registry 为准。
2026-09-12 试玩日志器 + 诊断转储(playtest 数据采集基建)
新增:① PlaytestLogger(呈现层组件)——订阅 B1 新信号 settlement_snapshot(每结算末尾全量状态:关卡/深度/轮次/verdict/英雄/敌人/行动经济/板序号统计/buff/库存/本轮 facts)+ battle_finished/node_entered/level_finished,逐行写 JSONL:user://logs/playtest_<seed>_<时间戳>.jsonl(每行一个完整状态,直接可喂 pandas);② 诊断转储按钮(侧栏底部"🩺 诊断转储")——卡死时点击,全量核心状态(B1 相位机/计数器/facts、A2 棋盘、A3、B4、runner)+ 最近 200 结算行/100 操作环形缓冲 → user://logs/diag_*.json(行为探针 _dump_state 的产品化)。
顺手修复(日志首秀即抓真 bug):_start_full_level 面板加成双写叠加——tune_panel.apply() 先写表(6→18),runner.set_hero_override 再以 18 为基线 ×3(→54)。修复 = 关卡模式单一应用路径(runner 写表),日志快照 atk 54→18 证实。教训(规范 5.x 补充案例):同一加成的多应用路径必须单一事实源;JSONL 快照是数值回归的最低成本探测器。
冒烟 103/103(+7:快照信号/字段齐备/板序号/JSONL 解析/诊断文件)。日志目录:%APPDATA%/Godot/app_userdata/DungeonSweeperVerticalSlice/logs/。
2026-09-12 C3 GDD 落地 + 试玩采集清单
落地:C3 GDD(design/gdd/c3-difficulty-curve.md,solo 出稿未评审)的设计承诺落回切片——① DifficultyTable 结构位(schema + 空表 + ConfigDB 挂载 + B2.spawn 套乘钩子:行值快照前施加、越域 clamp 至 [0.1,10];MVP 空表零行为——AC-10 冒烟断言含注入/越域验证);② 切片调参登记(敌深度轴/板参数/供给参数)转正为 MVP 默认曲线——切片当前数值 = C3 GDD 背书的设计态,试玩即体验 C3 定稿难度。冒烟 96/96。
试玩数据采集清单(反哺 C3 六个 OQ——试玩时请记录):
- OQ3 真人修正系数(首要):你无面板加成打第一关的通关/败北结果(模拟基线 80% 通关——真人预期显著更低,落差就是修正系数)。
- OQ2 Boss 血量:Boss 战实际打了多少轮、是否觉得血量压迫合理还是拖沓(模拟值 130HP 占比 0.81 越带)。
- OQ6 轮内刷新:你实际用了几次"弃图刷新"、是否觉得"挖-刷-挖"太顺滑(免结算=敌人不出手)。
- OQ4 弃图倾向:有没有"挖一半就想弃图刷 RAP"的冲动(模拟测不到真人策略)。
- 难度台阶可感知性:D2 伏击兽/D4 Boss 相比 D0 蛆虫的变强是否有具体面孔(新敌种=新图像线索)。
- 奖励供给体感:可选类道具(刀/治疗包)获取频率与囤积感受(供给控制器批后每关 ≈4.5–6.5 件)。
试玩方式:F5 → 「▶ 第一关 · 苔藓回廊」基线打一局 → 调整板 +100% 攻击再打一局(对照"数值提升→通关期望改善"的元进度体感)。
2026-09-12 试玩批次 1 → v3 数值批(F7 流程实践)
试玩反馈(v2 数值):满血全通关(三策略均通)/ Boss 血量 OK 或可上调 / 刷新零使用 / 零弃图倾向 / 治疗包零使用 / DND 命名指令(地精/熊地精/食人魔酋长)。
v3 数值批:atk 4/4/6/4/7 → 7/5/9/6/9(承伤主杠杆);D0 goblin 24 保持(20 会被首轮粉尘秒杀——冒烟旗回归断言抓获)、D1 群 13×2、D2 bugbear 40/9、D3 群 26×2、Boss ogre_chief 150/9(用户拍板可上调);L2 锚行同步。DND 命名:goblin 地精 → bugbear 熊地精(DND 原型即伏击手)→ ogre_chief 食人魔酋长;enemy_id 同步更名。
v3 扫描对照 F5:基线 60%(带 40–60% 上沿 ✓,v2 80%)· 败北 4/6 集中 Boss(压迫预期兑现)· +50%→87% / +100%→93% / +200%→100%(天赋曲线成立)· 承伤 90(v2 80)。C3 GDD 回写:F3 带 [0.5,1.1](OQ2 裁决)、OQ2/3/4/6 试玩读数、试玩批次记录。
冒烟 103/103(旗回归断言改用 Boss 行——D0 20HP 级被盲挖粉尘秒杀无法承载场景;DifficultyTable 断言对齐 v3 行值)。下一批 = v3 真人试玩(OQ3 定量/OQ2 终裁)。
2026-09-12 遭遇随机化(Roguelike 局感引入批——Peglin 对比报告落地项)
触发:用户试玩反馈"关卡完全没有 Roguelike 的体现"→ Peglin 对比报告(design/research/peglin-comparison-2026-09-12.md)→ 用户拍板先做遭遇随机化(节点分支/多波/遗物协同后置)。
设计(C3 GDD Core Rule 8):EnemyTable 行 unit_count 升级为区间语义 [unit_count, unit_count_max](新字段可省略=定值,旧行零迁移);B1.begin_battle 实例化期按区间均匀骰,RngService 新增 encounter 封闭流(registry 接口漂移登记——挖掘决策域之外 P1 合规);B2 零随机纪律保持(spawn 收 override 即确定值);同种子全程可回放;新敌种首遇节点固定数量(教学位不加骰)。
L1 区间:地精 [1,2] · 地精一伙 [2,3](hp 13)· 熊地精固定(教学位)· 熊地精双雄 [2,3](hp 18)· Boss 固定——期望总量 ≈304(+8%),F6 带内。
扫描(N=15):基线通关 47%(区间期望总量上移 +8% 的叠加效应——F5 带 40-60% 带内 ✓);+50% → 67%;败北分散(Boss×3/战1×4/战3×1)。注意:区间骰使难度分布更宽(运气成分进入遭遇层——Roguelike 体的核心),真人体感待批次 2。
冒烟 149/149(+46:区间双值出现/全域内/同种子可回放/D2 教学位固定)。
2026-09-12 试玩批次 1 → v3 数值批(F7 流程实践)
2026-09-12 伤害类型 × 护甲克制批(用户拍板——三段伤害 + 标错惩罚落地)
触发:设计会话(本日)定稿"怪物护甲类型(无甲/护甲A/护甲B)× 角色伤害三段构成(基础/伤害A/伤害B)"的克制对策系统(穿甲弹/高爆弹式三角)+ 标错旗随机惩罚。设定表经用户多轮审阅确认"没有问题"后落程序(GDD 正式修订另批进行——本批以表格结论为实现依据)。
拍板结构 → 落点:
| 设定 | 实现落点 |
|---|---|
| 敌人护甲类型:无甲 / 护甲A / 护甲B | EnemyTable 新字段 armor_type({none,a,b},缺省 none 向后兼容)· 映射:goblin=none / bugbear=a / ogre_chief=b(教学梯度候选,provisional)· B2.spawn 行值快照入单位字典 |
| 伤害三段:①基础 ②伤害A(开格充能)③伤害B(标雷充能) | B1 战斗段主角先手攻击改三分量:基础 = atk×(1+attack_up)(不吃克制,attack_up 消费面不变);伤害A = 本轮开出的资格格计数 ×damage_a_per_cell(初始展开格不计——reward_eligible=false);伤害B = 首次标中雷 ×damage_b_per_flag(与 weaken 同键每雷实例一次去重——忘拔旗不重复充能);三分量各自 floor 后相加,hero_attack 行携带 base/dmg_a/dmg_b 分量(P2 归因) |
| 克制矩阵:特化 ×150 / 无甲 ×100 / 对位甲 ×50 | SettlementTable 新字段 armor_effectiveness({base,dmg_a,dmg_b}×{none,a,b} percent,缺项回退 100)——刀/AOE/清图奖励恒定表值不吃克制(道具=万能稳定伤害,暂定待拍板) |
| 伤害A 单轮封顶 | damage_a_cap = 8(与 ap_per_round 对齐——防连锁轮一次充能十几个格把特化甲怪一拍秒杀;0 = 不封顶) |
| 标错旗 → 随机轻惩罚三选一(时效 1 结算) | _apply_miss_backlash():① enrage 暴走(敌 +25% 进 enemy_output 池)② 敌方伏击 +2 层(复用 ambush 行)③ off_guard 失衡(我方 +25% 进 hero_defense 池 = 多挨打);新 B3 行 ×2(dur=1 与 weaken/ambush 同款先兑付后衰减);沿用 _flag_miss_seen 每雷格实例一次去重 |
| 随机载体 | 零新流确定性派生:(x×7 + y×13 + 板序号×5) mod 3——同种子可回放、不扰动既有三条封闭流取号序;正式侧候选 = RngService 新增封闭流(待拍板) |
| 呈现 | 敌人卡环点行常驻护甲标签(无甲/护甲A/护甲B——克制对策可读前提)· 结算明细主角攻击行拆"(基础 X + 开格 Y + 标雷 Z)" · 反噬效果行入明细流 · settlement_snapshot 增 armor/charge 字段(JSONL 数值分析面) |
数值全部 provisional 待拍板/调参(登记于 enemy.tres / settlement.tres 注释):damage_a_per_cell=1 · damage_a_cap=8 · damage_b_per_flag=2 · 矩阵 150/100/50 · enrage/off_guard 25% · 伏击 +2 层 · 护甲映射 goblin/bugbear/ogre——C3 调参时按 F6 供给平衡式复算(三段充能是新增伤害供给,裸装败北/基线通关率两条冒烟路径已复验仍成立)。
正式侧义务(GDD/registry 修订清单,待文档批):B2 GDD(EnemyTable armor_type 字段 + schema)、B1 GDD(F3 主角攻击三分量构成 + flag_miss 反噬编排 + 克制矩阵载体)、B3 GDD(六行 MVP 状态表 + source_class flag_miss 授予)、A2 OQ1(标错惩罚候选升级为三选一随机池 + 重复性口径=每雷格实例一次)、registry(enemy/settlement_table/status_effect 条目 + A3 条款②锚与条款③不等式重推导——标中旗收益从纯 weaken 变"weaken+伤害B 充能")、C3(数值 provisional 接管)。lore 侧:design/research/lore-nest-metaphor-2026-09-12.md(伤害A=地利/伤害B=封印暴露、反噬=封印失败——待新会话拍板后写回 game-concept)。
验证:冒烟 161/161(+12:护甲快照三档传播 / 克制矩阵三行表值 / hero_attack 行三分量字段〔全战斗回放 ×2〕/ 标错旗 flag_miss+反噬效果行 / 标中雷充能进主角攻击 / 反噬派生同种子回放)· ui_probe PASS · ui_tune_probe PASS · ui_click_probe(done=true、选用失效=0、问题=0)。
2026-09-12 战斗屏五区改造批(battle.md 落地——ui-programmer 批)
背景:design/ux/battle.md(/ux-review APPROVED)+ design/ux/interaction-patterns.md(核心 8 pattern)落地到切片呈现层。core/ 与 data/ 零改动(本批纯 presentation/ + smoke/)。
五区布局(1280×800 基座):A 区 28px 顶栏关卡进度条(level_strip_view.gd 改造:暗金已过/奖励金当前高亮);B 区 252px 战斗画面(battle_stage_view.gd 新建 = hero_card_view.gd + 轮次·阶段指示 + 兑现演出区 + enemy_card_view.gd ×1–3〔顺位徽标/意图徽标常驻/环点拍数/伏击共享池/死亡灰化+碎裂残位禁瞬消〕+ 底部结算明细带);C 区 240px hero_info_panel_view.gd(直角细线数据框 + 修正来源角标 + RAP 点阵 + status_slot_row.gd ×4〔形状+色相双通道/层数角标/剩余结算点/悬停 tooltip 来源+语义+剩余/空态槽隐藏〕);D 区 board_zone_view.gd(ap_bar_view.gd 44px〔AP 点阵+停手居左;图例+弃图刷新居右——确认 chips 异位 pattern 7〕+ board_view.gd 改造〔悬停三语义自绘光标/目标格边框/BFS 路径蓝点预览/可挖域 8 向呼吸微光/奖励徽章 R₀ 域外/已开雾格 tint 残留/雾区全开一次性信号/去饱和 shader〕+ toast_stack.gd 2.5s 消退 + board_fx_view.gd 演出层)+ desaturation.gdshader(去饱和+金橙偏移、明度不变);E 区 280px inventory_panel_view.gd(常读列表固定槽高 + 原位窗口态 pattern 2/8:描边金光/标题切换/时机指示/usable_now 禁选+原因/跳过/政策注记;属性简述投影、来源不呈现)。旧 hud_view.gd 删除(HUDView 职责由 B/C/D 三区视图承接)。
全屏 States 与模态:legend_overlay.gd(图例,「迷雾 = 无雷盲区」恒在 + 状态槽空态说明)/ settlement_review_overlay.gd(明细回看)/ battle_end_overlay.gd(胜=金蜡封落于棋盘中央+判定行+回看入口;败=暮蓝 #5A6C8C+旗化光点收回)——统一模态登记序管理(_open_modal 打开时显式隐藏上方遮挡层,缺陷⑤纪律)。清图金粒喷泉+彩纸 / 完美排雷金光带+横幅 / 标中旗加重弹道 / Boss 紫赤影子爬棋盘 / 零合法板诚实 toast / 雾首遇·chord·非相邻一次性提示(每 run 去重,ux_hint_shown 遥测)。发现并修复历史 quirk:TunePanel 默认 visible=true 靠被不透明开始层遮蔽的树序巧合——已显式初始化 false(缺陷⑤家族)。
遥测(playtest_logger 增 ux 行族,呈现层观测不改 core):ux_round_input_ratio(原始输入:AP 消耗,快照驱动)/ ux_round_exit{path_tag}(快照 round_facts.path——呈现层只订 B1 的 ADR 纪律下唯一合法源)/ ux_refresh_attempt{result, round_refresh_index} / ux_window_choice / ux_reject{source, sub_reason} / ux_hint_shown{hint_id}。
探针:ui_probe 增五区构建断言 + L2 雾图段(雾首遇提示/雾区连通分量);ui_click_probe 增刷新确认链/图例开关/tooltip 触发/模态遮挡断言(图例/回看/窗口态/终局)/窗口期去饱和断言/首格可点计时(进入战斗屏口径 133–151ms ≤500ms AC;场景冷启动 ~700ms 为脚本首载编译域,观测项)——既有全部断言保留。** Waiting 刷新代理已按 OQ12 退役**:UI 刷新按钮仅挖掘期 Active 受理(presenter 门禁),原探针"窗口期点刷新"行为由 Active 确认链测试替代。
回归:smoke_all 149/149 · ui_probe PASS · ui_tune_probe PASS · ui_click_probe PASS(PROBE_SEED 7/11/23/99/42/77 六种子 done=true、选用失效=0、问题=0)。
占位登记:敌人意图视觉映射按 enemy_id 程序化占位(资产定稿归 B5);D区演出(喷泉/彩纸/弹道/影子)全部程序化占位;CJK 字体依赖系统回退(Windows 可用,随包字体归 D1 正式化硬性前置——ADR-0003);金蜡封/暮蓝氛围为色块占位级。
2026-09-12 呈现层 code-review 修复批(/code-review CHANGES REQUIRED → 全项清偿)
触发:全切片 53 脚本 ~9400 行 /code-review(CLAUDE.md 代码规范 + ADR-0001/0003/0004 对照),裁决 CHANGES REQUIRED(7 项必改)。core/ 12 文件与 smoke 断言面整体健康;病灶集中于 tune_panel 封装破口、main.gd 结构回涨、三处呈现契约错位。
BLOCKING 修复:
| # | 缺陷 | 修复 |
|---|---|---|
| 1 | TunePanel 视图写核心表(apply() 直写 _db.hero.atk/.max_hp)+ run_simulation 内 load("res://smoke/...") 驱动 core——面板模拟按 pct² 口径、模拟后表值残留污染真实对局(runner 把放大值当基线再乘) |
tune_panel 重构为纯视图(apply_requested/reset_requested/simulate_requested 信号外发 + setter 注入);加成落表收口组合根唯一路径 _apply_hero_override(每次从 _ready 捕获基线重算,幂等禁叠加);模拟编排拆 tune_sim_controller.gd(先复位基线再移交);报告文案归 HudPresenter.tune_sim_report |
| 2 | 意图徽标双翻译:presenter 先把 beat key 译中文投影、EnemyCardView 再按英文 key 匹配 → 色相/重击"▼"通道永久失效;BEAT_NAMES 两处重复 |
presenter 直传 B2 原键(attack/charge/heavy);名/色/标记渲染映射唯一定义处 = EnemyCardView(set_intent 契约头注成文) |
| 3 | C 区 RAP 死分支:_refresh_economy 从不投影 a3.rap,"RAP 滚动归零"反馈(A3 D1 义务)不可达;视图靠解析自身 label 文本当状态 |
presenter 持续投影 a3.rap;hero_info_panel_view 改 _last_rap 成员存储,删除 _rap_value() 文本解析 |
| 4 | smoke_all 恒真断言(check(true, "全部计数在域内")——越域也 PASS) |
改带分布标签的真实域内断言 |
结构/封装修复:
- main.gd 761 → 667 行(评审记录基线 433 行,400 行审视线):节点构建拆
ui_assembler.gd(只 new/add_child/布局,零接线零核心写);模态层级状态机拆modal_stack.gd(缺陷⑤纪律载体);战斗流程叙事文案拆battle_narrator.gd(兑现 main 头注"不拼呈现字符串");模拟编排拆tune_sim_controller.gd。剩余行数 = ADR-0001 规定的接线 + 模式流转 + 核心写调用唯一出口(再压需移动 ADR 规定职责,登记为 D1 正式化批候审)。 - level_runner core↔core 接线 lambda → 方法 Callable ×4(ADR-0001 静态规则 S6——lambda 捕获 self 延长 RefCounted 生命周期/成环)。
- B1 新增
diagnostic_snapshot()诊断观测面:组合根诊断转储与 click_probe 停滞诊断全部改走成文 API,零下划线私有字段直读(此前直读 8 个)。 - 信号处理体去 lambda 化:main 三处多行/单行 lambda(inter 层继续/单场入口/库存拒绝)改命名方法 +
bind(规范 4.1)。 - 顺带:
can_request_refresh()断行格式修复(原单行内嵌 tab 不可读);_build_inter_overlay死参parent_root删除;_start_battle重复_start_overlay.visible = false去重;调试两层入口改由_start_battle统一取加成后满血(原传参在加成前取表值)。
探针同步(缺陷回归断言随契约更新——3.3):ui_tune_probe 重写——应用/重置走真实按钮信号路径(press_apply_for_probe 接缝,ADR-0004"合成输入走真实翻译出口"口径);新增两条回归断言:⑦模拟后 hero 表保持基线(无残留)⑧应用加成 + 启动完整关卡后 runner 写表值 = 基线 × 单次加成(12/75;旧缺陷表现 24/112 在此被抓获);ui_click_probe 停滞状态与诊断转储改走 diagnostic_snapshot()。
验证:smoke_all 141/141 · ui_probe PASS · ui_tune_probe PASS(含新回归⑦⑧)· ui_click_probe 六种子(7/11/23/99/42/77)全 PASS(done=true、选用失效=0、问题=0)。新增 4 脚本 .uid 经 headless 编辑器扫描生成(语言纪律⑤)。
登记待办(非本批范围):自动玩家策略四份复制收口(评审 W-3);schema 溯源行补齐(W-9);S1–S8 静态扫描脚本化后 S1 自建 RNG 豁免口径登记(W-1);views 转发层信号契约头注补齐(W-2)。
2026-09-13 封装收口批(代码架构审查 E1–E5/O1–O5/P3 修复——ADR-0009 候选项的切片侧预收口)
触发:/architecture-review 改编批——以 architecture.md + ADR-0001~0005 + code-conventions 为基线做代码组织/封装专项审查(报告:docs/architecture/code-architecture-review-2026-09-13.md,Verdict: CONCERNS),用户拍板 P1+P2+P3 全修(P2 中涉接口漂移两项另出设计稿待审)。
核心封装修复(P1):
| # | 项 | 修复 |
|---|---|---|
| E1 | B1 协作对象全公开 → 呈现层链式穿透(b1.b2.hero、b1.a3.phase 式层层下钻 main×18 / presenter×15 处) |
a1/b2/b3/b4 私有化(a2/a3 保留公有 = 架构文档 API Boundaries 的 D1 契约面);新增 presentation_snapshot()(载荷 schema 头注成文)/is_battle_live()/stock_count()/query_reward_identity() 四个成文只读出口——diagnostic_snapshot 同款模式 |
| E2 | A2 状态字典公开且被视图绕过查询面直读(board_view:278/303 直读 .revealed,头注自称"只读查询面"自相矛盾) |
board/revealed/flags 私有化;新增 current_board()/reveal_record() 查询面;B1/组合根/探针全部改走命名面 |
| E3 | B2 裸字典容器公开(hero/enemies 可被任意写;presenter 为死亡残位直读原始数组) |
私有化 + hero_unit()/all_enemies()(含死亡残位,句柄语义与 query_alive 同构)投影面;presenter 残位渲染需求收进 API |
| E5 | "只读"字段仅靠纪律(phase/ap/rap/last_round_end/master_seed 架构文档定只读,实际公开可变) | getter-only 属性 + 下划线后备字段(外部读法 a3.phase 不变,写入仅剩方法通道——GDScript 层面机制化) |
组织修复(P1/P2/P3):
- O1/O2 调试模式抽离:main.gd 调试分支(单场/连续两层/HP 携带/共享 B4)拆
presentation/debug_session.gd——调试语义单一实现点(O2 双实现漂移收口);组合根保留接线(battle_created 先于 begin_battle 发出,ADR-0001 接线唯一归组合根 + 缺陷①时序义务)与终局 UI 决策。ui_probe 抓获初版时序缺陷(battle_ready 才接手 b1 → 雾首遇提示丢失)——即缺陷①同款,battle_created 接手修复。 - O3 DamageMath 抽取:B1 伤害公式族(F2 乘区/充能分量,零状态纯算术)拆
core/damage_math.gd(规范 1.2 工具函数挂宿主类);board_generator 同一合法板重复调用两次 measure_inferability 合并为一次(全库最贵求解器)。 - P3 清债:头注溯源补齐 ×4(board_data/config_db/rng_service/reward_supply_controller——规范 1.4);B4 grant/grant_clear/stock/use 失败返回统一
false→null(E6 消费方is Dictionary判定天然兼容);equivalence_supply 表行 duplicate 防配置源泄漏;load()→preload/类名直引 ×3(main logger/runner、tune_sim autoplay)。
加固(基线既有噪声根治):main.gd _on_board_action 的清图演出判定在 settle_batch 同步重入(结算→battle_over→关卡终局置空 b1)后仍摸 b1.a2 → SCRIPT ERROR(基线 click_probe 每跑必现)——补 b1 != null 守卫,探针 stderr 归零。
验证:冒烟 141/141(与基线一致)· ui_probe PASS · ui_tune_probe PASS · ui_click_probe PASS(done=true、选用失效=0、问题=0,SCRIPT ERROR 0——优于基线)· 新增脚本 .uid 经 headless 编辑器扫描生成(语言纪律⑤)· presentation 层残留穿透引用 grep 归零(呈现面调用 19 处全部为命名 API)。
登记待办(P2 设计稿待审——见审查报告 §4):E4 db.hero 表值运行时改写参数化(涉 B2.spawn 契约 = 接口漂移,须 GDD/registry 修订批);O4 自动玩家策略四份复制收口(与既有待办 W-3 合并)。
2026-09-13 P2 收口批(E4 表值参数化 + O4 自动玩家单一实现——用户拍板两项均做)
E4(db.hero 表值运行时改写 → 参数显式传递):
B2.spawn增atk_override/max_hp_override参数(-1 = 表值兜底;沿用 unit_count_override 先例;EC16 越界守卫改对生效上限判);B1.begin_battleencounter 增hero_atk/hero_max_hp字段(缺省表值——冒烟直呼路径零改动),战斗段_hero_atk快照替代db.hero.atk读取;LevelRunner:start_level表写删除、生效值进 encounter、restore_hero_base只清百分比(表值不可变后无基线可恢复)、_base_*字段删除(直接读恒定的表);- main:
_apply_hero_override/_scaled_override表写路径废除 →_debug_hero_override()生效值供给 Callable(面板百分比现算经 encounter 入战斗);_on_tune_apply/_on_tune_simulate去复位步骤;_db_base_*字段删除。 - 收益:双写叠加(6→18→54)与双基线同步整类隐患随表写移除;D2「单一事实源」原则机制化(表值运行期不可变)。
- 登记义务:registry architecture.yaml 新增
hero_override_parameter_passing条目(ADR-0009 候选;B2.spawn 签名 +2 / B1 encounter +2 = 接口漂移,正式侧 B1/B2 GDD 修订随 ADR-0009 批)。 - 探针语义升级:ui_tune_probe ⑦「表值残留」→「hero 表运行期不可变」(reintroduce 表写即 FAIL);⑧ 双写叠加回归改为完整关卡路径 + 呈现快照单次生效断言(12/75;旧缺陷形态 24/112 仍被抓获)。ui_probe 的
_start_single语义注记:调试单场恒基线(入口清零滑条——原行为,非缺陷)。
O4(自动玩家策略四份复制 → 单一实现,合并既有待办 W-3):
- 新增
smoke/auto_player.gd:choose_dig(最近可挖格)+window_selection(治疗优先于刀;差异参数化 heal_hp_div 2/3 · round_gate 0/3 · knife_compare best/sum——四调用点原语义逐一保留:smoke_all 3/3/best · monte_carlo 2/0/sum · dump_battle 3/3/sum · level_autoplay 2/3/best); - 四消费方删除各自的
_choose_dig/窗口策略块改走单一实现;click_probe 的level_autoplay._choose_dig引用同步改指 AutoPlayer; - 等价性证明:smoke_all 同种子回放断言(步骤流逐行相同)重构后保持全绿。
验证:冒烟 141/141 · ui_probe PASS · ui_tune_probe PASS(含 E4 新断言)· ui_click_probe PASS(done=true、选用失效=0、问题=0)。
2026-09-13 零承伤根因分割探针 + playtest-09-12 Bug #1–#3 处置批(报告 Top3 授权任务)
触发:playtest-2026-09-12-designer 报告 Top 3 Priorities(探针分割 → Bug 建档修复 → 多种子复扫基线);数值拍板与设计变更不在授权范围(待拍板清单见文末)。
① 零承伤根因分割(新探针 smoke/damage_probe.gd——boss/level 两模式):
- 快照盲区发现:settlement_snapshot 取在衰减段之后,时效 1 的 defense_up 当轮授予当轮衰减——真人局 JSONL
buffs[]恒空 ≠ 池为空(报告悬置的直接原因)。探针改从结算行(effect 行 pool_value)重建战斗段时点池值,池归属经 settlement.effect_pool_map 表驱动(零字面量)。 - Run A(fresh 池零挖掘裸验):Boss 攻击拍 d_tick = atk.total 全额兑现(attack 9/9 ×2 · charge 0 设计语义 · heavy 18/18),6 轮击倒英雄(defeat)——「Boss/敌攻击链缺陷」否证;拍名轮转与真人局逐拍一致(attack→attack→charge→heavy→attack)。
- Run B(自动挖掘墙行为):池 -30 → d_tick 21→14、池 -60 → 残余 ×0.40,墙轮承伤恒 >0;表值判定墙最深 -60 > pool_clamp_lo -100 = 归零不可达(09-13 调参批在当前数据上重证)。
- 结论:真人局 12/12 轮零承伤 = 旧数据 defense_up -50×2 = 池触 clamp 下限 ×0(设计语义)——任何 atk 曲线乘在 ×0 上(原报「v3 主杠杆乘在 ×0 上」坐实)。报告 Bug #2 = 设计问题非 bug。
② Bug #1–#3 建档与处置(BUG-0002/0003/0004,production/qa/bugs/,编号自 BUG-0001 顺延):
- BUG-0002(报告 #1 浅深度空遭遇)——Rejected as coded:seed 42 当前构建全关回放复现同款遥测签名(d0 spawn=1 / d1 spawn=3 + round-1 victory + unit_count 0)但实为首轮全灭(英雄爆发 + 爆裂粉尘 instant_aoe 全歼低 HP 敌群;与 20:41 局 d1 双地精各剩 1 HP 逐点吻合);遭遇骰数学下限 ≥1(B1 roll_lo)+ B2.spawn count<1 fail-fast 双闸,100 场扫描零越域。快照盲区修复:settlement_snapshot 增
spawn_count(实例化总数含死亡残位)——unit_count=0 时「全灭 vs 空场」可判别,同类误读机制化排除。 - BUG-0003(报告 #2 Boss 攻击零兑现)——Rejected as coded:根因见①;候选改法(clamp 收紧 / 乘法衰减 / 重击拍穿防)列待设计批。
- BUG-0004(报告 #3 grant_node_active 绕过 _supply.notify_granted)——Fixed:stock 受理成功后补入账(与 grant() 同一「发放即获取」口径);计数器战斗域清零语义不变 = 零战斗数值影响,纯计数口径修复(报告 Top3 #3 的上报义务执行)。
- 回归断言(代码规范 3.3):smoke_all +7——快照 spawn_count 字段与等值断言;遭遇全深度 × 12 种子全域内扫描(60 场 spawn ≥1 且 ∈[unit_count, unit_count_max]);
_smoke_attack_chain_fresh_pool(fresh 池非蓄力拍 d_tick == atk.total 全额兑现——攻击链健康钉死,未来真缺陷在此被抓);_smoke_supply⑦ 节点奖励发放即入账。
③ 多种子关卡复扫(Q1 调参批基线——level_monte_carlo 增 F4 两列「普通承伤/场% · Boss承伤%」:逐战斗承伤切分 = round 回卷分段 + 末段 Boss 判定(须抵达 Boss 节点)):
- N=30 × 10 档(种子 4200–4229;F7 切片样本量口径)。结论:全档位越带——F5 基线通关率 17%(带 40–60%)· +100% 档 43%(中天赋 ≥95%)· +200% 档 63%(高天赋 100%);F4 普通场承伤 35.1–43.1%/场(带 ≤20%)、Boss 场 71.3–134.9%(带 ≤50%)(hp+0 档;hp+100 档普通 13.9–22.6 带内 / Boss 35.8–76.7 仍多数越带)。拆墙(-50→-30 且权重 24→16)与 v3 atk 曲线叠加后,难度由严重不足摆向严重过剩。本批未动任何数值(敌 hp 曲线与奖励供给禁独立调参——registry 预警⑥联动义务;杠杆方向列待拍板,本基线 = F7 流程的测量输入)。
验证:冒烟 148/148(141 既有 + 7 新回归)· 三探针 PASS(ui_probe / ui_click_probe 6 种子 done=true、选用失效=0、问题=0 / ui_tune_probe)· damage_probe boss 模式 7/7 + level 模式(种子 42/43/44)4/4 全 PASS。
待拍板/待设计批清单(本会话零数值变更、零 GDD 变更):
- 难度杠杆重拍板(F4/F5 全档位越带)——候选:enemy atk 曲线回撤部分 v3 增量 / defense_up 权重回升 / heal 供给联动——归 C3 按 F7 流程(本基线为测量输入);
- 墙语义候选改法(clamp 收紧至 -60/-70 / stack 乘法衰减 / heavy 拍穿防)→ C3 + /propagate-design-change(连带 B1 池 clamp 语义 + B3 GDD "-50" 文字同步);
- 供给量重拍板:「每战斗首件保证」的总量语义(候选:关卡域首件)→ C3(BUG-0004 已封计数漏洞,关卡供给账目可完整观测);
- 浅深度首轮跳战可玩性(autoplay/真人 d0-d3 round-1 全灭跳过战斗过程)→ C3 结合 F4 复验数据裁决。
2026-09-13 拍板落地批(四项拍板——难度杠杆/墙语义/供给量/跳战)
拍板结果(用户四问裁决):①难度主杠杆 = 先真人试玩再拍(F5 真人修正系数标定优先于数值调整);②墙语义 = 维持现状 + 归零护栏;③供给量语义 = 先观测再拍;④跳战 = 并入难度复测再议。本批零玩法数值变更。
落地变更:
- smoke_all 新增
_smoke_wall_zero_guard(表级不变式:2×defense_up.magnitude > pool_clamp_lo)——BUG-0003 事故类(叠满触池底 = ×0 全额免伤)永久免疫:任何未来 magnitude/clamp 调参重新造出 ×0 墙即冒烟红灯,强制显式重审; - level_monte_carlo 增「跳战率」列(普通战斗 round-1 即胜占比——拍板④观测面,此后每次复测自动携带);
_damage_segments升级为逐段 {承伤, r1_win} 结构; - defense_scan 输出标签修正:「墙轮承伤(应为 0)」→「(合法——-30 批墙帽 ×0.40)」(旧 -50 数据时代的期望文案过时清理)。
跳战率基线(N=30,拍板④"再议"数据):基线 8% · +50% 13% · +100% 24% · +150% 27% · +200% 38%(普通场 round-1 全灭占比)。seed 42(试玩固定种子)为高跳战轨迹(autoplay d0–d3 四场全部 round-1 全灭)——真人局 d0–d3 全跳的体验含显著种子成分;基线 talent 下跳战是少数派,拍板④"复测再议"的数据前提成立。其余各列与 Q1 基线逐值一致(collect_rows=true 开启不改变行为——确定性交叉验证)。
验证:冒烟 149/149(+1 护栏)。
下一步(用户侧):开一局真人试玩(任意种子;JSONL 自动落 user://logs/)。观测清单(服务拍板①③复议):通关与否 + 败北节点(F5 修正系数 = 真人通关率 ÷ 模拟 17%)· 普通场掉血体感(对照 ≤20% 带)· Boss 战撑过几轮 · d0–d3 是否发生跳战 · 治疗包是否出现缺血时刻与库存残留(拍板③数据)。事后由会话分析 JSONL 出修正系数。
2026-09-14 完美策略档测量批(OQ7 技能轴上界仪——用户拍板"增加完美策略档测试验证",零玩法数值变更)
背景:用户(扫雷强玩家)指出"完全正确开图/标雷、零踩雷 ⇒ 存活无压力"——现行扫描只有弱策略基线档(不标旗/邻格盲挖/朴素选道具),技能轴不可测;registry calibration_gap(真人显著强于模拟者)此前只有方向无机制。本批 = 测量工具批。
落地变更:
auto_player.gd增完美策略求解器(perfect_action/_deduce):single + subset 推理不动点(A1 F1measure_inferability同族规则集,去 safe_set oracle——约束未知邻格含雷格,比生成期闸保守);零盲挖(只挖已证安全格 = 构造保证零踩雷,扫描末断言兜底违例 quit(1))· 已证雷格全标旗(旗先于挖——轮末 weaken + 伤害B 首次充能,雷上旗不阻连锁)· 卡死且资源可 →b1.player_request_refresh()轮内刷新 · 否则停手(残 AP 1:1 入 RAP)。输入只经 A2 查询面(reveal_record/is_revealed/has_flag),禁读棋盘雷区真值——测推理上界,非全知作弊。core 层零改动;window_selection增heal_no_waste选项(缺口 < 治疗量不用;完美档启用)+ 完美档轮次门解除(round_gate=0);level_autoplay.gd增policy参数(默认 "normal"——tune_sim_controller/defense_scan/level_debug 既有调用零改动);完美档驱动_autoplay_battle_perfect(move/dig/flag 走 A2 settle_batch、refresh 走 B1 编排、连续拒绝 ≥3 停手防死循环);st 增mine_hits/refreshes计数(mine_hit 证据行埋点);level_monte_carlo.gd增第 3 CLI 参[policy](normal/perfect/both,缺省 normal 兼容既有文档命令)+ 策略/踩雷/刷新列;脚注 F5 带文案同步 [30,50] 带锚定稿。
完美档基线(N=30 · 种子 4200–4229 · 耗时 597.6s):0 加成通关率 100%(弱策略基线档 60%)、通关剩余 HP 均 47.4/50、整关承伤均 3.5(p90 18.0)、普通场承伤 0.5%(带 ≤20%)、Boss 场 5.3%(带 ≤50%)、踩雷 0.00/局(断言 ✓)、刷新 0.23/局、跳战率 20%。+50%~+200% 全档位恒 100% 满血通关(+200% 承伤均 0.4)——技能轴上界完全碾压现行曲线:F5 带与 F6 S/K 区间对完美档零分辨力(区间模型无策略水平轴的结构性证实;calibration_gap 获得机制解释与定量上界)。
验证:冒烟 149/149 全绿(默认行为零变更——弱策略档既有断言全通过)。
待拍板:① 0 加成完美档通关率的目标带(现行 [30,50] 按弱策略口径定义——是否改为按完美档口径验收?);② 杠杆选择(已预登记:r_boss 走廊 180–207 / 群战上探 / decay 0.6;本批新增候选:"上限掺运气"系——供给量值随机化(power 区间化)/ 承伤硬地板——均待完美档复测验证效果)。
2026-09-14 伤害量值区间批(用户拍板②——"上限掺运气"两步全落地 + 完美档无效性实测,宽度 provisional)
拍板:验收口径改完美策略档(0 加成通关 ≤40%);杠杆 = 伤害值区间随机(上阶/下阶,范围内 roll);覆盖面 = 奖励侧五行先行、不足扩敌方侧(分步授权已用尽)。roll 时机 = 身份预分配批(E14 快照口径不变);中点恒等现值(A3 条款①当量锚不漂移);宽度 provisional 归测量迭代。
落地变更:
- 第一步·奖励侧五行(reward.tres + reward_table.gd schema + reward_economy.gd):heal_minor [2,6] / knife_t1 [5,11] / heal_pack [6,18] / knife_adv [10,22] / clear_blast [25,55]——power_min/power_max 可选配对字段(缺省定值行向后兼容,armor_type 先例);schema 校验 = 成对/buff 禁止/中点锚;roll 在 roll_board 身份批内追加取号(既有取号序零扰动)+ grant_node_active 同路径;快照 power = roll 值,B1/呈现零改动,授予期零随机纪律不变;
- 第二步·敌方攻击侧(enemy.tres 六行 + enemy_table.gd schema + unit_container.spawn + battle_orchestrator):atk [min,max] = 行值 ±3 provisional(d0 7[4,10] / d1 5[2,8] / d2 9[6,12] / d3 6[3,9] / Boss 9[6,12] / L2 7[4,10]);roll = 遭遇骰同流(encounter 恰一 scope,数量骰先、atk 骰后)spawn 期整战持久——每拍抖动否决(数字可读性锚),B2 零随机纪律保持(收 override 即确定值);spawn 签名 +1 参数(接口漂移登记,ADR-0009 同批);
- smoke_all 新增
_smoke_power_interval(4 断言:五行中点锚/roll 域内含清图槽/定值行零外溢/节点路径域内)。
实测(N=30,种子 4200–4229):
- 奖励侧单独:完美档 0 加成 100%(承伤 3.5——与区间前逐值一致);基线档 17%(不变);
- 敌方侧叠加:完美档 0 加成仍 100%(承伤 3.5→3.9 / p90 18→19——方差真实流动但被血缓冲全吞);剩余 HP 均 47.4 不变;
- 验收结论:≤40% 线用数值区间杠杆族到不了——完美玩家结构性优势(零踩雷 = 零直伤 + 全标旗 = weaken −65% 顶格 + 快杀 = 敌出手次数最少)不受值域方差影响。三选待裁决:①承伤硬地板(每结算不可减免平伤——S_min 压缩,B1/B2 域);②weaken 饱和/递减语义(拆"全标旗顶格"基石,B3/B1 域);③极端宽度(数值可用但毁基线档与可读性锚——建议否决)。本批区间机制保留(对普通玩家方差体验有效,中点锚不伤当量)。
验证:冒烟 154/149+5 全绿(区间批 5 新断言 + 既有全部回归含遭遇骰分布/回放)。