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 0000000..aafc8c5 Binary files /dev/null and b/Assets/main_menu/characters.png differ 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 0000000..271034d Binary files /dev/null and b/Assets/main_menu/icon.png differ diff --git a/Assets/main_menu/icon.png.import b/Assets/main_menu/icon.png.import new file mode 100644 index 0000000..0ddec65 --- /dev/null +++ b/Assets/main_menu/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdb3grojgjtaq" +path="res://.godot/imported/icon.png-a1f010172d24ada42d71428b39fa8e05.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/main_menu/icon.png" +dest_files=["res://.godot/imported/icon.png-a1f010172d24ada42d71428b39fa8e05.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/label_continue.png b/Assets/main_menu/label_continue.png new file mode 100644 index 0000000..f7d452f Binary files /dev/null and b/Assets/main_menu/label_continue.png differ diff --git a/Assets/main_menu/label_continue.png.import b/Assets/main_menu/label_continue.png.import new file mode 100644 index 0000000..bb38be6 --- /dev/null +++ b/Assets/main_menu/label_continue.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bn0offg4w11w4" +path="res://.godot/imported/label_continue.png-73ecf71c03ce72f5729846d86d279818.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/main_menu/label_continue.png" +dest_files=["res://.godot/imported/label_continue.png-73ecf71c03ce72f5729846d86d279818.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/label_options.png b/Assets/main_menu/label_options.png new file mode 100644 index 0000000..f80bafc Binary files /dev/null and b/Assets/main_menu/label_options.png differ diff --git a/Assets/main_menu/label_options.png.import b/Assets/main_menu/label_options.png.import new file mode 100644 index 0000000..d3aa651 --- /dev/null +++ b/Assets/main_menu/label_options.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8khh5b1iwic1" +path="res://.godot/imported/label_options.png-19b15ef319e033f5146c10542dd5f109.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/main_menu/label_options.png" +dest_files=["res://.godot/imported/label_options.png-19b15ef319e033f5146c10542dd5f109.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/Game.json b/Game.json new file mode 100644 index 0000000..cfe27d9 --- /dev/null +++ b/Game.json @@ -0,0 +1,6 @@ +{ + "version": "0.0.1", + "title": "ChessBuilder", + "developer": "Comet Studios", + "release_date": "2025-01-15" +} \ No newline at end of file diff --git a/Systems/Game/ChessGame.gd b/Systems/Game/ChessGame.gd index 39154dc..b2287b2 100644 --- a/Systems/Game/ChessGame.gd +++ b/Systems/Game/ChessGame.gd @@ -10,6 +10,7 @@ const StockfishController = preload("res://Systems/FairyStockfish/StockfishClien signal tile_pressed(location: String) signal send_location(location: String) signal turn_changed +signal game_initialized # Game state variables var currentPlayer: String = WHITE @@ -39,6 +40,7 @@ var lightStyle = null var darkStyle = null var highlightStyle = null var cpuElo = 1500 +var is_initialized: bool = false # Node references @onready var turnIndicator: ColorRect = $TurnIndicator @@ -51,6 +53,8 @@ var cpuElo = 1500 @onready var cardPreview: CardPreview @onready var boardContainer: FlowContainer = $Flow @onready var stateMachine: StateMachine = $StateMachine +@onready var menuContainer = get_node_or_null("/root/Board/MenuContainer") + # Export parameters @export var boardXSize = 12 @@ -68,31 +72,66 @@ var cpuElo = 1500 # =========================================================================== func _ready() -> 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")