From 4b7276f5d71c7afc8718905e5dcaef54c2bd9112 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 7 Nov 2026 06:58:39 +0800 Subject: [PATCH 1/5] =?UTF-8?q?docs(=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95):?= =?UTF-8?q?=20=E7=BB=93=E7=AE=97=E6=98=8E=E7=BB=86=E6=96=87=E6=A1=88?= =?UTF-8?q?=E5=85=A5=E8=A1=A8=E6=9D=A1=E9=80=80=E5=BD=B9=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E7=AB=8B=E9=80=90=E8=A1=8C=E6=96=87=E5=AD=97=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=80=80=E5=BD=B9=E4=B8=8E=E6=88=98=E6=96=97=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=A4=E6=9D=A1=EF=BC=882026-11-07=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BB=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户裁定:撤掉结算期逐行滚动文字列表、保留伤害飘字与攻击特效;日志零文案只存字段;战斗画面优化另立待办。日志核查结论:playtest_logger.gd:130-143 已逐行全字段落盘、开新与续玩均开会话,零缺漏,与裁定不符处是日志多带 text 与平铺 display_name 两处中文文案;动画特效走 target/target_id 不依赖行文案(battle_stage_view.gd:328-341)。08-Alpha版本标准「逐行结算排播」行定值删行(同表「战斗演出链」行已覆盖保留面),落文归文档设计段。凭据:文档域闸 --docs【验收通过】无新增红 exit=0;开工现查 5c4d6000 的 run 111 未落定(非红,不等待)。 --- 待办清单.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/待办清单.md b/待办清单.md index 7a110d22..14003875 100644 --- a/待办清单.md +++ b/待办清单.md @@ -53,11 +53,21 @@ **状态**:待文档设计 -#### 结算明细文案入表——玩家可见明细文案归属改数据表承载(2026-11-06 登记,来源=批次移交) +#### 结算期逐行文字列表退役与日志零文案(2026-11-07 登记,来源=会话提及) -**实况**:迭代 53 反哺点 4 归属裁决在案=文案入数据表行(2026-11-06 用户裁);规范句已落 [战斗结算](design/gdd/systems/战斗循环/战斗结算.md) v1.8 明细流水节(显示名等玩家可见文案=数据面字段,代码读表拼行、禁代码写死文案字串);现行代码硬编码面=结算明细扩展行标签文案(如减半标签,reward_grant.gd:226 一族)。 +**实况**:用户裁定撤掉战斗屏结算期逐行滚动的文字列表,保留伤害飘字与攻击特效;日志零文案只存字段。现行日志已逐行全字段落盘(game/presentation/playtest_logger.gd:130-143;开新/续玩均开会话,game/presentation/main.gd:247/:295)——零缺漏、无需补采,与裁定不符处是日志多带中文文案两处(text 与平铺的 display_name)。文字列表消费面=game/presentation/views/battle_log_view.gd:173-260 与 game/presentation/row_pacer.gd:100;动画特效走 target/target_id,不依赖行文案(game/presentation/views/battle_stage_view.gd:328-341)。[战斗结算](design/gdd/systems/战斗循环/战斗结算.md) v1.8 明细流水节规范句仍写「文案入表、代码读表拼行」,与本裁定相反。 -**缺口**:还差表结构设计讨论——承载表与字段形态、基础行文案是否同批入表、读表拼行接线面。 +**缺口**:还差设计讨论——文字列表退役范围(飘字与特效保留面)、日志两处中文字段清理、[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「逐行结算排播」行删行(同表「战斗演出链」行已覆盖保留面)、[battle](design/ux/battle.md) 不可整体跳过承诺与[战斗表现](design/gdd/systems/战斗循环/战斗表现.md) 因果可读验收判据改写。 + +**改动面**:文档+游戏代码 + +**状态**:待文档设计 + +#### 战斗画面优化——动画演出与美术表现(2026-11-07 登记,来源=会话提及) + +**实况**:用户令单独立条,专门承接战斗画面优化;文字列表退役先行,本条开工待用户发令。承接面=[战斗表现](design/gdd/systems/战斗循环/战斗表现.md) 输入清单(受击/弹道/退场/来源格可读化/高光兑现强化)与 P1 后置行;现行动画基础=站桩闪白/弹道/灰化(game/presentation/views/battle_stage_view.gd:327-363),演出链已在 [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md) 标在役。美术资产按用户自立批处理,本条不代跑。 + +**缺口**:还差画面优化的设计讨论——动画密度与节奏、素材范围、验收判据(战斗表现.md:149「能说出这一行来自哪步操作」须改写)。 **改动面**:文档+游戏代码 From 9f21236f8044b9bb5dfaf48778f0fa66ea398bcb Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 7 Nov 2026 07:11:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E8=AF=8D=E6=8D=A2=E4=BB=A3=C2=B7oracle?= =?UTF-8?q?=E2=86=92=E5=88=A4=E6=8D=AE=E5=87=BA=E5=A4=84):=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=202026-11-07=20=E4=BB=A4=E2=80=94=E2=80=94=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E5=87=BA=E5=A4=84=E6=B3=A8=E8=AE=B0=E7=9A=84=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E8=AF=8D=E6=94=B9=E7=94=A8=E9=A1=B9=E7=9B=AE=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E4=B8=AD=E6=96=87=E5=90=8D=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=20Oracle=20=E8=A2=AB=E8=AF=BB=E6=88=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E3=80=82=E6=B3=A8=E9=87=8A=E6=A0=BC=E5=BC=8F=E5=8F=A5?= =?UTF-8?q?=E3=80=81=E6=9C=BA=E6=A3=80=E6=AD=A3=E5=88=99=E3=80=81=E6=A0=87?= =?UTF-8?q?=E8=AF=86=E7=AC=A6=E3=80=81=E5=8D=A1=E7=89=87=E4=B8=8E=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E5=90=8C=E6=AD=A5=E6=8D=A2=E4=BB=A3=EF=BC=9B=E9=9B=B6?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=E6=94=B9=E5=8A=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改动面 112 文件 572+/572-:game/tests/** 与 game/probe/** 共 106 件 545 行 `# oracle:`→`# 判据出处:`;tools/capability_audit.py 正则字面量换中文+ORACLE_*→CRITERION_*/check_oracle_markers→check_criterion_markers/oracle_marked(flagged)→criterion_* 共 11 行;test-conventions.md:119 格式句+:155 措辞;待办清单与需求卡片-QA覆盖余量收口批各 1 处字面量;coverage_enum.py:21 与 camp_scene_layout_test.gd:101 旁支措辞;ui_click_probe.gd 对拍局部变量 oracle→expected 7 处;auto_player.gd 三处 safe_set 真值措辞。不动:历史审计报告两份、test-oracle-anchor 分支名、git 史、生成日志;指针格式/扫描面/判红条件/验收义务全不变。 读数(区内实跑):改前 capability_audit --strict「417 注记函数·红项 0」→改后「417 判据出处注记函数·红项 0」exit=0;新标记 545 行/106 文件,现行义务面 oracle 残留 0(在册沿革除外);diff 自检 game/ 非注释新增行仅 6 行且全在 ui_click_probe.gd 的 expected 变量段;112 改动文件 CRLF=0;py_compile tools/capability_audit.py OK;--docs exit=0【验收通过】无新增红;--gates exit=0(静态扫描绿、闸壳 bash -n ×13 失败 0)。 --- design/engineering/test-conventions.md | 4 +- game/probe/board_shot_probe.gd | 6 +- game/probe/fx_probe.gd | 2 +- game/probe/fx_shot_probe.gd | 6 +- game/probe/layout_probe.gd | 4 +- game/probe/level_map_shot_probe.gd | 6 +- game/probe/level_map_viewport_probe.gd | 22 +++---- game/probe/probe_coverage_recorder.gd | 2 +- game/probe/screen_flow_probe.gd | 26 ++++----- game/probe/shot_probe.gd | 22 +++---- game/probe/t17_defer_probe.gd | 2 +- game/probe/type_glow_shot_probe.gd | 2 +- game/probe/ui_click_probe.gd | 58 +++++++++---------- game/probe/ui_contrast_probe.gd | 2 +- game/probe/ui_input_probe.gd | 24 ++++---- game/probe/ui_probe.gd | 28 ++++----- game/probe/ui_struct_probe.gd | 22 +++---- game/probe/ui_tune_probe.gd | 12 ++-- game/sim/auto_player.gd | 6 +- game/tests/smoke_boot.gd | 6 +- game/tests/system_test.gd | 16 ++--- .../unit/battle_settlement/boss_gate_test.gd | 4 +- .../damage_controller_test.gd | 26 ++++----- .../battle_settlement/damage_math_test.gd | 10 ++-- .../battle_settlement/effect_port_test.gd | 8 +-- .../extended_row_violation_test.gd | 2 +- .../battle_settlement/refresh_feats_test.gd | 26 ++++----- .../battle_settlement/roll_multiplier_test.gd | 14 ++--- .../round_flow_skill_pool_test.gd | 30 +++++----- .../battle_settlement/seal_polarity_test.gd | 32 +++++----- .../settlement_wiring_snapshot_test.gd | 2 +- .../battle_settlement/skill_unlock_test.gd | 10 ++-- .../battle_settlement/trigger_cond_test.gd | 2 +- .../variant_placement_test.gd | 8 +-- .../tests/unit/contracts/source_guard_test.gd | 4 +- .../unit/contracts/system_contracts_test.gd | 50 ++++++++-------- game/tests/unit/core/adventure_feats_test.gd | 8 +-- .../unit/core/auto_player_deduce_test.gd | 2 +- .../unit/core/battle_driver_drive_test.gd | 8 +-- game/tests/unit/core/board_gen_reward_test.gd | 10 ++-- game/tests/unit/core/board_generator_test.gd | 14 ++--- .../tests/unit/core/breakpoint_resume_test.gd | 2 +- .../core/config_db_cross_validator_test.gd | 8 +-- .../unit/core/config_db_resolver_test.gd | 14 ++--- .../unit/core/curio_refresh_paid_test.gd | 2 +- game/tests/unit/core/effect_words_t1_test.gd | 2 +- .../unit/core/encapsulation_p2_sweep_test.gd | 12 ++-- .../unit/core/encapsulation_sweep_test.gd | 20 +++---- game/tests/unit/core/feat_vouchers_test.gd | 2 +- game/tests/unit/core/hero_ledger_test.gd | 2 +- .../unit/core/level_map_type_vis_test.gd | 18 +++--- .../unit/core/level_shop_economy_test.gd | 28 ++++----- .../unit/core/level_table_validate_test.gd | 8 +-- .../unit/core/meta_progression_forge_test.gd | 22 +++---- .../tests/unit/core/minesweeper_rules_test.gd | 14 ++--- .../unit/core/node_map_generator_test.gd | 22 +++---- game/tests/unit/core/node_map_growth_test.gd | 10 ++-- .../unit/core/playtest_logger_guard_test.gd | 2 +- game/tests/unit/core/pool_case_d_test.gd | 10 ++-- game/tests/unit/core/run_time_fatal_test.gd | 12 ++-- .../unit/core/save_boot_no_activate_test.gd | 8 +-- .../unit/core/save_manager_domain_test.gd | 6 +- .../unit/core/save_slot_isolation_test.gd | 6 +- .../tests/unit/core/save_slot_summary_test.gd | 6 +- game/tests/unit/core/settle_segments_test.gd | 2 +- game/tests/unit/core/treasure_effects_test.gd | 2 +- game/tests/unit/core/treasure_items_test.gd | 2 +- .../unit/core/tree_requires_level_test.gd | 2 +- game/tests/unit/core/tree_rules_v11_test.gd | 4 +- game/tests/unit/cross_system_flow_test.gd | 10 ++-- .../data_config/config_db_fatal_oob_test.gd | 4 +- game/tests/unit/data_config/config_db_test.gd | 14 ++--- .../data_config/counter_prefix_fatal_test.gd | 4 +- .../data_config/effect_kind_retired_test.gd | 4 +- game/tests/unit/data_config/elite_row_test.gd | 12 ++-- .../unit/data_config/forge_table_test.gd | 10 ++-- .../unit/data_config/level_gen_params_test.gd | 8 +-- .../reward_dangling_treasure_test.gd | 4 +- .../unit/data_config/rng_service_test.gd | 10 ++-- .../unit/data_config/rng_stream_boot_test.gd | 2 +- .../data_config/table_structure_guard_test.gd | 22 +++---- .../treasure_target_violation_test.gd | 4 +- game/tests/unit/example_test.gd | 2 +- game/tests/unit/node_map_determinism_test.gd | 4 +- .../presentation/animation_frame_spec_test.gd | 6 +- .../unit/presentation/battle_narrator_test.gd | 14 ++--- .../presentation/camp_scene_layout_test.gd | 10 ++-- .../unit/presentation/confirm_dialog_test.gd | 6 +- .../unit/presentation/forge_workbench_test.gd | 4 +- .../unit/presentation/hud_presenter_test.gd | 8 +-- .../presentation/level_map_info_fog_test.gd | 16 ++--- .../unit/presentation/modal_flow_test.gd | 2 +- .../unit/presentation/pacing_queue_test.gd | 6 +- .../palette_token_pairwise_test.gd | 4 +- .../presentation/player_copy_sweep_test.gd | 16 ++--- .../presentation_encapsulation_sweep_test.gd | 16 ++--- .../unit/presentation/reward_overlay_test.gd | 6 +- .../presentation/seal_mark_params_test.gd | 8 +-- .../unit/presentation/settings_store_test.gd | 8 +-- .../presentation/stage_background_test.gd | 14 ++--- .../presentation/standee_fx_sweep_test.gd | 2 +- .../standee_present_values_test.gd | 4 +- .../presentation/terrain_tile_sets_test.gd | 8 +-- .../presentation/theme_projection_test.gd | 24 ++++---- .../tune_sim_batch_parity_test.gd | 4 +- .../tests/unit/presentation/type_glow_test.gd | 12 ++-- .../unit/presentation/ui_font_asset_test.gd | 2 +- game/tests/unit/save_rng_roundtrip_test.gd | 6 +- .../需求卡片-QA覆盖余量收口批-2026-11-07.md | 2 +- tools/capability_audit.py | 22 +++---- tools/coverage_enum.py | 2 +- 待办清单.md | 2 +- 112 files changed, 572 insertions(+), 572 deletions(-) diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md index 0550d090..1f6612fe 100644 --- a/design/engineering/test-conventions.md +++ b/design/engineering/test-conventions.md @@ -116,7 +116,7 @@ **判据出处行锚(2026-11-05 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改,被编入迭代开工前由写卡段按本粒度补挂)**:对照表「需求点」列每行必须带**判据出处行锚**——该行验收判据所依据的现行文档句子,格式「`<文档相对路径>:<行号>`」。现行文档=`design/` 全域现行文档(含 `ux/` 交互规格与 art-bible 的判据行);已退役的需求卡片不是现行文档,不得充当判据出处。作用=断言预期值从规格句抄出,不从实现反推:实现行为与规格句冲突时断言红;规格缺席的行写不出锚,即停卡退回写卡段(那是需求澄清缺口,不是测试缺口)。机检=`tools/pipeline_gate.py` 判据 C5(锚格式与指向存在性,按卡文件名日期分流)+`tools/capability_audit.py` 链式锚检查(断言→套件→能力行→系统文档,见 §8.9)。 -**测试函数的判据出处注记(2026-11-06 立)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# oracle: :<行号> <判据一句>`」——指针在前、判据摘要句在后,断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;被指规格句改行号时随批维护指针——死指针即红。局限如实声明:注记是被动文本,句内容改而行数不变时机检抓不到(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+指针存在性;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。 +**测试函数的判据出处注记(2026-11-06 立)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: :<行号> <判据一句>`」——指针在前、判据摘要句在后,断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;被指规格句改行号时随批维护指针——死指针即红。局限如实声明:注记是被动文本,句内容改而行数不变时机检抓不到(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+指针存在性;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。 **验收档申报(2026-11-04 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改)**:每张需求卡片在头部信息区(与设计事实源声明同区)申报一个验收档,三档:高/中/低。判据=失败代价单维——这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低。一张卡触多档按最高档申报;申报由写卡段落笔,用户批卡(U0)时确认或改判。档位只调节 §8.7 审计深度——闸机与 CI 的域划分、选闸算法、全量强制档一概不因档位变化,真实入口、判据绑定面、禁削弱等验收闭合判据全部照旧。未申报档位的卡一律按高档全量审计。机检=`tools/pipeline_gate.py` 判据 C4:卡内须含「验收档:高/中/低」申报行。 @@ -152,7 +152,7 @@ 2. 抽查判据绑定面:断言从真实入口进入、钉在被测改动的特有可观测提交面上,且当轮真实跑批执行过; 3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。 4. 核对内部字段直查的受控例外:直查行是否已在对照表注明理由(该行为无公开可观测面可钉)。 -5. 核对判据出处:抽查断言的预期值能否从其判据出处行锚(§8.3)的规格句独立写出——预期值只在实现里有的(同义反复,oracle 镜像实现),判红。 +5. 核对判据出处:抽查断言的预期值能否从其判据出处行锚(§8.3)的规格句独立写出——预期值只在实现里有的(同义反复,判据镜像实现),判红。 **审计深度分级(2026-11-04 立)**:审计按卡内申报的验收档(§8.3)逐卡定深度;梯度只落在昂贵的判断件上,机械且堵造假向量的两件(削弱检查、例外核对)三档全保留不抽。中/低档省略的测试复跑以远端 CI 读数为执行证据——`tools/ci_check.sh <合并提交>` 的现查输出(commit+run 号+conclusion)是机器产物,run 号在远端永久可复核,审计报告照抄该行即可;照抄前先核对读数必须是「绿」——「未验」(零触发批跑闸步全跳过)与「不可判」不作证据,那种批的回补办法是等一次含代码面的合回或用户自发全量回归(2026-11-04 用户裁:回执等待件退役,证据由落盘文件改为现查读数;「不采信实现者自述已全绿」的口径不变): diff --git a/game/probe/board_shot_probe.gd b/game/probe/board_shot_probe.gd index 76dcdade..325c4c19 100644 --- a/game/probe/board_shot_probe.gd +++ b/game/probe/board_shot_probe.gd @@ -26,7 +26,7 @@ var _cur_settlement = null # 当关 settlement(身份回调读取面—— func _ready() -> void: -# oracle: design/engineering/test-conventions.md:84 (棋盘截图取证——渲染闸采集组) +# 判据出处: design/engineering/test-conventions.md:84 (棋盘截图取证——渲染闸采集组) # 运行前提=窗口化真渲染面(shot_probe 同款护栏——headless 下 frame_post_draw 永不触发+视口纹理恒空) if DisplayServer.get_name() == "headless": print("[board_shot] FAIL — 本探针必须窗口化运行(headless 无渲染面,截图必空);现行事实源=tools/render_gate.sh 取证段") @@ -182,7 +182,7 @@ func _ready() -> void: # 判据:环外径像素 ÷ 格边 落 0.82±1px;封印格最外圈 1px 框最暗值与相邻未封印未开格同位框最暗值差 ≤1/255 #(halo 在 0.455×格边归零——格边框不应被压暗;相邻未开格同砖纹理同套瓦片为无封印参照)。 func _seal_evidence(tag: String, view: Node, settlement: Object, off_img: Image, out: String) -> void: -# oracle: design/engineering/test-conventions.md:84 (封印印记像素取证组) +# 判据出处: design/engineering/test-conventions.md:84 (封印印记像素取证组) var ms = settlement.minesweeper var seal_cell := Vector2i(-9, -9) var ref_cell := Vector2i(-9, -9) @@ -290,7 +290,7 @@ func _probe_identity_lookup(c: Vector2i): # 双帧逐像素比对:所有变化像素必须落在生效格的内缘带内 # (de < cell÷8——带外含砖心零侵入=禁整格染色/禁越圈);每个生效格须有实绘像素(不空转)。 func _check_dual_frames(tag: String, view, glow_cells: Dictionary, off_img: Image, on_img: Image) -> void: -# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) var board = view.board() if board == null: _problems.append("%s 双帧比对取板失败(view.board() 为 null)" % tag) diff --git a/game/probe/fx_probe.gd b/game/probe/fx_probe.gd index 5ea3d1ad..365a8d6b 100644 --- a/game/probe/fx_probe.gd +++ b/game/probe/fx_probe.gd @@ -8,7 +8,7 @@ extends Node func _ready() -> void: -# oracle: design/gdd/systems/战斗循环/战斗表现.md:148 (结算演出——挖掘期零打扰组) +# 判据出处: design/gdd/systems/战斗循环/战斗表现.md:148 (结算演出——挖掘期零打扰组) await get_tree().process_frame var problems: Array = [] diff --git a/game/probe/fx_shot_probe.gd b/game/probe/fx_shot_probe.gd index 71c2daa7..a953779b 100644 --- a/game/probe/fx_shot_probe.gd +++ b/game/probe/fx_shot_probe.gd @@ -21,7 +21,7 @@ var _problems: Array = [] func _ready() -> void: -# oracle: design/engineering/test-conventions.md:84 (特效截图取证——渲染闸采集组) +# 判据出处: design/engineering/test-conventions.md:84 (特效截图取证——渲染闸采集组) var args := OS.get_cmdline_user_args() out_dir = args[0] if args.size() >= 1 and args[0] != "" else "user://qa-fx" DirAccess.make_dir_recursive_absolute(out_dir) @@ -108,7 +108,7 @@ func _ready() -> void: func _snap(tag: String) -> void: -# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) await RenderingServer.frame_post_draw var img: Image = get_viewport().get_texture().get_image() if img == null or img.is_empty(): @@ -118,7 +118,7 @@ func _snap(tag: String) -> void: func _fail(msg: String) -> void: -# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) _problems.append(msg) push_error("[fx_shot_probe] FAIL — " + msg) get_tree().quit(1) diff --git a/game/probe/layout_probe.gd b/game/probe/layout_probe.gd index 3b9f88e1..e0e8ddf9 100644 --- a/game/probe/layout_probe.gd +++ b/game/probe/layout_probe.gd @@ -19,7 +19,7 @@ var _est_reads: Dictionary = {} # 逐档 13/14 板推定读数留痕(label func _ready() -> void: -# oracle: design/gdd/systems/表现与支撑/HUD框架.md:264 (战斗屏三区几何与棋盘格边长——分辨率档位组) +# 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:264 (战斗屏三区几何与棋盘格边长——分辨率档位组) await get_tree().process_frame var main: Node = load("res://presentation/main.tscn").instantiate() add_child(main) @@ -59,7 +59,7 @@ func _ready() -> void: # 一份不变量断言,逐档代入——代码量与档数无关 func _check_one(label: String, main: Node) -> void: -# oracle: design/gdd/systems/表现与支撑/HUD框架.md:264 (单档几何断言组) +# 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:264 (单档几何断言组) var vr: Rect2 = get_viewport().get_visible_rect() if vr.size != Vector2(VIEWPORTS[0]["size"]) and vr.size.y < 1.0: _problems.append("[%s] 逻辑视口退化 %s" % [label, vr.size]) diff --git a/game/probe/level_map_shot_probe.gd b/game/probe/level_map_shot_probe.gd index a201979c..f637f333 100644 --- a/game/probe/level_map_shot_probe.gd +++ b/game/probe/level_map_shot_probe.gd @@ -11,7 +11,7 @@ extends Node const SEED_L3 := 910212 # 深图固定种子(与 level_map_viewport_probe 同源——图确定性承载) func _ready() -> void: -# oracle: design/engineering/test-conventions.md:84 (关卡画面截图取证——载入守卫组) +# 判据出处: design/engineering/test-conventions.md:84 (关卡画面截图取证——载入守卫组) var args := OS.get_cmdline_user_args() var out_dir := args[0] if args.size() > 0 else "user://" await get_tree().process_frame @@ -45,7 +45,7 @@ func _settle() -> void: func _make_runner(entry: bool, node_id: int): -# oracle: design/engineering/test-conventions.md:84 (判定上报通道——验证函数组) +# 判据出处: design/engineering/test-conventions.md:84 (判定上报通道——验证函数组) var rng = load("res://core/rng_service.gd").new() rng.new_adventure(SEED_L3) var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng) @@ -85,7 +85,7 @@ func _deepest_with_outs(screen, runner) -> int: func _shot(out_dir: String, fname: String) -> void: -# oracle: design/engineering/test-conventions.md:84 (判定上报通道——验证函数组) +# 判据出处: design/engineering/test-conventions.md:84 (判定上报通道——验证函数组) DirAccess.make_dir_recursive_absolute(out_dir) # 落盘目录自建(save_png 对缺目录静默失败——刷新链不预建) var img := get_viewport().get_texture().get_image() var err := img.save_png(out_dir.path_join(fname)) diff --git a/game/probe/level_map_viewport_probe.gd b/game/probe/level_map_viewport_probe.gd index a83c93d3..42118dbe 100644 --- a/game/probe/level_map_viewport_probe.gd +++ b/game/probe/level_map_viewport_probe.gd @@ -22,14 +22,14 @@ var _runner # 当前停点的单关 runner(open_choices 驱动随记—— func _check(desc: String, ok: bool) -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) _checks += 1 if not ok: _problems.append(desc) func _ready() -> void: -# oracle: design/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组) +# 判据出处: design/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组) await get_tree().process_frame await get_tree().process_frame var host := Control.new() @@ -62,7 +62,7 @@ func _ready() -> void: ## R1 浅图整幅居中无裁切+画布入视口件承载(画布=视口首子件——setup 注入序) func _probe_shallow_no_crop(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (浅层不裁切组) +# 判据出处: design/ux/level-map.md:3 (浅层不裁切组) _runner = _make_runner_entry(1, SEED_L1) screen.open_choices(_cand_nodes(_runner), _runner) await get_tree().process_frame @@ -81,7 +81,7 @@ func _probe_shallow_no_crop(screen, vp) -> void: ## R5 前置+深图入口停点:锚点=入口组包围盒中心夹紧(spec :101——多入口并列取包围盒居中) func _probe_deep_entry_clamp(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (深层入口钳制组) +# 判据出处: design/ux/level-map.md:3 (深层入口钳制组) _runner = _make_runner_entry(3, SEED_L3) screen.open_choices(_cand_nodes(_runner), _runner) await get_tree().process_frame @@ -175,7 +175,7 @@ func _probe_clamp_bounds_and_columns(screen, vp) -> void: ## R6 拖拽不触发选路提交;阈值另一侧完整点击仍提交(提交语义零改动) func _probe_drag_no_submit(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) # 重建到中段可居中停点(候选=停点出边——候选节点居屏中可拖可达) var stops := _centerable_stops(screen, vp) if stops.size() < 3: @@ -214,7 +214,7 @@ func _probe_drag_no_submit(screen, vp) -> void: ## R2 停点切换后当前节点居中(视口中线投影 x=640±2——视口满屏宽即屏中线) func _probe_follow_anchor(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) var stops := _centerable_stops(screen, vp) if stops.size() < 3: _problems.append("R2 可居中停点不足(=%d)" % stops.size()) @@ -230,7 +230,7 @@ func _probe_follow_anchor(screen, vp) -> void: ## R7 平滑滚动有 tween 中间帧;减动效开=位置即达(画布坐标域判定) func _probe_smooth_scroll_reduced_motion(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) var saved_scale: float = UiKit.motion_scale UiKit.motion_scale = 1.0 var stops := _centerable_stops(screen, vp) @@ -270,7 +270,7 @@ func _probe_smooth_scroll_reduced_motion(screen, vp) -> void: ## R8 指引件可见性与几何(深图超窗——像素级判据②③) func _probe_guidance_chrome(screen, vp) -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) var band_l: Control = vp.get_node_or_null(NodePath("FadeL")) var band_r: Control = vp.get_node_or_null(NodePath("FadeR")) var chip: Control = vp.get_node_or_null(NodePath("PanHint")) @@ -302,7 +302,7 @@ func _probe_shallow_guidance_hidden(screen, vp) -> void: ## 入口停点 runner(defer_entry——选路态挂起、候选=入口节点) func _make_runner_entry(level_index: int, seed_val: int): -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) var rng = load("res://core/rng_service.gd").new() rng.new_adventure(seed_val) var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng) @@ -313,7 +313,7 @@ func _make_runner_entry(level_index: int, seed_val: int): ## 中段停点 runner(断点续玩重建——图由种子+参数档重生成同图,零 RNG 消耗) func _make_runner_at_stop(level_index: int, seed_val: int, node_id: int): -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) var rng = load("res://core/rng_service.gd").new() rng.new_adventure(seed_val) var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng) @@ -388,7 +388,7 @@ func _extreme_node(pos: Dictionary, nodes: Array, first: bool) -> Dictionary: func _finish() -> void: -# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组) +# 判据出处: design/ux/level-map.md:3 (判定上报通道——验证函数组) if _checks == 0: _problems.append("零断言执行(断言数下限闸——三硬闸③)") if _problems.is_empty(): diff --git a/game/probe/probe_coverage_recorder.gd b/game/probe/probe_coverage_recorder.gd index c13abde8..b45dcfad 100644 --- a/game/probe/probe_coverage_recorder.gd +++ b/game/probe/probe_coverage_recorder.gd @@ -199,7 +199,7 @@ func _seen_into(node: Node, keys: Array[String]) -> void: # ---- 落盘(JSONP 式 .js——file:// 页面