From f41903a3b0869679c0f824b6c775757ae1ab5e4f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 2 Nov 2026 07:34:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E5=8D=A1(=E6=96=AD=E8=A8=80=E8=A1=A5?= =?UTF-8?q?=E9=BD=90=E6=89=B9):=20=E9=9C=80=E6=B1=82=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=88=90=E6=96=87=E2=80=94=E2=80=94=E2=91=A0=E5=A2=9E=E7=9B=8A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=BB=93=E7=AE=97=E9=93=BEV1-V5(=E8=BF=AD?= =?UTF-8?q?=E4=BB=A348=E5=B7=B2=E7=9B=96=E5=8F=A0=E5=B1=82=E7=BB=AD?= =?UTF-8?q?=E6=97=B6,=E4=BD=99=E8=A1=B0=E5=87=8F=E9=80=90=E5=80=BC/?= =?UTF-8?q?=E5=85=A8=E6=B8=85/=E6=BB=A1=E5=B1=82=E6=8B=92/=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E5=B9=B6=E5=AD=98/=E9=A6=96=E6=8E=88=E5=BF=AB?= =?UTF-8?q?=E7=85=A7)=20=E2=91=A1=E5=87=8F=E5=8A=A8=E6=95=88=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E5=A5=91=E7=BA=A6V6-V8(=E6=8E=A2=E9=92=88=E5=B7=B2?= =?UTF-8?q?=E7=9B=96=E5=85=A8=E9=93=BE,=E4=BD=99store=E6=9C=AC=E4=BD=93?= =?UTF-8?q?=E5=8D=95=E5=85=83)=20=E2=91=A4Boss=E5=87=BA=E5=9C=BA=E9=97=A8?= =?UTF-8?q?=E6=8E=A7V9-V10(=E6=AF=8F=E5=8C=BA=E5=9F=9F=E6=81=B0=E4=B8=80?= =?UTF-8?q?=E7=BB=88=E7=82=B9+=E7=AB=AF=E5=88=B0=E7=AB=AFboss=E8=A1=8C?= =?UTF-8?q?=E9=9B=86;=CE=A3=C3=97r=5Fboss=E6=97=A0=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E6=89=BF=E8=BD=BD=E4=B8=8D=E9=80=A0=E6=96=AD=E8=A8=80?= =?UTF-8?q?)=20=E2=91=A5=E9=94=BB=E9=80=A0=E5=B7=A5=E5=9D=8AV11-V16(?= =?UTF-8?q?=E5=85=A8=E8=B7=AF=E7=BA=BF=E4=BB=B7=E6=A0=BC=E6=A2=AF/?= =?UTF-8?q?=E5=A4=9A=E7=BA=A7=E8=B4=AD=E4=B9=B0/=E6=8B=92=E8=B4=AD?= =?UTF-8?q?=E9=9B=B6=E5=89=AF=E4=BD=9C=E7=94=A8/=E7=A5=9D=E7=A6=8F?= =?UTF-8?q?=E9=9B=B6=E6=B3=84=E6=BC=8F/=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E8=A7=A3=E8=80=A6/=E7=94=B2=E5=9E=8B=E5=8F=8C=E8=BD=B4);=2013?= =?UTF-8?q?=E6=96=B0=E5=87=BD=E6=95=B0+2=E6=89=A9=E5=B1=95=E9=9B=B6?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=E6=94=B9=E5=8A=A8,=20=E4=B8=A4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=90=BD=E4=BD=8D=E9=A2=84=E6=A3=80=E4=B8=8E?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E9=A2=84=E7=AE=97=E5=9C=A8=E6=A1=88;=20READM?= =?UTF-8?q?E=E4=BA=94=E8=A1=8C=E8=83=BD=E5=8A=9B=E8=A1=8C=E5=85=A5?= =?UTF-8?q?=E8=A1=A8+=E8=A6=86=E7=9B=96=E5=9F=9F=E8=A1=A8=E4=BA=94?= =?UTF-8?q?=E5=A4=84=E7=BC=BA=E5=8F=A3=E5=8F=A5=E8=AE=A2=E6=AD=A3(?= =?UTF-8?q?=E2=91=A3=E9=99=A4=E5=90=8D=E7=BB=88=E6=80=81=E5=8F=A3=E5=BE=84?= =?UTF-8?q?);=20=E5=BE=85=E5=8A=9E=E6=9D=A1=E7=9B=AE8=E2=86=92=E5=B7=B2?= =?UTF-8?q?=E5=86=99=E5=8D=A1(=E5=87=AD=E6=8D=AE=3D=E5=8D=A1=E8=B7=AF?= =?UTF-8?q?=E5=BE=84)+=E5=A2=9E=E7=9B=8A=E7=8A=B6=E6=80=81=E5=87=AD?= =?UTF-8?q?=E6=8D=AEv1.1=E2=86=92v1.4=E8=AE=A2=E6=AD=A3;=20grilling?= =?UTF-8?q?=E4=B8=A4=E9=97=AE=E4=B8=A4=E8=A3=81(=E5=8D=95=E5=8D=A1?= =?UTF-8?q?=E5=9B=9B=E5=9F=9F+=E5=AE=A1=E8=AE=A1=E5=AD=90=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E9=80=9A=E9=81=93)=E9=9B=B6=E5=BE=85=E8=A3=81?= =?UTF-8?q?=E7=82=B9;=20pipeline=5Fgate=20PASS(=E5=8D=A1=E7=89=87=E5=8F=A3?= =?UTF-8?q?=E5=BE=846=E5=BC=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 15 +- reports/需求卡片-断言补齐批-2026-11-02.md | 174 ++++++++++++++++++++++ 待办清单.md | 7 +- 3 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 reports/需求卡片-断言补齐批-2026-11-02.md diff --git a/game/tests/README.md b/game/tests/README.md index 156bcee6..934ebead 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -99,6 +99,8 @@ tests/ | 奖励三选一候选/刷新付费/呈现 | 奇物×节点奖励屏 | `AdventureRunner.present_node_curio()`(数据面);奖励节点覆盖层场景(呈现面) | `curio_refresh_paid_test.gd:_init`;`reward_overlay_test.gd:_run` | | GP 钱包/escrow/商店收口/共享池 | 地图战斗资源×商店 | `LevelRunner.shop.buy_product()`/`shop.player_request_refresh()`/`LevelRunner.close_wallet()`/`shop.set_shop_pool()` | `level_shop_economy_test.gd:_smoke_gp_wallet`;`level_shop_economy_test.gd:_smoke_shop_room`;`level_shop_economy_test.gd:_smoke_shop_pool` | | 元进度入账与锻造两轴 | 元进度×锻造工坊 | `MetaStateStore.apply_adventure_summary()`/`MetaStateStore.spend_keystone()`/`MetaStateStore.set_forge_route_level()` | `meta_progression_forge_test.gd:_meta_pricing_and_buy`;`meta_progression_forge_test.gd:_smoke_forge_axes` | +| 锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用) | 锻造工坊 | `ForgeTable.level_price()`/`MetaProgression.forge_buy_level()` | `forge_table_test.gd:_test_price_ladder`;`meta_progression_forge_test.gd:_meta_pricing_and_buy`;`meta_progression_forge_test.gd:_test_forge_buy_reject` | +| 锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) | 锻造工坊×元进度 | `MetaProgression.forge_select()`/`hero_type_axes()`/商店购买口 | `meta_progression_forge_test.gd:_test_blessing_no_forge_leak`;`meta_progression_forge_test.gd:_test_default_axes_pre_key`;`meta_progression_forge_test.gd:_test_armor_switch_dual_axes` | | 天赋树购买与六键合成 | 天赋树 | `MetaProgression.tree_buy()`/`MetaStateStore.tree_state()`/`MetaStateStore.set_tree_level()` | `meta_progression_forge_test.gd:_smoke_tree`;`meta_progression_forge_test.gd:_smoke_tree_rules`;`tree_rules_v11_test.gd:_init` | | 秘宝结构冻结与 12 件效果 | 秘宝 | `TreasureItems.add_item()`/`query_inventory()`/`validate_use()` | `treasure_items_test.gd:_init`;`treasure_effects_test.gd:_init` | @@ -150,6 +152,7 @@ tests/ | 营地图鉴占位挂起态与反参照结构纪律 | 营地场景视图 | 布告板命中区 → `CampSceneView._gui_input()`(object_pressed 信号) → 图鉴占位视图;营地根态场景树审计 | `ui_struct_probe.gd:_ready`(占位禁词/禁行段)〔营地图批 V6〕;`ui_struct_probe.gd:_ready`(结构禁词段)〔营地图批 V9〕 | | 营地刷新单口与场景根 HUD 同步 | 营地刷新总线 | 写口尾 → `CampRefreshBus.refresh()` → 现开界面刷新+场景根 HUD 刷新 | `ui_struct_probe.gd:_ready`(顶栏位段)〔营地图批 V8〕;`ui_click_probe.gd:_ready`(写口尾刷新段) | | Esc 浮窗唤起与三出口动线 | 营地 Esc 流 | 营地场景根态合成 Esc 键事件→ `main_esc_flow.on_esc_input()` → `ui.flow.open/close`;浮窗三钮 `pressed` → 三出口 | `screen_flow_probe.gd:_ready`(Esc 唤起/子界面开态不唤起/再按关窗/非营地不唤起段)〔ESC批 V1〕;`screen_flow_probe.gd:_ready`(返回动线/设置双路径段)〔ESC批 V3/V4〕 | +| 减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) | 设置与本地化 | `SettingsStore.load_settings()`/`save_settings()`/`apply()` | `settings_store_test.gd:_test_settings_roundtrip`;`settings_store_test.gd:_test_settings_default`;`settings_store_test.gd:_test_settings_apply_chain` | | 营地顶栏 HUD 钥石读数与刷新单口同步 | 营地 HUD 栏 | 隔离存档实例 `meta_state._add_keystone()`→ 显式触发 `CampRefreshBus.refresh(camp_data)` → `camp_hud_band.refresh()` → `keystone_badge` 读数 | `screen_flow_probe.gd:_ready`(HUD 余额读数/刷新段)〔ESC批 V6〕;`ui_struct_probe.gd:_ready`(顶栏位结构段) | | 营地五窗统一窗壳形态 | 营地五界面 | 七物件命中区/笔记本 → `CampSceneView._gui_input()`(`object_pressed` 信号)→ 组合根分派开窗;窗板几何(居中定尺寸 720×640 起点)/遮罩/窗内滚动面为呈现提交面 | `screen_flow_probe.gd:_step_camp_window_shell`(窗壳形态段,计划用例——锚定 `reports/需求卡片-营地五界面真窗口化批-2026-11-02.md`)〔窗口化批 V1–V8〕 | @@ -164,9 +167,11 @@ tests/ | 加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域 | 数据配置×秘宝×奇物 | `ConfigDB.load_tables()` | `reward_dangling_treasure_test.gd:_init`;`counter_prefix_fatal_test.gd:_assert_rejected`;`treasure_target_violation_test.gd:_init` | | 表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 数据配置×敌人系统×地形变异×冒险结构 | `EnemyTable.validate()`/`VariationTable.variant_pool()`/`AdventureTable.validate()` | `table_structure_guard_test.gd:_smoke_enemy_bands`;`table_structure_guard_test.gd:_smoke_variation_framework`;`table_structure_guard_test.gd:_smoke_adventure_table` | | 难度修饰套乘:空表零行为/套乘生效/越域 clamp | 难度曲线与Boss | `UnitContainer.spawn()`/`ConfigDbResolver.resolve_difficulty_modifiers()` | `table_structure_guard_test.gd:_smoke_difficulty_table`;`config_db_resolver_test.gd:_test_difficulty_clamp` | +| Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) | 难度曲线与Boss | `NodeMapGenerator.generate()`/`BattleOrchestrator.begin_battle()` | `node_map_generator_test.gd:_test_boss_exit_per_region`;`boss_gate_test.gd:_test_boss_node_spawns_boss_rowset` | | 锻造表 schema 正反与几何价格梯 | 锻造工坊 | `ForgeTable.level_price()`/`ForgeTable.route_rows()` | `forge_table_test.gd:_test_production_rows`;`forge_table_test.gd:_test_price_ladder`;`forge_table_test.gd:_test_negative_cases` | | 系统间契约词表与受理口径:五配方互异/掷点标签成员性/增益布尔受理 | 战斗结算×数据配置×增益状态 | `DamageController.open_ticket()`/`StatusContainer.apply_effect()` | `system_contracts_test.gd:_test_damage_controller_vocabularies`;`system_contracts_test.gd:_test_rng_tag_closure`;`system_contracts_test.gd:_test_status_boolean_acceptance` | | 同名状态合并策略(叠加/累加/并存)与剩余次数语义 | 战斗循环×增益状态 | `StatusContainer.apply_effect()`(编排宿主 begin_battle 链) | `roll_multiplier_test.gd:_smoke_armor_roll` | +| 状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) | 增益状态 | `StatusContainer.apply_effect()`/`decay_round()`/`notify_battle_end()` | `system_contracts_test.gd:_test_status_decay_and_clear`;`system_contracts_test.gd:_test_status_stack_full_reject`;`system_contracts_test.gd:_test_status_independent_branch`;`system_contracts_test.gd:_test_status_snapshot_first_grant` | | 敌人技能池跨表链接校验 | 数据配置×敌人系统 | `ConfigDbCrossValidator.validate_skill_pool_links()` | `config_db_cross_validator_test.gd:_test_all_links_valid`;`config_db_cross_validator_test.gd:_test_dangling_skill_id`;`config_db_cross_validator_test.gd:_test_cast_side_mismatch` | **覆盖域表**(`design/gdd/systems/` 逐篇对照——状态三档:已覆盖/部分覆盖/未覆盖;部分与未覆盖行的缺口指待办清单条目,覆盖面提升时同批改本表): @@ -177,11 +182,11 @@ tests/ | 冒险循环 | 关卡节点图生成.md | 节点图生成合法性与同种子复现;节点图生长递增与无解 fail-fast | 已覆盖 | — | | 冒险循环 | 关卡节点地图.md | 起关/选路/断点重生成同图(集成);信息迷雾类型可见性;关卡表消费侧校验与关卡推进 | 已覆盖 | — | | 冒险循环 | 奇物.md | 专长(奇物)授予与凭证保底;奖励三选一候选/刷新付费/呈现 | 已覆盖 | — | -| 冒险循环 | 难度曲线与Boss.md | Boss 半血解锁技门控;行集寻址、行序保序与难度乘数 clamp;难度修饰套乘:空表零行为/套乘生效/越域 clamp | 部分覆盖 | 难度曲线整链与 Boss 出场门控无专项断言;见待办清单「能力清单覆盖缺口补齐」条 | +| 冒险循环 | 难度曲线与Boss.md | Boss 半血解锁技门控;行集寻址、行序保序与难度乘数 clamp;难度修饰套乘:空表零行为/套乘生效/越域 clamp;Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) | 部分覆盖 | 机制面剩余缺口由「断言补齐批」承接;数值落带断言归 M4 数值批 | | 战斗循环 | 地图战斗资源.md | 清图奖励双份与零路径;GP 钱包/escrow/商店收口/共享池;封印与极性路由/不可逆 | 已覆盖 | — | -| 战斗循环 | 增益状态.md | 系统间契约词表与受理口径:五配方互异/掷点标签成员性/增益布尔受理;同名状态合并策略(叠加/累加/并存)与剩余次数语义;封印与极性路由/不可逆 | 部分覆盖 | 增益叠层/衰减/清除结算链无断言;见待办清单「能力清单覆盖缺口补齐」条 | +| 战斗循环 | 增益状态.md | 系统间契约词表与受理口径:五配方互异/掷点标签成员性/增益布尔受理;同名状态合并策略(叠加/累加/并存)与剩余次数语义;状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照);封印与极性路由/不可逆 | 部分覆盖 | 结算链剩余缺口由「断言补齐批」承接 | | 战斗循环 | 战斗结算.md | 伤害公式与掷点乘区;伤害单据编排与回放;轮内流与结算五段全序 | 已覆盖 | — | -| 战斗循环 | 战斗表现.md | 站桩敌人呈现与结算演出落点;站桩呈现定值与素材绑定;站桩显示档与素材分辨率绑定 | 部分覆盖 | 死亡灰化与减动效演出档仅探针与人工目检;见待办清单「能力清单覆盖缺口补齐」条 | +| 战斗循环 | 战斗表现.md | 站桩敌人呈现与结算演出落点;站桩呈现定值与素材绑定;站桩显示档与素材分辨率绑定 | 已覆盖 | 死亡灰化与减动效演出档以探针+人工目检为终态(2026-11-02 用户裁除名,不再补自动断言) | | 战斗循环 | 敌人系统.md | 技能池数据面与回放独立;Boss 半血解锁技门控;敌人技能池跨表链接校验 | 已覆盖 | — | | 排雷循环 | 地形变异.md | 变异布置门控;表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 已覆盖 | — | | 排雷循环 | 排雷玩法.md | 装板与开局免费展开(封锁格无资源、计入清图);挖/封印合法性与可辨拒绝(拒绝零副作用);封印不可逆与挖开封印格放行(兑付改判四情况) | 已覆盖 | — | @@ -191,13 +196,13 @@ tests/ | 表现与支撑 | 存档序列化.md | 存档写盘⇄读回往返保真;三槽位隔离与激活失败回滚;槽位摘要窥视与坏槽三态;启动态无激活不写盘;旧档迁移链与断点续玩零跳号(集成);存档⇄RNG 快照往返保真(集成) | 已覆盖 | — | | 表现与支撑 | 教学引导.md | — | 未覆盖 | 教学形态与首遇时机待设计;见待办清单「教学形态未定」条 | | 表现与支撑 | 数据配置.md | 全表装载、就绪态与表清单目录对账;进度坐标查行:精确命中/向上取整/封顶/警告去重;运行期越域致命与进程非 0 退出;加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域;表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 已覆盖 | — | -| 表现与支撑 | 设置与本地化.md | — | 未覆盖 | 减动效开关本体仅系统测试与冒烟覆盖、无单元/集成断言,多语言切换面未建;见待办清单「能力清单覆盖缺口补齐」条 | +| 表现与支撑 | 设置与本地化.md | 减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) | 部分覆盖 | 存储契约断言由「断言补齐批」承接;多语言切换面未建(P1) | | 表现与支撑 | 音频.md | — | 未覆盖 | MVP 无音频(P1 后置,无断言面);见待办清单「能力清单覆盖缺口补齐」条 | | 跨局循环 | 元进度.md | 元进度入账与锻造两轴 | 已覆盖 | — | | 跨局循环 | 天赋树.md | 天赋树购买与六键合成 | 已覆盖 | — | | 跨局循环 | 生涯.md | — | 未覆盖 | P6 后置未实装;见待办清单「「生涯」界面——冒险中数据回看的唯一承接处」条 | | 跨局循环 | 秘宝.md | 秘宝结构冻结与 12 件效果;加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域 | 已覆盖 | — | -| 跨局循环 | 锻造工坊.md | 锻造表 schema 正反与几何价格梯;元进度入账与锻造两轴 | 部分覆盖 | 价格梯仅长剑路线逐级验,GDD 无验收标准节(机检豁免在册);见待办清单「能力清单覆盖缺口补齐」条 | +| 跨局循环 | 锻造工坊.md | 锻造表 schema 正反与几何价格梯;元进度入账与锻造两轴;锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用);锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) | 部分覆盖 | 六缺口(全路线价格梯/多级购买扣款/拒购零副作用/祝福件零泄漏/默认值解耦/甲型双轴)由「断言补齐批」承接 | ## 断言计数双口径(2026-10-08 迭代 19 卡① T4 订正) diff --git a/reports/需求卡片-断言补齐批-2026-11-02.md b/reports/需求卡片-断言补齐批-2026-11-02.md new file mode 100644 index 00000000..042e3259 --- /dev/null +++ b/reports/需求卡片-断言补齐批-2026-11-02.md @@ -0,0 +1,174 @@ +# 需求卡片:断言补齐批(2026-11-02) + +> 一句话:为①增益状态结算链、②减动效开关存储、⑤Boss 出场门控、⑥锻造工坊结构四域补自动化断言——零行为改动、纯测试补齐,同批刷新能力清单缺口口径。 +> 来源:待办清单条目「能力清单覆盖缺口补齐——六类无断言面或设计未定项」(2026-10-29 登记,来源=会话提及)。 + +## 设计事实源 + +| 域 | 设计依据(唯一事实源) | 版本凭据 | +|---|---|---| +| ⑥ 锻造工坊 | `design/gdd/systems/跨局循环/锻造工坊.md` 验收标准节九条判据 | v0.11(2026-11-02) | +| ① 增益状态 | `design/gdd/systems/战斗循环/增益状态.md` 结算链规则 | v1.4 | +| ⑤ 难度曲线与Boss | `design/gdd/systems/冒险循环/难度曲线与Boss.md` 核心规则(机制面) | v1.2 | +| ② 减动效开关 | `design/gdd/systems/表现与支撑/设置与本地化.md`(开关承诺)+ `design/gdd/ux/battle.md`(减动效双态承诺:延迟归零同帧直落+横幅静态化、可加速不可整体跳过) | v1.1 | + +与待办清单条目 8 凭据(实况关联文档清单)一致;增益状态.md 以本表 v1.4 为准,待办条目实况中的 v1.1 记法由本批订正。 + +## 目标与完成定义 + +为条目 8 收窄后的四域剩余真缺口补 **13 个新断言函数+2 处既有函数扩展**;断言全数通过;能力清单(`game/tests/README.md`)同步刷新(5 行新增能力行+5 行覆盖域表缺口句订正)。 +完成定义=全部断言在当轮真实跑批中执行并通过+代码域闸全绿+合回后本地 CI 全量域闸全绿。 + +## 现状事实(代码级考证,2026-11-02) + +### ① 增益状态结算链(game/core/status_container.gd) + +- 授予路由:`apply_effect` :28-49 按 stack_policy 三臂路由(independent :41-43/accumulate :44-45/stack :46-47)。 +- 叠层/续时:`_apply_accumulate` :60-67(命中只加时长、层数恒 1、快照沿首授);`_apply_stack` :70-80(满层拒返 false、层数与时长零写入)。 +- 衰减:`decay_round` :121-134(先兑付后衰减、每实例每结算恰 −1、归 0 移除、返回移除数 k)。 +- 清除:`notify_battle_end` :137-143(战斗结束全清);`notify_battle_start` :16-22(开域+清残留)。 +- 可观测面:返回值 bool/int+只读投影 `query_active(side)`(effect_id/layers/remaining_settlements/effective_value=L×m)。 +- 已盖面(不动):迭代 48 卡①(git 1e35ab94)已盖叠层续时 V1/V2/V3(`roll_multiplier_test.gd:_smoke_armor_roll` :160-167);五段全序与衰减相位断言(`round_flow_skill_pool_test.gd:_smoke_settlement_segments` :382-449)。 +- 剩余缺口:衰减逐值与到期移除数、战斗结束全清、满层拒绝、independent 分支、快照沿首授——全部零断言(notify_battle_end 全测试目录零调用,grep 证实)。 + +### ② 减动效开关存储(game/presentation/settings_store.gd) + +- 独立设置存储(不进存档):user://settings.cfg 节/键 motion/reduced(读 :26、写 :33);`reduced_motion` 默认 false(:12)。 +- 引擎档应用:`apply()` :38-45(reduced → UiKit.motion_scale=0.5,否则 1.0)。 +- 已盖面(不动):探针全链(`ui_click_probe.gd` 设置面段 :310-327:开→0.5、持久化回读、关→1.0);系统测试 V2b(`system_test.gd` :166-168);单元侧排播双态(`pacing_queue_test.gd` :120-125,直拨 UiKit.motion_scale 不经 store)。 +- 剩余缺口:store 本体零单元断言(持久化回读/缺省值/应用链);README :194 缺口句仍写「仅系统测试与冒烟覆盖」,与现役探针覆盖不符——本批订正。 + +### ⑤ Boss 出场门控(机制面) + +- 门控链:`node_map_generator.gd` `_build_region` :338-352(每区域 boss 深度=L−r、恰一终点)→ `level_runner.gd:546` node_type 入参 → `battle_orchestrator.gd:283` row_kind 传参 → `config_db_resolver.gd:33-67` 行类路由(越域 fatal :41-43)→ boss 行集选出。 +- Σ×r_boss 无运行时承载(Boss hp 行值直填 enemy.tres;difficulty_table.gd:2-3 头注成文口径「Boss 数值走行值直填不经本表」)——本批不造运行时公式断言。 +- 已盖面(不动):resolver 路由与 clamp(`config_db_resolver_test.gd` 四函数);表侧 Boss 行集带键覆盖(`table_structure_guard_test.gd:_smoke_enemy_bands` :242-259);半血门与闩(`skill_unlock_test.gd`)。 +- 剩余缺口:每区域恰一 Boss 终点无专项断言(`node_map_generator_test.gd` 只断终点数与入口数 :79-89);「Boss 节点开战必选 boss 行集」端到端无直接断言。 + +### ⑥ 锻造工坊(meta_progression.gd+forge_table.gd+shop_session.gd) + +- 解锁双通道单点:`_forge_route_unlocked` meta_progression.gd:126-139(初始持有∨直购∨练满前一档);直购写口 `forge_buy_unlock` :160-170(已解锁拒绝零收费),解锁价 200(forge.tres)。 +- 定价:`forge_table.gd:24-28` level_price = floor(基价 × (公比/100)^已购级数);表值基价 20/公比 150(forge.tres)。 +- 注入:`hero_override` :270-293(树淬炼 :280-288、分层相加 :289-293、树攻防恒 0);`_forge_axis_bonus` :297-302(只认选中路线、异常回退 0);参数面下传 main.gd:191-201;入账 adventure_runner.gd:89-97。 +- 默认值常驻:`hero_type_axes` :188-198(未点亮照常返回 normal/light)+ forge.tres:7-8 默认轴。 +- 拒购:`forge_buy_level` :144-155;余额闸零副作用(`meta_state_store.gd:18-22` spend_keystone 余额不足 return false 零写入)。 +- 存档:save_manager v7 forge_routes 域 :267-272(默认 weapon=sword/armor=light)+normalize 补齐 :295-311。 +- 祝福件通道:局内商店购买(shop_session.gd:71-91 legacy/:272-293 pool)写局内加算区(GP 币),与 forge_routes 代码零交集;绑定负断言零测试。 +- 已盖面(不动):双通道/锁死/公式对拍/树零攻防(`meta_progression_forge_test.gd` :432-455、:476-541);锁定态/两区三行/钮态(`forge_workbench_test.gd` :42-99);长剑价格梯纯函数(`forge_table_test.gd:_test_price_ladder` :91-99);购买链首两级(:411-420)。 +- 剩余缺口:全路线价格梯(非长剑四路线零梯断言)、购买链 45 档、拒购零副作用、祝福件零泄漏、默认值解耦、甲型双轴切换。 + +## 设计契约红线 + +- 🔴 **零行为改动**:本批只增测试断言与 README 能力行;禁触产品码、禁触 data/tables 行值——断言需要观测面而现役无 → 停卡呈报,禁为可测性改产品码(需求改动另走卡)。 +- 🔴 **判据绑可观测提交面**(test-conventions §8.4);禁变异类测试、禁撤销类取证。 +- 🔴 **RNG 单点**:⑤ 集成断言用固定种子经 RngService 封闭流,禁 randomize()/自建 RNG。 +- 🔴 **实现照单落名**:README 代表用例名=测试函数名唯一依据,名实不符=停卡退回写卡段;断言失败消息尾缀〔断言补齐批 Vn〕全仓可 grep。 +- 🔴 **测试削弱申报**:本批不删不改任何既有断言(迭代 48 V1-V3 零触碰);无允许削弱项。 +- 🔴 **Forge 表行值零触碰**(provisional 形态归 M4 数值批)。 + +## 范围边界 + +**做**:13 个新断言函数+2 处既有函数扩展+README 能力行增行与覆盖域表缺口句订正。 + +**不做**:②多语言(P1 功能缺口);③音频(P1 后置);⑤数值落带断言(provisional 归 M4);④死亡灰化/碎裂断言(2026-11-02 用户裁除名,探针+人工目检为终态);Σ×r_boss 运行时公式断言(无运行时承载,不造);满级特效(本期不做);为可测性改产品码(需求改动另走卡)。 + +## 关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| `game/tests/README.md` 覆盖域表 | 断言落地后覆盖状态变化(:180/:182/:184/:194/:200 五行) | 状态列翻转登记进反哺点清单,由用户裁决后归文档批落文(实现批禁写 README);缺口句订正属写卡段维护面,本批当场落 | +| 两份 GDD(难度曲线与Boss/锻造工坊) | 断言绑定其验收标准节/规则节 | 无义务——零触面 | + +## 任务卡 T0..T4 + +**T0 ①增益状态结算链断言(≈0.5 工作日)** + +- [ ] T0-1 `game/tests/unit/contracts/system_contracts_test.gd` 新增四函数:`_test_status_decay_and_clear`〔V1/V2〕(衰减每结算恰 −1、归 0 移除并返回移除数 k;notify_battle_end 后 query_active 零行);`_test_status_stack_full_reject`〔V3〕(满层再授返 false、层数与 remaining 零写入);`_test_status_independent_branch`〔V4〕(直改已加载表 rows 追加 independent 试验行→授予两实例→并存独立结算,测毕还原);`_test_status_snapshot_first_grant`〔V5〕(accumulate 再授只加时长,origin_cell/round_index 沿首授) +- [ ] T0-2 单元套全绿——里程碑步出口跑一次全套闸;波内修复只做出红最小单元的最窄确认 + +**T1 ②设置存储契约断言(≈0.5 工作日)** + +- [ ] T1-1 新建 `game/tests/unit/presentation/settings_store_test.gd` 三函数:`_test_settings_roundtrip`〔V6〕(写 true→存→新实例回读 true,节/键 motion/reduced);`_test_settings_default`〔V7〕(无文件缺省 false);`_test_settings_apply_chain`〔V8〕(reduced→apply()→UiKit.motion_scale==0.5,false→1.0,测毕还原静态初值);隔离卫生:经 retarget() 指向临时 cfg,禁碰真实 user://settings.cfg(ui_click_probe 同款纪律) +- [ ] T1-2 单元套全绿(同 T0-2 措辞) + +**T2 ⑤Boss 门控断言(≈0.5 工作日)** + +- [ ] T2-1 `node_map_generator_test.gd` 新增 `_test_boss_exit_per_region`〔V9〕(真实生成多区域图,每区域终点集恰一 type=="boss"、深度=区域深度 L−r) +- [ ] T2-2 新建 `game/tests/unit/battle_settlement/boss_gate_test.gd`:`_test_boss_node_spawns_boss_rowset`〔V10〕(begin_battle(node_type="boss")→实例化敌人行键全部 row_kind=="boss";对照入参 node_type="battle" 预解析行集零 boss 行;固定种子经 RngService 流口) +- [ ] T2-3 单元套全绿(同 T0-2 措辞) + +**T3 ⑥锻造工坊断言(≈1 工作日)** + +- [ ] T3-1 扩展 `forge_table_test.gd:_test_price_ladder`〔V11〕:六路线全量梯(逐级严格递增、floor 公式按表值推算不写死表值、满级档价=上限档) +- [ ] T3-2 扩展 `meta_progression_forge_test.gd:_meta_pricing_and_buy`〔V12〕:长剑购买链走至 3 级(45 档扣款与余额递减断言) +- [ ] T3-3 新增 `_test_forge_buy_reject`〔V13〕(余额不足与未解锁两路→false,等级与余额零变化) +- [ ] T3-4 新增 `_test_blessing_no_forge_leak`〔V14〕(商店买攻击祝福+护甲祝福→forge_state 投影逐位不变) +- [ ] T3-5 新增 `_test_default_axes_pre_key`〔V15〕(树钥匙未点亮→hero_type_axes 返回 normal/light) +- [ ] T3-6 新增 `_test_armor_switch_dual_axes`〔V16〕(forge_select("heavy")→AC 轴 +2 且挨普通攻击修正 −1;切回 light 复原且等级保留) +- [ ] T3-7 单元套全绿(同 T0-2 措辞)——里程碑步出口跑一次全套闸;波内修复只做出红最小单元的最窄确认 + +**T4 产出物落位卡(≈0.25 工作日)** + +- [ ] T4-1 合并前写齐 `reports/iterN-实现报告-<日期>.md`(各卡状态+遗留读数义务+实现决定记录;本批零实机目检项——纯断言批无玩家可见面) +- [ ] T4-2 合并前写齐 `reports/iterN-反哺点-<日期>.md`(覆盖域表五行状态列翻转与缺口句收敛,逐条写明落点与依据;实现批禁写 design/ 与根规则文件) + +## 验证闸(改动—验收对照表) + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---| +| 增益衰减逐值与到期移除+战斗结束全清 | system_contracts_test.gd 新增一函数 | `_test_status_decay_and_clear`〔V1/V2〕 | 单元 | StatusContainer.apply_effect()/decay_round()/notify_battle_end() | 返回值+query_active 投影 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) | +| 增益满层拒绝 | 同上文件新增一函数 | `_test_status_stack_full_reject`〔V3〕 | 单元 | StatusContainer.apply_effect() | 返回 false+投影层数/时长零变化 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) | +| 增益独立并存+首授快照 | 同上文件新增两函数 | `_test_status_independent_branch`〔V4〕/`_test_status_snapshot_first_grant`〔V5〕 | 单元 | StatusContainer.apply_effect()+直改已加载表行(试验行) | 返回值+投影快照域 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) | +| 减动效存储回读/缺省/应用链 | settings_store_test.gd 新文件三函数 | `_test_settings_roundtrip`〔V6〕/`_test_settings_default`〔V7〕/`_test_settings_apply_chain`〔V8〕 | 单元 | SettingsStore.load_settings()/save_settings()/apply() | ConfigFile 回读值+UiKit.motion_scale | 新增:减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) | +| 每区域恰一 Boss 终点 | node_map_generator_test.gd 新增一函数 | `_test_boss_exit_per_region`〔V9〕 | 单元 | NodeMapGenerator.generate() | 生成图节点 type/depth 投影 | 新增:Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) | +| Boss 节点开战必选 Boss 行集 | boss_gate_test.gd 新文件一函数 | `_test_boss_node_spawns_boss_rowset`〔V10〕 | 集成 | BattleOrchestrator.begin_battle() | 实例化敌人行键 row_kind 投影 | 新增:Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) | +| 全路线价格梯+多级购买扣款 | forge_table_test 扩展+meta_progression_forge_test 扩展 | `_test_price_ladder`(扩)〔V11〕/`_meta_pricing_and_buy`(扩)〔V12〕 | 单元 | ForgeTable.level_price()/MetaProgression.forge_buy_level() | 表值推算序列+扣款与余额递减 | 新增:锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用) | +| 拒购零副作用 | meta_progression_forge_test 新增一函数 | `_test_forge_buy_reject`〔V13〕 | 单元 | MetaProgression.forge_buy_level() | 返回 false+余额/等级零变化 | 新增:锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用) | +| 祝福件零泄漏 | meta_progression_forge_test 新增一函数 | `_test_blessing_no_forge_leak`〔V14〕 | 单元 | 商店购买口(shop_session 两条购买路径) | forge_state 投影逐位不变 | 新增:锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) | +| 默认值解耦+甲型双轴 | meta_progression_forge_test 新增两函数 | `_test_default_axes_pre_key`〔V15〕/`_test_armor_switch_dual_axes`〔V16〕 | 单元 | MetaProgression.hero_type_axes()/forge_select() | 返回值+hero_override 投影(AC 轴+matchup 修正) | 新增:锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) | + +表外备注:`game/tests/README.md` 五行缺口句订正=非行为改动(写卡段维护面,本批当场落,见「关联文档同步面」节)。 + +## 独立验收审计 + +执行体=迭代 loop 内启动的未参与实现子代理(2026-11-02 用户裁,test-conventions §8.7 默认通道);报告落 `reports/iterN-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」。审计四件事:逐行核对对照表(测试存在、当轮执行、尾缀可 grep、真实入口未绕改动点);抽查判据绑定面;检查测试削弱(本卡申报=无允许削弱项);核对内部字段直查受控例外(本卡零直查行)。未过不得合并。 + +## 异常分级 + +- **L1 自救**:断言消息文本、局部夹具命名、扩展函数内步序。 +- **L2 记录继续**:README 新行在旅程段内的插入行位(系统归属相邻处)——记入实现决定记录。 +- **L3 停机呈报**:①independent 试验行注入不可行→停卡呈报;⑤boss_gate 集成夹具不可行→停卡呈报;⑥甲型双轴观测面不足(AC 修正不随 select 变化)→停卡呈报——观测面不足=上游缺陷,禁自造注入破坏;机检键与本卡契约互斥→停卡退回写卡段。 + +## 代拍板白名单 + +- 测试内局部命名、常量、断言消息文本。 +- 扩展函数内步序编排。 +- README 新行的旅程段内插入行位。 + +## 待裁点 + +零待裁点,开工门=U0。 + +## 落位与可复用性预检 + +**新增文件 2 个:** + +| 文件 | 职责 | 为什么不能复用既有 | +|---|---|---| +| `game/tests/unit/presentation/settings_store_test.gd` | SettingsStore 单元契约(回读/缺省/应用链) | pacing_queue_test 主题是排播节奏(直拨 UiKit 不经 store);ui_click_probe 是探针承载非单元套件(不入 run_all 单元登记);store 单元契约无既有唯一落点 | +| `game/tests/unit/battle_settlement/boss_gate_test.gd` | Boss 节点开战必选 Boss 行集端到端 | node_map_generator_test 只测图结构;config_db_resolver_test/table_structure_guard_test 只测表面路由与带键覆盖;battle_narrator_test 只测呈现投影命名——端到端链(generator→begin_battle→spawn)无既有承载 | + +**复用既有(全部扩展,不新增文件):** system_contracts_test.gd(增益状态单元契约既有宿主)、forge_table_test.gd/meta_progression_forge_test.gd(锻造既有宿主)、node_map_generator_test.gd(图结构既有宿主)。 + +**唯一面**:每条断言唯一函数承载;README 新行唯一;各新函数复用所在文件既有夹具(harness 不外散);零产品码触面。 + +**分层与交互**:全部新件在测试层(probe/sim/tests 不在 S9 扫描面,测量面直构惯例);Core 域断言经领域类公开方法进出(StatusContainer/NodeMapGenerator/MetaProgression/ForgeTable);集成断言实例化真实宿主链(battle_orchestrator),禁裸替身。 + +## 实现规范预算 + +- 新增两文件均为单元测试宿主:公开面仅 ` _init`(各文件 ≤6 个私有断言函数、零公开方法增长、成员 ≤5)——远低于 gdstyle 默认阈值(公开方法 ≤20/成员 ≤15)。 +- 存量触面:产品码零触面,S13 基线键零新增;扩展的四份存量测试件不入 gdstyle 基线(测试面直构惯例),无对账键。 + +## 拆分边界纪律 + +本卡非拆分/重构类(纯测试增补),不适用拆出单元条款;零删码,无「为机检保留无效成员」面。 diff --git a/待办清单.md b/待办清单.md index 268cd45b..3d0dd64c 100644 --- a/待办清单.md +++ b/待办清单.md @@ -58,15 +58,16 @@ #### 能力清单覆盖缺口补齐——六类无断言面或设计未定项(2026-10-29 登记,来源=会话提及) **实况**:实际情况=2026-11-02 设计讨论闭合——④除名(用户裁:死亡灰化/碎裂属纯表现锦上添花,探针+人工目检已是合规终态,呈现与 battle.md 承诺行零触碰);范围收窄:④除名后余五类,其中②多语言半边(P1 功能缺口,归 owner 文档待设计问题清单)、③音频(P1 后置)、⑤数值落带半边(归 M4 数值批)三块延期不在本条,可写卡面=①增益状态结算链、②减动效开关、⑤机制门控、⑥锻造工坊结构四处。关联文档: -- `game/tests/README.md` 覆盖域表 25 篇对照行(2026-10-29 立,缺口证据) +- reports/需求卡片-断言补齐批-2026-11-02.md(2026-11-02,本条需求卡片——已写卡凭据) +- `game/tests/README.md` 覆盖域表对照行(2026-10-29 立,缺口证据;2026-11-02 随卡刷新五行能力行与覆盖域口径) - `design/gdd/systems/跨局循环/锻造工坊.md` v0.11(2026-11-02,验收标准节九条判据落文——⑥写卡输入合同) -- `design/gdd/systems/战斗循环/增益状态.md` v1.1(2026-10-26,①结算链规则定稿) +- `design/gdd/systems/战斗循环/增益状态.md` v1.4(①结算链规则定稿) - `design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.2(⑤机制门控规则定稿;数值带 provisional 归 M4) - `design/gdd/systems/表现与支撑/设置与本地化.md` v1.1(②减动效开关与呈现承诺现行口径) **改动面**:游戏代码+工具代码 -**状态**:文档设计已闭合+待写卡 +**状态**:文档设计已闭合+已写卡 #### 战斗域结构深拆批——效果发射端口+掷格/受理分件(2026-10-31 重立,来源=批次移交)