extends Control ## #257: Loading screen overlay — blocks input during save/load round-trip. ## Shown when LOAD_GAME fires; hidden when save_result arrives (success or failure). ## Full-screen, dark overlay with centered status text. ## #724: Shows client version (from project.yaml) and protocol version below the status text. const BG_COLOR := Color(0.0, 0.0, 0.0, 0.75) const TEXT_COLOR := Color("#c8d0e0") const VERSION_COLOR := Color("#667788") const FONT_SIZE := 18 const VERSION_FONT_SIZE := 11 var _label: Label = null var _version_label: Label = null func _ready() -> void: visible = false mouse_filter = Control.MOUSE_FILTER_STOP set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _build_ui() func _build_ui() -> void: var bg := ColorRect.new() bg.color = BG_COLOR bg.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) bg.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(bg) _label = Label.new() _label.text = UIStrings.get_text("notifications.loading") _label.add_theme_font_size_override("font_size", FONT_SIZE) _label.add_theme_color_override("font_color", TEXT_COLOR) _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER _label.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _label.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_label) var client_ver := _read_client_version() var proto_ver: int = Protocol.PROTOCOL_VERSION _version_label = Label.new() _version_label.text = "v%s · protocol %d" % [client_ver, proto_ver] _version_label.add_theme_font_size_override("font_size", VERSION_FONT_SIZE) _version_label.add_theme_color_override("font_color", VERSION_COLOR) _version_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _version_label.anchor_left = 0.0 _version_label.anchor_right = 1.0 _version_label.anchor_top = 1.0 _version_label.anchor_bottom = 1.0 _version_label.offset_top = -32.0 _version_label.offset_bottom = -8.0 _version_label.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_version_label) func _read_client_version() -> String: var yaml_path := ProjectSettings.globalize_path("res://") + "/../project.yaml" if not FileAccess.file_exists(yaml_path): return "?.?.?" var file := FileAccess.open(yaml_path, FileAccess.READ) if file == null: return "?.?.?" var content := file.get_as_text() file.close() for line: String in content.split("\n"): if line.begins_with("version:"): var parts := line.split(":", false, 1) if parts.size() >= 2: return parts[1].strip_edges() return "?.?.?" func show_loading() -> void: visible = true ## Hide the loading overlay. success=false is reserved for future failure-state UI. func hide_loading(_success: bool = true) -> void: visible = false