From 9a2bcf02c2623c8f3e8f5e74e70b3c0333790484 Mon Sep 17 00:00:00 2001
From: David Luevano Alvarado <david@luevano.xyz>
Date: Sat, 4 Jun 2022 10:27:35 -0600
Subject: refactor nodes to work with native scene changer, add functioning
 main menu

---
 assets/ui/main_menu/selector.aseprite            | Bin 0 -> 765 bytes
 assets/ui/main_menu/selector.png                 | Bin 0 -> 231 bytes
 assets/ui/main_menu/selector1.png                | Bin 0 -> 155 bytes
 assets/ui/main_menu/selector2.png                | Bin 0 -> 160 bytes
 assets/ui/main_menu/selector3.png                | Bin 0 -> 164 bytes
 assets/ui/main_menu/selector4.png                | Bin 0 -> 159 bytes
 assets/ui/main_menu/selector5.png                | Bin 0 -> 88 bytes
 src/Game.tscn                                    |  24 +++++++
 src/Main.tscn                                    |  25 -------
 src/entities/actors/snake/scripts/head.gd        |   1 -
 src/event.gd                                     |   1 +
 src/game.gd                                      |  37 +++++++++++
 src/global.gd                                    |   1 +
 src/main.gd                                      |  41 ------------
 src/project.godot                                |  48 ++++++++++----
 src/tools/world_generator/scripts/walker_head.gd |  12 ++--
 src/ui/UI.tscn                                   |  58 ----------------
 src/ui/hud/HUD.tscn                              |  42 ++++++++++++
 src/ui/main_menu/scenes/MainMenu.tscn            |  66 ++++++++++++++++++
 src/ui/main_menu/scenes/MenuOption.tscn          |  27 ++++++++
 src/ui/main_menu/scripts/main_menu.gd            |  81 +++++++++++++++++++++++
 src/ui/main_menu/scripts/menu_option.gd          |  35 ++++++++++
 src/ui/main_menu/sprites/selector.png            | Bin 0 -> 231 bytes
 src/ui/main_menu/sprites/selector.png.import     |  35 ++++++++++
 src/ui/main_menu/sprites/selector1.png           | Bin 0 -> 155 bytes
 src/ui/main_menu/sprites/selector1.png.import    |  35 ++++++++++
 src/ui/main_menu/sprites/selector2.png           | Bin 0 -> 160 bytes
 src/ui/main_menu/sprites/selector2.png.import    |  35 ++++++++++
 src/ui/main_menu/sprites/selector3.png           | Bin 0 -> 164 bytes
 src/ui/main_menu/sprites/selector3.png.import    |  35 ++++++++++
 src/ui/main_menu/sprites/selector4.png           | Bin 0 -> 159 bytes
 src/ui/main_menu/sprites/selector4.png.import    |  35 ++++++++++
 src/ui/main_menu/sprites/selector5.png           | Bin 0 -> 88 bytes
 src/ui/main_menu/sprites/selector5.png.import    |  35 ++++++++++
 src/ui/ui.gd                                     |  14 ----
 35 files changed, 565 insertions(+), 158 deletions(-)
 create mode 100644 assets/ui/main_menu/selector.aseprite
 create mode 100644 assets/ui/main_menu/selector.png
 create mode 100644 assets/ui/main_menu/selector1.png
 create mode 100644 assets/ui/main_menu/selector2.png
 create mode 100644 assets/ui/main_menu/selector3.png
 create mode 100644 assets/ui/main_menu/selector4.png
 create mode 100644 assets/ui/main_menu/selector5.png
 create mode 100644 src/Game.tscn
 delete mode 100644 src/Main.tscn
 create mode 100644 src/game.gd
 delete mode 100644 src/main.gd
 delete mode 100644 src/ui/UI.tscn
 create mode 100644 src/ui/hud/HUD.tscn
 create mode 100644 src/ui/main_menu/scenes/MainMenu.tscn
 create mode 100644 src/ui/main_menu/scenes/MenuOption.tscn
 create mode 100644 src/ui/main_menu/scripts/main_menu.gd
 create mode 100644 src/ui/main_menu/scripts/menu_option.gd
 create mode 100644 src/ui/main_menu/sprites/selector.png
 create mode 100644 src/ui/main_menu/sprites/selector.png.import
 create mode 100644 src/ui/main_menu/sprites/selector1.png
 create mode 100644 src/ui/main_menu/sprites/selector1.png.import
 create mode 100644 src/ui/main_menu/sprites/selector2.png
 create mode 100644 src/ui/main_menu/sprites/selector2.png.import
 create mode 100644 src/ui/main_menu/sprites/selector3.png
 create mode 100644 src/ui/main_menu/sprites/selector3.png.import
 create mode 100644 src/ui/main_menu/sprites/selector4.png
 create mode 100644 src/ui/main_menu/sprites/selector4.png.import
 create mode 100644 src/ui/main_menu/sprites/selector5.png
 create mode 100644 src/ui/main_menu/sprites/selector5.png.import
 delete mode 100644 src/ui/ui.gd

