summaryrefslogtreecommitdiff
path: root/addons/escoria-core/ui_library/menus
diff options
context:
space:
mode:
Diffstat (limited to 'addons/escoria-core/ui_library/menus')
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd11
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load/load_game.gd58
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load/load_game.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn44
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd7
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn35
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd14
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.tscn63
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_game.gd90
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_game.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn56
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd21
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.tscn71
-rw-r--r--addons/escoria-core/ui_library/menus/main_menu/main_menu.gd42
-rw-r--r--addons/escoria-core/ui_library/menus/main_menu/main_menu.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/main_menu/main_menu.tscn85
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/de.pngbin0 -> 2245 bytes
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/de.png.import40
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/en.pngbin0 -> 8760 bytes
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/en.png.import40
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/es.pngbin0 -> 5210 bytes
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/es.png.import40
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/fr.pngbin0 -> 1840 bytes
-rw-r--r--addons/escoria-core/ui_library/menus/options/flags/fr.png.import40
-rw-r--r--addons/escoria-core/ui_library/menus/options/options.gd190
-rw-r--r--addons/escoria-core/ui_library/menus/options/options.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/options/options.tscn136
-rw-r--r--addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd75
-rw-r--r--addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd.uid1
-rw-r--r--addons/escoria-core/ui_library/menus/pause_menu/pause_menu.tscn94
34 files changed, 1261 insertions, 0 deletions
diff --git a/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd b/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd
new file mode 100644
index 0000000..975076f
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd
@@ -0,0 +1,11 @@
+class_name SaveGamesSorter
+
+static func sort_by_date_descending(a, b):
+ if Time.get_unix_time_from_datetime_dict(a.date) > Time.get_unix_time_from_datetime_dict(b.date):
+ return true
+ return false
+
+static func sort_by_date_ascending(a, b):
+ if Time.get_unix_time_from_datetime_dict(a.date) < Time.get_unix_time_from_datetime_dict(b.date):
+ return true
+ return false
diff --git a/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd.uid b/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd.uid
new file mode 100644
index 0000000..429faf6
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/SaveGamesSorter.gd.uid
@@ -0,0 +1 @@
+uid://cx3y8rl2vtp8a
diff --git a/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd b/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd
new file mode 100644
index 0000000..c0919fc
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd
@@ -0,0 +1,58 @@
+# A container for loading from a save slot
+extends Control
+
+
+# Emitted when the back button is pressed
+signal back_button_pressed
+
+
+# The scene to display a slot
+@export var slot_ui_scene: PackedScene
+
+
+# Load the savegames when loaded
+func _ready():
+ refresh_savegames()
+
+
+# A slot was pressed. Load the game
+#
+# #### Parameters
+# - slot_id: The slot that was pressed
+func _on_slot_pressed(slot_id: int) -> void:
+ escoria.save_manager.load_game(slot_id)
+
+
+# The back button was pressed
+func _on_back_pressed():
+ back_button_pressed.emit()
+
+
+# Create the slots from the list of savegames
+func refresh_savegames():
+ # Clear all UI saves slots
+ for slot in $VBoxContainer/ScrollContainer/slots.get_children():
+ $VBoxContainer/ScrollContainer/slots.remove_child(slot)
+
+ # Get saves list
+ var saves_list = escoria.save_manager.get_saves_list()
+ if saves_list.values().is_empty():
+ return
+ var saves_array: Array = saves_list.values()
+ saves_array.sort_custom(Callable(SaveGamesSorter, "sort_by_date_descending"))
+
+ for save in saves_array:
+ var new_slot = slot_ui_scene.instantiate()
+ $VBoxContainer/ScrollContainer/slots.add_child(
+ new_slot
+ )
+
+ var datetime_string = "%02d/%02d/%02d %02d:%02d" % [
+ save.date["day"],
+ save.date["month"],
+ save.date["year"],
+ save.date["hour"],
+ save.date["minute"],
+ ]
+ new_slot.set_slot_name_date(save["name"], datetime_string)
+ new_slot.connect("pressed", Callable(self, "_on_slot_pressed").bind(int(save["slotnumber"])))
diff --git a/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd.uid b/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd.uid
new file mode 100644
index 0000000..1a2ed80
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load/load_game.gd.uid
@@ -0,0 +1 @@
+uid://yfabboc406rf
diff --git a/addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn b/addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn
new file mode 100644
index 0000000..58fbcf2
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn
@@ -0,0 +1,44 @@
+[gd_scene load_steps=3 format=3 uid="uid://j3wkbyhedkpr"]
+
+[ext_resource type="PackedScene" uid="uid://ciysuxd81qucn" path="res://addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn" id="2"]
+[ext_resource type="Script" uid="uid://yfabboc406rf" path="res://addons/escoria-core/ui_library/menus/load_save/load/load_game.gd" id="3"]
+
+[node name="load_game" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("3")
+slot_ui_scene = ExtResource("2")
+
+[node name="Panel" type="ColorRect" parent="."]
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color(0.270588, 0.270588, 0.270588, 1)
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 0
+anchor_left = 0.3
+anchor_top = 0.3
+anchor_right = 0.7
+anchor_bottom = 0.7
+offset_left = -55.5
+offset_right = 55.5
+
+[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="slots" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="back" type="Button" parent="VBoxContainer"]
+layout_mode = 2
+text = "OPTIONS_BACK"
+
+[connection signal="pressed" from="VBoxContainer/back" to="." method="_on_back_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd
new file mode 100644
index 0000000..9de5d90
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd
@@ -0,0 +1,7 @@
+extends Button
+
+
+func set_slot_name_date(p_name: String, p_date: String):
+ $VBoxContainer/slot_name.text = p_name
+ $VBoxContainer/date.text = p_date
+
diff --git a/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd.uid b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd.uid
new file mode 100644
index 0000000..f48bf6e
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd.uid
@@ -0,0 +1 @@
+uid://de0wab1dx7xfx
diff --git a/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn
new file mode 100644
index 0000000..79f3a74
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=2 format=3 uid="uid://ciysuxd81qucn"]
+
+[ext_resource type="Script" uid="uid://de0wab1dx7xfx" path="res://addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.gd" id="2"]
+
+[node name="slot" type="Button"]
+offset_right = 665.0
+offset_bottom = 86.0
+custom_minimum_size = Vector2(0, 100)
+size_flags_horizontal = 3
+script = ExtResource("2")
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+alignment = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="slot_name" type="Label" parent="VBoxContainer"]
+offset_top = 34.0
+offset_right = 665.0
+offset_bottom = 48.0
+text = "slot_name"
+align = 1
+
+[node name="date" type="Label" parent="VBoxContainer"]
+offset_top = 52.0
+offset_right = 665.0
+offset_bottom = 66.0
+text = "date"
+align = 1
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd
new file mode 100644
index 0000000..6d7e88f
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd
@@ -0,0 +1,14 @@
+extends Popup
+
+signal confirm_yes
+
+func _ready():
+ $MarginContainer/VBoxContainer/HBoxContainer/yes.grab_focus()
+
+func _on_no_pressed():
+ hide()
+
+
+func _on_yes_pressed():
+ confirm_yes.emit()
+ hide()
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd.uid b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd.uid
new file mode 100644
index 0000000..5662ea7
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd.uid
@@ -0,0 +1 @@
+uid://m1jk0vg7pdn2
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.tscn b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.tscn
new file mode 100644
index 0000000..e345f01
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.tscn
@@ -0,0 +1,63 @@
+[gd_scene load_steps=2 format=3 uid="uid://c4ldxsprk70gi"]
+
+[ext_resource type="Script" uid="uid://m1jk0vg7pdn2" path="res://addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.gd" id="2"]
+
+[node name="overwrite_confirm_popup" type="Popup"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource("2")
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme_override_constants/margin_right = 30
+theme_override_constants/margin_top = 30
+theme_override_constants/margin_left = 30
+theme_override_constants/margin_bottom = 30
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
+offset_left = 30.0
+offset_top = 423.0
+offset_right = 1250.0
+offset_bottom = 477.0
+size_flags_vertical = 4
+theme_override_constants/separation = 20
+
+[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"]
+offset_right = 1220.0
+offset_bottom = 14.0
+text = "CONFIRM_OVERWRITE"
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
+offset_top = 34.0
+offset_right = 1220.0
+offset_bottom = 54.0
+theme_override_constants/separation = 10
+alignment = 2
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="no" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"]
+offset_left = 1187.0
+offset_right = 1220.0
+offset_bottom = 20.0
+text = "NO"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="yes" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"]
+offset_left = 1144.0
+offset_right = 1177.0
+offset_bottom = 20.0
+text = "YES"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/no" to="." method="_on_no_pressed"]
+[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/yes" to="." method="_on_yes_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd b/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd
new file mode 100644
index 0000000..33bbb13
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd
@@ -0,0 +1,90 @@
+# A container for saving to a save slot
+extends Control
+
+# Emitted when the back button is pressed
+signal back_button_pressed
+
+
+# The scene to display a slot
+@export var slot_ui_scene: PackedScene
+
+
+# The slot that was pressed
+var _slot_pressed = null
+
+
+# Load the savegames when loaded
+func _ready():
+ refresh_savegames()
+
+
+# A slot was pressed, save the game
+func _on_slot_pressed(p_slot_n: int):
+ _slot_pressed = p_slot_n
+ if escoria.save_manager.save_game_exists(p_slot_n):
+ $overwrite_confirm_popup.popup_centered_ratio(.3)
+ else:
+ $save_name_popup.popup_centered_ratio(.3)
+
+
+# Create the slots from the list of savegames
+func refresh_savegames():
+ var _slots = $VBoxContainer/ScrollContainer/slots
+ for slot in _slots.get_children():
+ _slots.remove_child(slot)
+
+ var saves_list = escoria.save_manager.get_saves_list()
+
+ var datetime = Time.get_datetime_dict_from_system()
+ var datetime_string = "%02d/%02d/%02d %02d:%02d" % [
+ datetime["day"],
+ datetime["month"],
+ datetime["year"],
+ datetime["hour"],
+ datetime["minute"],
+ ]
+ var new_slot = slot_ui_scene.instantiate()
+ _slots.add_child(new_slot)
+ _slots.move_child(new_slot, 0)
+ new_slot.set_slot_name_date(tr("New save"), datetime_string)
+ new_slot.connect("pressed", Callable(self, "_on_slot_pressed").bind(saves_list.size()+1))
+
+ if saves_list.values().is_empty():
+ return
+ var saves_array: Array = saves_list.values()
+ saves_array.sort_custom(Callable(SaveGamesSorter, "sort_by_date_descending"))
+
+ for save in saves_array:
+ new_slot = slot_ui_scene.instantiate()
+ _slots.add_child(new_slot)
+
+ datetime_string = "%02d/%02d/%02d %02d:%02d" % [
+ save.date["day"],
+ save.date["month"],
+ save.date["year"],
+ save.date["hour"],
+ save.date["minute"],
+ ]
+
+ new_slot.set_slot_name_date(save["name"], datetime_string)
+ new_slot.connect("pressed", Callable(self, "_on_slot_pressed").bind(int(save["slotnumber"])))
+
+
+# The back button was pressed
+func _on_back_pressed():
+ back_button_pressed.emit()
+
+
+# The name for the save game was given, save the game.
+#
+# #### Parameters
+# - p_savename: The name of the savegame entered
+func _on_save_name_popup_savegame_name_ok(p_savename: String):
+ escoria.save_manager.save_game(_slot_pressed, p_savename)
+ refresh_savegames()
+ _slot_pressed = null
+
+
+# Overwriting the savegame was confirmed, show the save name popup
+func _on_overwrite_confirm_popup_confirm_yes():
+ $save_name_popup.popup_centered_ratio(.3)
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd.uid b/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd.uid
new file mode 100644
index 0000000..359837e
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_game.gd.uid
@@ -0,0 +1 @@
+uid://crpi3w8bdekpc
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn b/addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn
new file mode 100644
index 0000000..e9df2b4
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn
@@ -0,0 +1,56 @@
+[gd_scene load_steps=5 format=3 uid="uid://cj440t8pub603"]
+
+[ext_resource type="PackedScene" uid="uid://ciysuxd81qucn" path="res://addons/escoria-core/ui_library/menus/load_save/load_save_slot/load_save_slot.tscn" id="1"]
+[ext_resource type="Script" uid="uid://crpi3w8bdekpc" path="res://addons/escoria-core/ui_library/menus/load_save/save/save_game.gd" id="2"]
+[ext_resource type="PackedScene" uid="uid://coiqm0xcq8f8o" path="res://addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.tscn" id="4"]
+[ext_resource type="PackedScene" uid="uid://c4ldxsprk70gi" path="res://addons/escoria-core/ui_library/menus/load_save/save/overwrite_confirm_popup.tscn" id="5"]
+
+[node name="save_game" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("2")
+slot_ui_scene = ExtResource("1")
+
+[node name="Panel" type="ColorRect" parent="."]
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -1.0
+offset_bottom = -1.0
+color = Color(0.270588, 0.270588, 0.270588, 1)
+
+[node name="save_name_popup" parent="." instance=ExtResource("4")]
+size = Vector2i(209, 185)
+
+[node name="overwrite_confirm_popup" parent="." instance=ExtResource("5")]
+size = Vector2i(231, 134)
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 0
+anchor_left = 0.3
+anchor_top = 0.3
+anchor_right = 0.7
+anchor_bottom = 0.7
+offset_left = -55.5
+offset_right = 55.5
+
+[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="slots" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="back" type="Button" parent="VBoxContainer"]
+layout_mode = 2
+text = "OPTIONS_BACK"
+
+[connection signal="savegame_name_ok" from="save_name_popup" to="." method="_on_save_name_popup_savegame_name_ok"]
+[connection signal="confirm_yes" from="overwrite_confirm_popup" to="." method="_on_overwrite_confirm_popup_confirm_yes"]
+[connection signal="pressed" from="VBoxContainer/back" to="." method="_on_back_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd
new file mode 100644
index 0000000..b631ef2
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd
@@ -0,0 +1,21 @@
+extends Popup
+
+signal savegame_name_ok(savegame_name)
+signal savegame_cancel
+
+func _on_cancel_pressed():
+ savegame_cancel.emit()
+ hide()
+
+func _on_ok_pressed():
+ if not $MarginContainer/VBoxContainer/LineEdit.text.is_empty():
+ savegame_name_ok.emit($MarginContainer/VBoxContainer/LineEdit.text)
+ $MarginContainer/VBoxContainer/LineEdit.clear()
+ hide()
+
+func _input(event):
+ if event is InputEventKey:
+ if event.is_pressed() \
+ and event.keycode == KEY_ENTER \
+ or event.keycode == KEY_KP_ENTER:
+ _on_ok_pressed()
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd.uid b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd.uid
new file mode 100644
index 0000000..41128a4
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd.uid
@@ -0,0 +1 @@
+uid://blqbjhwtenth5
diff --git a/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.tscn b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.tscn
new file mode 100644
index 0000000..8d6fc57
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.tscn
@@ -0,0 +1,71 @@
+[gd_scene load_steps=2 format=3 uid="uid://coiqm0xcq8f8o"]
+
+[ext_resource type="Script" uid="uid://blqbjhwtenth5" path="res://addons/escoria-core/ui_library/menus/load_save/save/save_name_popup.gd" id="2"]
+
+[node name="save_name_popup" type="Popup"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource("2")
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme_override_constants/margin_right = 30
+theme_override_constants/margin_top = 30
+theme_override_constants/margin_left = 30
+theme_override_constants/margin_bottom = 30
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
+offset_left = 30.0
+offset_top = 401.0
+offset_right = 1250.0
+offset_bottom = 499.0
+size_flags_vertical = 4
+theme_override_constants/separation = 20
+
+[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"]
+offset_right = 1220.0
+offset_bottom = 14.0
+text = "ENTER_SAVE_NAME"
+
+[node name="LineEdit" type="LineEdit" parent="MarginContainer/VBoxContainer"]
+offset_top = 34.0
+offset_right = 1220.0
+offset_bottom = 58.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
+offset_top = 78.0
+offset_right = 1220.0
+offset_bottom = 98.0
+theme_override_constants/separation = 10
+alignment = 2
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="cancel" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"]
+offset_left = 1118.0
+offset_right = 1179.0
+offset_bottom = 20.0
+text = "CANCEL"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ok" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"]
+offset_left = 1189.0
+offset_right = 1220.0
+offset_bottom = 20.0
+text = "OK"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/cancel" to="." method="_on_cancel_pressed"]
+[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/ok" to="." method="_on_ok_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd b/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd
new file mode 100644
index 0000000..dac988b
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd
@@ -0,0 +1,42 @@
+# A simple main menu
+extends Control
+
+
+# Start the game
+func _on_new_game_pressed():
+ escoria.new_game()
+
+
+# Show the load slots
+func _on_load_game_pressed():
+ $main.hide()
+ $load_game.refresh_savegames()
+ $load_game.show()
+
+
+# Show the options panel
+func _on_options_pressed():
+ $main.hide()
+ $options.show()
+
+
+# Quit the game
+func _on_quit_pressed():
+ escoria.quit()
+
+
+# Hide the options panel again
+func _on_options_back_button_pressed():
+ reset()
+
+
+# Hide the load panel
+func _on_load_game_back_button_pressed():
+ reset()
+
+
+# Resets the UI to initial state
+func reset():
+ $load_game.hide()
+ $options.hide()
+ $main.show()
diff --git a/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd.uid b/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd.uid
new file mode 100644
index 0000000..467bea5
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/main_menu/main_menu.gd.uid
@@ -0,0 +1 @@
+uid://cfpa1dldiuvh8
diff --git a/addons/escoria-core/ui_library/menus/main_menu/main_menu.tscn b/addons/escoria-core/ui_library/menus/main_menu/main_menu.tscn
new file mode 100644
index 0000000..b259fa1
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/main_menu/main_menu.tscn
@@ -0,0 +1,85 @@
+[gd_scene load_steps=6 format=3 uid="uid://u8an5av5fuxx"]
+
+[ext_resource type="Script" uid="uid://cfpa1dldiuvh8" path="res://addons/escoria-core/ui_library/menus/main_menu/main_menu.gd" id="1"]
+[ext_resource type="Theme" uid="uid://b081yyinnj03t" path="res://addons/escoria-core/ui_library/theme.tres" id="2"]
+[ext_resource type="Texture2D" uid="uid://bwplh73qf2twk" path="res://addons/escoria-core/design/escoria-logo-small.png" id="3"]
+[ext_resource type="PackedScene" uid="uid://bhcfnds3yy2yv" path="res://addons/escoria-core/ui_library/menus/options/options.tscn" id="4"]
+[ext_resource type="PackedScene" uid="uid://j3wkbyhedkpr" path="res://addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn" id="5"]
+
+[node name="main_menu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("2")
+script = ExtResource("1")
+
+[node name="load_game" parent="." instance=ExtResource("5")]
+visible = false
+layout_mode = 1
+
+[node name="options" parent="." instance=ExtResource("4")]
+visible = false
+layout_mode = 1
+
+[node name="main" type="Control" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="ColorRect" type="ColorRect" parent="main"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0.270222, 0.270222, 0.270222, 1)
+
+[node name="main" type="VBoxContainer" parent="main"]
+layout_mode = 0
+anchor_left = 0.5
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -308.0
+offset_right = 308.0
+theme_override_constants/separation = 100
+alignment = 1
+
+[node name="TextureRect" type="TextureRect" parent="main/main"]
+layout_mode = 2
+texture = ExtResource("3")
+
+[node name="buttons" type="VBoxContainer" parent="main/main"]
+layout_mode = 2
+theme_override_constants/separation = 10
+
+[node name="new_game" type="Button" parent="main/main/buttons"]
+custom_minimum_size = Vector2(0, 150)
+layout_mode = 2
+size_flags_vertical = 3
+text = "NEW_GAME"
+
+[node name="load_game" type="Button" parent="main/main/buttons"]
+layout_mode = 2
+text = "LOAD_GAME"
+
+[node name="options" type="Button" parent="main/main/buttons"]
+layout_mode = 2
+text = "OPTIONS"
+
+[node name="quit" type="Button" parent="main/main/buttons"]
+layout_mode = 2
+text = "QUIT"
+
+[connection signal="back_button_pressed" from="load_game" to="." method="_on_load_game_back_button_pressed"]
+[connection signal="back_button_pressed" from="options" to="." method="_on_options_back_button_pressed"]
+[connection signal="pressed" from="main/main/buttons/new_game" to="." method="_on_new_game_pressed"]
+[connection signal="pressed" from="main/main/buttons/load_game" to="." method="_on_load_game_pressed"]
+[connection signal="pressed" from="main/main/buttons/options" to="." method="_on_options_pressed"]
+[connection signal="pressed" from="main/main/buttons/quit" to="." method="_on_quit_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/options/flags/de.png b/addons/escoria-core/ui_library/menus/options/flags/de.png
new file mode 100644
index 0000000..4fe98a8
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/de.png
Binary files differ
diff --git a/addons/escoria-core/ui_library/menus/options/flags/de.png.import b/addons/escoria-core/ui_library/menus/options/flags/de.png.import
new file mode 100644
index 0000000..f4b4dc8
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/de.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://r6b3dp6ipv5k"
+path="res://.godot/imported/de.png-eb10e96b44c694832a61fe6e6648faac.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/escoria-core/ui_library/menus/options/flags/de.png"
+dest_files=["res://.godot/imported/de.png-eb10e96b44c694832a61fe6e6648faac.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/addons/escoria-core/ui_library/menus/options/flags/en.png b/addons/escoria-core/ui_library/menus/options/flags/en.png
new file mode 100644
index 0000000..0589284
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/en.png
Binary files differ
diff --git a/addons/escoria-core/ui_library/menus/options/flags/en.png.import b/addons/escoria-core/ui_library/menus/options/flags/en.png.import
new file mode 100644
index 0000000..309ad2b
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/en.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cxuxfcyqd81c2"
+path="res://.godot/imported/en.png-e3d7ed70a1e59fdf7b47a2d8c96ff41f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/escoria-core/ui_library/menus/options/flags/en.png"
+dest_files=["res://.godot/imported/en.png-e3d7ed70a1e59fdf7b47a2d8c96ff41f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/addons/escoria-core/ui_library/menus/options/flags/es.png b/addons/escoria-core/ui_library/menus/options/flags/es.png
new file mode 100644
index 0000000..7178ce4
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/es.png
Binary files differ
diff --git a/addons/escoria-core/ui_library/menus/options/flags/es.png.import b/addons/escoria-core/ui_library/menus/options/flags/es.png.import
new file mode 100644
index 0000000..378230c
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/es.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdw1c55s4iaf4"
+path="res://.godot/imported/es.png-90c18482f305496440586f74957db9fb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/escoria-core/ui_library/menus/options/flags/es.png"
+dest_files=["res://.godot/imported/es.png-90c18482f305496440586f74957db9fb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/addons/escoria-core/ui_library/menus/options/flags/fr.png b/addons/escoria-core/ui_library/menus/options/flags/fr.png
new file mode 100644
index 0000000..fcaf2cc
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/fr.png
Binary files differ
diff --git a/addons/escoria-core/ui_library/menus/options/flags/fr.png.import b/addons/escoria-core/ui_library/menus/options/flags/fr.png.import
new file mode 100644
index 0000000..a279aa7
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/flags/fr.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dfixfxtbgelrb"
+path="res://.godot/imported/fr.png-6fb37573278571598430825ea325f0e3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/escoria-core/ui_library/menus/options/flags/fr.png"
+dest_files=["res://.godot/imported/fr.png-6fb37573278571598430825ea325f0e3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/addons/escoria-core/ui_library/menus/options/options.gd b/addons/escoria-core/ui_library/menus/options/options.gd
new file mode 100644
index 0000000..32a9758
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/options.gd
@@ -0,0 +1,190 @@
+# An options menu
+extends Control
+
+
+# The back button was pressed
+signal back_button_pressed
+
+
+# Custom setting key
+const CUSTOM_SETTING: String = "a_custom_setting"
+
+
+# The current settings
+var backup_settings
+
+
+# A list of languages already added to the language selection
+var _loaded_languages: Array = []
+
+
+# The settings changed
+@onready var changed = false
+
+
+# Initialize the flags
+func _ready() -> void:
+ var _flags_container: HBoxContainer = \
+ $VBoxContainer/MarginContainer/options/flags
+ for child in _flags_container.get_children():
+ _flags_container.remove_child(child)
+ child.queue_free()
+
+ _loaded_languages = []
+
+ for lang in TranslationServer.get_loaded_locales():
+ if not lang in _loaded_languages:
+ _loaded_languages.append(lang)
+ var _lang = TextureRect.new()
+ _lang.texture = load(
+ "res://addons/escoria-core/ui_library" + \
+ "/menus/options/flags/%s.png" % lang
+ )
+ _flags_container.add_child(_lang)
+ _lang.connect("gui_input", Callable(self, "_on_language_input").bind(lang))
+
+
+# Show the options
+func show():
+ backup_settings = escoria.settings_manager.get_settings()
+ initialize_options(backup_settings)
+ visible = true
+
+
+# Set the sliders to the values of the settings
+#
+# #### Parameters
+# - p_settings: The settings to use
+func initialize_options(p_settings):
+ var _options = $VBoxContainer/MarginContainer/options
+ _options.get_node("general_volume").value = p_settings["master_volume"]
+ _options.get_node("sound_volume").value = p_settings["sfx_volume"]
+ _options.get_node("music_volume").value = p_settings["music_volume"]
+ _options.get_node("speech_volume").value = p_settings["speech_volume"]
+ _options.get_node("ambient_volume").value = p_settings["ambient_volume"]
+ _options.get_node("fullscreen").set_pressed_no_signal(p_settings["fullscreen"])
+
+
+# The language was changed
+#
+# #### Parameters
+# - event: The input event from the flag
+# - language: The language to set
+func _on_language_input(event: InputEvent, language: String):
+ if event.is_pressed():
+ TranslationServer.set_locale(language)
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.TEXT_LANG,
+ language
+ )
+ changed = true
+
+
+# Sound volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_sound_volume_changed(value):
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.SFX_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.SFX_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+
+# Music volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_music_volume_changed(value):
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.MUSIC_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.MUSIC_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+
+# General volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_general_volume_changed(value):
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.MASTER_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.MASTER_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+
+# Speech volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_speech_volume_value_changed(value: float) -> void:
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.SPEECH_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.SPEECH_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+# Ambient volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_ambient_volume_value_changed(value: float) -> void:
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+
+# Fullscreen was changed
+#
+# #### Parameters
+# - button_pressed: Fullscreen (true) or windowed (false)
+func _on_fullscreen_toggled(button_pressed: bool) -> void:
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.FULLSCREEN
+ ) != button_pressed:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.FULLSCREEN,
+ button_pressed
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
+
+# Save the settings
+func _on_apply_pressed():
+ escoria.settings_manager.custom_settings[CUSTOM_SETTING] = 100
+ escoria.settings_manager.save_settings()
+ changed = false
+ back_button_pressed.emit()
+
+
+# The back button was pressed
+func _on_back_pressed():
+ escoria.settings_manager.save_settings_resource_to_project_settings(backup_settings)
+ escoria.settings_manager.apply_settings()
+ back_button_pressed.emit()
diff --git a/addons/escoria-core/ui_library/menus/options/options.gd.uid b/addons/escoria-core/ui_library/menus/options/options.gd.uid
new file mode 100644
index 0000000..b7bb93d
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/options.gd.uid
@@ -0,0 +1 @@
+uid://btyrwps5h2qn7
diff --git a/addons/escoria-core/ui_library/menus/options/options.tscn b/addons/escoria-core/ui_library/menus/options/options.tscn
new file mode 100644
index 0000000..133315c
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/options/options.tscn
@@ -0,0 +1,136 @@
+[gd_scene load_steps=3 format=3 uid="uid://bhcfnds3yy2yv"]
+
+[ext_resource type="Texture2D" uid="uid://r6b3dp6ipv5k" path="res://addons/escoria-core/ui_library/menus/options/flags/de.png" id="1"]
+[ext_resource type="Script" uid="uid://btyrwps5h2qn7" path="res://addons/escoria-core/ui_library/menus/options/options.gd" id="4"]
+
+[node name="options" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("4")
+
+[node name="Panel" type="ColorRect" parent="."]
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color(0.270588, 0.270588, 0.270588, 1)
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+alignment = 1
+
+[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 6
+theme_override_constants/margin_left = 20
+theme_override_constants/margin_top = 20
+theme_override_constants/margin_right = 20
+theme_override_constants/margin_bottom = 20
+
+[node name="options" type="GridContainer" parent="VBoxContainer/MarginContainer"]
+layout_mode = 2
+size_flags_vertical = 6
+theme_override_constants/h_separation = 40
+columns = 2
+
+[node name="label" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "OPTIONS_LANGUAGE"
+
+[node name="flags" type="HBoxContainer" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/separation = 30
+alignment = 1
+
+[node name="TextureRect2" type="TextureRect" parent="VBoxContainer/MarginContainer/options/flags"]
+layout_mode = 2
+texture = ExtResource("1")
+
+[node name="TextureRect3" type="TextureRect" parent="VBoxContainer/MarginContainer/options/flags"]
+layout_mode = 2
+texture = ExtResource("1")
+
+[node name="label2" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "GENERAL_VOLUME"
+
+[node name="general_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label3" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "SOUND_VOLUME"
+
+[node name="sound_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label4" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "MUSIC_VOLUME"
+
+[node name="music_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label5" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "SPEECH_VOLUME"
+
+[node name="speech_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label6" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "AMBIENT_VOLUME"
+
+[node name="ambient_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label7" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+text = "FULLSCREEN"
+
+[node name="fullscreen" type="CheckBox" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 20
+alignment = 1
+
+[node name="back" type="Button" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "OPTIONS_BACK"
+
+[node name="apply" type="Button" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "APPLY"
+
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/general_volume" to="." method="_on_general_volume_changed"]
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/sound_volume" to="." method="_on_sound_volume_changed"]
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/music_volume" to="." method="_on_music_volume_changed"]
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/speech_volume" to="." method="_on_speech_volume_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/ambient_volume" to="." method="_on_ambient_volume_value_changed"]
+[connection signal="toggled" from="VBoxContainer/MarginContainer/options/fullscreen" to="." method="_on_fullscreen_toggled"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/back" to="." method="_on_back_pressed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/apply" to="." method="_on_apply_pressed"]
diff --git a/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd
new file mode 100644
index 0000000..e4f9c66
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd
@@ -0,0 +1,75 @@
+# A menu shown in game
+extends Control
+
+
+# Make the pause menu process in pause mode and hide it just to be sure
+func _ready():
+ self.process_mode = Node.PROCESS_MODE_ALWAYS
+ hide()
+
+
+# Continue the game
+func _on_continue_pressed():
+ escoria.main.current_scene.game.unpause_game()
+
+
+# Show the save slots
+func _on_save_game_pressed():
+ $VBoxContainer.hide()
+ $save_game.refresh_savegames()
+ $save_game.show()
+
+
+# Show the load slots
+func _on_load_game_pressed():
+ $VBoxContainer.hide()
+ $load_game.refresh_savegames()
+ $load_game.show()
+
+
+# Show the options menu
+func _on_options_pressed():
+ $VBoxContainer.hide()
+ $options.show()
+
+
+# Quit the game
+func _on_quit_pressed():
+ escoria.quit()
+
+
+# Hide the save slots after clicking back button
+func _on_save_game_back_button_pressed():
+ reset()
+
+
+# Hide the load slots after clicking back button
+func _on_load_game_back_button_pressed():
+ reset()
+
+
+# Hide options menu after clicking back button
+func _on_options_back_button_pressed():
+ reset()
+
+
+# Set whether saving is enabled currently
+#
+# #### Parameters
+# - p_enabled: Enable or disable saving
+func set_save_enabled(p_enabled: bool):
+ $VBoxContainer/menuitems/save_game.disabled = !p_enabled
+
+
+# Resets the UI to initial state
+func reset():
+ $save_game.hide()
+ $load_game.hide()
+ $options.hide()
+ $VBoxContainer.show()
+
+
+func _on_new_game_pressed():
+ #yield(escoria.new_game(), "completed")
+ escoria.new_game()
+ escoria.main.current_scene.game.unpause_game()
diff --git a/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd.uid b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd.uid
new file mode 100644
index 0000000..3f8bafb
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd.uid
@@ -0,0 +1 @@
+uid://dvx5soxivafmw
diff --git a/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.tscn b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.tscn
new file mode 100644
index 0000000..954191d
--- /dev/null
+++ b/addons/escoria-core/ui_library/menus/pause_menu/pause_menu.tscn
@@ -0,0 +1,94 @@
+[gd_scene load_steps=7 format=3 uid="uid://gfjgmbcafyyt"]
+
+[ext_resource type="Script" uid="uid://dvx5soxivafmw" path="res://addons/escoria-core/ui_library/menus/pause_menu/pause_menu.gd" id="1"]
+[ext_resource type="PackedScene" uid="uid://bhcfnds3yy2yv" path="res://addons/escoria-core/ui_library/menus/options/options.tscn" id="2"]
+[ext_resource type="Texture2D" uid="uid://bwplh73qf2twk" path="res://addons/escoria-core/design/escoria-logo-small.png" id="3"]
+[ext_resource type="PackedScene" uid="uid://cj440t8pub603" path="res://addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn" id="4"]
+[ext_resource type="PackedScene" uid="uid://j3wkbyhedkpr" path="res://addons/escoria-core/ui_library/menus/load_save/load/load_game.tscn" id="5"]
+[ext_resource type="Theme" uid="uid://b081yyinnj03t" path="res://addons/escoria-core/ui_library/theme.tres" id="6"]
+
+[node name="pause_menu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1")
+
+[node name="Panel" type="ColorRect" parent="."]
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color(0.270588, 0.270588, 0.270588, 1)
+
+[node name="save_game" parent="." instance=ExtResource("4")]
+visible = false
+layout_mode = 1
+theme = ExtResource("6")
+
+[node name="load_game" parent="." instance=ExtResource("5")]
+visible = false
+layout_mode = 1
+
+[node name="options" parent="." instance=ExtResource("2")]
+visible = false
+layout_mode = 1
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 0
+anchor_left = 0.5
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -308.0
+offset_right = 308.0
+theme_override_constants/separation = 100
+alignment = 1
+
+[node name="TextureRect" type="TextureRect" parent="VBoxContainer"]
+layout_mode = 2
+texture = ExtResource("3")
+
+[node name="menuitems" type="VBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 10
+
+[node name="continue" type="Button" parent="VBoxContainer/menuitems"]
+custom_minimum_size = Vector2(0, 150)
+layout_mode = 2
+size_flags_vertical = 3
+text = "CONTINUE_GAME"
+
+[node name="new_game" type="Button" parent="VBoxContainer/menuitems"]
+layout_mode = 2
+size_flags_vertical = 3
+text = "NEW_GAME"
+
+[node name="save_game" type="Button" parent="VBoxContainer/menuitems"]
+layout_mode = 2
+size_flags_vertical = 3
+text = "SAVE_GAME"
+
+[node name="load_game" type="Button" parent="VBoxContainer/menuitems"]
+layout_mode = 2
+size_flags_vertical = 3
+text = "LOAD_GAME"
+
+[node name="options" type="Button" parent="VBoxContainer/menuitems"]
+layout_mode = 2
+text = "OPTIONS"
+
+[node name="quit" type="Button" parent="VBoxContainer/menuitems"]
+layout_mode = 2
+size_flags_vertical = 3
+text = "QUIT"
+
+[connection signal="back_button_pressed" from="save_game" to="." method="_on_save_game_back_button_pressed"]
+[connection signal="back_button_pressed" from="load_game" to="." method="_on_load_game_back_button_pressed"]
+[connection signal="back_button_pressed" from="options" to="." method="_on_options_back_button_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/continue" to="." method="_on_continue_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/new_game" to="." method="_on_new_game_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/save_game" to="." method="_on_save_game_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/load_game" to="." method="_on_load_game_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/options" to="." method="_on_options_pressed"]
+[connection signal="pressed" from="VBoxContainer/menuitems/quit" to="." method="_on_quit_pressed"]