@@ -1,6 +1,6 @@
# 验证集清单(断言快照·冻结)
> 生成日期:2026-10-26 · 基点 commit: `5b5214f40f206498422e1bcd603a21a8393bf560 ` · 源:cross_system_flow_test.gd、node_map_determinism_test.gd、save_rng_roundtrip_test.gd、system_test.gd、damage_controller_test.gd、damage_math_test.gd、extended_row_violation_test.gd、roll_multiplier_test.gd、round_flow_skill_pool_test.gd、seal_polarity_test.gd、skill_unlock_test.gd、variant_placement_test.gd、source_guard_test.gd、system_contracts_test.gd、adventure_feats_test.gd、board_gen_reward_test.gd、board_generator_test.gd、breakpoint_resume_test.gd、config_db_cross_validator_test.gd、config_db_resolver_test.gd、curio_refresh_paid_test.gd、effect_words_t1_test.gd、feat_vouchers_test.gd、level_map_type_vis_test.gd、level_shop_economy_test.gd、level_table_validate_test.gd、meta_progression_forge_test.gd、minesweeper_rules_test.gd、node_map_generator_test.gd、node_map_growth_test.gd、pool_case_d_test.gd、save_boot_no_activate_test.gd、save_manager_domain_test.gd、save_slot_isolation_test.gd、save_slot_summary_test.gd、settle_segments_test.gd、treasure_effects_test.gd、treasure_items_test.gd、tree_requires_level_test.gd、tree_rules_v11_test.gd、config_db_fatal_oob_test.gd、config_db_test.gd、counter_prefix_fatal_test.gd、forge_table_test.gd、level_gen_params_test.gd、reward_dangling_treasure_test.gd、rng_service_test.gd、rng_stream_boot_test.gd、table_structure_guard_test.gd、treasure_target_violation_test.gd、example_test.gd、battle_narrator_test.gd、forge_workbench_test.gd、hud_presenter_test.gd、level_map_info_fog_test.gd、modal_flow_test.gd、pacing_queue_test.gd、player_copy_sweep_test.gd、reward_overlay_test.gd、standee_fx_sweep_test.gd、terrain_tile_sets_test.gd、theme_projection_test.gd、type_glow_test.gd、ui_font_asset_test.gd、test_kit.gd
> 生成日期:2026-10-27 · 基点 commit: `fa1409f491c5a77371230ed5136797182493d236 ` · 源:cross_system_flow_test.gd、node_map_determinism_test.gd、save_rng_roundtrip_test.gd、system_test.gd、damage_controller_test.gd、damage_math_test.gd、extended_row_violation_test.gd、roll_multiplier_test.gd、round_flow_skill_pool_test.gd、seal_polarity_test.gd、skill_unlock_test.gd、variant_placement_test.gd、source_guard_test.gd、system_contracts_test.gd、adventure_feats_test.gd、board_gen_reward_test.gd、board_generator_test.gd、breakpoint_resume_test.gd、config_db_cross_validator_test.gd、config_db_resolver_test.gd、curio_refresh_paid_test.gd、effect_words_t1_test.gd、feat_vouchers_test.gd、hero_ledger_test.gd、 level_map_type_vis_test.gd、level_shop_economy_test.gd、level_table_validate_test.gd、meta_progression_forge_test.gd、minesweeper_rules_test.gd、node_map_generator_test.gd、node_map_growth_test.gd、pool_case_d_test.gd、save_boot_no_activate_test.gd、save_manager_domain_test.gd、save_slot_isolation_test.gd、save_slot_summary_test.gd、settle_segments_test.gd、treasure_effects_test.gd、treasure_items_test.gd、tree_requires_level_test.gd、tree_rules_v11_test.gd、config_db_fatal_oob_test.gd、config_db_test.gd、counter_prefix_fatal_test.gd、forge_table_test.gd、level_gen_params_test.gd、reward_dangling_treasure_test.gd、rng_service_test.gd、rng_stream_boot_test.gd、table_structure_guard_test.gd、treasure_target_violation_test.gd、example_test.gd、battle_narrator_test.gd、forge_workbench_test.gd、hud_presenter_test.gd、level_map_info_fog_test.gd、modal_flow_test.gd、pacing_queue_test.gd、player_copy_sweep_test.gd、reward_overlay_test.gd、standee_fx_sweep_test.gd、terrain_tile_sets_test.gd、theme_projection_test.gd、type_glow_test.gd、ui_font_asset_test.gd、test_kit.gd
> 提取口径:静态 `check(` 调用点,括号配平归集(可跨行);缺省源=三宿主遍历
> ( unit/**+ integration/**+ system_test.gd)。本基点实测 1596 个静态调用点;行级
> `grep -c "check("` 是另一口径(含 `func check(` 定义行与注释行),两口径各自浮动,
@@ -56,7 +56,7 @@
| 21 | 169 | "诊断转储文件生成(%s) " ↩ % diag | diag.contains("diag_") | (待填) | | |
| 22 | 182 | "JSONL 全部行可解析(%d 行 = session + 2 结算)" ↩ % lines | lines >= 3 and parse_ok | (待填) | | |
## S05 _smoke_generated_map_determinism(行 43– 112 · 21 条 · 源 game/tests/integration/node_map_determinism_test.gd · 去向:待分类回填)
## S05 _smoke_generated_map_determinism(行 43– 113 · 21 条 · 源 game/tests/integration/node_map_determinism_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
@@ -65,22 +65,22 @@
| 25 | 47 | "产图节点携图内唯一句柄 id 与自入口 depth(消费侧寻址面)" | _not_empty_graph(nodes_a) and _handles_unique(nodes_a) | (待填) | | |
| 26 | 51 | "单关起关受理(种子 910004——生成图直供,无兜底图)" | runner1.start_level(2, 910004) | (待填) | | |
| 27 | 53 | "起关生效图 = 生成器同档同种子直取逐位一致(消费侧无第二图源)〔v7〕" | runner1.level_row.get("nodes", []) == (gen.generate(params2, 910004) as Dictionary).get("nodes", []) | (待填) | | |
| 28 | 59 | "冒险模式起关受理(入口停点)" | runner2.start_level_external(3, {"hero_hp": 20, "gp": 0}, {}, Callable(self, "_smoke_rest_stub"), {}, true) | (待填) | | |
| 29 | 61 | "起关产图零计数器消费(同图不依赖取数号位)" | rng_c.counter() == counter_before | (待填) | | |
| 30 | 64 | "入口停点候选数=参数档入口个数(L3 档 %d——多入口首跳即选路,禁写死单入口)〔v2〕" ↩ % entry_count | entry_count >= 1 and (runner2.next_candidates() as Array).size() == entry_count | (待填) | | |
| 31 | 68 | "第二入口经句柄显式进入(句柄 %d)〔v2〕 " ↩ % int(eids[1]) | runner2.pick_next_node(int(eids[1])) and int(runner2.current_node_id()) == int(eids[1]) | (待填) | | |
| 32 | 75 | "首局口径种子 42 开局受理(defer_entry 路径)" | adr_x.start_adventure(42, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 33 | 78 | "同种子第二次开局受理" | adr_y.start_adventure(42, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 34 | 80 | "种子 42 两次开局图逐位同图(教学局恒同图——首局固定种子的确定性承载)〔v7〕" | adr_x.runner().nodes() == adr_y.runner().nodes() | (待填) | | |
| 35 | 82 | "开局图 = L1 参数档在种子 42 下的生成图(开局无隐式取数分叉)" | adr_x.runner().nodes() == (gen.generate(_db.level_gen_params_row(1), 42) as Dictionary).get("nodes", []) | (待填) | | |
| 36 | 85 | "停点断点落盘在档" | sv_w.has_breakpoint() | (待填) | | |
| 37 | 88 | "断点续玩受理(代差标记键在档)〔v8〕 " | adr_z.resume_adventure(bp, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 38 | 90 | "续玩重生成图与中断前逐位同图〔v7〕 " | adr_z.runner().nodes() == adr_x.runner().nodes() | (待填) | | |
| 39 | 94 | "缺生成图代差标记键的旧断点被显式拒绝(禁按新语义静默回放)〔v8〕" | adr_old.resume_adventure(bp_old, {}) == false | (待填) | | |
| 40 | 101 | "level 表三行均无 templates 键(模板数据已清出)〔v9〕 " | tpl_free and _db.level_count() == 3 | (待填) | | |
| 41 | 106 | "新档首次冒险布尔位 = false(默认域——首局恒走固定种子 42) " | sv.is_first_adventure_done() == false | (待填) | | |
| 42 | 110 | "冒险收束点置位(三结局同写——写入只在收束挂点)" | sv.is_first_adventure_done() == true | (待填) | | |
| 43 | 112 | "置位幂等(重复收束不翻转)" | sv.is_first_adventure_done() == true | (待填) | | |
| 28 | 60 | "冒险模式起关受理(入口停点)" | runner2.start_level_external(3, Callable(self, "_smoke_rest_stub"), true) | (待填) | | |
| 29 | 62 | "起关产图零计数器消费(同图不依赖取数号位)" | rng_c.counter() == counter_before | (待填) | | |
| 30 | 65 | "入口停点候选数=参数档入口个数(L3 档 %d——多入口首跳即选路,禁写死单入口)〔v2〕" ↩ % entry_count | entry_count >= 1 and (runner2.next_candidates() as Array).size() == entry_count | (待填) | | |
| 31 | 69 | "第二入口经句柄显式进入(句柄 %d)〔v2〕 " ↩ % int(eids[1]) | runner2.pick_next_node(int(eids[1])) and int(runner2.current_node_id()) == int(eids[1]) | (待填) | | |
| 32 | 76 | "首局口径种子 42 开局受理(defer_entry 路径)" | adr_x.start_adventure(42, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 33 | 79 | "同种子第二次开局受理" | adr_y.start_adventure(42, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 34 | 81 | "种子 42 两次开局图逐位同图(教学局恒同图——首局固定种子的确定性承载)〔v7〕" | adr_x.runner().nodes() == adr_y.runner().nodes() | (待填) | | |
| 35 | 83 | "开局图 = L1 参数档在种子 42 下的生成图(开局无隐式取数分叉)" | adr_x.runner().nodes() == (gen.generate(_db.level_gen_params_row(1), 42) as Dictionary).get("nodes", []) | (待填) | | |
| 36 | 86 | "停点断点落盘在档" | sv_w.has_breakpoint() | (待填) | | |
| 37 | 89 | "断点续玩受理(代差标记键在档)〔v8〕 " | adr_z.resume_adventure(bp, {"hero_override": {}, "treasure_unlocked": {}}) | (待填) | | |
| 38 | 91 | "续玩重生成图与中断前逐位同图〔v7〕 " | adr_z.runner().nodes() == adr_x.runner().nodes() | (待填) | | |
| 39 | 95 | "缺生成图代差标记键的旧断点被显式拒绝(禁按新语义静默回放)〔v8〕" | adr_old.resume_adventure(bp_old, {}) == false | (待填) | | |
| 40 | 102 | "level 表三行均无 templates 键(模板数据已清出)〔v9〕 " | tpl_free and _db.level_count() == 3 | (待填) | | |
| 41 | 107 | "新档首次冒险布尔位 = false(默认域——首局恒走固定种子 42) " | sv.is_first_adventure_done() == false | (待填) | | |
| 42 | 111 | "冒险收束点置位(三结局同写——写入只在收束挂点)" | sv.is_first_adventure_done() == true | (待填) | | |
| 43 | 113 | "置位幂等(重复收束不翻转)" | sv.is_first_adventure_done() == true | (待填) | | |
## S06 _init(行 27– 27 · 1 条 · 源 game/tests/integration/save_rng_roundtrip_test.gd · 去向:待分类回填)
@@ -827,140 +827,140 @@
| 457 | 81 | "放弃结算:result=abandoned · cleared=false(已获面不追回——钥石累计 %d) " ↩ % int(sum.get("keystone_total", -1)) | String(sum.get("result", "")) == "abandoned" and not bool(sum.get("cleared", true)) | (待填) | | |
| 458 | 82 | "结算后重复 abandon 拒绝(结算受理只算一次——state=idle) " | not adr.abandon() | (待填) | | |
## S72 _smoke_adventure(行 113 – 438 · 57 条 · 源 game/tests/unit/core/adventure_feats_test.gd · 去向:待分类回填)
## S72 _smoke_adventure(行 118 – 44 3 · 57 条 · 源 game/tests/unit/core/adventure_feats_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 459 | 113 | "序列关数 = 行集关数(三关正式序列生效)" | int(_db.level.rows.size()) == 3 | (待填) | | |
| 460 | 130 | "生成图每个战斗/Boss 节点经解析链命中敌行集与棋盘行(扫描 %d 节点,缺失 %d)〔fv24〕 " ↩ % [cov_scan, cov_miss] | cov_scan > 0 and cov_miss == 0 | (待填) | | |
| 461 | 135 | "满配冒险成功(42 / atk+900 / hp+400——cleared=true; v2 怪阶梯后旧 200/100 档不再满配)" | String(st["result"]) == "completed" and bool(sum.get("cleared", false)) | (待填) | | |
| 462 | 136 | "完成几关 = 3( levels_cleared) " | int(sum.get("levels_cleared", -1)) == 3 | (待填) | | |
| 463 | 140 | "钥石合计 = ΣBoss 首杀行值(%d——逐杀掉落新口径;断点未注入恒首杀)" ↩ % int(sum.get("keystone_total", -1)) | int(sum.get("keystone_total", -1)) == ks_exp | (待填) | | |
| 464 | 142 | "逐杀掉落明细恰 3 笔(L1/L2/L3——additive 摘要键 keystone_drops) " | drops.size() == 3 | (待填) | | |
| 465 | 143 | "摘要携带主种子(42) " | int(sum.get("master_seed", -1)) == 42 | (待填) | | |
| 466 | 154 | "关卡完成三选一恰呈现 2 次、恰兑付 2 次(L1/L2 后——末关不发;resolves 含节点回执另计)" | picks.size() == 2 and resolves.size() == 2 + node_picks | (待填) | | |
| 467 | 165 | "三关生成图各含 ≥1 奖励节点(节点三选一候选位在图)〔v4〕 " | reward_levels == 3 | (待填) | | |
| 468 | 169 | "奖励分支点选→三选一候选可取且停点在途(候选 %s 件)" ↩ % str((rw.get("cands", []) as Array).size()) | bool(rw.get("pending", false)) and (rw.get("cands", []) as Array).size() >= 1 | (待填) | | |
| 469 | 182 | "奖励三选一点选兑付受理(件=%s) " ↩ % String(rw_pc.get("kind", "")) | rw_pick_ok | (待填) | | |
| 470 | 188 | "进战载荷两样=关卡序号+节点深度(实测 depth=%s 句柄=%s)〔v6〕 " ↩ % [str(enc_probe.get("node_depth", -1)), str(node_probe.get("id", -1))] | not enc_probe.is_empty() and int(enc_probe.get("node_depth", -1)) == int(node_probe.get("depth", -1)) and int(enc_probe.get("level_index", -1)) == 1 and int(node_probe.get("id", -1)) != int(node_probe.get("depth", -1)) | (待填) | | |
| 471 | 197 | "奖励节点兑付回执与经停逐笔相等(context=reward_node——同账计数 %d/%d) " ↩ % [node_resolves, node_picks] | node_resolves == node_picks | (待填) | | |
| 472 | 244 | "三选一候选 2–3 枚且零重复(令牌洗牌不放回——kind+tier 复合身份)" | cand_ok | (待填) | | |
| 473 | 24 5 | "关卡完成部分回血封顶(floor(观测上限×比例) 封顶——购血观测值精确断言,核代码增补)" | heal_ok | (待填) | | |
| 474 | 246 | "钥石逐杀入账(首杀档位 + 累计逐位)" | ks_gain_ok | (待填) | | |
| 475 | 247 | "点选恰兑付选中一件(值=令牌档位表值;未选项零生效)" | resolve_ok | (待填) | | |
| 476 | 258 | "各战上限入参 ∈ [基础, 基础+3×件值+购血余量](覆盖值通道——双渠道共享上限 3;模拟档贪心购血合法叠加〔数值修复批 v3.4〕;首战=基础 %d) " ↩ % exp_base | seq_ok | (待填) | | |
| 477 | 261 | "同种子两局逐位可复现(summary/上限序列/行进序列/三选一载荷——reward_pick 封闭流)" | st2["summary"] == sum and st2["encounter_max_hp_seq"] == seq and st2["visited_ids"] == st["visited_ids"] and st2["reward_events"] == st["reward_events"] | (待填) | | |
| 478 | 271 | "零配 L1 败北种子可达(seed=%s) " ↩ % str(lose.get("s", -1)) | not lose.is_empty() | (待填) | | |
| 479 | 274 | "L1 败北摘要:未打穿 · 完成 0 关 · 钥石 0 · 止步第 1 层" | not bool(sl["cleared"]) and int(sl["levels_cleared"]) == 0 \\ and int(sl["keystone_total"]) == 0 and int(sl["stopped_at"]) == 1 | (待填) | | |
| 480 | 27 8 | "L1 败北败退明细:层号/节点编号/节点类型在案(数值验证取数面 2026-09-22) " | int(dl.get("level_index", -1)) == 1 and int(dl.get("node_id", -1)) >= 0 \\ and String(dl.get("node_type", "")) in ["battle", "boss"] | (待填) | | |
| 481 | 287 | "半配(atk+50) L2 败北种子可达(seed=%s) " ↩ % str(half.get("s", -1)) | not half.is_empty() | (待填) | | |
| 482 | 290 | "L2 败北摘要:L1 已过(钥石=L1 首杀掉落)· 止步第 2 层" | not bool(sh["cleared"]) and int(sh["levels_cleared"]) == 1 \\ and int(sh["keystone_total"]) == int(_db.meta_boss_keystone_row(1).get("first_kill", 0)) \\ and int(sh["stopped_at"]) == 2 | (待填) | | |
| 483 | 295 | "L2 败北败退明细:层号=2 · 节点在案(数值验证取数面 2026-09-22) " | int(dh.get("level_index", -1)) == 2 and int(dh.get("node_id", -1)) >= 0 \\ and String(dh.get("node_type", "")) in ["battle", "boss"] | (待填) | | |
| 484 | 301 | "重复拒绝场景:冒险启动(seed 7——生成图确定同上)" | adr6.start_adventure(7) | (待填) | | |
| 485 | 309 | "重复拒绝场景就位:选路态放弃 → 已结算" | adr6.abandon() | (待填) | | |
| 486 | 312 | "重复关卡结束宣布拒绝(账本与摘要零变化——契约 7)" | adr6.summary == sum6_before | (待填) | | |
| 487 | 322 | "每战完成入账恰一次(gain %d = battles %d——GP 袋件入账单列)" ↩ % [gains, int(st["battles"])] | gains == int(st["battles"]) | (待填) | | |
| 488 | 323 | "钱包 clear 恰一次且为末事件(关卡收束不清——GP 冒险收束清零归冒险结构)" | clears == 1 and wallet.size() > 0 and String(wallet[wallet.size() - 1]["event"]) == "clear" | (待填) | | |
| 489 | 325 | "三关商店房各到达一次(每关入口→终点路径恰穿一店的驱动投影)且首达余额 > 0(%d——GP 跨关延续)" ↩ % (shop_seq[0] if shop_seq.size() > 0 else -1) | shop_seq.size() == 3 and int(shop_seq[0]) > 0 | (待填) | | |
| 490 | 336 | "同账场景种子可达(seed=%s——L2 商店房就位)" ↩ % str(same.get("s", -1)) | not same.is_empty() | (待填) | | |
| 491 | 349 | "进店余额 ≥ hp_up L2 首价(%d = 基价 %d + 关卡加成 %d——配置推导)" ↩ % [hp_price + l2_price_bonus, hp_price, l2_price_bonus] | gp0 >= hp_price + l2_price_bonus | (待填) | | |
| 492 | 350 | "购买 hp_up 受理(出账 + 加算区)" | r8.buy_product("hp_up") | (待填) | | |
| 493 | 352 | "统一冒险加算区含商店值(max_hp=%d ≥ 商店 3——L1 三选一件值另计)" ↩ % acc_shop | acc_shop >= 3 | (待填) | | |
| 494 | 355 | "L2 关卡完成三选一停点在案(直调兑付前——零自动推进)" | not a8._curio _pending.is_empty() | (待填) | | |
| 495 | 35 6 | "未兑付推进拒绝(选择停点零自动推进契约)" | not a8.continue_to_next_level() | (待填) | | |
| 496 | 359 | "三选一点选兑付受理(候选取首件)" | a8.pick_curio(String(l2_pick.get("kind", "")), String(l2_pick.get("tier", "")), String(l2_pick.get("feat_id", ""))) | (待填) | | |
| 497 | 362 | "三选一属性件与商店购买同账累加(max_hp=%d = %d + 三选一%s) " ↩ % [int(a8.run_ledger.bonus.get ("max_hp", -1) ), acc_shop, picked2] | int(a8.run_ledger.bonus.get ("max_hp", -1) ) == expect_acc | (待填) | | |
| 498 | 364 | "关卡完成部分回血封顶(hp %d ≤ 生效上限 %d——血回满语义退役)" ↩ % [int(a8.ledger[" hero_hp"]) , max_eff8] | int(a8.ledger[" hero_hp"]) <= max_eff8 | (待填) | | |
| 499 | 365 | "兑付后推进受理(下一关开始)" | a8.continue_to_next_level() | (待填) | | |
| 500 | 368 | "恢复点数学:floor(100× 30%)=30 · 封顶缺口 5 · 满血回 0 合法" | int(a9.apply_rest(30, 70, 100)) == 30 and int(a9.apply_rest(30, 95, 100)) == 5 \\ and int(a9.apply_rest(30, 100, 100)) == 0 | (待填) | | |
| 501 | 372 | "同一公式两个落点逐位一致(LevelRunner.rest_heal_amount 内置默认)" | int(lr9.rest_heal_amount(30, 70, 100)) == 30 and int(lr9.rest_heal_amount(30, 95, 100)) == 5 | (待填) | | |
| 502 | 376 | "放弃场景:冒险启动(seed 15——生成图确定同上)" | a10.start_adventure(15) | (待填) | | |
| 503 | 377 | "放弃场景:入口停点 pick 进首战(停点前移批 2026-09-23 驱动口径)" | a10.runner().pick_next_node(int(a10.runner().next_candidate_ids()[0])) | (待填) | | |
| 504 | 37 8 | "战斗中 abandon 拒绝(战斗域单事务在飞)" | not a10.abandon() | (待填) | | |
| 505 | 385 | "非战斗期(选路态)abandon 受理" | a10.runner().current_battle() == null and a10.abandon() | (待填) | | |
| 506 | 38 9 | "剔牌库/替换场景:冒险启动(seed 11——道具解锁集只含 wide_scout_band) " | a11.start_adventure(11, {"treasure_unlocked": {"wide_scout_band": true}}) | (待填) | | |
| 507 | 398 | "池耗即枯竭(attack/ap 令牌耗尽不出候选——%s) " ↩ % str(draw) | not draw_kinds.has("attack") and not draw_kinds.has("ap") | (待填) | | |
| 508 | 399 | "池耗后候选恒 ≥2(稀有档余量——防「三选项全不可选」死角)" | (draw as Array).size() >= 2 | (待填) | | |
| 509 | 408 | "池收缩——40 次重抽零 aux 候选(停点渠道 aux 卡退役,迭代 11 第①批 T7) " | not treasure_seen | (待填) | | |
| 510 | 417 | "满血关卡完成回血 0 合法(封顶口径——heal_gained=0 非负溢出)" | int(cap["payload"].get("heal_gained", -1)) == 0 | (待填) | | |
| 511 | 420 | "节点共享池场景:冒险启动(seed 13) " | a13.start_adventure(13, {"treasure_unlocked": {"wide_scout_band": true}}) | (待填) | | |
| 512 | 431 | "奖励节点共享池:令牌耗尽同样不出候选(同库同池——%s)" ↩ % str(ncands13) | not has_attack13 | (待填) | | |
| 513 | 435 | "奖励节点 GP 件入账(钱包「奖励入账」收口——+%d)" ↩ % int(_db.adventure.curio_value("gp", "common")) | a13.apply_node_curio("gp", "common") and int(a13.ledger.get("gp", 0)) == gp13 + int(_db.adventure.curio_value("gp", "common")) | (待填) | | |
| 514 | 436 | "节点停点态兑付后清零(恰一次语义同构)" | a13._node_curio _pending.is_empty() | (待填) | | |
| 515 | 438 | "放弃摘要:abandoned · 未打穿(已获大奖励不追回——同失败型结算)" | String(s10.get("result", "")) == "abandoned" and not bool(s10.get("cleared", true)) | (待填) | | |
| 459 | 118 | "序列关数 = 行集关数(三关正式序列生效)" | int(_db.level.rows.size()) == 3 | (待填) | | |
| 460 | 135 | "生成图每个战斗/Boss 节点经解析链命中敌行集与棋盘行(扫描 %d 节点,缺失 %d)〔fv24〕 " ↩ % [cov_scan, cov_miss] | cov_scan > 0 and cov_miss == 0 | (待填) | | |
| 461 | 140 | "满配冒险成功(42 / atk+900 / hp+400——cleared=true; v2 怪阶梯后旧 200/100 档不再满配)" | String(st["result"]) == "completed" and bool(sum.get("cleared", false)) | (待填) | | |
| 462 | 141 | "完成几关 = 3( levels_cleared) " | int(sum.get("levels_cleared", -1)) == 3 | (待填) | | |
| 463 | 145 | "钥石合计 = ΣBoss 首杀行值(%d——逐杀掉落新口径;断点未注入恒首杀)" ↩ % int(sum.get("keystone_total", -1)) | int(sum.get("keystone_total", -1)) == ks_exp | (待填) | | |
| 464 | 147 | "逐杀掉落明细恰 3 笔(L1/L2/L3——additive 摘要键 keystone_drops) " | drops.size() == 3 | (待填) | | |
| 465 | 148 | "摘要携带主种子(42) " | int(sum.get("master_seed", -1)) == 42 | (待填) | | |
| 466 | 159 | "关卡完成三选一恰呈现 2 次、恰兑付 2 次(L1/L2 后——末关不发;resolves 含节点回执另计)" | picks.size() == 2 and resolves.size() == 2 + node_picks | (待填) | | |
| 467 | 170 | "三关生成图各含 ≥1 奖励节点(节点三选一候选位在图)〔v4〕 " | reward_levels == 3 | (待填) | | |
| 468 | 174 | "奖励分支点选→三选一候选可取且停点在途(候选 %s 件)" ↩ % str((rw.get("cands", []) as Array).size()) | bool(rw.get("pending", false)) and (rw.get("cands", []) as Array).size() >= 1 | (待填) | | |
| 469 | 187 | "奖励三选一点选兑付受理(件=%s) " ↩ % String(rw_pc.get("kind", "")) | rw_pick_ok | (待填) | | |
| 470 | 193 | "进战载荷两样=关卡序号+节点深度(实测 depth=%s 句柄=%s)〔v6〕 " ↩ % [str(enc_probe.get("node_depth", -1)), str(node_probe.get("id", -1))] | not enc_probe.is_empty() and int(enc_probe.get("node_depth", -1)) == int(node_probe.get("depth", -1)) and int(enc_probe.get("level_index", -1)) == 1 and int(node_probe.get("id", -1)) != int(node_probe.get("depth", -1)) | (待填) | | |
| 471 | 202 | "奖励节点兑付回执与经停逐笔相等(context=reward_node——同账计数 %d/%d) " ↩ % [node_resolves, node_picks] | node_resolves == node_picks | (待填) | | |
| 472 | 249 | "三选一候选 2–3 枚且零重复(令牌洗牌不放回——kind+tier 复合身份)" | cand_ok | (待填) | | |
| 473 | 250 | "关卡完成部分回血封顶(floor(观测上限×比例) 封顶——购血观测值精确断言,核代码增补)" | heal_ok | (待填) | | |
| 474 | 251 | "钥石逐杀入账(首杀档位 + 累计逐位)" | ks_gain_ok | (待填) | | |
| 475 | 252 | "点选恰兑付选中一件(值=令牌档位表值;未选项零生效)" | resolve_ok | (待填) | | |
| 476 | 263 | "各战上限入参 ∈ [基础, 基础+3×件值+购血余量](覆盖值通道——双渠道共享上限 3;模拟档贪心购血合法叠加〔数值修复批 v3.4〕;首战=基础 %d) " ↩ % exp_base | seq_ok | (待填) | | |
| 477 | 266 | "同种子两局逐位可复现(summary/上限序列/行进序列/三选一载荷——reward_pick 封闭流)" | st2["summary"] == sum and st2["encounter_max_hp_seq"] == seq and st2["visited_ids"] == st["visited_ids"] and st2["reward_events"] == st["reward_events"] | (待填) | | |
| 478 | 276 | "零配 L1 败北种子可达(seed=%s) " ↩ % str(lose.get("s", -1)) | not lose.is_empty() | (待填) | | |
| 479 | 279 | "L1 败北摘要:未打穿 · 完成 0 关 · 钥石 0 · 止步第 1 层" | not bool(sl["cleared"]) and int(sl["levels_cleared"]) == 0 \\ and int(sl["keystone_total"]) == 0 and int(sl["stopped_at"]) == 1 | (待填) | | |
| 480 | 283 | "L1 败北败退明细:层号/节点编号/节点类型在案(数值验证取数面 2026-09-22) " | int(dl.get("level_index", -1)) == 1 and int(dl.get("node_id", -1)) >= 0 \\ and String(dl.get("node_type", "")) in ["battle", "boss"] | (待填) | | |
| 481 | 292 | "半配(atk+50) L2 败北种子可达(seed=%s) " ↩ % str(half.get("s", -1)) | not half.is_empty() | (待填) | | |
| 482 | 295 | "L2 败北摘要:L1 已过(钥石=L1 首杀掉落)· 止步第 2 层" | not bool(sh["cleared"]) and int(sh["levels_cleared"]) == 1 \\ and int(sh["keystone_total"]) == int(_db.meta_boss_keystone_row(1).get("first_kill", 0)) \\ and int(sh["stopped_at"]) == 2 | (待填) | | |
| 483 | 300 | "L2 败北败退明细:层号=2 · 节点在案(数值验证取数面 2026-09-22) " | int(dh.get("level_index", -1)) == 2 and int(dh.get("node_id", -1)) >= 0 \\ and String(dh.get("node_type", "")) in ["battle", "boss"] | (待填) | | |
| 484 | 306 | "重复拒绝场景:冒险启动(seed 7——生成图确定同上)" | adr6.start_adventure(7) | (待填) | | |
| 485 | 314 | "重复拒绝场景就位:选路态放弃 → 已结算" | adr6.abandon() | (待填) | | |
| 486 | 317 | "重复关卡结束宣布拒绝(账本与摘要零变化——契约 7)" | adr6.summary == sum6_before | (待填) | | |
| 487 | 327 | "每战完成入账恰一次(gain %d = battles %d——GP 袋件入账单列)" ↩ % [gains, int(st["battles"])] | gains == int(st["battles"]) | (待填) | | |
| 488 | 328 | "钱包 clear 恰一次且为末事件(关卡收束不清——GP 冒险收束清零归冒险结构)" | clears == 1 and wallet.size() > 0 and String(wallet[wallet.size() - 1]["event"]) == "clear" | (待填) | | |
| 489 | 330 | "三关商店房各到达一次(每关入口→终点路径恰穿一店的驱动投影)且首达余额 > 0(%d——GP 跨关延续)" ↩ % (shop_seq[0] if shop_seq.size() > 0 else -1) | shop_seq.size() == 3 and int(shop_seq[0]) > 0 | (待填) | | |
| 490 | 341 | "同账场景种子可达(seed=%s——L2 商店房就位)" ↩ % str(same.get("s", -1)) | not same.is_empty() | (待填) | | |
| 491 | 35 4 | "进店余额 ≥ hp_up L2 首价(%d = 基价 %d + 关卡加成 %d——配置推导)" ↩ % [hp_price + l2_price_bonus, hp_price, l2_price_bonus] | gp0 >= hp_price + l2_price_bonus | (待填) | | |
| 492 | 355 | "购买 hp_up 受理(出账 + 加算区)" | r8.buy_product("hp_up") | (待填) | | |
| 493 | 357 | "统一冒险加算区含商店值(max_hp=%d ≥ 商店 3——L1 三选一件值另计)" ↩ % acc_shop | acc_shop >= 3 | (待填) | | |
| 494 | 360 | "L2 关卡完成三选一停点在案(直调兑付前——零自动推进)〔拆件批 V2〕 " | not a8.stop(). _pending.is_empty() | (待填) | | |
| 495 | 361 | "未兑付推进拒绝(选择停点零自动推进契约)" | not a8.continue_to_next_level() | (待填) | | |
| 496 | 364 | "三选一点选兑付受理(候选取首件)" | a8.stop(). pick_curio(String(l2_pick.get("kind", "")), String(l2_pick.get("tier", "")), String(l2_pick.get("feat_id", ""))) | (待填) | | |
| 497 | 367 | "三选一属性件与商店购买同账累加(max_hp=%d = %d + 三选一%s) " ↩ % [a8.hero().bonus_total ("max_hp"), acc_shop, picked2] | a8.hero().bonus_total ("max_hp") == expect_acc | (待填) | | |
| 498 | 369 | "关卡完成部分回血封顶(hp %d ≤ 生效上限 %d——血回满语义退役)" ↩ % [a8.hero(). hero_hp, max_eff8] | a8.hero(). hero_hp <= max_eff8 | (待填) | | |
| 499 | 370 | "兑付后推进受理(下一关开始)" | a8.continue_to_next_level() | (待填) | | |
| 500 | 373 | "恢复点数学:floor(100× 30%)=30 · 封顶缺口 5 · 满血回 0 合法" | int(a9.apply_rest(30, 70, 100)) == 30 and int(a9.apply_rest(30, 95, 100)) == 5 \\ and int(a9.apply_rest(30, 100, 100)) == 0 | (待填) | | |
| 501 | 377 | "同一公式两个落点逐位一致(LevelRunner.rest_heal_amount 内置默认)" | int(lr9.rest_heal_amount(30, 70, 100)) == 30 and int(lr9.rest_heal_amount(30, 95, 100)) == 5 | (待填) | | |
| 502 | 381 | "放弃场景:冒险启动(seed 15——生成图确定同上)" | a10.start_adventure(15) | (待填) | | |
| 503 | 382 | "放弃场景:入口停点 pick 进首战(停点前移批 2026-09-23 驱动口径)" | a10.runner().pick_next_node(int(a10.runner().next_candidate_ids()[0])) | (待填) | | |
| 504 | 383 | "战斗中 abandon 拒绝(战斗域单事务在飞)" | not a10.abandon() | (待填) | | |
| 505 | 390 | "非战斗期(选路态)abandon 受理" | a10.runner().current_battle() == null and a10.abandon() | (待填) | | |
| 506 | 394 | "剔牌库/替换场景:冒险启动(seed 11——道具解锁集只含 wide_scout_band) " | a11.start_adventure(11, {"treasure_unlocked": {"wide_scout_band": true}}) | (待填) | | |
| 507 | 403 | "池耗即枯竭(attack/ap 令牌耗尽不出候选——%s) " ↩ % str(draw) | not draw_kinds.has("attack") and not draw_kinds.has("ap") | (待填) | | |
| 508 | 404 | "池耗后候选恒 ≥2(稀有档余量——防「三选项全不可选」死角)" | (draw as Array).size() >= 2 | (待填) | | |
| 509 | 413 | "池收缩——40 次重抽零 aux 候选(停点渠道 aux 卡退役,迭代 11 第①批 T7) " | not treasure_seen | (待填) | | |
| 510 | 422 | "满血关卡完成回血 0 合法(封顶口径——heal_gained=0 非负溢出)" | int(cap["payload"].get("heal_gained", -1)) == 0 | (待填) | | |
| 511 | 425 | "节点共享池场景:冒险启动(seed 13) " | a13.start_adventure(13, {"treasure_unlocked": {"wide_scout_band": true}}) | (待填) | | |
| 512 | 436 | "奖励节点共享池:令牌耗尽同样不出候选(同库同池——%s)" ↩ % str(ncands13) | not has_attack13 | (待填) | | |
| 513 | 440 | "奖励节点 GP 件入账(钱包「奖励入账」收口——+%d)" ↩ % int(_db.adventure.curio_value("gp", "common")) | a13.stop(). apply_node_curio("gp", "common") and a13.hero().gp == gp13 + int(_db.adventure.curio_value("gp", "common")) | (待填) | | |
| 514 | 441 | "节点停点态兑付后清零(恰一次语义同构)" | a13.stop()._node _pending.is_empty() | (待填) | | |
| 515 | 44 3 | "放弃摘要:abandoned · 未打穿(已获大奖励不追回——同失败型结算)" | String(s10.get("result", "")) == "abandoned" and not bool(s10.get("cleared", true)) | (待填) | | |
## S73 _smoke_feats(行 449 – 761 · 68 条 · 源 game/tests/unit/core/adventure_feats_test.gd · 去向:待分类回填)
## S73 _smoke_feats(行 45 4– 766 · 68 条 · 源 game/tests/unit/core/adventure_feats_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 516 | 449 | "feat_table 已加载(30 件=基础 27+迁入 2+卡② 完美保险 1——迭代 31 卡② 换代)" | _db.feats != null and (_db.feats.rows as Array).size() == 30 | (待填) | | |
| 517 | 450 | "feat_table.validate 零违例(四级 rarity/cap 域/trigger 词表/行键白名单全过)" | _db.feats.validate().is_empty() | (待填) | | |
| 518 | 452 | "专长带场景:冒险启动(seed 71) " | a_r0.start_adventure(71) | (待填) | | |
| 519 | 460 | "专长带入池:30 件四级直映射(普通 12/优秀 9/稀有 9/传说 0)——牌库 102+30=132〔专长批 V2+卡② 完美保险迁入〕" | feat_tokens == 30 and int(tier_counts.get("common", 0)) == 12 and int(tier_counts.get("excellent", 0)) == 9 and int(tier_counts.get("rare", 0)) == 9 and a_r0._curio_ deck.size() == 132 | (待填) | | |
| 520 | 462 | "旧 27 件已退役:arcane_ember/magma_body 表内零残留〔专长批 V2〕 " | _db.feats.row_by_id("arcane_ember").is_empty() and _db.feats.row_by_id("magma_body").is_empty() | (待填) | | |
| 521 | 463 | "迁出收尾:treasure_items 无 venom_edge/seal_burst 行(同调目录自然收窄)〔专长批 V13〕 " | _db.treasure_items.row_by_id("venom_edge").is_empty() and _db.treasure_items.row_by_id("seal_burst").is_empty() | (待填) | | |
| 522 | 470 | "层级纪律:牌库 kind 全集=CURIO_KINDS+relic(秘宝 item_id 零入池)〔专长批 V18〕 " | kinds_ok | (待填) | | |
| 523 | 476 | "棋盘事实不可变:新 30 行零棋盘改写类订阅(rewrite_board 已除名消费面)〔专长批 V19〕 " | rewrite_rows == 0 | (待填) | | |
| 524 | 483 | "对外命名纪律:30 行 display_name/desc 零「雷/旗」字面(封印/陷阱风味系)〔专长批 V21 初筛〕" | bad_words == 0 | (待填) | | |
| 525 | 484 | "数值纪律:陷阱爆发倍率>1 · 血蜜回复<典型陷阱伤 · 石肤上限 3 在册(结构锚形态内 provisional)〔专长批 V22 机检半〕" | float((_db.feats.row_by_id("trap_burst").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("mult", 0)) > 1.0 and int((_db.feats.row_by_id("blood_honey").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("value", 99)) < 5 and int((_db.feats.row_by_id("stone_skin").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("cap", 0)) == 3 | (待填) | | |
| 526 | 502 | "新 schema 构造表 validate 零违例(四级 rarity/cap 字段/词表全过——流派标签已退役零 archetype) " | rt.validate().is_empty() | (待填) | | |
| 527 | 506 | "专长带场景:冒险启动(seed 72——注入 5 行临时表)" | a_r.start_adventure(72) | (待填) | | |
| 528 | 511 | "专长带入池:5 行 relic 每件 1 张(四级 rarity 直映射)——牌库 102+5=107" | deck_relic == 5 and a_r._curio_ deck.size() == 107 | (待填) | | |
| 529 | 522 | "关卡完成渠道只出专长(60 次重抽 ≥2 种不同 relic——身份键 feat_id 同档可多件)" | feat_seen.size() >= 2 | (待填) | | |
| 530 | 523 | "节点渠道零专长(60 次重抽零 relic——专长在非 Boss 渠道只以专长凭证形态出现)" | not node_relic_seen | (待填) | | |
| 531 | 531 | "A5 专长凭证兑付受理(节点渠道——拿到即开)" | a_t.apply_node_curio("feat_ticket", "excellent") | (待填) | | |
| 532 | 537 | "A5 拿到即开——停点候选已替换为专长三选一(全 relic) " | tkt_all_relic | (待填) | | |
| 533 | 538 | "A5 零摘牌——专长凭证兑付不动令牌库(不进持有集)" | a_t.pool_stock("attack") == int(stock_before["attack"]) and a_t.pool_stock("gp") == int(stock_before["gp"]) | (待填) | | |
| 534 | 539 | "A5 无专长凭证残留持有集" | not (a_t.feats_held() as Array).has("feat_ticket") | (待填) | | |
| 535 | 542 | "A5 专长面兑付受理(专长凭证开出候选可正常入持有集)" | (a_t.feats_held() as Array).size() == feats_n + 1 | (待填) | | |
| 536 | 547 | "A6 保底触发(pity=5 → 第 6 次展示必出——概率无关)" | a_t._ feat_ticket_consider(rg_t) | (待填) | | |
| 537 | 548 | "A6 触发后清零" | a_t._feat_ ticket_pity == 0 | (待填) | | |
| 538 | 551 | "A6 限购满不再触发(保底冻结)" | not a_t._ feat_ticket_consider(rg_t) | (待填) | | |
| 539 | 559 | "A6 概率面存在(chance=20% 200 展示内必出现——零触发=概率面失守)" | offered | (待填) | | |
| 540 | 561 | "relic 兑付:入持有集 + 牌库摘牌(选中踢池——池库存 %d→%d) " ↩ % [deck_relic, deck_relic - 1] | a_r.pick_curio("relic", "rare", "x3") and (a_r.feats_held() as Array).has("x3") and a_r.pool_stock("relic") == deck_relic - 1 | (待填) | | |
| 541 | 585 | "双管镐:第 %d 次付费挖格返 1 AP(每第 2 次——mod_eq 预评估口径)" ↩ % (i + 1) | refund | (待填) | | |
| 542 | 587 | "双管镐反例:第 %d 次不返(未满 2 次)" ↩ % (i + 1) | not refund | (待填) | | |
| 543 | 591 | "地质学家:首开新类型集 1 点〔专长批 V3〕 " | orch._hits_of(geo_hits, "counter_add").size() == 1 | (待填) | | |
| 544 | 595 | "地质学家:满 4 种(预评估现值 3+本格)→揭示 1 格·计数清零〔专长批 V3〕 " | orch._hits_of(geo_hits2, "reveal_tiles").size() == 1 and EffectEngine.counter(orch.counters_ctx, "geo_types") == 0 | (待填) | | |
| 545 | 597 | "地质学家反例:同类型重复首开不叠点〔专长批 V3〕 " | orch._hits_of(geo_hits3, "counter_add").is_empty() | (待填) | | |
| 546 | 601 | "安全帽:开安全格攒层 × 2〔专长批 V3〕 " | EffectEngine.counter(orch.counters_ctx, "helm_layers") == 2 | (待填) | | |
| 547 | 607 | "安全帽:踩雷耗层减伤=层值 2(一次清零随施加面 set 行)〔专长批 V3〕 " | hh_reduce == 2 | (待填) | | |
| 548 | 611 | "跳格采掘:空白 0 格攒 1 点〔专长批 V3〕 " | orch._hits_of(sk_zero, "counter_add").size() == 1 | (待填) | | |
| 549 | 615 | "跳格采掘:满 3 点→揭示 1 格〔专长批 V3〕 " | orch._hits_of(sk_full, "reveal_tiles").size() == 1 | (待填) | | |
| 550 | 616 | "跳格采掘反例:普通开格不计点〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_blank_zero": false}), "counter_add").is_empty() | (待填) | | |
| 551 | 623 | "爆破会计:本轮挖格花费≥5→+1 GP〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_end", {}), "grant_gp").size() == 1 | (待填) | | |
| 552 | 625 | "边陲矿工:边缘格产出 +1·中心格反例零产出〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_edge_cell": true}), "grant_material").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_edge_cell": false}), "grant_material").is_empty() | (待填) | | |
| 553 | 633 | "封印回响:标中计数≥2→轮末返 1 AP(下轮 queue)〔专长批 V3〕 " | orch._hits_of(se_hits, "grant_ap").size() == 1 and String((orch._hits_of(se_hits, "grant_ap")[0] as Dictionary).get("mode", "")) == "queue" | (待填) | | |
| 554 | 642 | "封印匠:标中每第 3 次→中立移除恰一次(频率闸死)〔专长批 V3〕" | sm_remove == 1 | (待填) | | |
| 555 | 644 | "封印桩:标中本轮 AC +N( round 域——round_start 清零)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "ac_bonus").size() == 1 and String((orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "ac_bonus")[0] as Dictionary).get("mode", "")) == "round" | (待填) | | |
| 556 | 648 | "示警烟火:标中揭示 3×3 资源类型(不揭安危位置)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "preview_area").size() == 1 | (待填) | | |
| 557 | 657 | "疼痛记忆:攻击附加层值伤害=层值 2·用后清零(set 行随施加面)〔专长批 V3〕 " | pm_bonus == 2 | (待填) | | |
| 558 | 664 | "保险丝反例:单次 <5 不攒点不触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "terrain", "amount": 3}), "shield").is_empty() | (待填) | | |
| 559 | 668 | "保险丝:首点不出盾(2 点才出——预评估口径)〔专长批 V3〕 " | fw_shield == 0 | (待填) | | |
| 560 | 670 | "见血开窍:踩雷揭示 1 格〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "reveal_tiles").size() == 1 | (待填) | | |
| 561 | 677 | "陷阱本能:踩雷本轮攻击 +2( attack_bonus 通道——面板加算)〔专长批 V3〕 " | ti_val == 2 | (待填) | | |
| 562 | 682 | "连环陷阱:同轮第 2 颗起每颗额外 +1 层(疼痛记忆同账)〔专长批 V3〕 " | EffectEngine.counter(orch.counters_ctx, "pain_layers") == ct_before + 2 | (待填) | | |
| 563 | 685 | "陷阱爆发:全体敌雷伤×倍率直伤(blast_scaled——施加面值=damage× mult)〔专长批 V3〕 " | orch._hits_of(tb_hits, "blast_scaled").size() == 1 and float((orch._hits_of(tb_hits, "blast_scaled")[0] as Dictionary).get("mult", 0)) > 1.0 | (待填) | | |
| 564 | 68 9 | "血蜜:踩雷回复 N 生命〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "heal").size() == 1 | (待填) | | |
| 565 | 692 | "石肤:受伤 AC+1(本场域 cap 3——达上限不再涨由累积器封顶)〔专长批 V3〕 " | orch._hits_of(ss_hits, "ac_bonus").size() == 1 and int((orch._hits_of(ss_hits, "ac_bonus")[0] as Dictionary).get("cap", 0)) == 3 | (待填) | | |
| 566 | 696 | "背水:生命≤50% 减伤·过半血反例零减伤〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 1, "hp_ratio": 40}), "damage_reduce").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 2, "hp_ratio": 80}), "damage_reduce").is_empty() | (待填) | | |
| 567 | 701 | "破封一击:挖开带封印危险格 +1 层·无封印反例零触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {"dug_under_seal": true}), "counter_add").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {"dug_under_seal": false}), "counter_add").is_empty() | (待填) | | |
| 568 | 709 | "弃图兑换:停手剩余 AP≥3 入账〔专长批 V3〕 " | orch._hits_of(me_hits, "counter_add").size() == 1 | (待填) | | |
| 569 | 713 | "弃图兑换:折为攻击伤害=剩余 AP 全额·用后清零〔专长批 V3〕 " | me_atk == 4 | (待填) | | |
| 570 | 714 | "弃图兑换反例:剩余 AP<3 不触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_stop", {"ap_left": 2}), "counter_add").is_empty() | (待填) | | |
| 571 | 717 | "一滴不剩:上轮 AP 耗尽→+1 AP〔专长批 V3〕 " | orch._hits_of(ld_hits, "grant_ap").size() == 1 | (待填) | | |
| 572 | 718 | "一滴不剩反例:上轮有余不发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_start", {"round": 3, "ap_exhausted_last": false}), "grant_ap").is_empty() | (待填) | | |
| 573 | 724 | "收盘:本轮开格≥8→+1 GP〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_end", {}), "grant_gp").size() == 1 | (待填) | | |
| 574 | 727 | "斩首学者:击杀揭示 1 格〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "kill", {"target": "敌", "overflow": 0}), "reveal_tiles").size() == 1 | (待填) | | |
| 575 | 730 | "处刑台:敌血量≤30% 挂单位标记加伤·阈值外反例零命中〔专长批 V3〕 " | orch._hits_of(ex_hits, "target_attack_bonus").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "enemy_hp_threshold", {"unit": "e1", "pct": 60, "is_boss": false}), "target_attack_bonus").is_empty() | (待填) | | |
| 576 | 734 | "战地包扎:战斗胜利回复 N 生命(battle_won 新挂点)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "battle_won", {"round": 2}), "heal").size() == 1 | (待填) | | |
| 577 | 737 | "血税:双向同局账本(踩陷阱−2max_hp/封印命中+1atk——bonus_delta 战末汇入)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "bonus_delta").size() == 1 and String((orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "bonus_delta")[0] as Dictionary).get("axis", "")) == "atk" | (待填) | | |
| 578 | 742 | "淬毒刃纹(迁入):克制正面(magic_vs_heavy 矩阵值>0)追加·中性面反例零触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "clamp_check", {"matchup": "magic_vs_heavy"}), "modify_ticket").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "clamp_check", {"matchup": "normal_vs_light"}), "modify_ticket").is_empty() | (待填) | | |
| 579 | 746 | "封印爆裂(迁入):标中全体敌群伤〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "open_ticket").size() == 1 | (待填) | | |
| 580 | 750 | "零持有订阅=零命中(relic 关着零扰动——伤害管线既有行为逐位不变)" | orch0._fx_emit("attack_commit", {"atk": 10, "target": "敌", "matchup": "", "dig_streak": 0, "nest_count": 0}).is_empty() and orch0._fx_emit("dig_reveal", {"cell": Vector2i(1, 1), "round": 1, "is_first_dig_of_battle": true, "terrain_kind": []}).is_empty() and orch0._fx_emit("mine_hit", {"damage": 5}).is_empty() and orch0._fx_emit("battle_won", {"round": 1}).is_empty() | (待填) | | |
| 581 | 758 | "特性段空态隐藏(视图空态纪律同特性段)" | not panel._feat_section.visible | (待填) | | |
| 582 | 760 | "特性段持有呈现(逐件行常驻可读——「局内奖励选了什么看不到」缺口承载)" | panel._feat_section.visible and panel._feat_list.get_child_count() == 2 | (待填) | | |
| 583 | 761 | "特性卡文案表值化:desc 行字段直读(零硬编码映射)" | String(load("res://presentation/battle_narrator.gd").feat_card_text({"feat_id": "pain_memory", "display_name": "疼痛记忆", "desc": "触陷阱攒 1 层"})).contains("触陷阱攒 1 层") | (待填) | | |
| 516 | 45 4 | "feat_table 已加载(30 件=基础 27+迁入 2+卡② 完美保险 1——迭代 31 卡② 换代)" | _db.feats != null and (_db.feats.rows as Array).size() == 30 | (待填) | | |
| 517 | 455 | "feat_table.validate 零违例(四级 rarity/cap 域/trigger 词表/行键白名单全过)" | _db.feats.validate().is_empty() | (待填) | | |
| 518 | 457 | "专长带场景:冒险启动(seed 71) " | a_r0.start_adventure(71) | (待填) | | |
| 519 | 465 | "专长带入池:30 件四级直映射(普通 12/优秀 9/稀有 9/传说 0)——牌库 102+30=132〔专长批 V2+卡② 完美保险迁入〕" | feat_tokens == 30 and int(tier_counts.get("common", 0)) == 12 and int(tier_counts.get("excellent", 0)) == 9 and int(tier_counts.get("rare", 0)) == 9 and a_r0._curio. deck.size() == 132 | (待填) | | |
| 520 | 467 | "旧 27 件已退役:arcane_ember/magma_body 表内零残留〔专长批 V2〕 " | _db.feats.row_by_id("arcane_ember").is_empty() and _db.feats.row_by_id("magma_body").is_empty() | (待填) | | |
| 521 | 468 | "迁出收尾:treasure_items 无 venom_edge/seal_burst 行(同调目录自然收窄)〔专长批 V13〕 " | _db.treasure_items.row_by_id("venom_edge").is_empty() and _db.treasure_items.row_by_id("seal_burst").is_empty() | (待填) | | |
| 522 | 475 | "层级纪律:牌库 kind 全集=CURIO_KINDS+relic(秘宝 item_id 零入池)〔专长批 V18〕 " | kinds_ok | (待填) | | |
| 523 | 481 | "棋盘事实不可变:新 30 行零棋盘改写类订阅(rewrite_board 已除名消费面)〔专长批 V19〕 " | rewrite_rows == 0 | (待填) | | |
| 524 | 488 | "对外命名纪律:30 行 display_name/desc 零「雷/旗」字面(封印/陷阱风味系)〔专长批 V21 初筛〕" | bad_words == 0 | (待填) | | |
| 525 | 489 | "数值纪律:陷阱爆发倍率>1 · 血蜜回复<典型陷阱伤 · 石肤上限 3 在册(结构锚形态内 provisional)〔专长批 V22 机检半〕" | float((_db.feats.row_by_id("trap_burst").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("mult", 0)) > 1.0 and int((_db.feats.row_by_id("blood_honey").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("value", 99)) < 5 and int((_db.feats.row_by_id("stone_skin").get("triggers", [{}])[0] as Dictionary).get("do", {}).get("cap", 0)) == 3 | (待填) | | |
| 526 | 507 | "新 schema 构造表 validate 零违例(四级 rarity/cap 字段/词表全过——流派标签已退役零 archetype) " | rt.validate().is_empty() | (待填) | | |
| 527 | 511 | "专长带场景:冒险启动(seed 72——注入 5 行临时表)" | a_r.start_adventure(72) | (待填) | | |
| 528 | 516 | "专长带入池:5 行 relic 每件 1 张(四级 rarity 直映射)——牌库 102+5=107" | deck_relic == 5 and a_r._curio. deck.size() == 107 | (待填) | | |
| 529 | 527 | "关卡完成渠道只出专长(60 次重抽 ≥2 种不同 relic——身份键 feat_id 同档可多件)" | feat_seen.size() >= 2 | (待填) | | |
| 530 | 528 | "节点渠道零专长(60 次重抽零 relic——专长在非 Boss 渠道只以专长凭证形态出现)" | not node_relic_seen | (待填) | | |
| 531 | 536 | "A5 专长凭证兑付受理(节点渠道——拿到即开)" | a_t.stop(). apply_node_curio("feat_ticket", "excellent") | (待填) | | |
| 532 | 542 | "A5 拿到即开——停点候选已替换为专长三选一(全 relic) " | tkt_all_relic | (待填) | | |
| 533 | 54 3 | "A5 零摘牌——专长凭证兑付不动令牌库(不进持有集)" | a_t.stop(). pool_stock("attack") == int(stock_before["attack"]) and a_t.stop(). pool_stock("gp") == int(stock_before["gp"]) | (待填) | | |
| 534 | 544 | "A5 无专长凭证残留持有集" | not (a_t.feats_held() as Array).has("feat_ticket") | (待填) | | |
| 535 | 547 | "A5 专长面兑付受理(专长凭证开出候选可正常入持有集)" | (a_t.feats_held() as Array).size() == feats_n + 1 | (待填) | | |
| 536 | 552 | "A6 保底触发(pity=5 → 第 6 次展示必出——概率无关)" | a_t.stop(). feat_ticket_consider(rg_t) | (待填) | | |
| 537 | 553 | "A6 触发后清零" | a_t.stop()._deck. ticket_pity == 0 | (待填) | | |
| 538 | 556 | "A6 限购满不再触发(保底冻结)" | not a_t.stop(). feat_ticket_consider(rg_t) | (待填) | | |
| 539 | 564 | "A6 概率面存在(chance=20% 200 展示内必出现——零触发=概率面失守)" | offered | (待填) | | |
| 540 | 566 | "relic 兑付:入持有集 + 牌库摘牌(选中踢池——池库存 %d→%d) " ↩ % [deck_relic, deck_relic - 1] | a_r.stop(). pick_curio("relic", "rare", "x3") and (a_r.feats_held() as Array).has("x3") and a_r.stop(). pool_stock("relic") == deck_relic - 1 | (待填) | | |
| 541 | 590 | "双管镐:第 %d 次付费挖格返 1 AP(每第 2 次——mod_eq 预评估口径)" ↩ % (i + 1) | refund | (待填) | | |
| 542 | 592 | "双管镐反例:第 %d 次不返(未满 2 次)" ↩ % (i + 1) | not refund | (待填) | | |
| 543 | 596 | "地质学家:首开新类型集 1 点〔专长批 V3〕 " | orch._hits_of(geo_hits, "counter_add").size() == 1 | (待填) | | |
| 544 | 600 | "地质学家:满 4 种(预评估现值 3+本格)→揭示 1 格·计数清零〔专长批 V3〕 " | orch._hits_of(geo_hits2, "reveal_tiles").size() == 1 and EffectEngine.counter(orch.counters_ctx, "geo_types") == 0 | (待填) | | |
| 545 | 602 | "地质学家反例:同类型重复首开不叠点〔专长批 V3〕 " | orch._hits_of(geo_hits3, "counter_add").is_empty() | (待填) | | |
| 546 | 606 | "安全帽:开安全格攒层 × 2〔专长批 V3〕 " | EffectEngine.counter(orch.counters_ctx, "helm_layers") == 2 | (待填) | | |
| 547 | 612 | "安全帽:踩雷耗层减伤=层值 2(一次清零随施加面 set 行)〔专长批 V3〕 " | hh_reduce == 2 | (待填) | | |
| 548 | 616 | "跳格采掘:空白 0 格攒 1 点〔专长批 V3〕 " | orch._hits_of(sk_zero, "counter_add").size() == 1 | (待填) | | |
| 549 | 620 | "跳格采掘:满 3 点→揭示 1 格〔专长批 V3〕 " | orch._hits_of(sk_full, "reveal_tiles").size() == 1 | (待填) | | |
| 550 | 62 1 | "跳格采掘反例:普通开格不计点〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_blank_zero": false}), "counter_add").is_empty() | (待填) | | |
| 551 | 628 | "爆破会计:本轮挖格花费≥5→+1 GP〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_end", {}), "grant_gp").size() == 1 | (待填) | | |
| 552 | 630 | "边陲矿工:边缘格产出 +1·中心格反例零产出〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_edge_cell": true}), "grant_material").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_reveal", {"is_edge_cell": false}), "grant_material").is_empty() | (待填) | | |
| 553 | 638 | "封印回响:标中计数≥2→轮末返 1 AP(下轮 queue)〔专长批 V3〕 " | orch._hits_of(se_hits, "grant_ap").size() == 1 and String((orch._hits_of(se_hits, "grant_ap")[0] as Dictionary).get("mode", "")) == "queue" | (待填) | | |
| 554 | 647 | "封印匠:标中每第 3 次→中立移除恰一次(频率闸死)〔专长批 V3〕" | sm_remove == 1 | (待填) | | |
| 555 | 649 | "封印桩:标中本轮 AC +N( round 域——round_start 清零)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "ac_bonus").size() == 1 and String((orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "ac_bonus")[0] as Dictionary).get("mode", "")) == "round" | (待填) | | |
| 556 | 653 | "示警烟火:标中揭示 3×3 资源类型(不揭安危位置)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "preview_area").size() == 1 | (待填) | | |
| 557 | 662 | "疼痛记忆:攻击附加层值伤害=层值 2·用后清零(set 行随施加面)〔专长批 V3〕 " | pm_bonus == 2 | (待填) | | |
| 558 | 669 | "保险丝反例:单次 <5 不攒点不触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "terrain", "amount": 3}), "shield").is_empty() | (待填) | | |
| 559 | 673 | "保险丝:首点不出盾(2 点才出——预评估口径)〔专长批 V3〕 " | fw_shield == 0 | (待填) | | |
| 560 | 675 | "见血开窍:踩雷揭示 1 格〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "reveal_tiles").size() == 1 | (待填) | | |
| 561 | 682 | "陷阱本能:踩雷本轮攻击 +2( attack_bonus 通道——面板加算)〔专长批 V3〕 " | ti_val == 2 | (待填) | | |
| 562 | 687 | "连环陷阱:同轮第 2 颗起每颗额外 +1 层(疼痛记忆同账)〔专长批 V3〕 " | EffectEngine.counter(orch.counters_ctx, "pain_layers") == ct_before + 2 | (待填) | | |
| 563 | 690 | "陷阱爆发:全体敌雷伤×倍率直伤(blast_scaled——施加面值=damage× mult)〔专长批 V3〕 " | orch._hits_of(tb_hits, "blast_scaled").size() == 1 and float((orch._hits_of(tb_hits, "blast_scaled")[0] as Dictionary).get("mult", 0)) > 1.0 | (待填) | | |
| 564 | 694 | "血蜜:踩雷回复 N 生命〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "heal").size() == 1 | (待填) | | |
| 565 | 697 | "石肤:受伤 AC+1(本场域 cap 3——达上限不再涨由累积器封顶)〔专长批 V3〕 " | orch._hits_of(ss_hits, "ac_bonus").size() == 1 and int((orch._hits_of(ss_hits, "ac_bonus")[0] as Dictionary).get("cap", 0)) == 3 | (待填) | | |
| 566 | 701 | "背水:生命≤50% 减伤·过半血反例零减伤〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 1, "hp_ratio": 40}), "damage_reduce").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 2, "hp_ratio": 80}), "damage_reduce").is_empty() | (待填) | | |
| 567 | 706 | "破封一击:挖开带封印危险格 +1 层·无封印反例零触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {"dug_under_seal": true}), "counter_add").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {"dug_under_seal": false}), "counter_add").is_empty() | (待填) | | |
| 568 | 714 | "弃图兑换:停手剩余 AP≥3 入账〔专长批 V3〕 " | orch._hits_of(me_hits, "counter_add").size() == 1 | (待填) | | |
| 569 | 718 | "弃图兑换:折为攻击伤害=剩余 AP 全额·用后清零〔专长批 V3〕 " | me_atk == 4 | (待填) | | |
| 570 | 719 | "弃图兑换反例:剩余 AP<3 不触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "dig_stop", {"ap_left": 2}), "counter_add").is_empty() | (待填) | | |
| 571 | 722 | "一滴不剩:上轮 AP 耗尽→+1 AP〔专长批 V3〕 " | orch._hits_of(ld_hits, "grant_ap").size() == 1 | (待填) | | |
| 572 | 723 | "一滴不剩反例:上轮有余不发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_start", {"round": 3, "ap_exhausted_last": false}), "grant_ap").is_empty() | (待填) | | |
| 573 | 729 | "收盘:本轮开格≥8→+1 GP〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "round_end", {}), "grant_gp").size() == 1 | (待填) | | |
| 574 | 73 2 | "斩首学者:击杀揭示 1 格〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "kill", {"target": "敌", "overflow": 0}), "reveal_tiles").size() == 1 | (待填) | | |
| 575 | 735 | "处刑台:敌血量≤30% 挂单位标记加伤·阈值外反例零命中〔专长批 V3〕 " | orch._hits_of(ex_hits, "target_attack_bonus").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "enemy_hp_threshold", {"unit": "e1", "pct": 60, "is_boss": false}), "target_attack_bonus").is_empty() | (待填) | | |
| 576 | 739 | "战地包扎:战斗胜利回复 N 生命(battle_won 新挂点)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "battle_won", {"round": 2}), "heal").size() == 1 | (待填) | | |
| 577 | 742 | "血税:双向同局账本(踩陷阱−2max_hp/封印命中+1atk——bonus_delta 战末汇入)〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "mine_hit", {}), "bonus_delta").size() == 1 and String((orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "bonus_delta")[0] as Dictionary).get("axis", "")) == "atk" | (待填) | | |
| 578 | 747 | "淬毒刃纹(迁入):克制正面(magic_vs_heavy 矩阵值>0)追加·中性面反例零触发〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "clamp_check", {"matchup": "magic_vs_heavy"}), "modify_ticket").size() == 1 and orch._hits_of(fx.dispatch(orch.counters_ctx, "clamp_check", {"matchup": "normal_vs_light"}), "modify_ticket").is_empty() | (待填) | | |
| 579 | 751 | "封印爆裂(迁入):标中全体敌群伤〔专长批 V3〕 " | orch._hits_of(fx.dispatch(orch.counters_ctx, "seal_hit", {}), "open_ticket").size() == 1 | (待填) | | |
| 580 | 755 | "零持有订阅=零命中(relic 关着零扰动——伤害管线既有行为逐位不变)" | orch0._fx_emit("attack_commit", {"atk": 10, "target": "敌", "matchup": "", "dig_streak": 0, "nest_count": 0}).is_empty() and orch0._fx_emit("dig_reveal", {"cell": Vector2i(1, 1), "round": 1, "is_first_dig_of_battle": true, "terrain_kind": []}).is_empty() and orch0._fx_emit("mine_hit", {"damage": 5}).is_empty() and orch0._fx_emit("battle_won", {"round": 1}).is_empty() | (待填) | | |
| 581 | 763 | "特性段空态隐藏(视图空态纪律同特性段)" | not panel._feat_section.visible | (待填) | | |
| 582 | 765 | "特性段持有呈现(逐件行常驻可读——「局内奖励选了什么看不到」缺口承载)" | panel._feat_section.visible and panel._feat_list.get_child_count() == 2 | (待填) | | |
| 583 | 766 | "特性卡文案表值化:desc 行字段直读(零硬编码映射)" | String(load("res://presentation/battle_narrator.gd").feat_card_text({"feat_id": "pain_memory", "display_name": "疼痛记忆", "desc": "触陷阱攒 1 层"})).contains("触陷阱攒 1 层") | (待填) | | |
## S74 _smoke_layout_cell_formula(行 65– 68 · 2 条 · 源 game/tests/unit/core/board_gen_reward_test.gd · 去向:待分类回填)
@@ -1238,7 +1238,7 @@
| 708 | 383 | "关卡步骤流非空(%d 行)" ↩ % rep1.rows.size() | rep1.rows.size() > 0 | (待填) | | |
| 709 | 385 | "模拟后 hero 表恢复基线(atk=%d hp=%d ac=%d——对配置快照)" ↩ % [int(_db.hero.atk), int(_db.hero.max_hp), int(_db.hero.armor_class)] | int(_db.hero.atk) == int(hero_base.atk) and int(_db.hero.max_hp) == int(hero_base.hp) \\ and int(_db.hero.armor_class) == int(hero_base.ac) | (待填) | | |
## S104 _smoke_level_graph(行 442– 762 · 70 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S104 _smoke_level_graph(行 442– 761 · 70 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
@@ -1306,131 +1306,131 @@
| 771 | 710 | "混编各行行值独立投影(display_name/hp/atk 按各自行值——同场不同种不同值)" | String(mix_units[0].get("display_name")) == "地精" and int(mix_units[1].get("hp")) == 20 and int(mix_units[1].get("atk")) == 3 | (待填) | | |
| 772 | 714 | "行集实例总数守卫:两行各定值 3(总 6 > 4)spawn 被拒(行集构成纪律③——R3 fail-fast 运行面)" | not over_sys.spawn(1, 6, int(_db.hero.max_hp)) | (待填) | | |
| 773 | 719 | "混编断言段注入行全量还原(表回 28 行——迭代 35 生成图深度扩面覆盖批后的基线行数;首批混编投放基线 20 行+覆盖 8 行)" | int(_db.enemy.rows.size()) == 28 | (待填) | | |
| 774 | 726 | "可见性冒烟:L2 入口停点就位(defer_entry——无当前节点,锚层 0) " | vis_ok and vis_runner.awaiting_choice() and vis_runner.current_node_id() == -1 | (待填) | | |
| 775 | 732 | "可见性冒烟:入口停点候选集 ⊆ 类型可见集(下一跳恒可见)〔fv4〕 " | vis_cand_in | (待填) | | |
| 776 | 737 | "可见性冒烟:L2 全部终点 Boss 句柄 %s 恒在可见集(终点不入雾)〔fv3〕 " ↩ % str(_ids_of_type(nodes2, "boss")) | vis_boss_ok | (待填) | | |
| 777 | 739 | "可见性冒烟:N 读数据表 = %d( provisional 2——代码零硬编码)〔fv6〕 " ↩ % vis_n | vis_n == 2 | (待填) | | |
| 778 | 761 | "可见性冒烟:入口锚层 0 时层距 ≤ %d 的节点全在可见集(扫描面 %d 颗·违例 0)〔fv1〕 " ↩ % [vis_n, near_count] | near_count >= 1 and near_ok | (待填) | | |
| 779 | 762 | "可见性冒烟:入口锚层 0 时层距 > %d 的非终点节点全入雾(扫描面 %d 颗·违例 0)〔fv1〕 " ↩ % [vis_n, fog_count] | fog_count >= 1 and fog_ok | (待填) | | |
| 774 | 725 | "可见性冒烟:L2 入口停点就位(defer_entry——无当前节点,锚层 0) " | vis_ok and vis_runner.awaiting_choice() and vis_runner.current_node_id() == -1 | (待填) | | |
| 775 | 731 | "可见性冒烟:入口停点候选集 ⊆ 类型可见集(下一跳恒可见)〔fv4〕 " | vis_cand_in | (待填) | | |
| 776 | 736 | "可见性冒烟:L2 全部终点 Boss 句柄 %s 恒在可见集(终点不入雾)〔fv3〕 " ↩ % str(_ids_of_type(nodes2, "boss")) | vis_boss_ok | (待填) | | |
| 777 | 738 | "可见性冒烟:N 读数据表 = %d( provisional 2——代码零硬编码)〔fv6〕 " ↩ % vis_n | vis_n == 2 | (待填) | | |
| 778 | 760 | "可见性冒烟:入口锚层 0 时层距 ≤ %d 的节点全在可见集(扫描面 %d 颗·违例 0)〔fv1〕 " ↩ % [vis_n, near_count] | near_count >= 1 and near_ok | (待填) | | |
| 779 | 761 | "可见性冒烟:入口锚层 0 时层距 > %d 的非终点节点全入雾(扫描面 %d 颗·违例 0)〔fv1〕 " ↩ % [vis_n, fog_count] | fog_count >= 1 and fog_ok | (待填) | | |
## S105 _smoke_gp_wallet(行 799 – 835 · 9 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S105 _smoke_gp_wallet(行 798 – 834 · 9 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 780 | 799 | "GP 到账:L1 启动(普通战档)" | runner.start_level(1, 42) | (待填) | | |
| 781 | 809 | "L1 首战胜利(battle_finished gp_dropped 载荷在案)" | fin.has("p") and String(fin["p"].get("result", "")) == "victory" | (待填) | | |
| 782 | 812 | "L1 普通战 gp_dropped − escrow ∈ [2+0, 4+0](掷定+关级加值 %d, escrow %+d) " ↩ % [gp_dropped - escrow_sum, escrow_sum] | gp_dropped - escrow_sum >= 2 and gp_dropped - escrow_sum <= 4 | (待填) | | |
| 783 | 817 | "钱包恰入账一次(gain 事件 × %d) " ↩ % gains.size() | gains.size() == 1 | (待填) | | |
| 784 | 819 | "入账金额 = gp_dropped 载荷(%d) " ↩ % gp_dropped | int(gains[0]["amount"]) == gp_dropped | (待填) | | |
| 785 | 820 | "钱包读数 = 入账后投影(gp=%d,破财负值场景经 clamp ≥0) " ↩ % runner.gp | runner.gp == maxi(0, gp_dropped) and runner.gp == int(gains[0]["gp"]) | (待填) | | |
| 786 | 827 | "L2 Boss 战启动((2,9)——Boss 档掷定 [6,10] + 关级加值 1) " | boss.begin_battle({"level_index": 2, "node_depth": 9, "node_type": "boss", "hero_hp": int(_db.hero.max_hp)}) | (待填) | | |
| 787 | 832 | "L2 Boss 战终局(%s——gp_dropped 于战斗末掷定上抛)" ↩ % String(boss.battle_result) | fin_b.has("p") | (待填) | | |
| 788 | 835 | "L2 Boss 战 gp_dropped − escrow ∈ [6+1, 10+1](掷定+关级加值 %d, escrow %+d) " ↩ % [gp_b - escrow_b, escrow_b] | gp_b - escrow_b >= 7 and gp_b - escrow_b <= 11 | (待填) | | |
| 780 | 798 | "GP 到账:L1 启动(普通战档)" | runner.start_level(1, 42) | (待填) | | |
| 781 | 808 | "L1 首战胜利(battle_finished gp_dropped 载荷在案)" | fin.has("p") and String(fin["p"].get("result", "")) == "victory" | (待填) | | |
| 782 | 811 | "L1 普通战 gp_dropped − escrow ∈ [2+0, 4+0](掷定+关级加值 %d, escrow %+d) " ↩ % [gp_dropped - escrow_sum, escrow_sum] | gp_dropped - escrow_sum >= 2 and gp_dropped - escrow_sum <= 4 | (待填) | | |
| 783 | 816 | "钱包恰入账一次(gain 事件 × %d) " ↩ % gains.size() | gains.size() == 1 | (待填) | | |
| 784 | 818 | "入账金额 = gp_dropped 载荷(%d) " ↩ % gp_dropped | int(gains[0]["amount"]) == gp_dropped | (待填) | | |
| 785 | 819 | "钱包读数 = 入账后投影(gp=%d,破财负值场景经 clamp ≥0) " ↩ % runner.gp | runner.gp == maxi(0, gp_dropped) and runner.gp == int(gains[0]["gp"]) | (待填) | | |
| 786 | 826 | "L2 Boss 战启动((2,9)——Boss 档掷定 [6,10] + 关级加值 1) " | boss.begin_battle({"level_index": 2, "node_depth": 9, "node_type": "boss", "hero_hp": int(_db.hero.max_hp)}) | (待填) | | |
| 787 | 831 | "L2 Boss 战终局(%s——gp_dropped 于战斗末掷定上抛)" ↩ % String(boss.battle_result) | fin_b.has("p") | (待填) | | |
| 788 | 834 | "L2 Boss 战 gp_dropped − escrow ∈ [6+1, 10+1](掷定+关级加值 %d, escrow %+d) " ↩ % [gp_b - escrow_b, escrow_b] | gp_b - escrow_b >= 7 and gp_b - escrow_b <= 11 | (待填) | | |
## S106 _smoke_gp_escrow(行 873 – 937 · 12 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S106 _smoke_gp_escrow(行 872 – 936 · 12 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 789 | 873 | "GP 袋(gp 型安全格)可挖掘局种子可达(seed=%s) " ↩ % str(scan.get("seed", -1)) | not scan.is_empty() | (待填) | | |
| 790 | 886 | "GP局战斗终局(先手 999 收束)" | settlement2.battle_result == "victory" | (待填) | | |
| 791 | 891 | "GP 袋兑付行在案(GP 袋 +3 → 战斗内缓冲,origin 指回来源格)" | gain_ok | (待填) | | |
| 792 | 892 | "escrow 累计缓冲 ≥3(实测 %d——战斗域中间态,不入钱包不入增益容器)" ↩ % int(settlement2.escrow) | int(settlement2.escrow) >= 3 | (待填) | | |
| 793 | 894 | "格面兑付计入 gp_dropped( %d − escrow %d ∈ [2,4]——战斗末一次到账,随上抛即弃)" ↩ % [gp_d, int(settlement2.escrow)] | gp_d - int(settlement2.escrow) >= 2 and gp_d - int(settlement2.escrow) <= 4 | (待填) | | |
| 794 | 900 | "破财直验战斗启动" | settle_l.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "hero_atk": 999, "node_type": "boss"}) | (待填) | | |
| 795 | 904 | "破财 × 3 → escrow −6(负向缓冲记账,零钱包触达)" | int(settle_l.escrow) == -6 | (待填) | | |
| 796 | 909 | "破财压制 gp_dropped 负值上抛(%d + 6 = %d ∈ Boss 档掷定 [%d,%d] + 关级加值 %d——掷定不受破财污染)" ↩ % [ gp_l, gp_l + 6, int(boss_drop.get("roll_min", 0)), int(boss_drop.get("roll_max", 0)), boss_bonus1] | gp_l + 6 >= int(boss_drop.get("roll_min", 0)) + boss_bonus1 and gp_l + 6 <= int(boss_drop.get("roll_max", 0)) + boss_bonus1 | (待填) | | |
| 797 | 919 | "clamp 场景:L1 启动(冒险钱包开局 0) " | runner.start_level(1, 4242) | (待填) | | |
| 798 | 931 | "破财压制入账载荷为负(gp_dropped=%d) " ↩ % gp3 | gp3 < 0 | (待填) | | |
| 799 | 936 | "破财入账恰一次且投影读数 0( amount=%d, clamp 后 gp=0) " ↩ % gp3 | gain3.size() == 1 and int(gain3[0]["amount"]) == gp3 and int(gain3[0]["gp"]) == 0 | (待填) | | |
| 800 | 937 | "钱包全程不透支(gp=%d,事件投影最小读数 %d ≥ 0) " ↩ % [runner.gp, int(ev_box["min_gp"])] | runner.gp == 0 and int(ev_box["min_gp"]) >= 0 | (待填) | | |
| 789 | 872 | "GP 袋(gp 型安全格)可挖掘局种子可达(seed=%s) " ↩ % str(scan.get("seed", -1)) | not scan.is_empty() | (待填) | | |
| 790 | 885 | "GP局战斗终局(先手 999 收束)" | settlement2.battle_result == "victory" | (待填) | | |
| 791 | 890 | "GP 袋兑付行在案(GP 袋 +3 → 战斗内缓冲,origin 指回来源格)" | gain_ok | (待填) | | |
| 792 | 891 | "escrow 累计缓冲 ≥3(实测 %d——战斗域中间态,不入钱包不入增益容器)" ↩ % int(settlement2.escrow) | int(settlement2.escrow) >= 3 | (待填) | | |
| 793 | 893 | "格面兑付计入 gp_dropped( %d − escrow %d ∈ [2,4]——战斗末一次到账,随上抛即弃)" ↩ % [gp_d, int(settlement2.escrow)] | gp_d - int(settlement2.escrow) >= 2 and gp_d - int(settlement2.escrow) <= 4 | (待填) | | |
| 794 | 899 | "破财直验战斗启动" | settle_l.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "hero_atk": 999, "node_type": "boss"}) | (待填) | | |
| 795 | 903 | "破财 × 3 → escrow −6(负向缓冲记账,零钱包触达)" | int(settle_l.escrow) == -6 | (待填) | | |
| 796 | 908 | "破财压制 gp_dropped 负值上抛(%d + 6 = %d ∈ Boss 档掷定 [%d,%d] + 关级加值 %d——掷定不受破财污染)" ↩ % [ gp_l, gp_l + 6, int(boss_drop.get("roll_min", 0)), int(boss_drop.get("roll_max", 0)), boss_bonus1] | gp_l + 6 >= int(boss_drop.get("roll_min", 0)) + boss_bonus1 and gp_l + 6 <= int(boss_drop.get("roll_max", 0)) + boss_bonus1 | (待填) | | |
| 797 | 918 | "clamp 场景:L1 启动(冒险钱包开局 0) " | runner.start_level(1, 4242) | (待填) | | |
| 798 | 930 | "破财压制入账载荷为负(gp_dropped=%d) " ↩ % gp3 | gp3 < 0 | (待填) | | |
| 799 | 935 | "破财入账恰一次且投影读数 0( amount=%d, clamp 后 gp=0) " ↩ % gp3 | gain3.size() == 1 and int(gain3[0]["amount"]) == gp3 and int(gain3[0]["gp"]) == 0 | (待填) | | |
| 800 | 936 | "钱包全程不透支(gp=%d,事件投影最小读数 %d ≥ 0) " ↩ % [runner.gp, int(ev_box["min_gp"])] | runner.gp == 0 and int(ev_box["min_gp"]) >= 0 | (待填) | | |
## S107 _smoke_shop_room(行 1003 – 1089 · 25 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S107 _smoke_shop_room(行 1002 – 1088 · 25 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 801 | 1003 | "商店房到达种子可达(seed=%s——进店 GP ≥ 16) " ↩ % str(shop_run.get("seed", -1)) | not shop_run.is_empty() | (待填) | | |
| 802 | 1016 | "L2 行进到商店房:当前节点型别 = shop 且出边恰一条指终点 Boss(句柄 %d·出边 %s) " ↩ % [shop_id, str(shop_outs)] | String(runner.current_node().get("type", "")) == "shop" and shop_outs.size() == 1 \\ and String(s_byid.get(int(shop_outs[0]), {}).get("type", "")) == "boss" \\ and (s_byid.get(int(shop_outs[0]), {}).get("next", []) as Array).is_empty() | (待填) | | |
| 803 | 1020 | "L2 到店路径穿商店恰 1 家(已到句柄 %s 型别计数——必经恰一店的行进面)" ↩ % str(runner.visited_ids()) | _path_shop_count(s_nodes, runner.visited_ids()) == 1 | (待填) | | |
| 804 | 1022 | "L2 商店节点(句柄 %d)入边恰一条(店位归终点的直接前驱——行进面复核)" ↩ % shop_id | shop_preds == 1 | (待填) | | |
| 805 | 1024 | "到店商店节点无出边(夹具停摆——去终点方向无法从图解析)" | false | (待填) | | |
| 806 | 1026 | "到店开店态(覆盖层数据源就位——离开前不出选路口,零自动推进)" | not runner.awaiting_choice() and runner.next_candidate_ids().is_empty() | (待填) | | |
| 807 | 1029 | "三商品全陈列(atk_up/hp_up/armor_up——无刷新无摇号)" | prods.size() == 3 | (待填) | | |
| 808 | 1031 | "L2 首购现价 = 基价 + 关级加值 2( atk_up 6 / hp_up 4 / armor_up 6) " | int(by_id["atk_up"]["price"]) == 6 and int(by_id["hp_up"]["price"]) == 4 and int(by_id["armor_up"]["price"]) == 6 | (待填) | | |
| 809 | 1034 | "购买 atk_up 受理(现价 6) " | runner.buy_product("atk_up") | (待填) | | |
| 810 | 1035 | "钱包扣现价 6( %d → %d) " ↩ % [gp0, runner.gp] | runner.gp == gp0 - 6 | (待填) | | |
| 811 | 1037 | "统一冒险加算区 atk +1( bonus={atk,max_hp,armor_class} 账本 ) " | int( runner.run_ledger.bonus.get ("atk", -1) ) == 1 and int( runner.run_ledger.bonus.get ("max_hp", -1) ) == 0 and int( runner.run_ledger.bonus.get ("armor_class", -1) ) == 0 | (待填) | | |
| 812 | 1039 | "atk_up 二购现价 = 4+2+2=8(步长 2 × 已购 1 档,现价现算)" | int(by_id["atk_up"]["price"]) == 8 and int(by_id["atk_up"]["purchased"]) == 1 | (待填) | | |
| 813 | 1046 | "购买 hp_up 受理(现价 4) " | runner.buy_product("hp_up") | (待填) | | |
| 814 | 1047 | "钱包扣 4( %d) " ↩ % runner.gp | runner.gp == gp0 - 6 - 4 | (待填) | | |
| 815 | 1048 | "生命上限 +3( %d → %d——加算区 max_hp 轴)" ↩ % [mhp_before, runner.effective_max_hp()] | runner.effective_max_hp() == mhp_before + 3 | (待填) | | |
| 816 | 1049 | "当前生命同步 +3 封顶新上限(%d → %d) " ↩ % [hp_before, runner.hero_hp] | runner.hero_hp == mini(hp_before + 3, runner.effective_max_hp()) | (待填) | | |
| 817 | 1051 | "购买 armor_up 受理(现价 6) " | runner.buy_product("armor_up") | (待填) | | |
| 818 | 1052 | "AC = 10+1( armor_class 加算区轴,无百分比通道)" | runner.effective_ac() == int(_db.hero.armor_class) + 1 | (待填) | | |
| 819 | 1067 | "余额不足购买被拒(gp=%d < 现价 %d——零扣费零档位变动)" ↩ % [gp_dry, hp_dry] | not runner.buy_product("hp_up") and runner.gp == gp_dry and runner.purchased_tier("hp_up") == tier_dry | (待填) | | |
| 820 | 1069 | "离开商店 → 回选路口(候选 = 店出边 %s——零自动推进收口)" ↩ % str(shop_outs) | runner.continue_after_node() and runner.awaiting_choice() and _sorted_ids(runner.next_candidate_ids()) == _sorted_ids(shop_outs) | (待填) | | |
| 821 | 1072 | "主角攻击生效值 = 2+1(基础表值 + 加算区)" | runner.effective_atk() == int(_db.hero.atk) + 1 | (待填) | | |
| 822 | 1073 | "选终点 Boss(句柄 %d)开战" ↩ % int(shop_outs[0]) | runner.pick_next_node(int(shop_outs[0])) and runner.current_battle() != null | (待填) | | |
| 823 | 1077 | "战斗开始参数 = 基础表值 + 加算区(atk %d = 2+1 / max_hp %d = %d+%d× 3) " ↩ % [int(snap["hero"].get("atk", -1)), int(snap["hero"].get("max_hp", -1)), int(_db.hero.max_hp), hp_buys] | int(snap["hero"].get("atk", -1)) == int(_db.hero.atk) + 1 and int(snap["hero"].get("max_hp", -1)) == int(_db.hero.max_hp) + 3 * hp_buys | (待填) | | |
| 824 | 1088 | "冒险收束(Boss 战终局:%s) " ↩ % String(fin_end.get("p", {}).get("result", "")) | fin_end.has("p") and String(fin_end["p"].get("result", "")) in ["victory", "defeat"] | (待填) | | |
| 825 | 1089 | "冒险收束钱包清零(局内货币生命周期终点——不入存档不入摘要)" | runner.gp == 0 | (待填) | | |
| 801 | 1002 | "商店房到达种子可达(seed=%s——进店 GP ≥ 16) " ↩ % str(shop_run.get("seed", -1)) | not shop_run.is_empty() | (待填) | | |
| 802 | 1015 | "L2 行进到商店房:当前节点型别 = shop 且出边恰一条指终点 Boss(句柄 %d·出边 %s) " ↩ % [shop_id, str(shop_outs)] | String(runner.current_node().get("type", "")) == "shop" and shop_outs.size() == 1 \\ and String(s_byid.get(int(shop_outs[0]), {}).get("type", "")) == "boss" \\ and (s_byid.get(int(shop_outs[0]), {}).get("next", []) as Array).is_empty() | (待填) | | |
| 803 | 1019 | "L2 到店路径穿商店恰 1 家(已到句柄 %s 型别计数——必经恰一店的行进面)" ↩ % str(runner.visited_ids()) | _path_shop_count(s_nodes, runner.visited_ids()) == 1 | (待填) | | |
| 804 | 1021 | "L2 商店节点(句柄 %d)入边恰一条(店位归终点的直接前驱——行进面复核)" ↩ % shop_id | shop_preds == 1 | (待填) | | |
| 805 | 1023 | "到店商店节点无出边(夹具停摆——去终点方向无法从图解析)" | false | (待填) | | |
| 806 | 1025 | "到店开店态(覆盖层数据源就位——离开前不出选路口,零自动推进)" | not runner.awaiting_choice() and runner.next_candidate_ids().is_empty() | (待填) | | |
| 807 | 1028 | "三商品全陈列(atk_up/hp_up/armor_up——无刷新无摇号)" | prods.size() == 3 | (待填) | | |
| 808 | 1030 | "L2 首购现价 = 基价 + 关级加值 2( atk_up 6 / hp_up 4 / armor_up 6) " | int(by_id["atk_up"]["price"]) == 6 and int(by_id["hp_up"]["price"]) == 4 and int(by_id["armor_up"]["price"]) == 6 | (待填) | | |
| 809 | 1033 | "购买 atk_up 受理(现价 6) " | runner.buy_product("atk_up") | (待填) | | |
| 810 | 1034 | "钱包扣现价 6( %d → %d) " ↩ % [gp0, runner.gp] | runner.gp == gp0 - 6 | (待填) | | |
| 811 | 1036 | "统一冒险加算区 atk +1( 加算区住主角账 ) " | runner.hero().bonus_total ("atk") == 1 and runner.hero().bonus_total ("max_hp") == 0 and runner.hero().bonus_total ("armor_class") == 0 | (待填) | | |
| 812 | 1038 | "atk_up 二购现价 = 4+2+2=8(步长 2 × 已购 1 档,现价现算)" | int(by_id["atk_up"]["price"]) == 8 and int(by_id["atk_up"]["purchased"]) == 1 | (待填) | | |
| 813 | 1045 | "购买 hp_up 受理(现价 4) " | runner.buy_product("hp_up") | (待填) | | |
| 814 | 1046 | "钱包扣 4( %d) " ↩ % runner.gp | runner.gp == gp0 - 6 - 4 | (待填) | | |
| 815 | 1047 | "生命上限 +3( %d → %d——加算区 max_hp 轴)" ↩ % [mhp_before, runner.effective_max_hp()] | runner.effective_max_hp() == mhp_before + 3 | (待填) | | |
| 816 | 1048 | "当前生命同步 +3 封顶新上限(%d → %d) " ↩ % [hp_before, runner.hero_hp] | runner.hero_hp == mini(hp_before + 3, runner.effective_max_hp()) | (待填) | | |
| 817 | 1050 | "购买 armor_up 受理(现价 6) " | runner.buy_product("armor_up") | (待填) | | |
| 818 | 1051 | "AC = 10+1( armor_class 加算区轴,无百分比通道)" | runner.effective_ac() == int(_db.hero.armor_class) + 1 | (待填) | | |
| 819 | 1066 | "余额不足购买被拒(gp=%d < 现价 %d——零扣费零档位变动)" ↩ % [gp_dry, hp_dry] | not runner.buy_product("hp_up") and runner.gp == gp_dry and runner.purchased_tier("hp_up") == tier_dry | (待填) | | |
| 820 | 1068 | "离开商店 → 回选路口(候选 = 店出边 %s——零自动推进收口)" ↩ % str(shop_outs) | runner.continue_after_node() and runner.awaiting_choice() and _sorted_ids(runner.next_candidate_ids()) == _sorted_ids(shop_outs) | (待填) | | |
| 821 | 1071 | "主角攻击生效值 = 2+1(基础表值 + 加算区)" | runner.effective_atk() == int(_db.hero.atk) + 1 | (待填) | | |
| 822 | 1072 | "选终点 Boss(句柄 %d)开战" ↩ % int(shop_outs[0]) | runner.pick_next_node(int(shop_outs[0])) and runner.current_battle() != null | (待填) | | |
| 823 | 1076 | "战斗开始参数 = 基础表值 + 加算区(atk %d = 2+1 / max_hp %d = %d+%d× 3) " ↩ % [int(snap["hero"].get("atk", -1)), int(snap["hero"].get("max_hp", -1)), int(_db.hero.max_hp), hp_buys] | int(snap["hero"].get("atk", -1)) == int(_db.hero.atk) + 1 and int(snap["hero"].get("max_hp", -1)) == int(_db.hero.max_hp) + 3 * hp_buys | (待填) | | |
| 824 | 1087 | "冒险收束(Boss 战终局:%s) " ↩ % String(fin_end.get("p", {}).get("result", "")) | fin_end.has("p") and String(fin_end["p"].get("result", "")) in ["victory", "defeat"] | (待填) | | |
| 825 | 1088 | "冒险收束钱包清零(局内货币生命周期终点——不入存档不入摘要)" | runner.gp == 0 | (待填) | | |
## S108 _smoke_shop_graph(行 1111 – 1168 · 9 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S108 _smoke_shop_graph(行 1110 – 1167 · 9 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 826 | 1111 | "L%d 参数档缺行(商店编排断言无源可扫)" ↩ % L | false | (待填) | | |
| 827 | 1116 | "L%d 种子 %d 生成图为空(编排断言扫描面空转)" ↩ % [L, seed_val] | false | (待填) | | |
| 828 | 1142 | "编排断言扫描面非空(三关参数档 × 种子 %d–%d=图 %d 张·终点 %d·路径 %d)〔v5〕 " ↩ % [SWEEP_SEED_FROM, SWEEP_SEED_TO - 1, graph_total, term_total, path_total] | graph_total == 3 * (SWEEP_SEED_TO - SWEEP_SEED_FROM) and term_total >= 3 and path_total >= 3 | (待填) | | |
| 829 | 1144 | "性质① 每个终点的直接前驱恰一家商店(入边一条且源型别=shop·违例 %d/%d 终点)〔v5〕 " ↩ % [pred_bad, term_total] | pred_bad == 0 | (待填) | | |
| 830 | 1145 | "性质② 每图商店节点数 = 终点数(违例 %d/%d 图)〔v5〕 " ↩ % [count_bad, graph_total] | count_bad == 0 | (待填) | | |
| 831 | 1146 | "性质③ 每条入口→终点路径恰穿一家商店(违例 %d/%d 条路径)〔v5〕 " ↩ % [path_bad, path_total] | path_bad == 0 | (待填) | | |
| 832 | 1152 | "L%d 现行图终点 %d 个 = 商店 %d 个·入口→终点路径 %d 条全穿恰一店" ↩ % [L, cur_terms.size(), cur_shops.size(), _all_entry_terminal_paths(cur_nodes).size()] | cur_terms.size() == cur_shops.size() and not cur_terms.is_empty() and _all_entry_terminal_paths(cur_nodes).size() >= cur_terms.size() and _paths_all_one_shop(cur_nodes) | (待填) | | |
| 833 | 1164 | "L%d 现行图终点深度 %s 逐点 Boss 行集解析命中且落带 ≥ 终点深度" ↩ % [L, str(tdepths)] | hit_ok | (待填) | | |
| 834 | 1167 | "L1 现行图跨表覆盖(战斗/Boss 节点 %d 颗非空·敌侧违例 %d·板侧违例 %d) " ↩ % [int(l1_cov["nodes"]), int(l1_cov["enemy_bad"]), int(l1_cov["board_bad"])] | int(l1_cov["nodes"]) >= 1 and int(l1_cov["enemy_bad"]) == 0 and int(l1_cov["board_bad"]) == 0 | (待填) | | |
| 826 | 1110 | "L%d 参数档缺行(商店编排断言无源可扫)" ↩ % L | false | (待填) | | |
| 827 | 1115 | "L%d 种子 %d 生成图为空(编排断言扫描面空转)" ↩ % [L, seed_val] | false | (待填) | | |
| 828 | 1141 | "编排断言扫描面非空(三关参数档 × 种子 %d–%d=图 %d 张·终点 %d·路径 %d)〔v5〕 " ↩ % [SWEEP_SEED_FROM, SWEEP_SEED_TO - 1, graph_total, term_total, path_total] | graph_total == 3 * (SWEEP_SEED_TO - SWEEP_SEED_FROM) and term_total >= 3 and path_total >= 3 | (待填) | | |
| 829 | 1143 | "性质① 每个终点的直接前驱恰一家商店(入边一条且源型别=shop·违例 %d/%d 终点)〔v5〕 " ↩ % [pred_bad, term_total] | pred_bad == 0 | (待填) | | |
| 830 | 1144 | "性质② 每图商店节点数 = 终点数(违例 %d/%d 图)〔v5〕 " ↩ % [count_bad, graph_total] | count_bad == 0 | (待填) | | |
| 831 | 1145 | "性质③ 每条入口→终点路径恰穿一家商店(违例 %d/%d 条路径)〔v5〕 " ↩ % [path_bad, path_total] | path_bad == 0 | (待填) | | |
| 832 | 1151 | "L%d 现行图终点 %d 个 = 商店 %d 个·入口→终点路径 %d 条全穿恰一店" ↩ % [L, cur_terms.size(), cur_shops.size(), _all_entry_terminal_paths(cur_nodes).size()] | cur_terms.size() == cur_shops.size() and not cur_terms.is_empty() and _all_entry_terminal_paths(cur_nodes).size() >= cur_terms.size() and _paths_all_one_shop(cur_nodes) | (待填) | | |
| 833 | 1163 | "L%d 现行图终点深度 %s 逐点 Boss 行集解析命中且落带 ≥ 终点深度" ↩ % [L, str(tdepths)] | hit_ok | (待填) | | |
| 834 | 1166 | "L1 现行图跨表覆盖(战斗/Boss 节点 %d 颗非空·敌侧违例 %d·板侧违例 %d) " ↩ % [int(l1_cov["nodes"]), int(l1_cov["enemy_bad"]), int(l1_cov["board_bad"])] | int(l1_cov["nodes"]) >= 1 and int(l1_cov["enemy_bad"]) == 0 and int(l1_cov["board_bad"]) == 0 | (待填) | | |
## S109 _smoke_multi_terminal_settlement(行 1176 – 1223 · 5 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S109 _smoke_multi_terminal_settlement(行 1175 – 1222 · 5 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 835 | 1176 | "L2 现行图为多终点(Boss 终点 %s 两颗以上——大岔口承载面)" ↩ % str(boss_ids) | boss_ids.size() >= 2 | (待填) | | |
| 836 | 1188 | "L2 min/max 两路各打进各自终点 Boss(末句柄 %d / %d 互异且都在图 Boss 集 %s 内;两路 result=%s/%s) " ↩ % [min_last, max_last, str(boss_ids), String(run_min.get("result", "")), String(run_max.get("result", ""))] | String(run_min.get("result", "")) == "victory" and String(run_max.get("result", "")) == "victory" and boss_ids.has(min_last) and boss_ids.has(max_last) and min_last != max_last | (待填) | | |
| 837 | 1192 | "min 路未到 max 终点 %d、max 路未到 min 终点 %d(区域隔离——走 A 区不误兑付 B 区 Boss) " ↩ % [max_last, min_last] | not min_vis.has(max_last) and not max_vis.has(min_last) | (待填) | | |
| 838 | 1199 | "L2 全程驱动启动受理" | runner.start_level(2, 42) | (待填) | | |
| 839 | 1221 | "任一 Boss 胜即本关收束恰一次(count=%d·载荷 result=%s·node_id=%s 在图 Boss 集 %s 内)" ↩ % [int(fin["count"]), String(payload.get("result", "")), str(payload.get("node_id", -1)), str(boss_ids)] | int(fin["count"]) == 1 and String(payload.get("result", "")) == "victory" and boss_ids.has(int(payload.get("node_id", -1))) | (待填) | | |
| 835 | 1175 | "L2 现行图为多终点(Boss 终点 %s 两颗以上——大岔口承载面)" ↩ % str(boss_ids) | boss_ids.size() >= 2 | (待填) | | |
| 836 | 1187 | "L2 min/max 两路各打进各自终点 Boss(末句柄 %d / %d 互异且都在图 Boss 集 %s 内;两路 result=%s/%s) " ↩ % [min_last, max_last, str(boss_ids), String(run_min.get("result", "")), String(run_max.get("result", ""))] | String(run_min.get("result", "")) == "victory" and String(run_max.get("result", "")) == "victory" and boss_ids.has(min_last) and boss_ids.has(max_last) and min_last != max_last | (待填) | | |
| 837 | 1191 | "min 路未到 max 终点 %d、max 路未到 min 终点 %d(区域隔离——走 A 区不误兑付 B 区 Boss) " ↩ % [max_last, min_last] | not min_vis.has(max_last) and not max_vis.has(min_last) | (待填) | | |
| 838 | 1198 | "L2 全程驱动启动受理" | runner.start_level(2, 42) | (待填) | | |
| 839 | 1220 | "任一 Boss 胜即本关收束恰一次(count=%d·载荷 result=%s·node_id=%s 在图 Boss 集 %s 内)" ↩ % [int(fin["count"]), String(payload.get("result", "")), str(payload.get("node_id", -1)), str(boss_ids)] | int(fin["count"]) == 1 and String(payload.get("result", "")) == "victory" and boss_ids.has(int(payload.get("node_id", -1))) | (待填) | | |
## S110 _smoke_shop_pool(行 1258 – 1392 · 29 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
## S110 _smoke_shop_pool(行 1257 – 1391 · 29 条 · 源 game/tests/unit/core/level_shop_economy_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
| 840 | 1258 | "池模式商店房场景可达(seed=%s) " ↩ % str(scen.get("s", -1)) | not scen.is_empty() | (待填) | | |
| 841 | 1266 | "进店抽 3(货架 %d 卡——同构交互)" ↩ % first_shelf_a.size() | first_shelf_a.size() == 3 | (待填) | | |
| 842 | 1272 | "刷新首价=基价(%d) " ↩ % cost0 | cost0 == int(_db.adventure.shop_refresh_cost_base) | (待填) | | |
| 843 | 1273 | "基础免费 0 次(Q2——天赋增益位后续添加)" | r8.shop_refresh_free_left() == 0 | (待填) | | |
| 844 | 1275 | "GP 刷新受理(gp=%d cost=%d) " ↩ % [gp0, cost0] | r8.shop_refresh() | (待填) | | |
| 845 | 1276 | "GP 刷新扣费(%d→%d) " ↩ % [gp0, int(r8.gp)] | int(r8.gp) == gp0 - cost0 | (待填) | | |
| 846 | 1277 | "刷新爬价 × curve( %d) " ↩ % int(r8.shop_refresh_cost()) | int(r8.shop_refresh_cost()) == int(ceil(float(cost0) * float(_db.adventure.shop_refresh_cost_curve))) | (待填) | | |
| 847 | 1285 | "同种子同货架逐位(确定性重放承载——断点货架续玩语义)" | same_shelf | (待填) | | |
| 848 | 1295 | "relic 现价 = ceil(15.0× b^(关序−1))(读表与迁移前字面量逐位一致,%d)〔wd11〕 " ↩ % relic_price_now | relic_price_now == relic_price_pre | (待填) | | |
| 849 | 1301 | "货架 kind 在封闭词表或保底 relic 卡(%s) " ↩ % ckind | is_relic or shelf_kinds.has(ckind) | (待填) | | |
| 850 | 1308 | "首购现价 = ceil(基价×b^(关序−1))( %s: %d = %d 推导)" ↩ % [ckind, int(c.get("price", -1)), expect_p] | int(c.get("price", -1)) == expect_p | (待填) | | |
| 851 | 1315 | "可购卡在架(GP %d——种子扫描保证首购空间)" ↩ % int(r8.gp) | not buy_c.is_empty() | (待填) | | |
| 852 | 1323 | "购买受理(pool 口——%s\|%s) " ↩ % [kind, tier] | r8.buy_pool_item(kind) | (待填) | | |
| 853 | 1324 | "钱包扣现价(%d → %d) " ↩ % [gp0, int(r8.gp)] | int(r8.gp) == gp0 - int(buy_c.get("price", 0)) | (待填) | | |
| 854 | 1325 | "加算区 +令牌档位件值(池件=奖励件本体——%s\|%s %+d) " ↩ % [kind, tier, int(_db.adventure.curio_value(kind, tier))] | int(a8.run_ledger.bonus.get (String(val_map[kind]), -999) ) == val0 + int(_db.adventure.curio_value(kind, tier)) | (待填) | | |
| 855 | 1326 | "共享池账本 -1(跨渠道单点——taken %d → %d) " ↩ % [taken0, int(a8._curio_ taken.get(kind, 0))] | int(a8._curio_ taken.get(kind, 0)) == taken0 + 1 | (待填) | | |
| 856 | 1338 | "A 链爬价 = ceil(base× b^(关序−1)× A^1)(进店第 2 购——%d) " ↩ % expect_p2 | int(second.get("price", -1)) == expect_p2 | (待填) | | |
| 857 | 1339 | "同 visit 第二购受理(A 链软闸在价不在限)" | r8.buy_pool_item(String(second.get("kind_id", ""))) | (待填) | | |
| 858 | 1341 | "A 链爬价场景未构造(抬 GP 后货架仍无可购第二卡)——场景绑定失败" | false | (待填) | | |
| 859 | 1349 | "切边件零入店(40 次重抽零 gp/aux——负交易切边+三轴 doctrine) " | not cut_seen | (待填) | | |
| 860 | 1360 | "库存尽剔牌库(attack 令牌耗尽——池消耗即上限跨渠道共库 reward→shop 向)" | not attack_seen | (待填) | | |
| 861 | 1362 | "池空消费拒绝(handler 零副作用——买光即枯竭硬闸)" | not a8._ consume_pool_purchase("attack", "common") and a8.pool_stock("attack") == stock_before | (待填) | | |
| 862 | 1365 | "商店消费口受理(_apply_curio_pick 同口——真单点库)" | a8._ consume_pool_purchase("attack", "common") | (待填) | | |
| 863 | 1371 | "商店购买进奖励牌库摘牌(买一件=奖励面少一件——shop→reward 向共库)" | not reward_attack_seen | (待填) | | |
| 864 | 1376 | "离开商店 → 回选路口(货架态清零落档——零自动推进收口)" | r8.continue_after_node() and r8.awaiting_choice() | (待填) | | |
| 865 | 1378 | "断点扩键 shop_shelf 在案(离开店=空架合法态——P2 甲扩列)" | bp.has("shop_shelf") and (bp["shop_shelf"] as Array).is_empty() | (待填) | | |
| 866 | 1379 | "断点扩键 shop_visit_buys 在案(离开店清零——A 链输入不入档语义)" | bp.has("shop_visit_buys") and int(bp["shop_visit_buys"]) == 0 | (待填) | | |
| 867 | 1384 | "终局池读数六键出讫(run_adventure pool 面——四池种+T5 专长凭证+T6 heal 行,读数只锚一次载体)" | ps.size() == 6 | (待填) | | |
| 868 | 1392 | "终局池余量在域 [0,配额]( %s) " ↩ % str(ps) | ps_ok | (待填) | | |
| 840 | 1257 | "池模式商店房场景可达(seed=%s) " ↩ % str(scen.get("s", -1)) | not scen.is_empty() | (待填) | | |
| 841 | 1265 | "进店抽 3(货架 %d 卡——同构交互)" ↩ % first_shelf_a.size() | first_shelf_a.size() == 3 | (待填) | | |
| 842 | 1271 | "刷新首价=基价(%d) " ↩ % cost0 | cost0 == int(_db.adventure.shop_refresh_cost_base) | (待填) | | |
| 843 | 1272 | "基础免费 0 次(Q2——天赋增益位后续添加)" | r8.shop_refresh_free_left() == 0 | (待填) | | |
| 844 | 1274 | "GP 刷新受理(gp=%d cost=%d) " ↩ % [gp0, cost0] | r8.shop_refresh() | (待填) | | |
| 845 | 1275 | "GP 刷新扣费(%d→%d) " ↩ % [gp0, int(r8.gp)] | int(r8.gp) == gp0 - cost0 | (待填) | | |
| 846 | 1276 | "刷新爬价 × curve( %d) " ↩ % int(r8.shop_refresh_cost()) | int(r8.shop_refresh_cost()) == int(ceil(float(cost0) * float(_db.adventure.shop_refresh_cost_curve))) | (待填) | | |
| 847 | 1284 | "同种子同货架逐位(确定性重放承载——断点货架续玩语义)" | same_shelf | (待填) | | |
| 848 | 1294 | "relic 现价 = ceil(15.0× b^(关序−1))(读表与迁移前字面量逐位一致,%d)〔wd11〕 " ↩ % relic_price_now | relic_price_now == relic_price_pre | (待填) | | |
| 849 | 1300 | "货架 kind 在封闭词表或保底 relic 卡(%s) " ↩ % ckind | is_relic or shelf_kinds.has(ckind) | (待填) | | |
| 850 | 1307 | "首购现价 = ceil(基价×b^(关序−1))( %s: %d = %d 推导)" ↩ % [ckind, int(c.get("price", -1)), expect_p] | int(c.get("price", -1)) == expect_p | (待填) | | |
| 851 | 1314 | "可购卡在架(GP %d——种子扫描保证首购空间)" ↩ % int(r8.gp) | not buy_c.is_empty() | (待填) | | |
| 852 | 1322 | "购买受理(pool 口——%s\|%s) " ↩ % [kind, tier] | r8.buy_pool_item(kind) | (待填) | | |
| 853 | 1323 | "钱包扣现价(%d → %d) " ↩ % [gp0, int(r8.gp)] | int(r8.gp) == gp0 - int(buy_c.get("price", 0)) | (待填) | | |
| 854 | 1324 | "加算区 +令牌档位件值(池件=奖励件本体——%s\|%s %+d) " ↩ % [kind, tier, int(_db.adventure.curio_value(kind, tier))] | a8.hero().bonus_total (String(val_map[kind])) == val0 + int(_db.adventure.curio_value(kind, tier)) | (待填) | | |
| 855 | 1325 | "共享池账本 -1(跨渠道单点——taken %d → %d) " ↩ % [taken0, int(a8._curio. taken.get(kind, 0))] | int(a8._curio. taken.get(kind, 0)) == taken0 + 1 | (待填) | | |
| 856 | 1337 | "A 链爬价 = ceil(base× b^(关序−1)× A^1)(进店第 2 购——%d) " ↩ % expect_p2 | int(second.get("price", -1)) == expect_p2 | (待填) | | |
| 857 | 1338 | "同 visit 第二购受理(A 链软闸在价不在限)" | r8.buy_pool_item(String(second.get("kind_id", ""))) | (待填) | | |
| 858 | 1340 | "A 链爬价场景未构造(抬 GP 后货架仍无可购第二卡)——场景绑定失败" | false | (待填) | | |
| 859 | 1348 | "切边件零入店(40 次重抽零 gp/aux——负交易切边+三轴 doctrine) " | not cut_seen | (待填) | | |
| 860 | 1359 | "库存尽剔牌库(attack 令牌耗尽——池消耗即上限跨渠道共库 reward→shop 向)" | not attack_seen | (待填) | | |
| 861 | 1361 | "池空消费拒绝(handler 零副作用——买光即枯竭硬闸)" | not a8.stop(). consume_pool_purchase("attack", "common") and a8.stop(). pool_stock("attack") == stock_before | (待填) | | |
| 862 | 1364 | "商店消费口受理(停点件兑付单点同口——真单点库)〔拆件批 V3〕" | a8.stop(). consume_pool_purchase("attack", "common") | (待填) | | |
| 863 | 1370 | "商店购买进奖励牌库摘牌(买一件=奖励面少一件——shop→reward 向共库)" | not reward_attack_seen | (待填) | | |
| 864 | 1375 | "离开商店 → 回选路口(货架态清零落档——零自动推进收口)" | r8.continue_after_node() and r8.awaiting_choice() | (待填) | | |
| 865 | 1377 | "断点扩键 shop_shelf 在案(离开店=空架合法态——P2 甲扩列)" | bp.has("shop_shelf") and (bp["shop_shelf"] as Array).is_empty() | (待填) | | |
| 866 | 1378 | "断点扩键 shop_visit_buys 在案(离开店清零——A 链输入不入档语义)" | bp.has("shop_visit_buys") and int(bp["shop_visit_buys"]) == 0 | (待填) | | |
| 867 | 1383 | "终局池读数六键出讫(run_adventure pool 面——四池种+T5 专长凭证+T6 heal 行,读数只锚一次载体)" | ps.size() == 6 | (待填) | | |
| 868 | 1391 | "终局池余量在域 [0,配额]( %s) " ↩ % str(ps) | ps_ok | (待填) | | |
## S111 _test_positive(行 46– 56 · 3 条 · 源 game/tests/unit/core/level_table_validate_test.gd · 去向:待分类回填)
@@ -1508,9 +1508,9 @@
| 918 | 284 | "装配关系读回持久(reload 后投影一致——写新件 id)〔秘宝批 V15〕 " | (mp_a2.attune_camp_status()["equipped"] as Array).has("morning_order") | (待填) | | |
| 919 | 288 | "充能重置场景:装配冒险启动(seed 12)〔秘宝批 V8 换主语〕" | a12.start_adventure(12, {"attunement": ["incense_stick", "sky_eye"]}) | (待填) | | |
| 920 | 290 | "充能账本按装备 active_charged 件重置(新目录表值:线香 battle 级 1 次/天眼 level 级 1 次——周期重置点归 V8 逐形态面)" | int(a12.run_ledger.attune_charges.get("incense_stick", -1)) == 1 and int(a12.run_ledger.attune_charges.get("sky_eye", -1)) == 1 | (待填) | | |
| 921 | 296 | "刷新双计数器——X 优先消耗(x1y2 → x0y2) " | a12.refresh_curio() and a12._attune _refresh_x == 0 and a12._attune _refresh_y == 2 | (待填) | | |
| 922 | 298 | "刷新双计数器——X 耗尽转 Y 池、池竭拒绝(x0y2 → y0 → 第四次 false 零副作用)" | a12.refresh_curio() and a12.refresh_curio() and a12._attune _refresh_y == 0 and a12.refresh_curio() == false | (待填) | | |
| 923 | 302 | "刷新 X 每碰三选一重置(不结转;新目录无 bonus_refresh 行源——X 机制保留恒 0 空转,存量加仓走 _refresh_stock=刷新练习 V8)〔秘宝批换代〕" | a12._attune _refresh_x == 0 and a12.attune_refresh_left() == 0 | (待填) | | |
| 921 | 296 | "刷新双计数器——X 优先消耗(x1y2 → x0y2) " | a12.stop(). refresh_curio() and a12.stop(). _refresh_x == 0 and a12.stop(). _refresh_y == 2 | (待填) | | |
| 922 | 298 | "刷新双计数器——X 耗尽转 Y 池、池竭拒绝(x0y2 → y0 → 第四次 false 零副作用)" | a12.stop(). refresh_curio() and a12.stop(). refresh_curio() and a12.stop(). _refresh_y == 0 and a12.stop(). refresh_curio() == false | (待填) | | |
| 923 | 302 | "刷新 X 每碰三选一重置(不结转;新目录无 bonus_refresh 行源——X 机制保留恒 0 空转,存量加仓走 _refresh_stock=刷新练习 V8)〔秘宝批换代〕" | a12.stop(). _refresh_x == 0 and a12.stop(). attune_refresh_left() == 0 | (待填) | | |
| 924 | 313 | "开局传参夹具前置:Fork 侧 a 激活 rule 键非空 + Y=Lv2 行表值 2(防断言空转)" | rules_e.has("posture_first_strike") and mp_e.attune_refresh_charges() == 2 | (待填) | | |
| 925 | 317 | "主菜单开新冒险参数面:同调装配 = 存档装配集(营地装了什么开局就带什么)" | (p_new.get("attunement", []) as Array) == (sv_e.attunement_equipped() as Array) | (待填) | | |
| 926 | 319 | "主菜单开新冒险参数面:Y 刷新池 = 当前等级行表值(营地升几档开局就给几次)" | int(p_new.get("attune_refresh_y", -1)) == mp_e.attune_refresh_charges() | (待填) | | |
@@ -1529,7 +1529,7 @@
| 934 | 357 | "命中线在账未注入(契约 6——override 无 hit 字段〔天赋树批 V13〕)" | not mp.hero_override().has("hit") | (待填) | | |
| 935 | 360 | "注入参数冒险启动(start_adventure params 通道)" | adr.start_adventure(920251, {"hero_override": mp.hero_override()}) | (待填) | | |
| 936 | 364 | "首战 hero_atk = 表值 + 永久强化 flat( begin_battle 同表达式——下一局能用到强化)" | int(r.effective_atk()) == int(_db.hero.atk) + int(ov.get("atk", 0)) | (待填) | | |
| 937 | 366 | "首战 hero_max_hp 与开局生命账本 = 表值 + 注入档" | int(r.effective_max_hp()) == int(_db.hero.max_hp) + int(ov.get("max_hp", 0)) and int(adr.ledger[" hero_hp"] ) == int(_db.hero.max_hp) + int(ov.get("max_hp", 0)) | (待填) | | |
| 937 | 366 | "首战 hero_max_hp 与开局生命账本 = 表值 + 注入档" | int(r.effective_max_hp()) == int(_db.hero.max_hp) + int(ov.get("max_hp", 0)) and int(adr.hero(). hero_hp) == int(_db.hero.max_hp) + int(ov.get("max_hp", 0)) | (待填) | | |
| 938 | 371 | "白板冒险启动(无 params 实参——B1 空参数路径)" | adr_w.start_adventure(920251) | (待填) | | |
| 939 | 374 | "零强化参数冒险启动(新档 hero_override 全零)" | adr_z.start_adventure(920251, {"hero_override": load("res://core/meta_progression.gd").new(_db, sv_white).hero_override()}) | (待填) | | |
| 940 | 378 | "白板成立:空参数 = 零强化参数 = 纯表值(atk/max_hp/ac 三轴逐位一致——验收 2/3) " | int(rw.effective_atk()) == int(_db.hero.atk) and int(rw.effective_max_hp()) == int(_db.hero.max_hp) and int(rz.effective_atk()) == int(rw.effective_atk()) and int(rz.effective_max_hp()) == int(rw.effective_max_hp()) and int(rz.effective_ac()) == int(rw.effective_ac()) | (待填) | | |
@@ -1567,8 +1567,8 @@
| 967 | 505 | "重甲直购解锁+首购+选中(三层 AC 夹具)" | mp5.forge_buy_unlock("heavy") and mp5.forge_buy_level("heavy") and mp5.forge_select_armor("heavy") | (待填) | | |
| 968 | 509 | "注入参数冒险启动(两轴+override 同面)" | adr5.start_adventure(77, p5) | (待填) | | |
| 969 | 511 | "入战 AC 三层:甲型基础 12(重甲)+路线加值 1+局内 0〔锻造工坊批 V7〕 " | int(r5.effective_ac()) == 12 + 1 | (待填) | | |
| 970 | 513 | "参数面快照入 runner( attack_type=normal/armor_type=heavy)〔锻造工坊批 V6〕 " | adr5.hero_ attack_type == "normal" and adr5.hero_ armor_type == "heavy" | (待填) | | |
| 971 | 516 | "冒险开始后锁死:改存档选中不影响参数面快照与生效值(契约 8)〔锻造工坊批 V6〕 " | mp5.forge_select_armor("light") and adr5.hero_ armor_type == "heavy" and int(r5.effective_ac()) == 12 + 1 | (待填) | | |
| 970 | 513 | "参数面快照入 runner( attack_type=normal/armor_type=heavy)〔锻造工坊批 V6〕 " | adr5.hero(). attack_type == "normal" and adr5.hero(). armor_type == "heavy" | (待填) | | |
| 971 | 516 | "冒险开始后锁死:改存档选中不影响参数面快照与生效值(契约 8)〔锻造工坊批 V6〕 " | mp5.forge_select_armor("light") and adr5.hero(). armor_type == "heavy" and int(r5.effective_ac()) == 12 + 1 | (待填) | | |
| 972 | 525 | "enc 两轴直达 spawn 英雄快照(hero_attack 行携带 pierce 键——注入链末端)〔锻造工坊批 V5〕 " | pierce_rows >= 1 | (待填) | | |
| 973 | 529 | "spawn 显式两轴注入(magic/heavy 直入英雄快照)〔锻造工坊批 V5〕 " | uc2.spawn(1, 0, int(_db.hero.max_hp), [], -1, -1, [], "magic", "heavy") and String(uc2.hero_unit().get("attack_type", "")) == "magic" and String(uc2.hero_unit().get("armor_type", "")) == "heavy" | (待填) | | |
| 974 | 539 | "树零攻防来源复核(12 行 effects 键集无 atk/armor_class——契约 1)〔锻造工坊批 V10〕 " | not tree_atk_ac | (待填) | | |
@@ -1603,7 +1603,7 @@
| 998 | 618 | "两线拉满+同调位全解锁 → 地脉共鸣自动点亮(零币特化判定)" | sv.tree_level("easter_ley") == 1 | (待填) | | |
| 999 | 621 | "觉醒零消费(钥石余额不动)" | int(sv.keystone_balance()) == bal_now | (待填) | | |
## S119 _smoke_tree_rules(行 633– 757 · 21 条 · 源 game/tests/unit/core/meta_progression_forge_test.gd · 去向:待分类回填)
## S119 _smoke_tree_rules(行 633– 758 · 21 条 · 源 game/tests/unit/core/meta_progression_forge_test.gd · 去向:待分类回填)
| 序号 | 行号 | 标签原文 | cond 摘要 | 白话释义 | 处置 | quiet |
|---|---|---|---|---|---|---|
@@ -1624,10 +1624,10 @@
| 1014 | 721 | "守⑤ rig:次战编排启动(新战新队列实例)" | orch2.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40, "hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {}, "feats": [], "tree_rules": ["sense_guard"], "battle_index": 1, "bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "adventure_counters": {}, "voucher_rap": 0, "voucher_time_sand": 0, "node_type": "battle"}) | (待填) | | |
| 1015 | 727 | "守⑤:末轮判出不返(queue 只在 notify_round_start 兑现、战亡即弃——无跨战泄漏)" | int(orch2.action_economy.pending_ap_delta()) == 0 | (待填) | | |
| 1016 | 733 | "散未激活:商品标价原价(无 economy_spend 键)" | int(lr._spend_discounted(100)) == 100 | (待填) | | |
| 1017 | 735 | "散激活:商品购买价 × 80%( provisional 折率——floor 偏向玩家、下限 1;刷新价不折=另一计价点零触碰)" | int(lr._spend_discounted(100)) == 80 and int(lr._spend_discounted(1)) == 1 | (待填) | | |
| 1018 | 739 | "聚 rig:基线编排启动(无增益侧)" | orch3.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40, "hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {}, "feats": [], "tree_rules": [], "battle_index": 1, "bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "adventure_counters": {}, "voucher_rap": 0, "voucher_time_sand": 0, "node_type": "battle"}) | (待填) | | |
| 1019 | 748 | "聚 rig:增益编排启动(tree_rules=economy_hoard) " | orch4.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40, "hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {}, "feats": [], "tree_rules": ["economy_hoard"], "battle_index": 1, "bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "adventure_counters": {}, "voucher_rap": 0, "voucher_time_sand": 0, "node_type": "battle"}) | (待填) | | |
| 1020 | 756 | "聚:战斗掉落乘算 × 1.5( provisional——同种子配对 %d→%d,入账前=结算框显示实得)" | gp_hoard == int(round(float(gp_base) * 1.5)) and gp_hoard >= gp_base | (待填) | | |
| 1017 | 736 | "散激活:商品购买价 × 80%( provisional 折率——floor 偏向玩家、下限 1;刷新价不折=另一计价点零触碰)" | int(lr._spend_discounted(100)) == 80 and int(lr._spend_discounted(1)) == 1 | (待填) | | |
| 1018 | 740 | "聚 rig:基线编排启动(无增益侧)" | orch3.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40, "hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {}, "feats": [], "tree_rules": [], "battle_index": 1, "bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "adventure_counters": {}, "voucher_rap": 0, "voucher_time_sand": 0, "node_type": "battle"}) | (待填) | | |
| 1019 | 749 | "聚 rig:增益编排启动(tree_rules=economy_hoard) " | orch4.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40, "hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {}, "feats": [], "tree_rules": ["economy_hoard"], "battle_index": 1, "bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "adventure_counters": {}, "voucher_rap": 0, "voucher_time_sand": 0, "node_type": "battle"}) | (待填) | | |
| 1020 | 757 | "聚:战斗掉落乘算 × 1.5( provisional——同种子配对 %d→%d,入账前=结算框显示实得)" | gp_hoard == int(round(float(gp_base) * 1.5)) and gp_hoard >= gp_base | (待填) | | |
## S120 _init(行 22– 30 · 2 条 · 源 game/tests/unit/core/minesweeper_rules_test.gd · 去向:待分类回填)