From ca57fd39d5c759892dfad18b22c125503621efff Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 2 Oct 2026 05:00:14 +0800 Subject: [PATCH 1/4] =?UTF-8?q?revert:=20=E6=9A=82=E5=9B=9E=E6=BB=9A?= =?UTF-8?q?=E9=80=89=E8=B7=AF=E5=91=88=E7=8E=B0=E4=B8=A4=E4=B8=BB=E5=9B=A0?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=88=E5=B9=B2=E7=BA=BF=E5=81=8F=E7=A7=BB?= =?UTF-8?q?+=E9=9D=9E=E5=80=99=E9=80=89=E9=99=8D=E9=80=8F=E6=98=8E?= =?UTF-8?q?=EF=BC=89=E2=80=94=E2=80=94ui=5Fclick=5Fprobe=E5=8D=A1=E6=AD=BB?= =?UTF-8?q?=E5=BD=92=E5=9B=A0=E9=9A=94=E7=A6=BB=E7=94=A8=EF=BC=88=E8=AF=A5?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8E=E6=8E=A8=E8=BF=9B=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=97=A0=E6=95=B0=E6=8D=AE=E9=9D=A2=E4=BA=A4=E9=9B=86=E4=BD=86?= =?UTF-8?q?=E5=AE=9E=E8=AF=81=E7=9B=B8=E5=85=B3=EF=BC=8C=E5=8D=A1=E5=9B=A0?= =?UTF-8?q?=E5=BE=85=E4=B8=93=E9=A1=B9=E5=BD=92=E5=9B=A0=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9C=AC=E4=BD=93=E6=8C=82=E5=8D=95=E7=8B=AC=E6=89=B9?= =?UTF-8?q?=E5=9B=9E=E7=82=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/level_map_screen.gd | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 9b58f4ef..c11a005a 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -394,9 +394,6 @@ func _draw_graph(canvas: Control) -> void: var visited: Array = _runner.visited_ids() var cand_ids: Array = _runner.next_candidate_ids() # 连线(通道)先行画(方块覆盖其上);悬停预承诺 = 所属通道再增亮(加粗) - # T17 修复:选路停点(候选非空)非候选通道降透明——金岔路从结构网分离(干线共线重叠缺陷的 - # 视觉主因:不同源通道共用同一垂直干线,金边与石色边焊接成「整列可走」假象) - var dim_passages: bool = not cand_ids.is_empty() for node in nodes: var from: Vector2 = pos[node] for tid in _out_ids(node, nodes): @@ -406,7 +403,7 @@ func _draw_graph(canvas: Control) -> void: var to: Vector2 = pos[target] var lit: bool = _id_of(node) == current_id and cand_ids.has(tid) var hovered: bool = lit and _hover_id == tid - var col := COL_PASSAGE_LIT if lit else (Color(COL_PASSAGE, 0.35) if dim_passages else COL_PASSAGE) + var col := COL_PASSAGE_LIT if lit else COL_PASSAGE var width := 4.0 if hovered else (3.0 if lit else 2.0) # 样张 v1 冻结:2/3/4(原 1.5 取整) _draw_passage(canvas, from, to, col, width) # 房间方块 @@ -514,9 +511,6 @@ func _draw_passage(canvas: Control, from: Vector2, to: Vector2, col: Color, widt var b := to - Vector2(NODE_HALF.x, 0) if b.x < a.x: return - # T17 修复:垂直干线 x 按源节点 y 偏移——不同源的边不再共线重叠(旧 mid_x=中点使相邻层 - # 全部通道焊成一条干系,「金岔路+整列可走」误读的直接几何根源)。同源双边仍共线(同出发 - # 点语义正确),跨源分离度 = 源行距 × 0.2(L2 行距 ~58px → 偏移 ~12px 可辨)。 - var mid_x := (a.x + b.x) / 2.0 + (a.y - b.y) * 0.2 + var mid_x := (a.x + b.x) / 2.0 var pts := PackedVector2Array([a, Vector2(mid_x, a.y), Vector2(mid_x, b.y), b]) canvas.draw_polyline(pts, col, width) From 1306ba69f5318701a87689101b8e022efa30eeaf Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 2 Oct 2026 05:01:14 +0800 Subject: [PATCH 2/4] =?UTF-8?q?revert:=20=E6=9A=82=E5=9B=9E=E6=BB=9A?= =?UTF-8?q?=E8=A1=80=E9=87=8F=E5=8F=A3=E5=BE=84=E4=BF=AE=E5=A4=8D=E2=80=94?= =?UTF-8?q?=E2=80=94probe=E5=8D=A1=E6=AD=BB=E4=BA=8C=E5=88=86=E9=9A=94?= =?UTF-8?q?=E7=A6=BB=E7=94=A8=EF=BC=88=E5=AE=9E=E8=AF=81=E8=A3=81=E5=86=B3?= =?UTF-8?q?=E6=81=92=E7=AD=89=E8=AE=BA=E8=AF=81=E7=9B=B2=E7=82=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/adventure_runner.gd | 13 ++----------- game/smoke/smoke_all.gd | 7 +++---- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/game/core/adventure_runner.gd b/game/core/adventure_runner.gd index d77421c0..09bc6b89 100644 --- a/game/core/adventure_runner.gd +++ b/game/core/adventure_runner.gd @@ -113,7 +113,7 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool: _base_override = _normalize_override(params.get("hero_override", {})) _first_script = bool(params.get("first_script", false)) # 缺省 = 非首次(抽签路径;真实侧由呈现层读存档布尔位传入) _aux_unlocked = params.get("aux_unlocked", {}) if params.get("aux_unlocked", {}) is Dictionary else {} # additive(迭代 7 T5) - ledger["hero_hp"] = effective_max_hp() # 生命账本置满(生效上限口径——T17 修复:含 TunePanel pct,与战斗内同源) + ledger["hero_hp"] = int(db.hero.max_hp) + int(_base_override["max_hp"]) # 生命账本置满(表值+永久强化 flat——加算区刚归零) state = "running" return _start_current_level() @@ -211,15 +211,6 @@ func set_hero_override(atk_pct: int, hp_pct: int) -> void: _runner.set_hero_override(atk_pct, hp_pct) -# 冒险账本侧生效上限(T17 修复——账本置满/回血封顶与战斗内上限同式同源): -# (表值 + 永久强化 flat + 加算区 flat)后乘 TunePanel 百分比——叠加次序与 LevelRunner.effective_max_hp -# 逐字一致。旧口径两处只算 flat 不乘 pct:调生命上限 26→104 时开局血仍 26(账本 26 / 战斗内 104)、 -# 通关 20% 回血封顶按 26 算。pct=0(模拟/冒烟默认)时乘法恒等——MC 锚零漂移。 -func effective_max_hp() -> int: - var base: int = int(db.hero.max_hp) + int(_base_override.get("max_hp", 0)) + int(bonus.get("max_hp", 0)) - return maxi(1, int(round(float(base) * (100.0 + float(_override[1])) / 100.0))) - - # 断点承载注入(迭代 8 卡①——组合根冒险开始时调用;模拟/冒烟不注入 = 断点面整体静默) func set_save_manager(sm) -> void: _save_manager = sm @@ -618,7 +609,7 @@ func _on_level_finished(payload: Dictionary) -> void: # 通关兑付(非末关恰一次;迭代 10 三层奖励框架):部分回血先行 → 加权洗牌掷 3 → 三选一停点 #(顺序即契约——回血按当刻账本与上限结算,选择停点零自动推进) var hp_before := int(ledger.get("hero_hp", 0)) - var max_eff := effective_max_hp() # T17 修复:回血封顶口径含 TunePanel pct(同战斗内上限) + var max_eff := int(db.hero.max_hp) + int(_base_override["max_hp"]) + int(bonus.get("max_hp", 0)) var heal := mini(int(floor(float(max_eff) * float(int(db.adventure.clear_heal_pct)) / 100.0)), max_eff - hp_before) ledger["hero_hp"] = hp_before + heal # 置位先于 emit(信号同步派发——处理器内立即确认时 _pending_next_level 必须已就位) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 7b8bcba4..e81fe505 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -347,14 +347,13 @@ func _smoke_adventure() -> void: var hp_before: int = int(p.get("hp_before", -1)) var hp_after: int = int(p.get("hp_after", -1)) # 模拟档 v3.4 商店贪心购血合法抬升(L2/L3 店在 Boss 前)——回血口径窗口 = 加算区件 + 购血余量 0..15 - # T17 账本口径修复随批:置满/回血封顶改生效上限口径(flat 后乘 TunePanel pct)——窗口同步 ×5(本段 pct=400) var heal_ok_i := false for extra in 16: - var m := int(round(float(int(_db.hero.max_hp) + hp_acc + extra) * 5.0)) + var m := int(_db.hero.max_hp) + hp_acc + extra if heal == mini(int(floor(float(m) * float(heal_pct) / 100.0)), m - hp_before): heal_ok_i = true break - if not heal_ok_i or hp_after != hp_before + heal or hp_after > int(round(float(int(_db.hero.max_hp) + hp_acc + 15) * 5.0)): + if not heal_ok_i or hp_after != hp_before + heal or hp_after > int(_db.hero.max_hp) + hp_acc + 15: heal_ok = false ks_prefix += int(_db.meta_boss_keystone_row(int(p.get("level_index", -1))).get("first_kill", 0)) if int(p.get("keystone_gained", -1)) != int(_db.meta_boss_keystone_row(int(p.get("level_index", -1))).get("first_kill", 0)) or int(p.get("keystone_total", -1)) != ks_prefix: @@ -487,7 +486,7 @@ func _smoke_adventure() -> void: var expect_acc: int = acc_shop + (int(_db.adventure.bonus_max_hp_flat) if picked2 == "max_hp" else 0) check(int(a8.bonus.get("max_hp", -1)) == expect_acc, "三选一属性件与商店购买同账累加(max_hp=%d = %d + 三选一%s)" % [int(a8.bonus.get("max_hp", -1)), acc_shop, picked2]) - var max_eff8: int = a8.effective_max_hp() # T17 口径修复随批:账本生效上限含 TunePanel pct(a8 已 set 400) + var max_eff8 := int(_db.hero.max_hp) + int(a8.bonus["max_hp"]) check(int(a8.ledger["hero_hp"]) <= max_eff8, "通关部分回血封顶(hp %d ≤ 生效上限 %d——血回满语义退役)" % [int(a8.ledger["hero_hp"]), max_eff8]) check(a8.continue_to_next_level(), "兑付后推进受理(下一关开始)") From 684e93e71e6ed8620618227123169e9e8f2b75a0 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 2 Oct 2026 05:36:22 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=88=98=E6=96=97=E6=8E=89=E8=90=BD?= =?UTF-8?q?=E6=B8=A0=E9=81=93=E9=80=80=E5=BD=B9=E6=89=B9=EF=BC=882026-10-0?= =?UTF-8?q?1=E7=94=A8=E6=88=B7=E6=8B=8D=E6=9D=BF=E7=94=B2=EF=BC=89:=20?= =?UTF-8?q?=E2=91=A0reward.tres=E5=88=A0aux=E6=8C=96=E6=A0=BC=E6=8A=95?= =?UTF-8?q?=E6=94=BE=E5=9B=9B=E8=A1=8C=EF=BC=88=E5=B7=A5=E5=85=B5=E4=BB=A4?= =?UTF-8?q?5/=E6=8E=A2=E5=B7=A2=E6=91=86=E9=92=9F4/=E7=88=86=E7=A0=B4?= =?UTF-8?q?=E5=8C=851+=E6=83=8A=E6=89=B0=E8=B4=9F=E5=8D=A0=E4=BD=8D0?= =?UTF-8?q?=EF=BC=89=E2=80=94=E2=80=94=E6=88=98=E6=96=97/=E6=8C=96?= =?UTF-8?q?=E6=A0=BC=E4=B8=8D=E6=8E=89=E9=AD=94=E6=B3=95=E9=81=93=E5=85=B7?= =?UTF-8?q?=EF=BC=8C=E5=94=AF=E4=B8=80=E6=9D=A5=E8=B7=AF=3D=E4=B8=89?= =?UTF-8?q?=E9=80=89=E4=B8=80=E5=85=B1=E4=BA=AB=E6=B1=A0=EF=BC=88=E8=8A=82?= =?UTF-8?q?=E7=82=B9/=E9=80=9A=E5=85=B3=EF=BC=8C=E9=81=93=E5=85=B7?= =?UTF-8?q?=E4=BD=8D=E9=97=A8=E6=8E=A7=E7=8B=AC=E7=AB=8B=E4=B8=8D=E5=8F=97?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=EF=BC=89=E2=91=A1config=5Fdb=20F2=E6=8A=95?= =?UTF-8?q?=E6=94=BE=E7=BB=B4=E5=BA=A6=E8=A6=86=E7=9B=96=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E9=9A=8F=E6=B8=A0=E9=81=93=E9=80=80=E5=BD=B9=EF=BC=88=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E6=B1=A0=E5=8A=A8=E6=80=81=E6=8E=B7=E5=AE=9A=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E9=9D=99=E6=80=81=E6=A0=A1=E9=AA=8C=E7=BB=B4=E5=BA=A6?= =?UTF-8?q?=EF=BC=8C=E9=9D=99=E6=80=81=E4=BF=9D=E8=AF=81=E9=87=8D=E7=AB=8B?= =?UTF-8?q?=E5=BD=92=E5=90=8C=E8=B0=83/=E6=B8=A0=E9=81=93=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=89=B9=EF=BC=89=E2=91=A2smoke=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E6=96=AD=E8=A8=8022=E2=86=9218+reward=5Fdangling=5Faux?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=94=B9=E8=BF=BD=E5=8A=A0=E5=BC=8F=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=EF=BC=88=E6=97=A7=E9=94=9A=E8=A1=8C=E5=B7=B2=E5=88=A0?= =?UTF-8?q?=EF=BC=89=E2=91=A3T17=E6=B8=85=E5=8D=9515=E9=A1=B9=E6=94=B9?= =?UTF-8?q?=E5=86=99+=E6=89=B93=E5=88=A4=E5=AE=9A=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=85=A5=E6=A1=A3=EF=BC=9B=E9=97=B8=3D=E5=86=92=E7=83=9F628/0+?= =?UTF-8?q?run=5Fall=2015=E5=A5=97=E5=85=A8=E7=BB=BF+ui=5Fprobe/ui=5Finput?= =?UTF-8?q?=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iter9-t17-fullflow-checklist-2026-10-01.md | 17 +++++++- game/core/config_db.gd | 18 ++------ game/data/tables/reward.tres | 43 ------------------- game/smoke/smoke_all.gd | 2 +- .../data_config/reward_dangling_aux_test.gd | 17 ++++---- 5 files changed, 29 insertions(+), 68 deletions(-) diff --git a/design/qa/m3-iter9-t17-fullflow-checklist-2026-10-01.md b/design/qa/m3-iter9-t17-fullflow-checklist-2026-10-01.md index 290f70b8..74df1162 100644 --- a/design/qa/m3-iter9-t17-fullflow-checklist-2026-10-01.md +++ b/design/qa/m3-iter9-t17-fullflow-checklist-2026-10-01.md @@ -46,7 +46,7 @@ - 判定:☐ ✅ ☐ ❌ 一句话:____________ **15. 魔法道具两步使用与拒绝零消耗** -- 操作:先看战斗信息栏的道具槽(挖安全格偶尔直接掉道具、槽位亮起;没掉就用第 14 项选的)。点空间类道具(探巢摆钟/爆破工兵包)槽位 → 点雷图目标格;点工兵令槽位;再拿空间类道具故意点一块**已开格**。 +- 操作:先看战斗信息栏的道具槽(**道具只来自第 14 项奖励节点三选一/通关三选一**——战斗/挖格不掉道具,掉落渠道已于 2026-10-01 退役;工坊未解锁时三选一也不出道具件,本项可等抽到道具件再做)。点空间类道具(探巢摆钟/爆破工兵包)槽位 → 点雷图目标格;点工兵令槽位;再拿空间类道具故意点一块**已开格**。 - 预期:空间类点槽后槽位金框选中出提示,点目标格后真视红框/预读徽章出现(爆破包则该格爆开);工兵令点槽即用、本轮行动点立涨;点已开格则弹拒绝提示且**道具不消耗**。(顺手可验:对真视红框格插旗照常扣 1 行动点——真视给信息不给保护。) - 判定:☐ ✅ ☐ ❌ 一句话:____________ @@ -201,6 +201,21 @@ | 12 逐条结算 ★ | ❌→同 10 | 07⑩①演出复验=演出在滚✓,感知归 C′ | | 13 胜利结算框 | ✅ | — | +### 批 3(第 14–21 项+额外反馈,2026-10-02) + +| 项 | 判定 | 备注 | +|---|---|---| +| 14 奖励节点三选一 | ✅ | — | +| 15 魔法道具两步使用 | ❌→渠道退役落 | 清单「挖安全格掉道具」系过渡渠道过时表述——**用户拍板甲:战斗掉落渠道即刻退役**(reward.tres 四行删+F2 校验随退+断言同步),道具唯一来路=三选一共享池;本项待抽到道具件后补验 | +| 16 休息与商店 | ✅ | — | +| 17 图上点击选路 | ❌→修复回炉挂 | 呈现缺陷(B 线调研:候选计算正确,干线共线重叠+非候选区分弱)——修复实现后因 probe 红灯暂回滚,**挂选路/结算呈现专项批** | +| 18 放弃二次确认 | ✅ | — | +| 19 第二关数字可读 ★ | ✅可读+审美 | 「还是丑」——审美轴归 06 已登记待办(数字直画观感),后续由用户指定工具/模型处理 | +| 20 GP 常驻徽章 | ✅ | — | +| 21 本关强化列表 | ✅ | — | + +**额外反馈两条**:①结算演播期输入冻结——硬锁实现与收尾链(点击泵架构)冲突,已回退,挂选路/结算呈现专项批与用户裁决;②debug 调生命上限后当前血不同步——修复已实现(账本置满/回血封顶同式含 pct),因 probe 红灯关联暂缓落库,待归因。 + 三修闸:冒烟 628/0+run_all 15 套+五探针,worktree/master 双跑全绿(台账 301)。 ## 来源与回流 diff --git a/game/core/config_db.gd b/game/core/config_db.gd index 72592349..4509dab1 100644 --- a/game/core/config_db.gd +++ b/game/core/config_db.gd @@ -170,20 +170,10 @@ func _cross_validate(loaded: Dictionary) -> void: push_diag("error", "reward_dangling_aux", "RewardTable %s aux 行引用无效道具 %s(retired/deferred/不存在): %s" % [row.get("reward_id"), aux_eff, "双表校验"]) # ①c F2 投放维度覆盖(魔法道具 GDD——五维度各 ≥1 掉落权重为正的活行):豁免面 {plan, info, counter} # = 罗盘退役(plan,2026-09-29 拍板①乙)+显影件 Alpha 重定(info/counter 悬置)——豁免随 Alpha 重定批消减 - if aux_tab != null: - var covered := {} - for row in rt.rows: - if String(row.get("cell_type", "")) != RewardTable.AUX_ITEM_TYPE or int(row.get("weight", 0)) <= 0: - continue - var arow: Dictionary = aux_tab.row_by_id(String(row.get("effect_id", ""))) - for tag in arow.get("dimension_tags", []): - covered[String(tag)] = true - var f2_exempt := {"plan": true, "info": true, "counter": true} # 豁免面(随 Alpha 重定/天赋批消减) - for d in AuxItemTable.DIMENSIONS: - if f2_exempt.has(d): - continue - if not covered.has(d): - push_diag("error", "dimension_coverage", "F2 投放维度覆盖缺 %s(豁免面外零活行投放)" % d) + # ①c F2 投放维度覆盖校验随战斗掉落渠道退役(2026-10-01 用户拍板甲——挖格不掉道具,魔法道具 + # 唯一来路=三选一共享池〔节点/通关〕):旧校验=「掉落池五维度各 ≥1 正权重活行」,载体已随 + # reward.tres aux 投放四行删除而消失;共享池为「抽到道具位再动态掷定具体道具」,维度覆盖不可 + # 静态校验。静态覆盖保证的重立(如按维度钉共享池抽签面)归同调实施批/渠道设计批。 # ② SettlementTable.effect_pool_map 悬空 for eff in st_tab.effect_pool_map.keys(): if not effect_ids.has(eff): diff --git a/game/data/tables/reward.tres b/game/data/tables/reward.tres index a9d9c921..303513c9 100644 --- a/game/data/tables/reward.tres +++ b/game/data/tables/reward.tres @@ -200,49 +200,6 @@ rows = [{ "weight": 0, "pool_tag": "cell", "tier": 1 -}, { - -"reward_id": "aux_sapper_order", -"cell_type": "aux_item", -"polarity": "positive", -"effect_id": "sapper_order", -"display_name": "工兵令", -"power": 0, -"weight": 5, -"pool_tag": "cell", -"tier": 2 -}, { - -"reward_id": "aux_nest_pendulum", -"cell_type": "aux_item", -"polarity": "positive", -"effect_id": "nest_pendulum", -"display_name": "探巢摆钟", -"power": 0, -"weight": 4, -"pool_tag": "cell", -"tier": 2 -}, { - -"reward_id": "aux_blast_kit", -"cell_type": "aux_item", -"polarity": "positive", -"effect_id": "blast_kit", -"display_name": "爆破工兵包", -"power": 0, -"weight": 1, -"pool_tag": "cell", -"tier": 3 -}, { -"reward_id": "aux_none", -"cell_type": "aux_item", -"polarity": "negative", -"effect_id": "", -"display_name": "惊扰的遗落物", -"power": 0, -"weight": 0, -"pool_tag": "cell", -"tier": 1 }] ; 格面资源批(2026-09-15 用户拍板——registry reward_table 条目为现行 schema 事实源): diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index e81fe505..52fc2a40 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -3391,7 +3391,7 @@ func _smoke_nine_types_gp_stream() -> void: gp_pos = int(row.weight) if String(row.get("reward_id", "")) == "gp_lose": gp_neg = int(row.weight) - check(cell_rows == 22, "奖励字典 22 行(九型×正负 18 格 + aux 正三投放/负一占位——魔法道具内容批 2026-09-29;清图槽独立批尾不计)") + check(cell_rows == 18, "奖励字典 18 行(九型×正负 18 格——aux 挖格投放四行已退役 2026-10-01 用户拍板甲:战斗/挖格不掉道具,魔法道具唯一来路=三选一共享池〔节点/通关〕;清图槽独立批尾不计)") # 雷格负向直伤当量(迭代 8 卡⑧——真人反馈「三雷 3/4 血无后果感」投值:三行各抬 +3 档,负向≈正向 2 倍定价) var mine_power := {"heal_backlash": 6, "pierce_snare": 8, "magic_recoil": 8} # 数值修复批 2026-10-01 再抬档(旧 4/5/5,见 numfix 报告) for row in _db.reward.rows: diff --git a/game/tests/unit/data_config/reward_dangling_aux_test.gd b/game/tests/unit/data_config/reward_dangling_aux_test.gd index a62a35e0..7490d229 100644 --- a/game/tests/unit/data_config/reward_dangling_aux_test.gd +++ b/game/tests/unit/data_config/reward_dangling_aux_test.gd @@ -34,16 +34,15 @@ func _inject_violation() -> bool: return false var s := f.get_as_text() f.close() - # 工兵令投放行 → 引用已退役的 loot_compass:双表校验须拦(retired 不入投放面) - var blocks: PackedStringArray = s.split("}, {") - var hit := false - for i in blocks.size(): - if '"reward_id": "aux_sapper_order"' in blocks[i]: - blocks[i] = blocks[i].replace('"effect_id": "sapper_order"', '"effect_id": "loot_compass"') - hit = true - s = "}, {".join(blocks) + # 追加式注入(2026-10-01 战斗掉落渠道退役随批——现行表已无 aux 行可作锚):向 rows 尾追加 + # 一块引用已退役 loot_compass 的 aux 投放行,双表校验须拦(retired 不入投放面)。 + var inject := ', {\n\n"reward_id": "aux_dangling_probe",\n"cell_type": "aux_item",\n"polarity": "positive",\n"effect_id": "loot_compass",\n"display_name": "悬空探针",\n"power": 0,\n"weight": 1,\n"pool_tag": "cell",\n"tier": 1\n}' + var idx := s.rfind("\n}]") + if idx < 0: + return false + s = s.substr(0, idx) + inject + s.substr(idx) var w := FileAccess.open(path, FileAccess.WRITE) - if w == null or not hit: + if w == null: return false w.store_string(s) w.close() From 939bb8ced9a9d8701c6778f5ad1b38ca20569b27 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 2 Oct 2026 06:29:32 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=BB=93=E7=AE=97=E6=BC=94=E6=92=AD?= =?UTF-8?q?=E6=9C=9F=E6=A3=8B=E7=9B=98=E7=A1=AC=E9=94=81v3=EF=BC=88T17?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=98=8E=E7=A1=AE=E4=BB=A4=E2=80=94=E2=80=94?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E7=82=B9/=E4=B8=8D=E5=8F=AF=E7=A7=BB/?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E6=8C=96=EF=BC=89:=20=5Fon=5Fboard=5Faction?= =?UTF-8?q?=E6=8E=92=E6=92=AD=E6=9C=9F=EF=BC=88=E7=BA=AF=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=EF=BC=89=E5=90=9E=E7=82=B9=E5=87=BB+probe?= =?UTF-8?q?=E6=8E=92=E6=92=AD=E8=B1=81=E5=85=8D=EF=BC=88Waiting=E4=B8=8D?= =?UTF-8?q?=E8=B1=81=E5=85=8D=3D=E6=94=B6=E5=B0=BE=E9=93=BE=E6=8E=A2?= =?UTF-8?q?=E6=B5=8B=E9=9D=A2=EF=BC=89=EF=BC=9Bworktree=E5=86=92=E7=83=9F6?= =?UTF-8?q?28/0=EF=BC=88probe=E5=8D=A1=E6=AD=BB=E7=B3=BBworktree=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98=EF=BC=8C=E5=AE=9A?= =?UTF-8?q?=E6=A1=88=E5=BD=92master=E5=A4=8D=E8=B7=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/main.gd | 7 +++++++ game/smoke/ui_click_probe.gd | 12 ++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 82d1289e..8f0c7043 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -1196,6 +1196,13 @@ func _on_board_action(cell: Vector2i, kind: String) -> void: # 玩家动作 → 核心写调用的唯一通道(模态/无战斗拒绝在此收口) if _input_locked(): return + # 结算演播期棋盘冻结(T17 用户明确令 v3——不可点/不可移/不可挖): + # 锁面=排播队列活跃(纯队列判据;_row_pace_wait 有末行尾迹窗口不可作演播中标志)。 + # 队列排空即解锁、无状态残留;HUD 按钮不在锁面(停手/明细回看各自通路,开启前 + # _flush_row_queue 自行排空)。v1 撞收尾链的教训对策:ui_click_probe 的排播期 stall + # 豁免随批(合法停顿态),Waiting 收尾等待期**不豁免**——probe 报卡即为真回归信号。 + if not _row_queue.is_empty(): + return # 魔法道具选中态劫持(迭代 7 T4——两步交互第二步):点格=使用目标拾取,不落挖格; # 只劫持挖掘点击(move/flag 语义不冲突——选中期玩家仍可移动/插旗) if _aux_use_selection != 0 and kind == "dig": diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index 44f6fd69..07d8f040 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -259,10 +259,14 @@ func _ready() -> void: "settling": diag.settling, } if JSON.stringify(st) == JSON.stringify(_last_state): - _stall_frames += 1 - if _stall_frames == 30: - _report_stall(st) - return + # 排播演播期豁免(T17 硬锁 v3 随批——合法停顿态):演播期棋盘锁生效、probe 点击被吞、 + # 逻辑态恒定属预期。判据=纯队列(与 main 锁同源)。Waiting 收尾等待期**不豁免**—— + # 锁若把收尾链卡死,此处 stall 照报(探测面)。 + if main._row_queue.is_empty(): + _stall_frames += 1 + if _stall_frames == 30: + _report_stall(st) + return else: _stall_frames = 0 _ap_spent_this_round = 0