From 67979358347bd002597a7fc3f886f841542ed35c Mon Sep 17 00:00:00 2001 From: 2ManyProjects Date: Sat, 1 Mar 2025 21:38:01 -0600 Subject: [PATCH] Simple menu --- Assets/Themes/SimpleMenuText.tres | 4 + Assets/Themes/Title.tres | 4 + Assets/main_menu/characters.png | Bin 0 -> 9958 bytes Assets/main_menu/characters.png.import | 34 ++++++ Assets/main_menu/icon.png | Bin 0 -> 2286 bytes Assets/main_menu/icon.png.import | 34 ++++++ Assets/main_menu/label_continue.png | Bin 0 -> 1612 bytes Assets/main_menu/label_continue.png.import | 34 ++++++ Assets/main_menu/label_options.png | Bin 0 -> 1688 bytes Assets/main_menu/label_options.png.import | 34 ++++++ Game.json | 6 + Systems/Game/ChessGame.gd | 62 ++++++++-- Systems/Game/Game.gd | 64 ++++++++++ Systems/Game/Menu/MenuContainer.gd | 119 +++++++++++++++++++ Systems/Game/Menu/MenuOption.gd | 39 ++++++ Systems/Game/Menu/MenuTextOption.gd | 50 ++++++++ Systems/StateMachine/GameStates/DrawPhase.gd | 2 +- Systems/StateMachine/StateMachine.gd | 4 +- board.tscn | 112 ++++++++++++++++- 19 files changed, 588 insertions(+), 14 deletions(-) create mode 100644 Assets/Themes/SimpleMenuText.tres create mode 100644 Assets/Themes/Title.tres create mode 100644 Assets/main_menu/characters.png create mode 100644 Assets/main_menu/characters.png.import create mode 100644 Assets/main_menu/icon.png create mode 100644 Assets/main_menu/icon.png.import create mode 100644 Assets/main_menu/label_continue.png create mode 100644 Assets/main_menu/label_continue.png.import create mode 100644 Assets/main_menu/label_options.png create mode 100644 Assets/main_menu/label_options.png.import create mode 100644 Game.json create mode 100644 Systems/Game/Game.gd create mode 100644 Systems/Game/Menu/MenuContainer.gd create mode 100644 Systems/Game/Menu/MenuOption.gd create mode 100644 Systems/Game/Menu/MenuTextOption.gd diff --git a/Assets/Themes/SimpleMenuText.tres b/Assets/Themes/SimpleMenuText.tres new file mode 100644 index 0000000..89d894d --- /dev/null +++ b/Assets/Themes/SimpleMenuText.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://btgbiqdc4kf15"] + +[resource] +default_font_size = 49 diff --git a/Assets/Themes/Title.tres b/Assets/Themes/Title.tres new file mode 100644 index 0000000..dc64ea5 --- /dev/null +++ b/Assets/Themes/Title.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://cuq0xndnachqb"] + +[resource] +default_font_size = 71 diff --git a/Assets/main_menu/characters.png b/Assets/main_menu/characters.png new file mode 100644 index 0000000000000000000000000000000000000000..aafc8c51eb1c40559852e97e2ca77f79ed89616e GIT binary patch literal 9958 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 literal 0 HcmV?d00001 diff --git a/Assets/main_menu/characters.png.import b/Assets/main_menu/characters.png.import new file mode 100644 index 0000000..2c672d9 --- /dev/null +++ b/Assets/main_menu/characters.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bexpni52h8527" +path="res://.godot/imported/characters.png-aa4b087f4ba916c3768cf8d9d020e5a0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/main_menu/characters.png" +dest_files=["res://.godot/imported/characters.png-aa4b087f4ba916c3768cf8d9d020e5a0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Assets/main_menu/icon.png b/Assets/main_menu/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..271034dd8463a9d3053f91a86742a5382208aafb GIT binary patch literal 2286 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%0D+e0XLPyh;OXr%kDMdgJzT%IC$$%voq;*(L= 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