diff --git a/assets/ui/main_menu/selector.aseprite b/assets/ui/main_menu/selector.aseprite
new file mode 100644
index 0000000..630e929
Binary files /dev/null and b/assets/ui/main_menu/selector.aseprite differ
diff --git a/assets/ui/main_menu/selector.png b/assets/ui/main_menu/selector.png
new file mode 100644
index 0000000..48a5678
Binary files /dev/null and b/assets/ui/main_menu/selector.png differ
diff --git a/assets/ui/main_menu/selector1.png b/assets/ui/main_menu/selector1.png
new file mode 100644
index 0000000..b516e93
Binary files /dev/null and b/assets/ui/main_menu/selector1.png differ
diff --git a/assets/ui/main_menu/selector2.png b/assets/ui/main_menu/selector2.png
new file mode 100644
index 0000000..93547db
Binary files /dev/null and b/assets/ui/main_menu/selector2.png differ
diff --git a/assets/ui/main_menu/selector3.png b/assets/ui/main_menu/selector3.png
new file mode 100644
index 0000000..0e468c2
Binary files /dev/null and b/assets/ui/main_menu/selector3.png differ
diff --git a/assets/ui/main_menu/selector4.png b/assets/ui/main_menu/selector4.png
new file mode 100644
index 0000000..7d2ee70
Binary files /dev/null and b/assets/ui/main_menu/selector4.png differ
diff --git a/assets/ui/main_menu/selector5.png b/assets/ui/main_menu/selector5.png
new file mode 100644
index 0000000..5e4988e
Binary files /dev/null and b/assets/ui/main_menu/selector5.png differ
diff --git a/src/Game.tscn b/src/Game.tscn
new file mode 100644
index 0000000..1709a85
--- /dev/null
+++ b/src/Game.tscn
@@ -0,0 +1,24 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://entities/actors/snake/scenes/Snake.tscn" type="PackedScene" id=1]
+[ext_resource path="res://ui/hud/HUD.tscn" type="PackedScene" id=2]
+[ext_resource path="res://tools/score_manager/ScoreManager.tscn" type="PackedScene" id=3]
+[ext_resource path="res://entities/food/scenes/FoodManager.tscn" type="PackedScene" id=4]
+[ext_resource path="res://tools/world_generator/scenes/WorldGenerator.tscn" type="PackedScene" id=5]
+[ext_resource path="res://game.gd" type="Script" id=6]
+
+[node name="Game" type="Node2D"]
+script = ExtResource( 6 )
+
+[node name="WorldGenerator" parent="." instance=ExtResource( 5 )]
+
+[node name="ScoreManager" parent="." instance=ExtResource( 3 )]
+
+[node name="Snake" parent="." instance=ExtResource( 1 )]
+
+[node name="FoodManager" parent="." instance=ExtResource( 4 )]
+WORLD_GENERATOR_NP = NodePath("../WorldGenerator")
+
+[node name="HUDScreen" type="CanvasLayer" parent="."]
+
+[node name="HUD" parent="HUDScreen" instance=ExtResource( 2 )]
diff --git a/src/Main.tscn b/src/Main.tscn
deleted file mode 100644
index e874cc8..0000000
--- a/src/Main.tscn
+++ /dev/null
@@ -1,25 +0,0 @@
-[gd_scene load_steps=7 format=2]
-
-[ext_resource path="res://entities/actors/snake/scenes/Snake.tscn" type="PackedScene" id=1]
-[ext_resource path="res://tools/score_manager/ScoreManager.tscn" type="PackedScene" id=2]
-[ext_resource path="res://ui/UI.tscn" type="PackedScene" id=3]
-[ext_resource path="res://main.gd" type="Script" id=4]
-[ext_resource path="res://entities/food/scenes/FoodManager.tscn" type="PackedScene" id=5]
-[ext_resource path="res://tools/world_generator/scenes/WorldGenerator.tscn" type="PackedScene" id=6]
-
-[node name="Main" type="Node2D"]
-script = ExtResource( 4 )
-
-[node name="WorldGenerator" parent="." instance=ExtResource( 6 )]
-
-[node name="FoodManager" parent="." instance=ExtResource( 5 )]
-WORLD_GENERATOR_NP = NodePath("../WorldGenerator")
-
-[node name="Snake" parent="." instance=ExtResource( 1 )]
-
-[node name="ScoreManager" parent="." instance=ExtResource( 2 )]
-
-[node name="UI" parent="." instance=ExtResource( 3 )]
-__meta__ = {
-"_edit_horizontal_guides_": [ 8.0 ]
-}
diff --git a/src/entities/actors/snake/scripts/head.gd b/src/entities/actors/snake/scripts/head.gd
index 1e17b18..32847f7 100644
--- a/src/entities/actors/snake/scripts/head.gd
+++ b/src/entities/actors/snake/scripts/head.gd
@@ -46,7 +46,6 @@ func _handle_time_elapsed(delta: float) -> void:
 
 
 func _on_food_eaten(properties: Dictionary) -> void:
