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 {}