diff --git a/game/presentation/hud_presenter.gd b/game/presentation/hud_presenter.gd index 30a89efa..028fc4fc 100644 --- a/game/presentation/hud_presenter.gd +++ b/game/presentation/hud_presenter.gd @@ -41,9 +41,13 @@ static func refresh(stage: BattleStageView, info: HeroInfoPanelView, ap_bar: ApB else: info.set_relic_holdings([]) if settlement == null: + info.set_board_variants([]) # 战斗域角标出战斗即隐(首发批 2026-10-04——空态纪律) _refresh_out_of_battle(stage, info, ap_bar, runner, level_active, db) return var s: Dictionary = settlement.presentation_snapshot() + # 地形变异常驻角标投影(全局作用域变异首发批 2026-10-04——板级变异快照 → 文案行; + # 空态隐藏=流派件段先例;战斗全程常驻防中局遗忘) + info.set_board_variants(board_variant_lines(db, s.get("board_variants", []))) var hero: Dictionary = s.hero if hero.is_empty() or not bool(hero.get("alive", false)): _refresh_out_of_battle(stage, info, ap_bar, runner, level_active, db) @@ -109,6 +113,19 @@ static func relic_holdings_lines(db, held: Array) -> Array[String]: return rlines +# 地形变异常驻角标文案(全局作用域变异首发批 2026-10-04——板级变异 id → display_name 行; +# 空集 = 空数组=空态隐藏。体感短语 provisional 归本地化批) +static func board_variant_lines(db, ids: Array) -> Array[String]: + var lines: Array[String] = [] + if db == null or db.variation == null: + return lines + for vid in ids: + var row: Dictionary = db.variation.row_by_id(String(vid)) + if not row.is_empty(): + lines.append("%s · 奶薄枪肥" % String(row.get("display_name", vid))) + return lines + + # ---- 战斗收尾反馈与结算视觉同步(T3 HUD 单通道批 2026-10-02——组合根直改视图收敛入此) ---- # battle_over 收尾反馈:死亡兜底灰化 → 主角态回 idle → RAP 清零脉冲(调试收尾路)→ 状态全清可见反馈。 diff --git a/game/presentation/main.gd b/game/presentation/main.gd index baca32f8..cf38bbc7 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -764,6 +764,14 @@ func _on_round_started(ri: int) -> void: else: _row_pacer.enqueue({"__round_line": ri}) settlement_fx.play_round_banner(ri) + # 开战横幅——板级地形变异预告(全局作用域变异首发批 2026-10-04):首轮快照 board_variants + # 非空才发射(Boss 图恒带一型=替换制;普通图空快照零发射);轮横幅下方叠行,view 内判减动效。 + if ri == 1 and settlement != null: + var bvs: Array = settlement.presentation_snapshot().get("board_variants", []) + if not bvs.is_empty(): + var vlines: Array[String] = HudPresenter.board_variant_lines(db, bvs) + if not vlines.is_empty(): + settlement_fx.play_board_variant_banner("地形变异 · " + vlines[0]) _refresh_used_round = 0 _refresh_presentations() diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index a790725f..50cb9a13 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -150,7 +150,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: box.add_child(quitbtn) # 玩法帮助文案(表值驱动——2026-09-16 AP 压速批遗留硬编码 8 随手修正;护甲等级掷点批同步"减伤"→"护甲强化") - var help_text := "玩法:每轮 %d AP——挖开(1AP)/插旗(1AP)/移动(免费)/连锁(免费)。\n每个非封锁格都藏一种格面资源(增伤/护甲强化/回血/爆裂/削弱)。开安全格、标中雷 = 正向兑付;\n开雷格、标错安全格 = 负向兑付——全部在轮末结算逐行兑现;吃掷点的基础攻击按护甲等级判定,无 miss、最低保底 1 点。\n停手:剩余 AP 转存 RAP;弃图刷新:RAP−%d 当场换图继续挖(每轮剩 %d 次)。\n敌人全灭胜、主角倒下负。悬停可看三态光标与可挖域微光。" % [ + var help_text := "玩法:每轮 %d AP——挖开(1AP)/插旗(1AP)/移动(免费)/连锁(免费)。\n每个非封锁格都藏一种格面资源(增伤/护甲强化/回血/爆裂/削弱)。开安全格、标中雷 = 正向兑付;\n开雷格、标错安全格 = 负向兑付——全部在轮末结算逐行兑现;吃掷点的基础攻击按护甲等级判定,无 miss、最低保底 1 点。\n停手:剩余 AP 转存 RAP;弃图刷新:RAP−%d 当场换图继续挖(每轮剩 %d 次)。\n敌人全灭胜、主角倒下负。悬停可看三态光标与可挖域微光。\n地形变异:第二关起 Boss 图带整图变异(贫矿脉——奶变薄、枪变肥;开战横幅与 HUD 角标常驻提示)。" % [ int(db.action_economy.ap_per_round), int(db.action_economy.rap_refresh_cost), int(db.action_economy.refresh_cap_per_round)] # 字号下限(v3.5 批 B3——正文 ≥16);对比度修复(v3.5 批 B3——WARM_FAINT 对深石底实测 2.58:1→暖白 ≥6:1;暗底双色墨制) var help := UiKit.label(help_text, 16, false, UiKit.WARM) diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index 4e6f39fb..513a7701 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -23,6 +23,8 @@ var _bonus_section: VBoxContainer # 本关强化(预留——空态 var _bonus_list: VBoxContainer var _relic_section: VBoxContainer # 流派件持有段(迭代 12 呈现补齐——空态隐藏) var _relic_list: VBoxContainer +var _board_variant_section: VBoxContainer # 地形变异常驻角标(全局作用域变异首发批——空态隐藏) +var _board_variant_list: VBoxContainer func _init() -> void: @@ -79,6 +81,16 @@ func _init() -> void: _relic_list = VBoxContainer.new() _relic_list.add_theme_constant_override("separation", 2) _relic_section.add_child(_relic_list) + # 地形变异常驻角标(全局作用域变异首发批 2026-10-04——Boss 图整图型战斗全程可见防中局遗忘; + # 空态整节隐藏=流派件段先例;摆位/文案 provisional 归 HUD 框架批与本地化批) + _board_variant_section = VBoxContainer.new() + _board_variant_section.add_theme_constant_override("separation", 4) + _board_variant_section.visible = false + col.add_child(_board_variant_section) + _board_variant_section.add_child(UiKit.label("地形变异", 16, true)) + _board_variant_list = VBoxContainer.new() + _board_variant_list.add_theme_constant_override("separation", 2) + _board_variant_section.add_child(_board_variant_list) # 本关强化(预留):锻造/大奖励/关卡奖励节点的属性提升——中循环数据因改变战斗数学准入; # 与战斗内状态效果(B 区站桩,随战斗消散)分区,防「战斗结束被清」误读;空态整节隐藏 _bonus_section = VBoxContainer.new() @@ -112,6 +124,17 @@ func set_relic_holdings(lines: Array) -> void: _relic_section.visible = not lines.is_empty() +# 地形变异常驻角标(首发批 2026-10-04):lines = 文案行(板级变异 display_name+体感短语)——空数组 = 整节隐藏 +func set_board_variants(lines: Array) -> void: + for c3 in _board_variant_list.get_children(): + _board_variant_list.remove_child(c3) + c3.queue_free() + for line in lines: + var l3 := UiKit.label(String(line), 16, false, COL_INK) + _board_variant_list.add_child(l3) + _board_variant_section.visible = not lines.is_empty() + + # 本关强化列表(预留接线面):lines = 文案行数组(如「锻造 +2 攻击」)——空数组 = 整节隐藏 func set_level_bonuses(lines: Array) -> void: for c in _bonus_list.get_children(): diff --git a/game/presentation/views/settlement_fx_view.gd b/game/presentation/views/settlement_fx_view.gd index 5221032a..067d3a01 100644 --- a/game/presentation/views/settlement_fx_view.gd +++ b/game/presentation/views/settlement_fx_view.gd @@ -147,3 +147,32 @@ func play_round_banner(ri: int) -> void: tw.tween_interval(UiKit.motion(BANNER_DWELL)) tw.tween_property(banner, "modulate:a", 0.0, UiKit.motion(0.25)) tw.tween_callback(banner.queue_free) + + +# 开战横幅——板级地形变异预告(全局作用域变异首发批 2026-10-04):board_variants 非空时开战 +# 显示一行(文本=「地形变异 · 贫矿脉」式);减动效=静态驻留后即隐(轮横幅先例——行呈现不跳过)。 +# 文案/驻留参数 provisional 归本地化批;普通图恒不发射(组合根按快照 board_variants 空判)。 +func play_board_variant_banner(text: String) -> void: + _fx_banners += 1 + var banner := Panel.new() + banner.mouse_filter = Control.MOUSE_FILTER_IGNORE + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, 8, 2)) + var lab := UiKit.label(text, 22, true, UiKit.GOLD) + lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + lab.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + banner.add_child(lab) + banner.size = Vector2(320, 46) + banner.position = Vector2((size.x - banner.size.x) * 0.5, size.y * 0.30 + 52.0) # 轮横幅下方叠行(首轮同刻两横幅不重叠) + banner.z_index = 4 + add_child(banner) + if UiKit.motion_scale < 1.0: + var st := get_tree().create_timer(BANNER_DWELL) + st.timeout.connect(banner.queue_free) + return + banner.modulate.a = 0.0 + var tw := banner.create_tween() + tw.tween_property(banner, "modulate:a", 1.0, UiKit.motion(0.15)) + tw.tween_interval(UiKit.motion(BANNER_DWELL)) + tw.tween_property(banner, "modulate:a", 0.0, UiKit.motion(0.25)) + tw.tween_callback(banner.queue_free)