按 code-conventions §1.4.1 第三轮定稿执行:core 22+schemas 18+presentation 根 14+views 28,全部头注 #→##、删日期/变更叙事/GDD 与架构反向链接/字段与域清单/机制描述,保留职责摘要+真实使用约束(防事故禁令/单一入口/信号契约每信号一行)。main.gd 31→5 行、save_manager 45→5 行、adventure_runner 37→5 行为最大单件。子代理分模块执行(波一 core+schemas、波二 presentation+views,并发≤2)。验收=tools/verify_comment_only_change.py 逐字节校验(82 文件头注区外逐行一致=零行为变更)+audit_file_headers 全绿;纯注释批免冒烟(先例 5843270)
112 lines
5.0 KiB
GDScript
112 lines
5.0 KiB
GDScript
## VERTICAL SLICE - NOT FOR PRODUCTION
|
||
## D 区容器:AP 条+棋盘+toast+演出层+两枚角标的组合壳,子件信号原样转发组合根(组合根只接线一处)。
|
||
class_name BoardZoneView
|
||
extends PanelContainer
|
||
|
||
var ap_bar: ApBarView
|
||
var board_view: BoardView
|
||
var toast: ToastStack
|
||
var fx: BoardFxView
|
||
var status_badge: Button # 状态面板入口角标(迭代 17 卡③ P1 丁——debug 角标同形制;连接归组合根)
|
||
var debug_badge: Button # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——调试门控归组合根;状态角标同形制)
|
||
var _board_area: Control # resized 命名转发用(原 lambda 局部捕获——P1-3 转命名 2026-09-29)
|
||
|
||
signal action_requested(cell: Vector2i, kind: String)
|
||
signal stop_pressed
|
||
signal refresh_confirmed
|
||
signal legend_toggled
|
||
signal hover_forbidden(cell: Vector2i)
|
||
signal chord_attempted(cell: Vector2i)
|
||
|
||
|
||
func _init() -> void:
|
||
size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||
var vb := VBoxContainer.new()
|
||
vb.add_theme_constant_override("separation", 4)
|
||
add_child(vb)
|
||
ap_bar = ApBarView.new()
|
||
vb.add_child(ap_bar)
|
||
var board_area := Control.new()
|
||
board_area.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||
board_area.clip_contents = true
|
||
vb.add_child(board_area)
|
||
_board_area = board_area
|
||
board_area.resized.connect(_on_board_area_resized)
|
||
board_view = BoardView.new()
|
||
board_view.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||
board_area.add_child(board_view)
|
||
fx = BoardFxView.new()
|
||
board_area.add_child(fx)
|
||
toast = ToastStack.new()
|
||
board_area.add_child(toast)
|
||
# 角标对(迭代 18 卡⑦ P2 甲——调试+状态两枚右下角常驻,HBox 并排锚角距 16px):
|
||
# 17卡③状态角标同形制:紧凑钮豁免宽度基准+字号降档。可见性/置灰归组合根 _sync_status_entry
|
||
#(调试门控/其他模态开着=置灰不可点——排除式开态查询);信号连接归组合根。
|
||
# preset 在子件全部入列后调用——MINSIZE 锚按当时最小尺寸计偏移(空容器调用=零尺寸锚外溢屏边)
|
||
var corner := HBoxContainer.new()
|
||
corner.add_theme_constant_override("separation", 8)
|
||
debug_badge = UiKit.button("调试", 0.0) # 角落小件豁免宽度基准(同状态角标)
|
||
debug_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT)
|
||
debug_badge.tooltip_text = "打开调试浮窗(当局数据/种子/数值调整)"
|
||
debug_badge.visible = false # 显式初始化——非调试会话不误现(可见性归组合根同步)
|
||
corner.add_child(debug_badge)
|
||
status_badge = UiKit.button("状态", 0.0) # 角落小件豁免宽度基准(同调试角标)
|
||
status_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT)
|
||
status_badge.tooltip_text = "查看钥石与永久强化进度(只读)"
|
||
status_badge.visible = false # 显式初始化——非对局期不误现(可见性归组合根同步)
|
||
corner.add_child(status_badge)
|
||
# 右下角锚定(迭代 18 卡⑦):MINSIZE 预设须在入树后调用——容器出树的最小尺寸缓存陈旧为 0
|
||
#(裸 Button 无此病,容器延迟到首轮排序才重算),零尺寸锚角会使钮对悬出屏边;
|
||
# grow 向左上=后续最小尺寸变化向屏内生长。预设延迟帧尾——届时容器最小尺寸已就绪
|
||
corner.grow_horizontal = Control.GROW_DIRECTION_BEGIN
|
||
corner.grow_vertical = Control.GROW_DIRECTION_BEGIN
|
||
corner.set_anchors_and_offsets_preset.call_deferred(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16)
|
||
board_area.add_child(corner)
|
||
# M8(UI 落码批):棋盘底常驻操作提示条(demo ⑦——文案经 board_view 输入代码证实;
|
||
# 旧 chord 一次性 toast 提示退役归此常驻条;审计第 7 条用户批)
|
||
var hint := PanelContainer.new()
|
||
hint.add_theme_stylebox_override("panel", UiKit.panel_flat(
|
||
Color(0.09, 0.07, 0.05, 0.82), UiKit.HINT_STRIP_EDGE, 0, 1, Vector4(12, 2, 12, 2)))
|
||
hint.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
||
hint.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
vb.add_child(hint)
|
||
var hl := UiKit.label("左键 挖掘 / 移动 · 右键 封印(不可逆) · 同格双击 快开",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT)
|
||
hint.add_child(hl)
|
||
# 信号转发(组合根只接线一处)
|
||
board_view.action_requested.connect(_forward_action)
|
||
board_view.hover_forbidden.connect(_forward_hover)
|
||
board_view.chord_attempted.connect(_forward_chord)
|
||
ap_bar.stop_pressed.connect(_emit_stop_pressed)
|
||
ap_bar.refresh_confirmed.connect(_emit_refresh_confirmed)
|
||
ap_bar.legend_toggled.connect(_emit_legend_toggled)
|
||
|
||
|
||
func _on_board_area_resized() -> void:
|
||
board_view.set_cell_area(_board_area.size)
|
||
|
||
|
||
func _forward_action(c: Vector2i, kind: String) -> void:
|
||
action_requested.emit(c, kind)
|
||
|
||
|
||
func _forward_hover(c: Vector2i) -> void:
|
||
hover_forbidden.emit(c)
|
||
|
||
|
||
func _forward_chord(c: Vector2i) -> void:
|
||
chord_attempted.emit(c)
|
||
|
||
|
||
func _emit_stop_pressed() -> void:
|
||
stop_pressed.emit()
|
||
|
||
|
||
func _emit_refresh_confirmed() -> void:
|
||
refresh_confirmed.emit()
|
||
|
||
|
||
func _emit_legend_toggled() -> void:
|
||
legend_toggled.emit()
|
||
|
||
|