From fb665f87dc39a6f9f3d30ab61147570649bf7fa6 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Wed, 30 Sep 2026 07:08:11 +0800 Subject: [PATCH] =?UTF-8?q?iter9-T11+T12:=20=E5=8D=A1=E2=91=AA=20GP=20?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB=E6=A0=B8=E9=AA=8C=E6=94=B6=E5=8F=A3=EF=BC=88?= =?UTF-8?q?=E5=AE=9E=E6=80=81=E5=B7=B2=E7=AC=A6=20level-map=20spec?= =?UTF-8?q?=EF=BC=9A=E5=BE=BD=E7=AB=A0=20M-2=20=E5=B7=B2=E8=90=BD+?= =?UTF-8?q?=E5=88=B7=E6=96=B0=3D=E5=86=99=E8=B7=AF=E5=BE=84=E5=9B=9E?= =?UTF-8?q?=E6=89=A7=E5=90=8E=E9=87=8D=E6=9F=A5=E3=80=94open=5Fchoices=20?= =?UTF-8?q?=E5=9B=9E=E6=89=A7=E7=82=B9=E3=80=95=E5=90=88=E6=B3=95=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=EF=BC=9Bshot=5Fprobe=20=E8=A1=A5=E5=BE=BD=E7=AB=A0?= =?UTF-8?q?=E5=8F=AF=E8=A7=81+=E8=AF=BB=E6=95=B0=3Drunner.gp=20=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E5=AE=9E=E6=B5=8B=E8=BF=87=EF=BC=9B06=20=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E5=9B=9B=E6=89=BF=E8=BD=BD=E9=9D=A2=E5=85=A8=E9=97=AD?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E3=80=94=E9=92=A5=E7=9F=B3=E4=B8=89=E5=A4=84?= =?UTF-8?q?/=E8=83=9C=E5=88=A9=E7=BB=93=E7=AE=97/=E5=86=92=E9=99=A9?= =?UTF-8?q?=E7=BB=88=E5=B1=80/=E5=85=B3=E5=8D=A1=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB=E3=80=95=EF=BC=89+=E5=8D=A1=E2=91=AB=20C=20?= =?UTF-8?q?=E5=8C=BA=E6=9C=AC=E5=85=B3=E5=BC=BA=E5=8C=96=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E7=BA=BF=EF=BC=88HudPresenter.refresh=20=E5=8D=95?= =?UTF-8?q?=E7=82=B9=E6=8A=95=E5=BD=B1=20runner=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=8A=A0=E7=AE=97=E5=8C=BA=20bonus{atk,max=5Fhp,armor=5Fclass}?= =?UTF-8?q?=E2=86=92=E4=B8=89=E8=A1=8C=E6=96=87=E6=A1=88=E3=80=94=E6=94=BB?= =?UTF-8?q?=E5=87=BB/=E7=94=9F=E5=91=BD=E4=B8=8A=E9=99=90/=E6=8A=A4?= =?UTF-8?q?=E7=94=B2=20AC=EF=BC=8C=E8=A1=8C=E6=96=87=3D=E4=BB=A3=E6=8B=8D?= =?UTF-8?q?=E6=9D=BF=E3=80=95=EF=BC=8C=E7=A9=BA=E5=8A=A0=E7=AE=97=E6=95=B4?= =?UTF-8?q?=E8=8A=82=E9=9A=90=E8=97=8F=EF=BC=9B=E9=9B=B6=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E8=A7=A6=E7=A2=B0=E2=80=94=E2=80=94=E5=91=88=E7=8E=B0=E5=8F=AA?= =?UTF-8?q?=E8=AF=BB=E6=8A=95=E5=BD=B1=EF=BC=89=EF=BC=9B=E5=86=92=E7=83=9F?= =?UTF-8?q?=20596/0+shot=5Fprobe=20=E9=97=AE=E9=A2=98=3D0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 14 ----------- game/presentation/hud_presenter.gd | 15 ++++++++++++ game/smoke/shot_probe.gd | 38 +++++++++++++++++++++++------- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 6f255d5f..e269c93e 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -388,20 +388,6 @@ **状态**:部分收口——魔法道具槽已随迭代 7 落地(C 区四槽两步交互+库存只读面);本关强化列表**编入 M-3 迭代 9 卡⑫**(2026-09-30 用户扩编,台账 288——set_level_bonuses→runner 加算区投影接线) -#### GP/钥石迁出战斗屏后的展示面接线(2026-09-26 登记) - -**现状**:信息归属批(台账 165)将 GP(中循环资源)/钥石(大循环资源)自战斗屏 C 区退役(用户二轮拍板去向):**GP = 关卡画面常驻总量 + 战斗结算画面总量+增量;钥石 = 结算画面 + 营地**。原 C 区钱包行为唯一展示面已删——数据源完好(runner.gp / MetaProgression 账本),纯呈现接线。 - -**归属冲突已收口——2026-09-27 用户拍板**:战斗胜利出现战斗总结结算、展示获得的资源(目前 = GP);战斗失败出现冒险总结结算、确认后回存档首页。battle.md OQ14「战斗结算画面」口径为准,GP 总量+增量归**战斗胜利总结结算**;本条原归属行「结算画面批 GP 增量」系登记偏差已修正。 - -**接线缺口**:战斗胜利结算现行文案(battle_end_text「战斗胜利!敌人全灭。」)无 GP 呈现——增量+总量上胜利结算为本条剩余实装面;关卡画面常驻总量的呈现规格已建 [level-map](ux/level-map.md)(2026-09-27,顶栏 GP 常驻徽章 = 图标+数字直角数据框),实装归关卡画面批。 - -钥石呈现现行承载即拍板口径——大奖励屏(big_reward_text 钥石增量+累计 = Boss 层进账)、冒险总结结算(keystone_settle_text 入账明细 = 「结算画面」指认)、营地(存量);三处并存系「进账时刻 / 收束明细 / 存量可用」不同义,不构成重复展示(level-clear.md OQ3 已收口维持)。 - -**归属**:战斗屏胜利结算批(GP 增量+总量呈现接线——battle.md 域)/ 关卡画面 UX 批(GP 常驻总量)/ 钥石侧已全部承载(大奖励屏 + 冒险总结结算 + 营地,无剩余) - -**状态**:部分收口——2026-09-27 用户拍板归属冲突收口 + 钥石三处承载确认;剩 = 关卡画面 GP 常驻(纯呈现,归关卡画面批)。**2026-09-29 迭代 6 T7 批注记**:冒险终局面板补「本局 GP 入账 · 合计 N」(adventure_finished 收束清零前呈现侧影子账取值,零核心触碰)——「战斗结算画面」双形态(单场战斗胜利总结〔M-1 迭代 2 T5 已接〕/冒险终局面板〔本批〕)均已承载 GP,本条剩余实装面只剩关卡画面常驻。**关卡画面 GP 常驻编入 M-3 迭代 9 卡⑪**(2026-09-30 用户扩编,台账 288——level-map spec 顶栏徽章接线) - #### 节点奖励屏 UX spec(随魔法道具内容重定批交付,2026-09-27 登记) **现状**:battle.md 原幽灵引用——design/gdd/ux/node-reward.md,2026-09-20 链接审计批入欠账基线——经 2026-09-27 欠账处置拍板改挂本条名下:节点奖励屏不立独立 spec,待魔法道具内容重定批给出奖励内容后随批出生。 diff --git a/game/presentation/hud_presenter.gd b/game/presentation/hud_presenter.gd index 0b67bd93..4bc7f651 100644 --- a/game/presentation/hud_presenter.gd +++ b/game/presentation/hud_presenter.gd @@ -19,6 +19,21 @@ extends RefCounted # HP/状态效果单投喂 B 区站桩(原 B/C 双投喂为重复展示——信息归属拍板单一展示面原则) static func refresh(stage: BattleStageView, info: HeroInfoPanelView, ap_bar: ApBarView, settlement, runner, level_active: bool, db, refresh_remaining: int) -> void: + # 本关强化列表(v3.5 迭代 9 卡⑫ 2026-09-30——runner 统一加算区投影:商店购买与关卡大奖励 + # 共账本〔level_runner bonus{atk,max_hp,armor_class}〕;空加算=整节隐藏〔视图内空态纪律〕。 + # 呈现只读投影零核心触碰;行文格式=代拍板白名单项) + if runner != null and level_active: + var b: Dictionary = runner.bonus + var lines: Array[String] = [] + if int(b.get("atk", 0)) != 0: + lines.append("攻击 %+d" % int(b.get("atk", 0))) + if int(b.get("max_hp", 0)) != 0: + lines.append("生命上限 %+d" % int(b.get("max_hp", 0))) + if int(b.get("armor_class", 0)) != 0: + lines.append("护甲 AC %+d" % int(b.get("armor_class", 0))) + info.set_level_bonuses(lines) + else: + info.set_level_bonuses([]) if settlement == null: _refresh_out_of_battle(stage, info, ap_bar, runner, level_active, db) return diff --git a/game/smoke/shot_probe.gd b/game/smoke/shot_probe.gd index 5eed7b13..39ac3c07 100644 --- a/game/smoke/shot_probe.gd +++ b/game/smoke/shot_probe.gd @@ -51,15 +51,23 @@ func _ready() -> void: if close_btn != null: close_btn.pressed.emit() await get_tree().process_frame - # ③ 关卡画面(开始冒险→停点出图——冒险开始即出图,停点前移批语义) - var lvbtn: Button = _find_button_by_prefix(main._start_overlay, "开始冒险") - if lvbtn == null: - _problems.append("开始冒险按钮缺失(开始层 lvbtn)") - else: - lvbtn.pressed.emit() - for i in 4: - await get_tree().process_frame - await _snap("level") + # ③ 关卡画面(开始冒险→停点出图——冒险开始即出图,停点前移批语义) + var lvbtn: Button = _find_button_by_prefix(main._start_overlay, "开始冒险") + if lvbtn == null: + _problems.append("开始冒险按钮缺失(开始层 lvbtn)") + else: + lvbtn.pressed.emit() + for i in 4: + await get_tree().process_frame + await _snap("level") + # GP 常驻徽章断言(迭代 9 卡⑪核验——读数=runner.gp 现值,刷新=写路径回执后重查〔open_choices〕) + var gp_label: Label = _find_label_by_text(main.level_screen, "◈ ") + if gp_label == null or not gp_label.is_visible_in_tree(): + _problems.append("GP 徽章不可见(关卡画面顶栏)") + elif main.level_screen.get("_runner") != null: + var expect := "◈ %d" % int(main.level_screen.get("_runner").gp) + if gp_label.text != expect: + _problems.append("GP 徽章读数不符: %s != %s" % [gp_label.text, expect]) # ④ 战斗(节点一——真实选路提交路径 press_candidate,ui_click_probe :199 同款) if main.level_screen != null and main.level_screen.visible: main.level_screen.press_candidate(0) @@ -128,6 +136,18 @@ func _find_label_rect(root: Node, text_fragment: String) -> Dictionary: return {} +func _find_label_by_text(root: Node, text_fragment: String) -> Label: + if root == null: + return null + if root is Label and String(root.text).contains(text_fragment): + return root + for c in root.get_children(): + var r := _find_label_by_text(c, text_fragment) + if r != null: + return r + return null + + func _node_rect(n: Node) -> Dictionary: if n == null or not (n is CanvasItem): return {}