-	print("tongue food eaten")
 	if not tongue_sprite.visible:
 		tongue_sprite.visible = true
 	tongue_sprite.play()
diff --git a/src/event.gd b/src/event.gd
index 991b0e2..fb79a30 100644
--- a/src/event.gd
+++ b/src/event.gd
@@ -1,6 +1,7 @@
 extends Node
 
 signal game_start
+signal game_restart
 signal game_over
 
 signal snake_path_new_point(coordinates)
diff --git a/src/game.gd b/src/game.gd
new file mode 100644
index 0000000..218d975
--- /dev/null
+++ b/src/game.gd
@@ -0,0 +1,37 @@
+extends Node2D
+
+onready var _snake: Node2D = $Snake
+
+
+func _ready() -> void:
+	Event.connect("game_over", self, "_on_game_over")
+	Event.connect("game_restart", self, "_on_game_restart")
+	Event.connect("snake_segment_body_entered", self, "_on_snake_segment_body_entered")
+
+
+func _input(event: InputEvent) -> void:
+	if event.is_action_pressed("restart"):
+		Event.emit_signal("game_restart")
+
+
+func _on_snake_segment_body_entered(body: Node) -> void:
+	if body is KinematicBody2D:
+		Event.emit_signal("game_over")
+
+
+func _snake_set_process(on_off: bool) -> void:
+	_snake.propagate_call("set_process", [on_off])
+	_snake.propagate_call("set_process_internal", [on_off])
+	_snake.propagate_call("set_physics_process", [on_off])
+	_snake.propagate_call("set_physics_process_internal", [on_off])
+	_snake.propagate_call("set_process_input", [on_off])
+
+
+func _on_game_over() -> void:
+	print("game_over")
+	_snake_set_process(false)
+
+
+func _on_game_restart() -> void:
+	print("game_restart")
+	get_tree().change_scene_to(Global.GAME_NODE)
\ No newline at end of file
diff --git a/src/global.gd b/src/global.gd
index 1ed4d29..59fd4bd 100644
--- a/src/global.gd
+++ b/src/global.gd
@@ -1,5 +1,6 @@
 extends Node
 
+var GAME_NODE: PackedScene = preload("res://Game.tscn")
 var GAME_SCALE: float = 2.0
 var TILE_SIZE: int = 16
 var WORLD_TILE_PATH: int = 0