V9u@O#XB ii3Y$9fxkljzu;ee@QW!s6F^V^0000 void: - print("Initialize Local Stockfish") - # Set up the stockfish path based on OS + print("ChessGame _ready() called") + # Only set up paths and window size initially if OS.get_name() == "Windows": stockfishPath = "res://Assets/ChessEngines/stockfish/stockfish.exe" else: stockfishPath = ProjectSettings.globalize_path("res://Assets/ChessEngines/Fairy-Stockfish/src/stockfish") + add_to_group("ChessGame") currentFen = FEN DisplayServer.window_set_size(Vector2i(windowXSize, windowYSize)) + + # Set up the menu signal connection + if menuContainer: + print("Found MenuContainer, connecting signal") + if !menuContainer.is_connected("new_game_requested", Callable(self, "_on_new_game_requested")): + print("Signal Connected") + menuContainer.connect("new_game_requested", Callable(self, "_on_new_game_requested")) + else: + print("MenuContainer not found, will initialize game now") + call_deferred("initialize_game_system") + turnIndicator.visible = false + +func _on_new_game_requested(): + print("ChessGame received new_game_requested signal ", is_initialized) + turnIndicator.visible = true + if is_initialized: + resetBoard() + else: + initialize_game_system() + +func initialize_game_system(): + print("Initializing game system") + # Set up basic styles first + setupStyles() + # Initialize the game components initializeGame() initializeTiles() - # Start the state machine - stateMachine.transitionToNextState(Constants.WHITE_TURN) + # Initialize Stockfish controller stockfishController = StockfishController.new() add_child(stockfishController) stockfishController.connect_to_engine(stockfishPath, self) - # if stockfishController.connect_to_engine(stockfishPath): - # stockfishController.limit_strength_to(cpuElo) + + # Start the state machine + if stateMachine: + stateMachine.start() + stateMachine.transitionToNextState(Constants.WHITE_TURN) + + # Mark as initialized + is_initialized = true + + # Emit signal that game is initialized + emit_signal("game_initialized") func _exit_tree(): # Clean up the Stockfish controller when exiting - stockfishController.disconnect_engine() + if stockfishController: + stockfishController.disconnect_engine() func initializeGame() -> void: @@ -242,7 +281,7 @@ func createBoard() -> void: var numberX = 0 var numberY = 0 var isWhite = true - + print("CREATING BOARD X " + str(boardXSize) + " Y " + str(boardYSize)) while numberY != boardYSize: boardContainer.size.y += tileYSize + 5 boardContainer.size.x += tileXSize + 5 @@ -261,7 +300,7 @@ func createTile(x: int, y: int, isWhite: bool) -> void: var tile = PieceContainer.new(str(x) + "-" + str(y)) tile.set_custom_minimum_size(Vector2(tileXSize, tileYSize)) tile.add_theme_stylebox_override("normal", lightStyle if isWhite else darkStyle) - + print(" Create Tile " + str(x) + "-" + str(y) ) tile.set_name(str(x) + "-" + str(y)) # tile.pressed.connect(func(): handleTileSelection(tile.name)) tile.pressed.connect(func(): @@ -327,6 +366,7 @@ func setupTilesFromFEN() -> void: x += 1 func placePiece(position: String, pieceName: String, color: int) -> void: + print("Placing Piece") var piece = summonPiece(pieceName, color) var container = boardContainer.get_node(position) as PieceContainer await container.set_piece(piece, false) @@ -533,7 +573,8 @@ func clearSelection() : # Clear the current selection resetHighlights() selectedNode = "" - cardPreview.hide_preview() + if cardPreview: + cardPreview.hide_preview() return @@ -830,4 +871,3 @@ func updateHalfMoveClock(fromIdx: int, toIdx: int) -> void: halfMoveClock = 0 else: halfMoveClock += 1 - diff --git a/Systems/Game/Game.gd b/Systems/Game/Game.gd new file mode 100644 index 0000000..b2156d9 --- /dev/null +++ b/Systems/Game/Game.gd @@ -0,0 +1,64 @@ +class_name Game extends Node + +# This script can be attached to your main Game node that contains both +# the menu and the chess game components + +@onready var menuContainer = $MenuContainer +@onready var chessGame = $ChessGame +@onready var stateMachine = $StateMachine + +func _ready(): + # Show menu on startup + if menuContainer: + menuContainer.visible = true + + # Hide chess game initially + if chessGame: + chessGame.visible = false + + # Connect menu signals + if menuContainer and menuContainer.has_signal("new_game_requested"): + menuContainer.connect("new_game_requested", Callable(self, "_on_new_game_started")) + +func _on_new_game_started(): + print("Starting new game...") + + # Show chess game + if chessGame: + chessGame.visible = true + + # You can add additional game initialization logic here if needed + # For example, configuring game options based on menu selections + + # Ensure the chess game is properly initialized + if !chessGame.is_inside_tree(): + await chessGame.ready + + # Start game logic + _start_game_logic() + +func _start_game_logic(): + # If StateMachine is already initialized in the Chess game, this may not be needed + if stateMachine and stateMachine.has_method("transitionToNextState"): + stateMachine.transitionToNextState(Constants.WHITE_TURN) + + # Add any additional game start logic here + + # If you need to open a specific scene or create nodes dynamically: + # var chess_scene = load("res://Scenes/ChessGame.tscn").instantiate() + # add_child(chess_scene) + +# Handle escape key to show menu during game +func _unhandled_input(event): + if event is InputEventKey: + if event.pressed and event.keycode == KEY_ESCAPE: + _toggle_menu() + +func _toggle_menu(): + if menuContainer: + menuContainer.visible = !menuContainer.visible + + # Optional: Pause game when menu is visible + if menuContainer.visible and chessGame: + # You might want to pause the game or disable input + pass \ No newline at end of file diff --git a/Systems/Game/Menu/MenuContainer.gd b/Systems/Game/Menu/MenuContainer.gd new file mode 100644 index 0000000..22b7016 --- /dev/null +++ b/Systems/Game/Menu/MenuContainer.gd @@ -0,0 +1,119 @@ +extends Control +class_name MenuContainer + +# Path to the game scene or initialization script +const ChessGame = preload("res://Systems/Game/ChessGame.gd") + +const VERSION_FILE_PATH = "res://Game.json" +# Signal to notify parent when a new game is requested +signal new_game_requested + +@onready var newGameButton = $HBoxContainer/VBoxContainer/MenuOptions/NewGameText +@onready var continueButton = $HBoxContainer/VBoxContainer/MenuOptions/Continue +@onready var optionsButton = $HBoxContainer/VBoxContainer/MenuOptions/Options +@onready var versionText = $HBoxContainer/VBoxContainer/VersionText +@onready var titleText = $HBoxContainer/VBoxContainer/TitleText +@onready var developerText = $HBoxContainer/VBoxContainer/DeveloperText + +@onready var stateMachine = get_node("/root/Board/StateMachine") +func _ready(): + # Connect menu option signals + _connect_button(newGameButton, "_on_new_game_pressed") + _connect_button(continueButton, "_on_continue_pressed") + _connect_button(optionsButton, "_on_options_pressed") + load_version() + + +func load_version(): + + var version = "v.0.0.0" + var title = "ChessBuilder" + var developer = "" + var file = FileAccess.open(VERSION_FILE_PATH, FileAccess.READ) + if file: + var json_text = file.get_as_text() + file.close() + + # Parse the JSON + var json = JSON.new() + var error = json.parse(json_text) + + if error == OK: + var data = json.get_data() + if data and typeof(data) == TYPE_DICTIONARY and data.has("version"): + version = "v " + str(data.version) + if data and typeof(data) == TYPE_DICTIONARY and data.has("title"): + title = str(data.title) + if data and typeof(data) == TYPE_DICTIONARY and data.has("developer"): + developer = str(data.developer) + else: + print("JSON Parse Error: ", json.get_error_message()) + + if versionText: + versionText.text = version + if titleText: + titleText.text = title + if developerText: + developerText.text = developer +# Connect a button signal to a method +func _connect_button(button, method_name): + if button and button.has_signal("pressed"): + if !button.is_connected("pressed", Callable(self, method_name)): + button.connect("pressed", Callable(self, method_name)) + +# Handle New Game button press +func _on_new_game_pressed(): + print("New Game pressed, initializing game...") + + # Hide the menu container + self.visible = false + + # # Find the ChessGame instance or create one if needed + # var chess_game = _find_chess_game() + + # if chess_game: + # # Reset the game board if it exists + # chess_game.resetBoard() + + # # Start state machine + # if stateMachine: + # stateMachine.transitionToNextState(Constants.WHITE_TURN) + # else: + # print("Warning: StateMachine not found") + # else: + # print("Error: ChessGame not found") + + # Emit signal for parent to handle + emit_signal("new_game_requested") + +# Handle Continue button press +func _on_continue_pressed(): + print("Continue pressed") + # Implement continue game logic here + # self.visible = false + # You can add logic to load a saved game if needed + +# Handle Options button press +func _on_options_pressed(): + print("Options pressed") + # Implement options menu logic here + # You could show an options panel or switch to an options menu + +# Find the ChessGame node +func _find_chess_game(): + # Try to find existing ChessGame node + var chess_game = get_node_or_null("/root/Game/ChessGame") + + # If not found, check if we're a child of ChessGame + if not chess_game: + var parent = get_parent() + while parent and not chess_game: + if parent.get_class() == "ChessGame" or parent is ChessGame: + chess_game = parent + parent = parent.get_parent() + + return chess_game + +# Public method to show the menu +func show_menu(): + self.visible = true diff --git a/Systems/Game/Menu/MenuOption.gd b/Systems/Game/Menu/MenuOption.gd new file mode 100644 index 0000000..380ca4c --- /dev/null +++ b/Systems/Game/Menu/MenuOption.gd @@ -0,0 +1,39 @@ +extends TextureRect +class_name MenuOption + +signal pressed + +# Original modulate to return to after hover +var _original_modulate: Color + +func _ready(): + # Make this texture rect clickable + mouse_filter = Control.MOUSE_FILTER_STOP + + # Save original modulate color + _original_modulate = modulate + + # Connect the gui_input signal to our own handler + connect("gui_input", Callable(self, "_on_gui_input")) + + # Connect hover signals for better user experience + connect("mouse_entered", Callable(self, "_on_mouse_entered")) + connect("mouse_exited", Callable(self, "_on_mouse_exited")) + +func _on_gui_input(event): + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + emit_signal("pressed") + get_viewport().set_input_as_handled() + +func _on_mouse_entered(): + # Change appearance when mouse hovers + modulate = Color(1.2, 1.2, 0.8) # Slight yellowish tint and brightening + + # Optional: Add a hover sound effect + # if has_node("/root/SoundManager"): + # get_node("/root/SoundManager").play_hover_sound() + +func _on_mouse_exited(): + # Restore original appearance + modulate = _original_modulate diff --git a/Systems/Game/Menu/MenuTextOption.gd b/Systems/Game/Menu/MenuTextOption.gd new file mode 100644 index 0000000..71f503a --- /dev/null +++ b/Systems/Game/Menu/MenuTextOption.gd @@ -0,0 +1,50 @@ +extends RichTextLabel +class_name MenuTextOption + +signal pressed + +# Style properties +var normal_color: Color = Color(1, 1, 1, 1) # White +var hover_color: Color = Color(1, 1, 0, 1) # Yellow +var font_size: int = 24 + +func _ready(): + # Make this label clickable + mouse_filter = Control.MOUSE_FILTER_STOP + + # Set up base styling + add_theme_font_size_override("normal_font_size", font_size) + add_theme_color_override("default_color", normal_color) + + # Make text bold + bbcode_enabled = true + text = "[b]" + text + "[/b]" + + # Connect the gui_input signal to our own handler + connect("gui_input", Callable(self, "_on_gui_input")) + + # Connect hover signals for better user experience + connect("mouse_entered", Callable(self, "_on_mouse_entered")) + connect("mouse_exited", Callable(self, "_on_mouse_exited")) + +func _on_gui_input(event): + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + emit_signal("pressed") + get_viewport().set_input_as_handled() + +func _on_mouse_entered(): + # Change appearance when mouse hovers + add_theme_color_override("default_color", hover_color) + + # Scale up slightly on hover (optional) + var tween = create_tween() + tween.tween_property(self, "scale", Vector2(1.05, 1.05), 0.1) + +func _on_mouse_exited(): + # Restore original appearance + add_theme_color_override("default_color", normal_color) + + # Scale back to normal (optional) + var tween = create_tween() + tween.tween_property(self, "scale", Vector2(1.0, 1.0), 0.1) \ No newline at end of file diff --git a/Systems/StateMachine/GameStates/DrawPhase.gd b/Systems/StateMachine/GameStates/DrawPhase.gd index 3d69f13..bf35bae 100644 --- a/Systems/StateMachine/GameStates/DrawPhase.gd +++ b/Systems/StateMachine/GameStates/DrawPhase.gd @@ -6,4 +6,4 @@ func enter(_previous: String, _data := {}) -> void: game.deckManager.drawCard() finished.emit(Constants.PERSISTENT_EFFECTS) - \ No newline at end of file + diff --git a/Systems/StateMachine/StateMachine.gd b/Systems/StateMachine/StateMachine.gd index d7f0e94..f0029a0 100644 --- a/Systems/StateMachine/StateMachine.gd +++ b/Systems/StateMachine/StateMachine.gd @@ -12,6 +12,9 @@ var previouseState = null func _ready() -> void: + print("Ready Statemachine") + +func start() -> void: for stateNode: ChessGameState in find_children("*", "ChessGameState"): stateNode.game = owner stateNode.finished.connect(transitionToNextState) @@ -19,7 +22,6 @@ func _ready() -> void: await owner.ready state.enter("") - func unhandledInput(event: InputEvent) -> void: # print("StateMachine received input:", event) state.handleInput(event) diff --git a/board.tscn b/board.tscn index 9dc6a39..01a2e51 100644 --- a/board.tscn +++ b/board.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://d0qyk6v20uief"] +[gd_scene load_steps=26 format=3 uid="uid://d0qyk6v20uief"] [ext_resource type="Script" path="res://Systems/Game/ChessGame.gd" id="1_fkb2r"] [ext_resource type="Script" path="res://Systems/StateMachine/GameStates/WhiteTurn.gd" id="3_276ip"] @@ -17,6 +17,14 @@ [ext_resource type="Script" path="res://Systems/StateMachine/GameStates/CleanupPhase.gd" id="15_m58r8"] [ext_resource type="Script" path="res://Systems/StateMachine/GameStates/RoundEnd.gd" id="16_8h5do"] [ext_resource type="Script" path="res://Systems/Game/CameraController.gd" id="17_1epdx"] +[ext_resource type="Script" path="res://Systems/Game/Menu/MenuContainer.gd" id="18_c1y73"] +[ext_resource type="Texture2D" uid="uid://bn0offg4w11w4" path="res://Assets/main_menu/label_continue.png" id="18_yr4pt"] +[ext_resource type="Theme" uid="uid://cuq0xndnachqb" path="res://Assets/Themes/Title.tres" id="19_enj45"] +[ext_resource type="Texture2D" uid="uid://b8khh5b1iwic1" path="res://Assets/main_menu/label_options.png" id="20_necaf"] +[ext_resource type="Script" path="res://Systems/Game/Menu/MenuOption.gd" id="20_qqo7d"] +[ext_resource type="Texture2D" uid="uid://bexpni52h8527" path="res://Assets/main_menu/characters.png" id="23_vmvai"] +[ext_resource type="Theme" uid="uid://btgbiqdc4kf15" path="res://Assets/Themes/SimpleMenuText.tres" id="24_4y4dr"] +[ext_resource type="Script" path="res://Systems/Game/Menu/MenuTextOption.gd" id="24_aslgu"] [node name="Board" type="Control"] layout_mode = 3 @@ -155,3 +163,105 @@ game = NodePath("../..") [node name="CameraController" type="Node2D" parent="."] script = ExtResource("17_1epdx") + +[node name="MenuContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 120 +theme_override_constants/margin_top = 80 +theme_override_constants/margin_right = 120 +theme_override_constants/margin_bottom = 80 +script = ExtResource("18_c1y73") + +[node name="HBoxContainer" type="HBoxContainer" parent="MenuContainer"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MenuContainer/HBoxContainer"] +layout_mode = 2 + +[node name="TitleText" type="RichTextLabel" parent="MenuContainer/HBoxContainer/VBoxContainer"] +clip_contents = false +layout_mode = 2 +size_flags_stretch_ratio = 0.0 +theme = ExtResource("19_enj45") +text = "ChessBuilder" +fit_content = true +scroll_active = false +autowrap_mode = 0 +tab_size = 1 +shortcut_keys_enabled = false +deselect_on_focus_loss_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("24_aslgu") + +[node name="MenuOptions" type="VBoxContainer" parent="MenuContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/separation = 30 +alignment = 1 + +[node name="Continue" type="TextureRect" parent="MenuContainer/HBoxContainer/VBoxContainer/MenuOptions"] +layout_mode = 2 +texture = ExtResource("18_yr4pt") +stretch_mode = 2 +script = ExtResource("20_qqo7d") + +[node name="NewGameText" type="RichTextLabel" parent="MenuContainer/HBoxContainer/VBoxContainer/MenuOptions"] +layout_mode = 2 +theme = ExtResource("24_4y4dr") +text = "New Game" +fit_content = true +scroll_active = false +autowrap_mode = 0 +tab_size = 1 +shortcut_keys_enabled = false +deselect_on_focus_loss_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("24_aslgu") + +[node name="Options" type="TextureRect" parent="MenuContainer/HBoxContainer/VBoxContainer/MenuOptions"] +layout_mode = 2 +texture = ExtResource("20_necaf") +stretch_mode = 2 +script = ExtResource("20_qqo7d") + +[node name="VersionText" type="RichTextLabel" parent="MenuContainer/HBoxContainer/VBoxContainer"] +clip_contents = false +layout_mode = 2 +size_flags_stretch_ratio = 0.0 +theme = ExtResource("24_4y4dr") +text = "v." +fit_content = true +scroll_active = false +autowrap_mode = 0 +tab_size = 1 +shortcut_keys_enabled = false +deselect_on_focus_loss_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("24_aslgu") + +[node name="DeveloperText" type="RichTextLabel" parent="MenuContainer/HBoxContainer/VBoxContainer"] +clip_contents = false +layout_mode = 2 +size_flags_stretch_ratio = 0.0 +theme = ExtResource("24_4y4dr") +fit_content = true +scroll_active = false +autowrap_mode = 0 +tab_size = 1 +shortcut_keys_enabled = false +deselect_on_focus_loss_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("24_aslgu") + +[node name="CenterContainer" type="CenterContainer" parent="MenuContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="GameImage" type="TextureRect" parent="MenuContainer/HBoxContainer/CenterContainer"] +layout_mode = 2 +texture = ExtResource("23_vmvai")