feat(ux): T2 独立屏落地——RouteOverlay 升格 LevelMapScreen+组合根屏级互斥
类/文件改名 route_overlay.gd→level_map_screen.gd(RouteOverlay 退役,uid 随迁);屏底=暗幕 0.6 半透→不透明 BG_ROOT+石纹底噪(TEX_BACKDROP_STONE load_tex 守卫缺位纯色回退,spec Layout 形态升格);open_choices 进入转场 alpha 淡入 200ms(UiKit.motion;就地刷新/模态栈恢复不重放)。 组合根:_battle_root 宿主引用留存+_level_screen_active 状态+_enter/_exit_level_screen 单一出口(进屏隐战斗屏/出屏显战斗屏);_on_choices_presented 走进屏;_on_route_chosen 出屏分支;_on_adventure_finished 强制回战斗屏呈现摘要(放弃入口终局兜底)。_input_locked/模态登记序(节点层与商店层之间)不变——兑付覆盖层域内弹出的遮挡恢复语义由模态栈零改动复用。 探针机械改名 main.route_overlay→main.level_screen(ui_probe 5/ui_click_probe 4/ui_input 5/ui_tune 2 处)。坑⑤再证:新 class_name 后未刷编辑器缓存致四探针 Parse Error 超时——--editor --quit 后全绿。轻闸=冒烟 557/0+五探针 PASS。
This commit is contained in:
1 parent
30002f85fd
commit
ae2ca4ffd4
7 files changed
+78
-37
No files matched your search
+37
-14
@@ -43,7 +43,9 @@ var _start_overlay: Control
|
||||
var _end_overlay: BattleEndOverlay
|
||||
var _inter_overlay: Control
|
||||
var _inter_label: Label
|
||||
var route_overlay: RouteOverlay # 节点图选路覆盖层(分支节点图批——零自动推进停点)
|
||||
var level_screen: LevelMapScreen # 关卡画面(独立屏——2026-09-28 形态升格批:激活期战斗屏宿主整体隐藏;零自动推进停点语义不变)
|
||||
var _battle_root: Control # 战斗屏宿主(B/C/D 三区容器——独立屏激活期 visible=false 级互斥)
|
||||
var _level_screen_active := false # 独立屏激活状态(覆盖兑付覆盖层在屏域内弹出期间——战斗屏保持隐藏)
|
||||
|
||||
# 调试模式编排(单场/连续两层——状态机与战斗生命周期归 debug_session.gd,本类只接线与出 UI)
|
||||
var _debug = null
|
||||
@@ -99,6 +101,7 @@ func _ready() -> void:
|
||||
func _build_ui() -> void:
|
||||
var root := VBoxContainer.new()
|
||||
add_child(root)
|
||||
_battle_root = root # 独立屏互斥面(2026-09-28 形态升格批)
|
||||
var battle_ui: Dictionary = UiAssembler.build_battle_ui(root, db)
|
||||
stage = battle_ui.stage
|
||||
log_view = battle_ui.log_view
|
||||
@@ -132,15 +135,16 @@ func _build_ui() -> void:
|
||||
shop_overlay = overlays.shop_overlay
|
||||
camp_overlay = overlays.camp_overlay
|
||||
tune_panel = overlays.tune_panel
|
||||
route_overlay = RouteOverlay.new()
|
||||
add_child(route_overlay)
|
||||
# 树序 = 模态登记序 = z 遮挡序(缺陷⑤纪律)——选路层须夹在节点层与商店层之间
|
||||
move_child(route_overlay, node_overlay.get_index() + 1)
|
||||
level_screen = LevelMapScreen.new()
|
||||
add_child(level_screen)
|
||||
# 树序 = 模态登记序 = z 遮挡序(缺陷⑤纪律)——关卡画面须夹在节点层与商店层之间
|
||||
#(兑付覆盖层在本屏域内弹出:模态栈打开低层时自动隐藏高层本屏、关闭自动恢复——零机制改动复用)
|
||||
move_child(level_screen, node_overlay.get_index() + 1)
|
||||
legend_overlay.closed.connect(_on_modal_closed.bind(legend_overlay))
|
||||
review_overlay.closed.connect(_on_modal_closed.bind(review_overlay))
|
||||
node_overlay.continue_pressed.connect(_on_node_continue)
|
||||
route_overlay.route_chosen.connect(_on_route_chosen)
|
||||
route_overlay.abandon_requested.connect(_on_abandon_requested) # 放弃入口(2026-09-21 用户拍板——台账 119)
|
||||
level_screen.route_chosen.connect(_on_route_chosen)
|
||||
level_screen.abandon_requested.connect(_on_abandon_requested) # 放弃入口(2026-09-21 用户拍板——台账 119)
|
||||
shop_overlay.buy_requested.connect(_on_shop_buy)
|
||||
shop_overlay.leave_pressed.connect(_on_shop_leave)
|
||||
camp_overlay.buy_requested.connect(_on_camp_buy)
|
||||
@@ -151,7 +155,7 @@ func _build_ui() -> void:
|
||||
tune_panel.apply_requested.connect(_on_tune_apply)
|
||||
tune_panel.simulate_requested.connect(_on_tune_simulate)
|
||||
_modals = ModalStack.new()
|
||||
for m: Control in [legend_overlay, review_overlay, node_overlay, route_overlay, _end_overlay, shop_overlay, camp_overlay, tune_panel]:
|
||||
for m: Control in [legend_overlay, review_overlay, node_overlay, level_screen, _end_overlay, shop_overlay, camp_overlay, tune_panel]:
|
||||
_register_modal(m)
|
||||
_tune_sim = TuneSimController.new(db, tune_panel, int(db.hero.max_hp))
|
||||
|
||||
@@ -205,7 +209,7 @@ func _on_modal_closed(m: Control) -> void:
|
||||
func _input_locked() -> bool:
|
||||
# 模态/非战斗期棋盘输入锁(各 overlay 自身可见即锁定)
|
||||
return legend_overlay.is_open() or review_overlay.is_open() or _end_overlay.is_open() \
|
||||
or node_overlay.visible or route_overlay.visible or shop_overlay.visible or tune_panel.visible \
|
||||
or node_overlay.visible or level_screen.visible or shop_overlay.visible or tune_panel.visible \
|
||||
or _start_overlay.visible or _inter_overlay.visible or settlement == null
|
||||
|
||||
|
||||
@@ -231,7 +235,7 @@ func _start_adventure() -> void:
|
||||
adventure.adventure_finished.connect(_on_adventure_finished)
|
||||
adventure.level_started.connect(_on_adventure_level_started)
|
||||
_level_active = true
|
||||
route_overlay.set_abandon_available(true) # 放弃入口挂选路停点(天然非战斗期——2026-09-21 用户拍板)
|
||||
level_screen.set_abandon_available(true) # 放弃入口挂选路停点(天然非战斗期——2026-09-21 用户拍板)
|
||||
_reset_run_scope()
|
||||
log_view.clear()
|
||||
var seed_val := _seed_value()
|
||||
@@ -304,7 +308,7 @@ func _on_adventure_finished(summary: Dictionary) -> void:
|
||||
_level_active = false
|
||||
var result: String = String(summary.get("result", ""))
|
||||
settlement = null
|
||||
_close_modal(route_overlay) # 终局兜底(放弃入口新场景:选路层在开态——走模态栈恢复其遮挡面;未开过时 close 容错)
|
||||
_exit_level_screen() # 终局兜底:独立屏在开态(放弃入口)也先回战斗屏呈现摘要——屏级互斥单一出口
|
||||
_sync_settlement_visuals() # → 全关
|
||||
stage.hero_standee.set_effects_cleared_feedback() # 状态全清可见反馈(增益状态×4④——载体 2026-09-26 迁 B 区站桩)
|
||||
stage.gray_all_enemies() # 死亡兜底:站桩灰化残位(禁瞬消语义的战斗收尾面)
|
||||
@@ -572,17 +576,36 @@ func _on_choices_presented(candidates: Array) -> void:
|
||||
if runner == null:
|
||||
return
|
||||
log_view.append_bb(Narrator.route_line(candidates, runner))
|
||||
_open_modal(route_overlay)
|
||||
route_overlay.open_choices(candidates, runner)
|
||||
_enter_level_screen()
|
||||
level_screen.open_choices(candidates, runner)
|
||||
_refresh_presentations()
|
||||
|
||||
|
||||
func _on_route_chosen(node_id: int) -> void:
|
||||
_close_modal(route_overlay)
|
||||
_close_modal(level_screen)
|
||||
if not level_screen.visible:
|
||||
_exit_level_screen() # 战斗/Boss 节点:切回战斗屏;奖励/恢复/商店:本屏保持激活(T3 接管域内弹出)
|
||||
if runner != null and not runner.pick_next_node(node_id):
|
||||
push_error("[组合根] 选路被拒(编号 %d 不在候选)" % node_id)
|
||||
|
||||
|
||||
# ---- 独立屏屏级互斥(形态升格批 2026-09-28——单一出口:进屏隐战斗屏 / 出屏显战斗屏)----
|
||||
# 兑付覆盖层(节点/商店)在本屏激活域内弹出期间保持隐藏态不变——模态栈打开低层时隐藏本屏、
|
||||
# 关闭自动恢复本屏(遮挡语义复用),战斗屏不在此期间回显。
|
||||
|
||||
func _enter_level_screen() -> void:
|
||||
_level_screen_active = true
|
||||
_battle_root.visible = false
|
||||
_open_modal(level_screen)
|
||||
|
||||
|
||||
func _exit_level_screen() -> void:
|
||||
_level_screen_active = false
|
||||
_battle_root.visible = true
|
||||
if level_screen.visible:
|
||||
_close_modal(level_screen)
|
||||
|
||||
|
||||
func _on_abandon_requested() -> void:
|
||||
# 放弃入口(2026-09-21 用户拍板「放弃接口也要有」——推翻 冒险结构.md「MVP 无界面入口」后置条款;
|
||||
# 入口挂选路停点 = 天然非战斗期,拒绝分支仅防御在案):受理 → 冒险放弃结算(同失败型,
|
||||
|
||||
Reference in new issue
Block a user