diff --git a/src/main.gd b/src/main.gd
deleted file mode 100644
index 38a0341..0000000
--- a/src/main.gd
+++ /dev/null
@@ -1,41 +0,0 @@
-class_name Main
-extends Node
-
-onready var _snake: Node2D = $Snake
-
-
-func _ready() -> void:
-	Event.connect("game_start", self, "_on_game_start")
-	Event.connect("game_over", self, "_on_game_over")
-	Event.connect("snake_segment_body_entered", self, "_on_snake_segment_body_entered")
-
-	_snake_disabled(false)
-	# OS.window_size = Global.GAME_SCALE * OS.window_size
-
-
-func _input(event: InputEvent) -> void:
-	if event.is_action_pressed("restart"):
-		get_tree().reload_current_scene()
-
-
-func _on_snake_segment_body_entered(body: Node) -> void:
-	if body is KinematicBody2D:
-		Event.emit_signal("game_over")
-
-
-func _snake_disabled(on_off: bool) -> void:
-	_snake.propagate_call("set_process", [on_off])
-	_snake.propagate_call("set_process_internal", [on_off])
-	_snake.propagate_call("set_physics_process", [on_off])
-	_snake.propagate_call("set_physics_process_internal", [on_off])
-	_snake.propagate_call("set_process_input", [on_off])
-
-
-func _on_game_start() -> void:
-	print("game start")
-	_snake_disabled(true)
-
-
-func _on_game_over() -> void:
-	print("game over")
-	_snake_disabled(false)
diff --git a/src/project.godot b/src/project.godot
index 159bfd5..5ea911a 100644
--- a/src/project.godot
+++ b/src/project.godot
@@ -39,20 +39,15 @@ _global_script_classes=[ {
 "language": "GDScript",
 "path": "res://addons/GifMaker/GifRectangle.gd"
 }, {
-"base": "Node",
-"class": "Main",
+"base": "CenterContainer",
+"class": "MenuOption",
 "language": "GDScript",
-"path": "res://main.gd"
+"path": "res://ui/main_menu/scripts/menu_option.gd"
 }, {
 "base": "Node2D",
 "class": "Snake",
 "language": "GDScript",
 "path": "res://entities/actors/snake/scripts/snake.gd"
-}, {
-"base": "CanvasLayer",
-"class": "UI",
-"language": "GDScript",
-"path": "res://ui/ui.gd"
 } ]
 _global_script_class_icons={
 "Food": "",
@@ -61,15 +56,14 @@ _global_script_class_icons={
 "GifDecoder": "",
 "GifRecorder": "res://addons/GifMaker/gif.svg",
 "GifRectangle": "res://addons/GifMaker/GifRectangle.svg",
-"Main": "",
-"Snake": "",
-"UI": ""
+"MenuOption": "",
+"Snake": ""
 }
 
 [application]
 
 config/name="GoGodotJam3"
-run/main_scene="res://Main.tscn"
+run/main_scene="res://ui/main_menu/scenes/MainMenu.tscn"
 config/icon="res://icons/game.png"
 
 [autoload]
@@ -108,6 +102,34 @@ texture={
 
 [input]
 
+ui_left={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_right={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_up={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_down={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
 move_left={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":65,"unicode":0,"echo":false,"script":null)
@@ -125,7 +147,7 @@ add_body_part={
 }
 restart={
 "deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":82,"unicode":0,"echo":false,"script":null)
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
  ]
 }
 
diff --git a/src/tools/world_generator/scripts/walker_head.gd b/src/tools/world_generator/scripts/walker_head.gd
index 3bf7e3a..dc71db1 100644
--- a/src/tools/world_generator/scripts/walker_head.gd
+++ b/src/tools/world_generator/scripts/walker_head.gd
@@ -2,8 +2,8 @@ extends Node2D
 
 export(NodePath) var TILEMAP_NP: NodePath
 export(PackedScene) var WALKER_UNIT_NP: PackedScene
-export(int, 5, 100, 1) var starting_unit_count: int = 5
-export(int, 5, 10, 1) var initial_safe_zone_size: int = 5
+export(int, 5, 100, 1) var STARTING_UNIT_COUNT: int = 5
+export(int, 3, 10, 1) var INITIAL_SAFE_ZONE_SIZE: int = 3
 
 onready var tilemap: TileMap = get_node(TILEMAP_NP)
 
@@ -24,14 +24,14 @@ func _ready() -> void:
 
 
 func _place_safe_zone() -> void:
-	for i in initial_safe_zone_size:
-		for j in initial_safe_zone_size:
+	var size: int = INITIAL_SAFE_ZONE_SIZE
+	for i in range(-size, size):
+		for j in range(-size, size):
 			tilemap.set_cell(i, j, Global.WORLD_TILE_PATH)
-			tilemap.set_cell(-i, -j, Global.WORLD_TILE_PATH)
 
 
 func _spawn_walker_units() -> void:
-	for i in starting_unit_count:
+	for i in STARTING_UNIT_COUNT:
 		_spawn_walker_unit(Vector2.ZERO)
 
 
diff --git a/src/ui/UI.tscn b/src/ui/UI.tscn
deleted file mode 100644
index 79d8f93..0000000
--- a/src/ui/UI.tscn
+++ /dev/null
@@ -1,58 +0,0 @@
-[gd_scene load_steps=5 format=2]
-
-[ext_resource path="res://ui/ui.gd" type="Script" id=1]
-[ext_resource path="res://ui/hud/progress_bars/sprites/grow_progress_icon.png" type="Texture" id=2]
-[ext_resource path="res://ui/hud/snake/scenes/SnakeHUD.tscn" type="PackedScene" id=3]
-[ext_resource path="res://ui/hud/progress_bars/scenes/GrowthProgress.tscn" type="PackedScene" id=4]
-
-[node name="UI" type="CanvasLayer"]
-script = ExtResource( 1 )
-
-[node name="Root" type="Control" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-
-[node name="StatsHUD" type="MarginContainer" parent="Root"]
-margin_left = 4.0
-margin_top = 4.0
-margin_right = 124.0
-margin_bottom = 44.0
-
-[node name="VBox" type="VBoxContainer" parent="Root/StatsHUD"]
-custom_constants/separation = 2
-
-[node name="SnakeHUD" parent="Root/StatsHUD/VBox" instance=ExtResource( 3 )]
-margin_right = 30.0
-margin_bottom = 8.0
-
-[node name="HBoxProgressBars" type="HBoxContainer" parent="Root/StatsHUD/VBox"]
-margin_top = 10.0
-margin_right = 30.0
-margin_bottom = 18.0
-custom_constants/separation = 2
-
-[node name="GrowthProgressIcon" type="TextureRect" parent="Root/StatsHUD/VBox/HBoxProgressBars"]
-margin_right = 8.0
-margin_bottom = 8.0
-texture = ExtResource( 2 )
-
-[node name="GrowthProgress" parent="Root/StatsHUD/VBox/HBoxProgressBars" instance=ExtResource( 4 )]
-margin_left = 10.0
-margin_right = 30.0
-margin_bottom = 8.0
-
-[node name="MarginContainer" type="MarginContainer" parent="Root"]
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_top = -20.0
-
-[node name="CenterContainer" type="CenterContainer" parent="Root/MarginContainer"]
-margin_right = 320.0
-margin_bottom = 20.0
-
-[node name="Start" type="Button" parent="Root/MarginContainer/CenterContainer"]
-margin_left = 139.0
-margin_right = 180.0
-margin_bottom = 20.0
-text = "Start"
diff --git a/src/ui/hud/HUD.tscn b/src/ui/hud/HUD.tscn
new file mode 100644
index 0000000..d30f7f5
--- /dev/null
+++ b/src/ui/hud/HUD.tscn
@@ -0,0 +1,42 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://ui/hud/progress_bars/sprites/grow_progress_icon.png" type="Texture" id=2]
+[ext_resource path="res://ui/hud/snake/scenes/SnakeHUD.tscn" type="PackedScene" id=3]
+[ext_resource path="res://ui/hud/progress_bars/scenes/GrowthProgress.tscn" type="PackedScene" id=4]
+
+[node name="HUD" type="MarginContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = 4.0
+margin_right = -4.0
+margin_bottom = -4.0
+
+[node name="StatsHUD" type="MarginContainer" parent="."]
+margin_right = 312.0
+margin_bottom = 172.0
+
+[node name="VBox" type="VBoxContainer" parent="StatsHUD"]
+margin_right = 312.0
+margin_bottom = 172.0
+custom_constants/separation = 2
+
+[node name="SnakeHUD" parent="StatsHUD/VBox" instance=ExtResource( 3 )]
+margin_right = 312.0
+margin_bottom = 8.0
+
+[node name="HBoxProgressBars" type="HBoxContainer" parent="StatsHUD/VBox"]
+margin_top = 10.0
+margin_right = 312.0
+margin_bottom = 18.0
+custom_constants/separation = 2
+
+[node name="GrowthProgressIcon" type="TextureRect" parent="StatsHUD/VBox/HBoxProgressBars"]
+margin_right = 8.0
+margin_bottom = 8.0
+texture = ExtResource( 2 )
+
+[node name="GrowthProgress" parent="StatsHUD/VBox/HBoxProgressBars" instance=ExtResource( 4 )]
+margin_left = 10.0
+margin_right = 30.0
+margin_bottom = 8.0
diff --git a/src/ui/main_menu/scenes/MainMenu.tscn b/src/ui/main_menu/scenes/MainMenu.tscn
new file mode 100644
index 0000000..249885e
--- /dev/null
+++ b/src/ui/main_menu/scenes/MainMenu.tscn
@@ -0,0 +1,66 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://ui/main_menu/scenes/MenuOption.tscn" type="PackedScene" id=1]
+[ext_resource path="res://fonts/monogram_extended.ttf" type="DynamicFontData" id=2]
+[ext_resource path="res://ui/main_menu/scripts/main_menu.gd" type="Script" id=3]
+
+[sub_resource type="DynamicFont" id=1]
+size = 64
+font_data = ExtResource( 2 )
+
+[node name="MainMenu" type="MarginContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 3 )
+START_OPTION_NP = NodePath("Center/VBox/Options/VBox/Start")
+SETTINGS_OPTION_NP = NodePath("Center/VBox/Options/VBox/Settings")
+EXIT_OPTION_NP = NodePath("Center/VBox/Options/VBox/Exit")
+
+[node name="Center" type="CenterContainer" parent="."]
+margin_right = 320.0
+margin_bottom = 180.0
+
+[node name="VBox" type="VBoxContainer" parent="Center"]
+margin_left = 64.0
+margin_top = 28.0
+margin_right = 256.0
+margin_bottom = 152.0
+custom_constants/separation = 16
+
+[node name="Title" type="CenterContainer" parent="Center/VBox"]
+margin_right = 192.0
+margin_bottom = 52.0
+
+[node name="Label" type="Label" parent="Center/VBox/Title"]
+margin_right = 192.0
+margin_bottom = 52.0
+custom_colors/font_color_shadow = Color( 0, 0, 0, 1 )
+custom_fonts/font = SubResource( 1 )
+text = "El Snake"
+
+[node name="Options" type="CenterContainer" parent="Center/VBox"]
+margin_top = 68.0
+margin_right = 192.0
+margin_bottom = 124.0
+
+[node name="VBox" type="VBoxContainer" parent="Center/VBox/Options"]
+margin_left = 56.0
+margin_right = 136.0
+margin_bottom = 56.0
+
+[node name="Start" parent="Center/VBox/Options/VBox" instance=ExtResource( 1 )]
+margin_right = 80.0
+label_text = "Start"
+selected = true
+
+[node name="Settings" parent="Center/VBox/Options/VBox" instance=ExtResource( 1 )]
+margin_top = 20.0
+margin_right = 80.0
+margin_bottom = 36.0
+label_text = "Settings"
+
+[node name="Exit" parent="Center/VBox/Options/VBox" instance=ExtResource( 1 )]
+margin_top = 40.0
+margin_right = 80.0
+margin_bottom = 56.0
+label_text = "Exit"
diff --git a/src/ui/main_menu/scenes/MenuOption.tscn b/src/ui/main_menu/scenes/MenuOption.tscn
new file mode 100644
index 0000000..d6bb05f
--- /dev/null
+++ b/src/ui/main_menu/scenes/MenuOption.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://fonts/MonogramExtended.tres" type="DynamicFont" id=2]
+[ext_resource path="res://ui/main_menu/scripts/menu_option.gd" type="Script" id=3]
+
+[node name="MenuOption" type="CenterContainer"]
+margin_right = 49.0
+margin_bottom = 16.0
+script = ExtResource( 3 )
+
+[node name="HBox" type="HBoxContainer" parent="."]
+margin_right = 80.0
+margin_bottom = 16.0
+
+[node name="Selector" type="TextureRect" parent="HBox"]
+margin_right = 16.0
+margin_bottom = 16.0
+rect_min_size = Vector2( 16, 16 )
+
+[node name="Label" type="Label" parent="HBox"]
+margin_left = 20.0
+margin_top = 1.0
+margin_right = 80.0
+margin_bottom = 14.0
+rect_min_size = Vector2( 60, 0 )
+custom_colors/font_color_shadow = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 2 )
diff --git a/src/ui/main_menu/scripts/main_menu.gd b/src/ui/main_menu/scripts/main_menu.gd
new file mode 100644
index 0000000..7077b68
--- /dev/null
+++ b/src/ui/main_menu/scripts/main_menu.gd
@@ -0,0 +1,81 @@
+extends MarginContainer
+
+export(NodePath) var START_OPTION_NP: NodePath
+export(NodePath) var SETTINGS_OPTION_NP: NodePath
+export(NodePath) var EXIT_OPTION_NP: NodePath
+
+onready var start_option: MenuOption = get_node(START_OPTION_NP)
+onready var settings_option: MenuOption = get_node(SETTINGS_OPTION_NP)
+onready var exit_option: MenuOption = get_node(EXIT_OPTION_NP)
+
+onready var main: Node2D = get_parent().get_parent()
+
+
+enum Option {
+	START,
+	SETTINGS,
+	EXIT
+}
+
+enum {
+	NEXT,
+	PREV
+}
+
+onready var options: Dictionary = {
+	Option.START: start_option,
+	Option.SETTINGS: settings_option,
+	Option.EXIT: exit_option
+}
+
+var current_selection: int = Option.START
+
+
+func _ready():
+	Event.connect("game_start", self, "_on_game_start")
+	start_option.type = Option.START
+	settings_option.type = Option.SETTINGS
+	exit_option.type = Option.EXIT
+
+
+func _input(event: InputEvent) -> void:
+	if event.is_action_pressed("ui_down"):
+		_menu_selection(NEXT)
+	elif event.is_action_pressed("ui_up"):
+		_menu_selection(PREV)
+
+
+	if event.is_action_pressed("ui_accept"):
+		match current_selection:
+			Option.START:
+				Event.emit_signal("game_start")
+			Option.SETTINGS:
+				print("Option TEST.")
+			Option.EXIT:
+				get_tree().quit()
+
+
+func _menu_selection(selection: int) -> void:
+	match selection:
+		NEXT:
+			current_selection += 1
+			if current_selection == Option.size():
+				current_selection = 0
+		PREV:
+			current_selection -= 1
+			if current_selection == -1:
+				current_selection = Option.size() - 1
+	_update_options()
+
+
+func _update_options() -> void:
+	for i in options:
+		if i == current_selection:
+			options[i].selected = true
+		else:
+			options[i].selected = false
+
+
+func _on_game_start() -> void:
+	print("game_start")
+	get_tree().change_scene_to(Global.GAME_NODE)
diff --git a/src/ui/main_menu/scripts/menu_option.gd b/src/ui/main_menu/scripts/menu_option.gd
new file mode 100644
index 0000000..58b4a50
--- /dev/null
+++ b/src/ui/main_menu/scripts/menu_option.gd
@@ -0,0 +1,35 @@
+class_name MenuOption
+extends CenterContainer
+
+export(String) var label_text: String
+export(bool) var selected: bool = false
+
+onready var label: Label = $HBox/Label
+onready var selector: TextureRect = $HBox/Selector
+var type: int
+
+var time_elapsed: float = 0.0
+var timer: float = 0.2
+var last_frame: int = 0
+var frames: Array = [preload("res://ui/main_menu/sprites/selector1.png"),
+					 preload("res://ui/main_menu/sprites/selector2.png"),
+					 preload("res://ui/main_menu/sprites/selector3.png"),
+					 preload("res://ui/main_menu/sprites/selector4.png"),
+					 preload("res://ui/main_menu/sprites/selector5.png")]
+
+
+func _ready():
+	label.text = label_text
+
+
+func _process(delta: float) -> void:
+	if selected:
+		if time_elapsed >= timer:
+			selector.texture = frames[last_frame]
+			last_frame += 1
+			if last_frame == frames.size() - 1:
+				last_frame = 0
+			time_elapsed = 0.0
+		time_elapsed += delta
+	else:
+		selector.texture = frames[4]
diff --git a/src/ui/main_menu/sprites/selector.png b/src/ui/main_menu/sprites/selector.png
new file mode 100644
index 0000000..48a5678
Binary files /dev/null and b/src/ui/main_menu/sprites/selector.png differ
diff --git a/src/ui/main_menu/sprites/selector.png.import b/src/ui/main_menu/sprites/selector.png.import
new file mode 100644
index 0000000..c327b8f
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector.png-bd5373564ca790ce40721086d248728a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector.png"
+dest_files=[ "res://.import/selector.png-bd5373564ca790ce40721086d248728a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/main_menu/sprites/selector1.png b/src/ui/main_menu/sprites/selector1.png
new file mode 100644
index 0000000..b516e93
Binary files /dev/null and b/src/ui/main_menu/sprites/selector1.png differ
diff --git a/src/ui/main_menu/sprites/selector1.png.import b/src/ui/main_menu/sprites/selector1.png.import
new file mode 100644
index 0000000..322198e
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector1.png-b6d09b162403970de2678bdb1de12abb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector1.png"
+dest_files=[ "res://.import/selector1.png-b6d09b162403970de2678bdb1de12abb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/main_menu/sprites/selector2.png b/src/ui/main_menu/sprites/selector2.png
new file mode 100644
index 0000000..93547db
Binary files /dev/null and b/src/ui/main_menu/sprites/selector2.png differ
diff --git a/src/ui/main_menu/sprites/selector2.png.import b/src/ui/main_menu/sprites/selector2.png.import
new file mode 100644
index 0000000..6bb6018
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector2.png-0419bb1259e0efa492a2ce8346b72d74.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector2.png"
+dest_files=[ "res://.import/selector2.png-0419bb1259e0efa492a2ce8346b72d74.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/main_menu/sprites/selector3.png b/src/ui/main_menu/sprites/selector3.png
new file mode 100644
index 0000000..0e468c2
Binary files /dev/null and b/src/ui/main_menu/sprites/selector3.png differ
diff --git a/src/ui/main_menu/sprites/selector3.png.import b/src/ui/main_menu/sprites/selector3.png.import
new file mode 100644
index 0000000..17be43b
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector3.png-e7eb1264fbb84184dcddc29017bcfac0.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector3.png"
+dest_files=[ "res://.import/selector3.png-e7eb1264fbb84184dcddc29017bcfac0.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/main_menu/sprites/selector4.png b/src/ui/main_menu/sprites/selector4.png
new file mode 100644
index 0000000..7d2ee70
Binary files /dev/null and b/src/ui/main_menu/sprites/selector4.png differ
diff --git a/src/ui/main_menu/sprites/selector4.png.import b/src/ui/main_menu/sprites/selector4.png.import
new file mode 100644
index 0000000..5cb135e
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector4.png-c3312c451267db277e5279e15c3e9dc2.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector4.png"
+dest_files=[ "res://.import/selector4.png-c3312c451267db277e5279e15c3e9dc2.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/main_menu/sprites/selector5.png b/src/ui/main_menu/sprites/selector5.png
new file mode 100644
index 0000000..5e4988e
Binary files /dev/null and b/src/ui/main_menu/sprites/selector5.png differ
diff --git a/src/ui/main_menu/sprites/selector5.png.import b/src/ui/main_menu/sprites/selector5.png.import
new file mode 100644
index 0000000..9282f51
--- /dev/null
+++ b/src/ui/main_menu/sprites/selector5.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/selector5.png-57a6bf00d882484ef5ce3c35f8ecea76.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/main_menu/sprites/selector5.png"
+dest_files=[ "res://.import/selector5.png-57a6bf00d882484ef5ce3c35f8ecea76.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/src/ui/ui.gd b/src/ui/ui.gd
deleted file mode 100644
index 1ceff2f..0000000
--- a/src/ui/ui.gd
+++ /dev/null
@@ -1,14 +0,0 @@
-class_name UI
-extends CanvasLayer
-
-onready var _start_button: Button = $Root/MarginContainer/CenterContainer/Start
-
-
-func _ready():
-	_start_button.connect("pressed", self, "_on_start_button_pressed")
-
-
-func _on_start_button_pressed() -> void:
-	_start_button.disabled = true
-	_start_button.visible = false
-	Event.emit_signal("game_start")
-- 
cgit v1.2.3-70-g09d2