From f8517399a761a25b7fd0298266bcd103e72f6395 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:52:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8=E5=9F=9F?= =?UTF-8?q?=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T5=20=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E4=B8=89=E5=B1=82=EF=BC=88=E8=BF=AD=E4=BB=A314?= =?UTF-8?q?=E2=91=A2=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9Asettlement=5Ffx=5F?= =?UTF-8?q?view=20+play=5Fboard=5Fvariant=5Fbanner=EF=BC=88=E8=BD=AE?= =?UTF-8?q?=E6=A8=AA=E5=B9=85=E5=85=88=E4=BE=8B=E5=90=8C=E6=AC=BE=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=87=8F=E5=8A=A8=E6=95=88=3D=E9=9D=99=E6=80=81?= =?UTF-8?q?=E9=A9=BB=E7=95=99=E5=8F=8C=E6=80=81=EF=BC=9B=E8=BD=AE=E6=A8=AA?= =?UTF-8?q?=E5=B9=85=E4=B8=8B=E6=96=B9=E5=8F=A0=E8=A1=8C=E4=BD=8D=EF=BC=89?= =?UTF-8?q?=EF=BC=9Bhero=5Finfo=5Fpanel=5Fview=20+=E5=9C=B0=E5=BD=A2?= =?UTF-8?q?=E5=8F=98=E5=BC=82=E5=B8=B8=E9=A9=BB=E8=A7=92=E6=A0=87=E6=AE=B5?= =?UTF-8?q?=EF=BC=88=E6=B5=81=E6=B4=BE=E4=BB=B6=E6=AE=B5=E5=85=88=E4=BE=8B?= =?UTF-8?q?=E2=80=94=E2=80=94=E7=A9=BA=E6=80=81=E6=95=B4=E8=8A=82=E9=9A=90?= =?UTF-8?q?=E8=97=8F=EF=BC=8C=E6=91=86=E4=BD=8Dprovisional=E5=BD=92HUD?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E6=89=B9=EF=BC=89=EF=BC=9Bhud=5Fpresenter=20?= =?UTF-8?q?+board=5Fvariant=5Flines=20=E6=96=87=E6=A1=88=E8=A3=85=E9=85=8D?= =?UTF-8?q?+refresh=20=E6=8E=A5=E7=BA=BF=EF=BC=88=E5=BF=AB=E7=85=A7=20boar?= =?UTF-8?q?d=5Fvariants=20=E6=8A=95=E5=BD=B1=E2=80=94=E2=80=94=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E2=86=92=E5=91=88=E7=8E=B0=E5=94=AF=E4=B8=80=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E9=9D=A2=EF=BC=9B=E5=87=BA=E6=88=98=E6=96=97=E5=8D=B3?= =?UTF-8?q?=E9=9A=90=EF=BC=89=EF=BC=9Bpresentation=5Fsnapshot=20+board=5Fv?= =?UTF-8?q?ariants=20=E6=8A=95=E5=BD=B1=E5=AD=97=E6=AE=B5=EF=BC=9Bmain.gd?= =?UTF-8?q?=20=5Fon=5Fround=5Fstarted=20=E9=A6=96=E8=BD=AE=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=88=A4=E7=A9=BA=E5=8F=91=E5=B0=84=E5=BC=80=E6=88=98?= =?UTF-8?q?=E6=A8=AA=E5=B9=85=EF=BC=88=E6=99=AE=E9=80=9A=E5=9B=BE=E6=81=92?= =?UTF-8?q?=E9=9B=B6=E5=8F=91=E5=B0=84=EF=BC=89=EF=BC=9Bui=5Fassembler=20?= =?UTF-8?q?=E7=8E=A9=E6=B3=95=E5=B8=AE=E5=8A=A9=E5=9D=97=20+=E6=95=B4?= =?UTF-8?q?=E5=9B=BE=E5=8F=98=E5=BC=82=E8=AF=B4=E6=98=8E=E8=A1=8C=EF=BC=88?= =?UTF-8?q?=E6=95=99=E5=AD=A6=E5=AE=9A=E7=A8=BF=E6=89=B9=20P4=E4=B8=99?= =?UTF-8?q?=E3=80=8C=E6=89=8B=E5=86=8C=E9=9B=B6=E5=86=8D=E6=95=99=E3=80=8D?= =?UTF-8?q?=E6=89=BF=E8=BD=BD=E4=BD=8D=EF=BC=8C=E9=9B=B6=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E6=95=99=E5=AD=A6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/hud_presenter.gd | 17 +++++++++++ game/presentation/main.gd | 8 +++++ game/presentation/ui_assembler.gd | 2 +- .../views/hero_info_panel_view.gd | 23 +++++++++++++++ game/presentation/views/settlement_fx_view.gd | 29 +++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) 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)