RY}^xH8ZVDm#4F=f@n!Mq`11IQ_{!Lc
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
L5%VJEMYQjK#!N~U
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/fonts/minecraftia-regular.ttf.import b/addons/popochiu/engine/objects/gui/fonts/minecraftia-regular.ttf.import
new file mode 100644
index 0000000..aaf70b3
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/fonts/minecraftia-regular.ttf.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://dm6h44ck2nm2b"
+path="res://.godot/imported/minecraftia-regular.ttf-aa9f24486e1e8f742a673dd5ce961da5.fontdata"
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/fonts/minecraftia-regular.ttf"
+dest_files=["res://.godot/imported/minecraftia-regular.ttf-aa9f24486e1e8f742a673dd5ce961da5.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=1
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf b/addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1550897cc447426d50ee74e1fa58b5d12ce45c33
GIT binary patch
literal 32092
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
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf.import b/addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf.import
new file mode 100644
index 0000000..5a51156
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://dixh1egf7k2fb"
+path="res://.godot/imported/monkeyisland_1991.ttf-48b761f2bda7eabd2ec4c88e22b30ed5.fontdata"
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/fonts/monkeyisland_1991.ttf"
+dest_files=["res://.godot/imported/monkeyisland_1991.ttf-48b761f2bda7eabd2ec4c88e22b30ed5.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=0
+generate_mipmaps=true
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=1
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[{
+"chars": [],
+"glyphs": [],
+"name": "New Configuration",
+"size": Vector2i(16, 0),
+"variation_embolden": 0.0
+}]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/addons/popochiu/engine/objects/gui/popochiu_commands.gd b/addons/popochiu/engine/objects/gui/popochiu_commands.gd
new file mode 100644
index 0000000..df1b051
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/popochiu_commands.gd
@@ -0,0 +1,25 @@
+class_name PopochiuCommands
+extends RefCounted
+## Defines the commands that can be used by players to interact with the objects in the game.
+
+
+#region Godot ######################################################################################
+func _init() -> void:
+ PopochiuUtils.e.register_command(-1, "", fallback)
+
+
+#endregion
+
+#region Public #####################################################################################
+## Should return the name of this class, or the identifier you want to use in scripts to know the
+## type of the current GUI commands.
+static func get_script_name() -> String:
+ return "PopochiuCommands"
+
+
+## Called by [Popochiu] when a command doesn't have an associated [Callable].
+func fallback() -> void:
+ PopochiuUtils.print_normal("[rainbow]The default Popochiu command fallback[/rainbow]")
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/popochiu_commands.gd.uid b/addons/popochiu/engine/objects/gui/popochiu_commands.gd.uid
new file mode 100644
index 0000000..d2c8b8b
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/popochiu_commands.gd.uid
@@ -0,0 +1 @@
+uid://ciipu5ylfyi6c
diff --git a/addons/popochiu/engine/objects/gui/popochiu_gui.gd b/addons/popochiu/engine/objects/gui/popochiu_gui.gd
new file mode 100644
index 0000000..04f09b7
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/popochiu_gui.gd
@@ -0,0 +1,202 @@
+class_name PopochiuGraphicInterface
+extends Control
+## Handles the in-game Graphic Interface.
+##
+## You can extend this class to create your own GUI, or use one of the built-in templates for:
+## 2-click context-sensitive, 9 verbs and Sierra style.
+
+## Stack of opened popups.
+var popups_stack := []
+## Whether a dialog line is being displayed.
+var is_showing_dialog_line := false
+
+var _components_map := {}
+
+
+#region Godot ######################################################################################
+func _ready():
+ for node: Control in (
+ get_tree().get_nodes_in_group("popochiu_gui_component")
+ + get_tree().get_nodes_in_group("popochiu_gui_popup")
+ ):
+ _components_map[node.name] = node
+
+ # Connect to singleton signals
+ PopochiuUtils.g.blocked.connect(_on_blocked)
+ PopochiuUtils.g.unblocked.connect(_on_unblocked)
+ PopochiuUtils.g.hidden.connect(on_hidden)
+ PopochiuUtils.g.shown.connect(on_shown)
+ PopochiuUtils.g.system_text_shown.connect(_on_system_text_shown)
+ PopochiuUtils.g.system_text_hidden.connect(_on_system_text_hidden)
+ PopochiuUtils.g.mouse_entered_clickable.connect(_on_mouse_entered_clickable)
+ PopochiuUtils.g.mouse_exited_clickable.connect(_on_mouse_exited_clickable)
+ PopochiuUtils.g.mouse_entered_inventory_item.connect(_on_mouse_entered_inventory_item)
+ PopochiuUtils.g.mouse_exited_inventory_item.connect(_on_mouse_exited_inventory_item)
+ PopochiuUtils.g.dialog_line_started.connect(_on_dialog_line_started)
+ PopochiuUtils.g.dialog_line_finished.connect(_on_dialog_line_finished)
+ PopochiuUtils.d.dialog_started.connect(_on_dialog_started)
+ PopochiuUtils.g.dialog_options_shown.connect(_on_dialog_options_shown)
+ PopochiuUtils.d.dialog_finished.connect(_on_dialog_finished)
+ PopochiuUtils.i.item_selected.connect(_on_inventory_item_selected)
+ PopochiuUtils.e.game_saved.connect(_on_game_saved)
+ PopochiuUtils.e.game_loaded.connect(_on_game_loaded)
+
+ if PopochiuUtils.e.settings.is_pixel_art_game:
+ # Apply this filter so the font doesn't blur
+ texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
+
+ if PopochiuUtils.e.settings.scale_gui:
+ size = get_viewport_rect().size / PopochiuUtils.e.scale
+ scale = PopochiuUtils.e.scale
+
+ # Adjust nodes with a "text" property that is a String in order to try to prevent glitches
+ # when rendering its font
+ _adjust_nodes_text(get_children())
+
+
+#endregion
+
+#region Virtual ####################################################################################
+## Called when the GUI is blocked and not intended to handle input events.
+func _on_blocked(props := { blocking = true }) -> void:
+ pass
+
+
+## Called when the GUI is unblocked and can handle input events again.
+func _on_unblocked() -> void:
+ pass
+
+
+## Called when the GUI is hidden.
+func _on_hidden() -> void:
+ pass
+
+
+## Called when the GUI is shown.
+func _on_shown() -> void:
+ pass
+
+
+## Called when [method G.show_system_text] is executed. Shows [param msg] in the [SystemText]
+## component.
+func _on_system_text_shown(msg: String) -> void:
+ pass
+
+
+## Called once the player closes the [SystemText] component by default when clicking anywhere on the
+## screen.
+func _on_system_text_hidden() -> void:
+ pass
+
+
+## Called when the mouse enters (hovers) [param clickable].
+func _on_mouse_entered_clickable(clickable: PopochiuClickable) -> void:
+ pass
+
+
+## Called when the mouse exits [param clickable].
+func _on_mouse_exited_clickable(clickable: PopochiuClickable) -> void:
+ pass
+
+
+## Called when the mouse enters (hovers) [param inventory_item].
+func _on_mouse_entered_inventory_item(inventory_item: PopochiuInventoryItem) -> void:
+ pass
+
+
+## Called when the mouse exits [param inventory_item].
+func _on_mouse_exited_inventory_item(inventory_item: PopochiuInventoryItem) -> void:
+ pass
+
+
+## Called when a dialog line is said by a [PopochiuCharacter] (this is when
+## [method PopochiuCharacter.say] is called.
+func _on_dialog_line_started() -> void:
+ pass
+
+
+## Called when a dialog line said by a [PopochiuCharacter] finishes (this is after players click the
+## screen anywhere to make the dialog line disappear).
+func _on_dialog_line_finished() -> void:
+ pass
+
+
+## Called when [param dialog] starts (this is after calling [method PopochiuDialog.start]).
+func _on_dialog_started(dialog: PopochiuDialog) -> void:
+ pass
+
+
+## Called when the running [PopochiuDialog] shows its options on screen.
+func _on_dialog_options_shown() -> void:
+ pass
+
+
+## Called when [param dialog] finishes (this is afet calling [method PopochiuDialog.stop]).
+func _on_dialog_finished(dialog: PopochiuDialog) -> void:
+ pass
+
+
+## Called when [param item] is selected in the inventory (i.e. by clicking it).
+func _on_inventory_item_selected(item: PopochiuInventoryItem) -> void:
+ pass
+
+
+## Called when the game is saved. By default, it shows [code]Game saved[/code] in the SystemText
+## component.
+func _on_game_saved() -> void:
+ pass
+
+
+## Called when a game is loaded. [param loaded_game] has the loaded data. By default, this emits
+## the [signal G.load_feedback_finished] signal.
+func _on_game_loaded(loaded_game: Dictionary) -> void:
+ PopochiuUtils.g.load_feedback_finished.emit()
+
+
+## Called by [b]cursor.gd[/b] to get the name of the cursor texture to show.
+func _get_cursor_name() -> String:
+ return ""
+
+
+#endregion
+
+#region Public #####################################################################################
+## Returns the GUI component which [member Node.name] matches [param component_name].
+## GUI components are those nodes that are in any of this groups:
+## [code]popochiu_gui_component[/code] and [code]popochiu_gui_popup[/code].
+func get_component(component_name: String) -> Control:
+ if _components_map.has(component_name):
+ return _components_map[component_name]
+ else:
+ PopochiuUtils.print_warning("No GUI component with name %s" % component_name)
+
+ return null
+
+
+## Returns the name of the cursor texture to show. [code]"normal"[/code] is returned by default.
+func get_cursor_name() -> String:
+ return "normal" if _get_cursor_name().is_empty() else _get_cursor_name()
+
+
+func on_hidden() -> void:
+ hide()
+ _on_hidden()
+
+
+func on_shown() -> void:
+ show()
+ _on_shown()
+
+
+#endregion
+
+#region Private ####################################################################################
+func _adjust_nodes_text(nodes_array: Array) -> void:
+ for node: Node in nodes_array:
+ _adjust_nodes_text(node.get_children())
+ if not node.get("text") or not typeof(node.get("text")) == TYPE_STRING: continue
+ if node.text.length() % 2 != 0:
+ node.text += " "
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/popochiu_gui.gd.uid b/addons/popochiu/engine/objects/gui/popochiu_gui.gd.uid
new file mode 100644
index 0000000..11c0a6d
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/popochiu_gui.gd.uid
@@ -0,0 +1 @@
+uid://dvtw5lqfyk7e
diff --git a/addons/popochiu/engine/objects/gui/popochiu_gui.tscn b/addons/popochiu/engine/objects/gui/popochiu_gui.tscn
new file mode 100644
index 0000000..670a793
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/popochiu_gui.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=3 format=3 uid="uid://k35rpa45ngms"]
+
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/popochiu_gui.gd" id="1"]
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_lylgs"]
+
+[node name="GraphicInterface" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_lylgs")
+script = ExtResource("1")
diff --git a/addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres b/addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres
new file mode 100644
index 0000000..1912582
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres
@@ -0,0 +1,88 @@
+[gd_resource type="Theme" load_steps=20 format=3 uid="uid://dpequqav4rjaf"]
+
+[ext_resource type="Texture2D" uid="uid://pl1ch71kfj72" path="res://addons/popochiu/engine/objects/gui/resources/images/check_button_checked.png" id="2_ldprq"]
+[ext_resource type="Texture2D" uid="uid://dukr75slqli45" path="res://addons/popochiu/engine/objects/gui/resources/images/check_button_unchecked.png" id="3_3rprc"]
+[ext_resource type="Texture2D" uid="uid://cqxqfxobqltga" path="res://addons/popochiu/engine/objects/gui/resources/images/grabber.png" id="4_4x0ix"]
+[ext_resource type="Texture2D" uid="uid://d1ywqbehmtuv" path="res://addons/popochiu/engine/objects/gui/resources/images/down_arrow.png" id="5_jwcnu"]
+[ext_resource type="FontFile" uid="uid://dm6h44ck2nm2b" path="res://addons/popochiu/engine/objects/gui/fonts/minecraftia-regular.ttf" id="6_gx6k1"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jar7r"]
+content_margin_left = 2.0
+content_margin_top = 0.0
+content_margin_right = 2.0
+content_margin_bottom = 0.0
+bg_color = Color(0, 0, 0, 0.705882)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jts3x"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_d2wsf"]
+content_margin_left = 2.0
+content_margin_top = 0.0
+content_margin_right = 2.0
+content_margin_bottom = 0.0
+bg_color = Color(0, 0, 0, 0.705882)
+
+[sub_resource type="StyleBoxFlat" id="7"]
+content_margin_left = 2.0
+content_margin_top = 0.0
+content_margin_right = 2.0
+content_margin_bottom = 0.0
+bg_color = Color(0, 0, 0, 0.705882)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3mrlf"]
+content_margin_left = 2.0
+content_margin_top = 0.0
+content_margin_right = 2.0
+content_margin_bottom = 0.0
+bg_color = Color(0, 0, 0, 0.705882)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_aa7jm"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tv3kj"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0prrl"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3tq14"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_l3jvo"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pr0tq"]
+bg_color = Color(0.698039, 0.698039, 0.698039, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mp7ca"]
+bg_color = Color(1, 1, 1, 1)
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_1vxxo"]
+thickness = 4
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_d8gde"]
+bg_color = Color(0, 0, 0, 0.705882)
+
+[resource]
+default_font = ExtResource("6_gx6k1")
+default_font_size = 8
+Button/colors/font_color = Color(1, 1, 1, 1)
+Button/colors/font_disabled_color = Color(0.482353, 0.482353, 0.482353, 1)
+Button/colors/font_focus_color = Color(0.305882, 0.305882, 0.862745, 1)
+Button/colors/font_hover_color = Color(0.952941, 0.952941, 0.0627451, 1)
+Button/colors/font_hover_pressed_color = Color(0.901961, 0.337255, 0.901961, 1)
+Button/colors/font_pressed_color = Color(0.305882, 0.952941, 0.952941, 1)
+Button/styles/disabled = SubResource("StyleBoxFlat_jar7r")
+Button/styles/focus = SubResource("StyleBoxEmpty_jts3x")
+Button/styles/hover = SubResource("StyleBoxFlat_d2wsf")
+Button/styles/normal = SubResource("7")
+Button/styles/pressed = SubResource("StyleBoxFlat_3mrlf")
+CheckButton/icons/checked = ExtResource("2_ldprq")
+CheckButton/icons/unchecked = ExtResource("3_3rprc")
+CheckButton/styles/disabled = SubResource("StyleBoxEmpty_aa7jm")
+CheckButton/styles/hover = SubResource("StyleBoxEmpty_tv3kj")
+CheckButton/styles/hover_pressed = SubResource("StyleBoxEmpty_0prrl")
+CheckButton/styles/normal = SubResource("StyleBoxEmpty_3tq14")
+CheckButton/styles/pressed = SubResource("StyleBoxEmpty_l3jvo")
+HSlider/icons/grabber = ExtResource("4_4x0ix")
+HSlider/icons/grabber_highlight = ExtResource("4_4x0ix")
+HSlider/styles/grabber_area = SubResource("StyleBoxFlat_pr0tq")
+HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_mp7ca")
+HSlider/styles/slider = SubResource("StyleBoxLine_1vxxo")
+OptionButton/icons/arrow = ExtResource("5_jwcnu")
+PanelContainer/styles/panel = SubResource("StyleBoxFlat_d8gde")
diff --git a/addons/popochiu/engine/objects/gui/resources/images/check_button_checked.png b/addons/popochiu/engine/objects/gui/resources/images/check_button_checked.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a998315a856711054a8dca10b137720f4d3fe63
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^QXn=58<5;Sv+gaBVk{1FcVbv~PUa<$lkDl@7-G?z
z{N?wbpZ3hQ47NI-KrC+6S)GB~JEu>d*a!rjG2I^|d5mQw1MVutG^`R!{LFb(=a5*)
zjYs`ic88uzuZn1SR~55zqL!VK+RDju`#rYy
Zn7B=FOGQ?gPzW@O1TaS?83{1OUsSFI@lt
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/resources/images/check_button_unchecked.png.import b/addons/popochiu/engine/objects/gui/resources/images/check_button_unchecked.png.import
new file mode 100644
index 0000000..b22554c
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/resources/images/check_button_unchecked.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dukr75slqli45"
+path="res://.godot/imported/check_button_unchecked.png-508dc4a98bf3c725d8ee671c42614a03.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/resources/images/check_button_unchecked.png"
+dest_files=["res://.godot/imported/check_button_unchecked.png-508dc4a98bf3c725d8ee671c42614a03.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/addons/popochiu/engine/objects/gui/resources/images/close.png b/addons/popochiu/engine/objects/gui/resources/images/close.png
new file mode 100644
index 0000000000000000000000000000000000000000..6828aae1e41c4ce80f8aee54442b4faaa4c4cd28
GIT binary patch
literal 128
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|tUO&DLnNjq
zCjh~Ze}CWCvzagmC%a60@+2kA<$8l+1CNE}Oi9U$y)NdxoU{E>9Byzq^&QEw-z32h
Yny1|||K#$=KvNhzUHx3vIVCg!0E=rV5C8xG
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/resources/images/close.png.import b/addons/popochiu/engine/objects/gui/resources/images/close.png.import
new file mode 100644
index 0000000..1fb999b
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/resources/images/close.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cmxrewai8t2lm"
+path="res://.godot/imported/close.png-71bc9d1ae7defb5a6b696b588c6e3643.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/resources/images/close.png"
+dest_files=["res://.godot/imported/close.png-71bc9d1ae7defb5a6b696b588c6e3643.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/addons/popochiu/engine/objects/gui/resources/images/close_highlight.png b/addons/popochiu/engine/objects/gui/resources/images/close_highlight.png
new file mode 100644
index 0000000000000000000000000000000000000000..5229eb4d3461ea4b254b3b7030c2137da4e91f4a
GIT binary patch
literal 128
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|tUO&DLnNjq
zCjh~ZKamgYnWY*!4VAnqkzWJaYnwJA4Iq$+Y>tklHBOa<$T+bw^H`3!iOFmjn<@xN7)t
v(gF3phc+dwH+T-cQlH@zV`j|vPK1%+Ly87dL$=m`pz#czu6{1-oD!M{?d8P5O!
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/resources/images/grabber.png.import b/addons/popochiu/engine/objects/gui/resources/images/grabber.png.import
new file mode 100644
index 0000000..2342319
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/resources/images/grabber.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cqxqfxobqltga"
+path="res://.godot/imported/grabber.png-270b67486fc72a76c07b8638f890e164.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/resources/images/grabber.png"
+dest_files=["res://.godot/imported/grabber.png-270b67486fc72a76c07b8638f890e164.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/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd
new file mode 100644
index 0000000..f149c52
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd
@@ -0,0 +1,166 @@
+class_name NineVerbCommands
+extends PopochiuCommands
+## Defines the commands and fallback methods for the 9 Verbs GUI.
+##
+## In this GUI, players can use one of four commands to interact with objects: Walk, Open, Pick up,
+## Push, Close, Look at, Pull, Give, Talk to, and Use. This behavior is based on games like The
+## Secret of Monkey Island, Day of the Tentacle and Thimbleweed Park.
+
+enum Commands { ## Defines the commands of the GUI.
+ WALK_TO, ## Used when players want to make the PC to walk.
+ OPEN, ## Used when players want to make the PC to open an object.
+ PICK_UP, ## Used when players want to make the PC to pick up an object.
+ PUSH, ## Used when players want to make the PC to push an object.
+ CLOSE, ## Used when players want to make the PC to close an object.
+ LOOK_AT, ## Used when players want to make the PC to look an object.
+ PULL, ## Used when players want to make the PC to pull an object.
+ GIVE, ## Used when players want to make the PC to give an object.
+ TALK_TO, ## Used when players want to make the PC to talk to an object.
+ USE ## Used when players want to make the PC to use an object.
+}
+
+
+#region Godot ######################################################################################
+func _init() -> void:
+ super()
+
+ PopochiuUtils.e.register_command(Commands.WALK_TO, "Walk to", walk_to)
+ PopochiuUtils.e.register_command(Commands.OPEN, "Open", open)
+ PopochiuUtils.e.register_command(Commands.PICK_UP, "Pick up", pick_up)
+ PopochiuUtils.e.register_command(Commands.PUSH, "Push", push)
+ PopochiuUtils.e.register_command(Commands.CLOSE, "Close", close)
+ PopochiuUtils.e.register_command(Commands.LOOK_AT, "Look at", look_at)
+ PopochiuUtils.e.register_command(Commands.PULL, "Pull", pull)
+ PopochiuUtils.e.register_command(Commands.GIVE, "Give", give)
+ PopochiuUtils.e.register_command(Commands.TALK_TO, "Talk to", talk_to)
+ PopochiuUtils.e.register_command(Commands.USE, "Use", use)
+
+
+#endregion
+
+#region Public #####################################################################################
+static func get_script_name() -> String:
+ return "NineVerbCommands"
+
+
+## Called by [Popochiu] when a command doesn't have an associated [Callable]. By default this calls
+## [method walk_to].
+func fallback() -> void:
+ walk_to()
+
+
+## Called when [code]E.current_command == Commands.WALK_TO[/code] and
+## [code]E.command_fallback()[/code] is triggered.[br][br]
+## By default makes the character walk to the clicked [code]PopochiuClickable[/code].
+func walk_to() -> void:
+ if PopochiuUtils.i.active:
+ PopochiuUtils.i.active = null
+ return
+
+ PopochiuUtils.c.player.walk_to_clicked()
+
+ await PopochiuUtils.c.player.move_ended
+
+ if (
+ PopochiuUtils.e.clicked and PopochiuUtils.e.clicked.get("suggested_command")
+ and PopochiuUtils.e.clicked.last_click_button == MOUSE_BUTTON_RIGHT
+ ):
+ PopochiuUtils.e.current_command = PopochiuUtils.e.clicked.suggested_command
+ PopochiuUtils.e.clicked.handle_command(MOUSE_BUTTON_LEFT)
+
+
+## Called when [code]E.current_command == Commands.OPEN[/code] and [code]E.command_fallback()[/code]
+## is triggered.
+func open() -> void:
+ await PopochiuUtils.c.player.say("Can't open that")
+
+
+## Called when [code]E.current_command == Commands.PICK_UP[/code] and
+## [code]E.command_fallback()[/code] is triggered.
+func pick_up() -> void:
+ await PopochiuUtils.c.player.say("Not picking that up")
+
+
+## Called when [code]E.current_command == Commands.PUSH[/code] and [code]E.command_fallback()[/code]
+## is triggered.
+func push() -> void:
+ await PopochiuUtils.c.player.say("I don't want to push that")
+
+
+## Called when [code]E.current_command == Commands.CLOSE[/code] and
+## [code]E.command_fallback()[/code] is triggered.
+func close() -> void:
+ await PopochiuUtils.c.player.say("Can't close that")
+
+
+## Called when [code]E.current_command == Commands.LOOK_AT[/code] and
+## [code]E.command_fallback()[/code] is triggered.
+func look_at() -> void:
+ if PopochiuUtils.e.clicked:
+ await PopochiuUtils.c.player.face_clicked()
+
+ await PopochiuUtils.c.player.say("I have nothing to say about that")
+
+
+## Called when [code]E.current_command == Commands.PULL[/code] and [code]E.command_fallback()[/code]
+## is triggered.
+func pull() -> void:
+ await PopochiuUtils.c.player.say("I don't want to pull that")
+
+
+## Called when [code]E.current_command == Commands.GIVE[/code] and [code]E.command_fallback()[/code]
+## is triggered.
+func give() -> void:
+ await _give_or_use(give_item_to)
+
+
+## Called when [code]E.current_command == Commands.USE[/code] and [code]E.command_fallback()[/code]
+## is triggered.
+func use() -> void:
+ await _give_or_use(use_item_on)
+
+
+func _give_or_use(callback: Callable) -> void:
+ if PopochiuUtils.i.active and PopochiuUtils.e.clicked:
+ callback.call(PopochiuUtils.i.active, PopochiuUtils.e.clicked)
+ elif (
+ PopochiuUtils.i.active
+ and PopochiuUtils.i.clicked
+ and PopochiuUtils.i.active != PopochiuUtils.i.clicked
+ ):
+ callback.call(PopochiuUtils.i.active, PopochiuUtils.i.clicked)
+ elif PopochiuUtils.i.clicked:
+ match PopochiuUtils.i.clicked.last_click_button:
+ MOUSE_BUTTON_LEFT:
+ PopochiuUtils.i.clicked.set_active(true)
+ MOUSE_BUTTON_RIGHT:
+ # TODO: I'm not sure this is the right way to do this. Maybe GUIs should capture
+ # click inputs on clickables and inventory items. ----------------------------
+ PopochiuUtils.e.current_command = (
+ PopochiuUtils.i.clicked.suggested_command
+ if PopochiuUtils.i.clicked.get("suggested_command")
+ else Commands.LOOK_AT
+ )
+
+ PopochiuUtils.i.clicked.handle_command(MOUSE_BUTTON_LEFT)
+ # ----------------------------------------------------------------------------------
+ else:
+ await PopochiuUtils.c.player.say("What?")
+
+
+## Called when [code]E.current_command == Commands.TALK_TO[/code] and
+## [code]E.command_fallback()[/code] is triggered.
+func talk_to() -> void:
+ await PopochiuUtils.c.player.say("Emmmm...")
+
+
+func use_item_on(_item: PopochiuInventoryItem, _target: Node) -> void:
+ PopochiuUtils.i.active = null
+ await PopochiuUtils.c.player.say("I don't want to do that")
+
+
+func give_item_to(_item: PopochiuInventoryItem, _target: Node) -> void:
+ PopochiuUtils.i.active = null
+ await PopochiuUtils.c.player.say("I don't want to do that")
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd.uid
new file mode 100644
index 0000000..9d59616
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_commands.gd.uid
@@ -0,0 +1 @@
+uid://dbik5fn44wljc
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd
new file mode 100644
index 0000000..fe5f25c
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd
@@ -0,0 +1,258 @@
+class_name NineVerbGUI
+extends PopochiuGraphicInterface
+## Defines the behavior of the 9 Verbs GUI.
+##
+## In this GUI players interact with objects based on the active command, which can be changed by
+## clicking one of the nine buttons in the bottom panel. The inventory is always visible in the
+## bottom right corner of the screen, and the settings popup can be opened using the button in the
+## top right corner of the screen.
+
+signal settings_requested
+
+# Used to go back to the WALK_TO command when hovering an inventory item without a verb selected
+var _return_to_walk_to := false
+
+## Used to access the [b]9VerbPanel[/b] component (the one at the bottom containing the verbs,
+## the inventory, and the button to open the [b]9VerbSettingsPopup[/b].
+@onready var _9_verb_panel: Control = %"9VerbPanel"
+@onready var hover_text_cursor: Control = %HoverTextCursor
+## Used to access the [b]9VerbSettingsPopup[/b] node.
+@onready var settings_popup: Control = %"9VerbSettingsPopup"
+@onready var save_and_load_popup: Control = %SaveAndLoadPopup
+@onready var history_popup: Control = %HistoryPopup
+## Used to access the [b]9VerbQuitPopup[/b] node.
+@onready var quit_popup: Control = %"9VerbQuitPopup"
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ super()
+
+ PopochiuUtils.cursor.replace_frames($Cursor)
+ PopochiuUtils.cursor.show_cursor()
+
+ $Cursor.hide()
+
+ # Connect to own signals
+ settings_requested.connect(_on_settings_requested)
+
+ # Connect to children's signals
+ settings_popup.classic_sentence_toggled.connect(_on_classic_sentence_toggled)
+ settings_popup.option_selected.connect(_on_settings_option_selected)
+
+
+ # Connect to singletons signals
+ PopochiuUtils.e.ready.connect(_on_popochiu_ready)
+
+
+func _unhandled_input(event: InputEvent) -> void:
+ # Make the PC move to the clicked point on RIGHT CLICK
+ if PopochiuUtils.get_click_or_touch_index(event) == MOUSE_BUTTON_RIGHT:
+ PopochiuUtils.c.player.walk(PopochiuUtils.r.current.get_local_mouse_position())
+
+
+#endregion
+
+#region Virtual ####################################################################################
+## Called when the GUI is blocked. Makes the [member E.current_command] to be none of the available
+## commands, hides the bottom panel and makes the GUI to stop processing unhandled input.
+func _on_blocked(props := { blocking = true }) -> void:
+ PopochiuUtils.e.current_command = -1
+ PopochiuUtils.g.show_hover_text()
+ _9_verb_panel.hide()
+
+ set_process_unhandled_input(false)
+
+
+## Called when the GUI is unblocked. Makes the [member E.current_command] to be
+## [constant NineVerbCommands.WALK_TO], shows the bottom panel and makes the GUI to start processing
+## unhandled input.
+func _on_unblocked() -> void:
+ if PopochiuUtils.d.current_dialog:
+ await get_tree().process_frame
+
+ PopochiuUtils.g.block()
+ return
+
+ PopochiuUtils.e.current_command = NineVerbCommands.Commands.WALK_TO
+ PopochiuUtils.g.show_hover_text()
+ _9_verb_panel.show()
+
+ # Make all commands to look as no pressed
+ _9_verb_panel.unpress_commands()
+
+ set_process_unhandled_input(true)
+
+
+## Called when [method G.show_system_text] is executed. Shows the [code]"wait"[/code] cursor.
+func _on_system_text_shown(_msg: String) -> void:
+ PopochiuUtils.cursor.show_cursor("wait")
+
+
+## Called when [method G.show_system_text] is executed. Shows the [code]"normal"[/code] cursor.
+func _on_system_text_hidden() -> void:
+ PopochiuUtils.cursor.show_cursor()
+
+
+## Called when the mouse enters (hovers) [param clickable]. It displays a text with the
+## [member PopochiuClickable.description] in the [HoverText] component and shows the
+## [code]"active"[/code] cursor.
+func _on_mouse_entered_clickable(clickable: PopochiuClickable) -> void:
+ if PopochiuUtils.g.is_blocked: return
+
+ if clickable.get("suggested_command"):
+ _9_verb_panel.highlight_command(clickable.suggested_command)
+
+ if PopochiuUtils.i.active:
+ _show_command_on(PopochiuUtils.i.active.description, clickable.description)
+ else:
+ PopochiuUtils.g.show_hover_text(clickable.description)
+
+
+## Called when the mouse exits [param clickable]. Clears the text in the [HoverText] component and
+## shows the [code]"normal"[/code] cursor.
+func _on_mouse_exited_clickable(clickable: PopochiuClickable) -> void:
+ if PopochiuUtils.g.is_blocked: return
+
+ if clickable.get("suggested_command"):
+ _9_verb_panel.highlight_command(clickable.suggested_command, false)
+ PopochiuUtils.cursor.show_cursor()
+
+ if PopochiuUtils.i.active:
+ _show_command_on(PopochiuUtils.i.active.description)
+ return
+
+ PopochiuUtils.g.show_hover_text()
+
+
+## Called when the mouse enters (hovers) [param inventory_item]. It displays a text with the
+## [member PopochiuInventoryItem.description] in the [HoverText] component and shows the
+## [code]"active"[/code] cursor.
+func _on_mouse_entered_inventory_item(inventory_item: PopochiuInventoryItem) -> void:
+ if PopochiuUtils.e.current_command == NineVerbCommands.Commands.WALK_TO:
+ _return_to_walk_to = true
+ PopochiuUtils.e.current_command = NineVerbCommands.Commands.USE
+
+ _9_verb_panel.highlight_command(NineVerbCommands.Commands.LOOK_AT)
+ PopochiuUtils.cursor.show_cursor()
+
+ if PopochiuUtils.i.active:
+ _show_command_on(PopochiuUtils.i.active.description, inventory_item.description)
+ else:
+ PopochiuUtils.g.show_hover_text(inventory_item.description)
+
+
+## Called when the mouse exits [param inventory_item]. Clears the text in the [HoverText] component
+## and shows the [code]"normal"[/code] cursor.
+func _on_mouse_exited_inventory_item(inventory_item: PopochiuInventoryItem) -> void:
+ if not PopochiuUtils.i.active and _return_to_walk_to:
+ PopochiuUtils.e.current_command = NineVerbCommands.Commands.WALK_TO
+ _return_to_walk_to = false
+
+ _9_verb_panel.highlight_command(NineVerbCommands.Commands.LOOK_AT, false)
+ PopochiuUtils.cursor.show_cursor()
+
+ if PopochiuUtils.i.active:
+ _show_command_on(PopochiuUtils.i.active.description)
+ return
+
+ PopochiuUtils.g.show_hover_text()
+
+
+## Called when a dialogue line starts. It shows the [code]"wait"[/code] cursor.
+func _on_dialog_line_started() -> void:
+ PopochiuUtils.cursor.show_cursor("wait")
+
+
+## Called when a dialogue line finishes. It shows the [code]"gui"[/code] cursor if there is an
+## active [PopochiuDialog], otherwise it shows the [code]"normal"[/code] cursor.
+func _on_dialog_line_finished() -> void:
+ PopochiuUtils.cursor.show_cursor("gui" if PopochiuUtils.d.current_dialog else "normal")
+
+
+## Called when a [PopochiuDialog] starts. It shows the [code]"gui"[/code] cursor.
+func _on_dialog_started(_dialog: PopochiuDialog) -> void:
+ PopochiuUtils.cursor.show_cursor("gui")
+
+
+## Called when the running [PopochiuDialog] shows its options on screen. It shows the
+## [code]"gui"[/code] cursor.
+func _on_dialog_options_shown() -> void:
+ PopochiuUtils.cursor.unblock()
+ PopochiuUtils.cursor.show_cursor("gui")
+
+
+## Called when a [PopochiuDialog] finishes. It shows the [code]"normal"[/code] cursor.
+func _on_dialog_finished(_dialog: PopochiuDialog) -> void:
+ PopochiuUtils.cursor.show_cursor()
+
+
+## Called when [param item] is selected in the inventory (i.e. by clicking it). For this GUI, this
+## will only occur when the current command is [constant NineVerbCommands.USE].
+func _on_inventory_item_selected(item: PopochiuInventoryItem) -> void:
+ if not item:
+ PopochiuUtils.e.current_command = NineVerbCommands.Commands.WALK_TO
+ PopochiuUtils.g.show_hover_text()
+ else:
+ _show_command_on(item.description)
+
+
+## Called when the game is saved. By default, it shows [code]Game saved[/code] in the SystemText
+## component.
+func _on_game_saved() -> void:
+ PopochiuUtils.g.show_system_text("Game saved")
+
+
+## Called when a game is loaded. [param loaded_game] has the loaded data. By default, it shows
+## [code]Game loaded[/code] in the SystemText component.
+func _on_game_loaded(loaded_game: Dictionary) -> void:
+ await PopochiuUtils.g.show_system_text("Game loaded")
+
+ super(loaded_game)
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_popochiu_ready() -> void:
+ if is_instance_valid(PopochiuUtils.c.player):
+ PopochiuUtils.c.player.started_walk_to.connect(_on_player_started_walk)
+
+
+func _on_settings_requested() -> void:
+ settings_popup.open()
+
+
+func _on_player_started_walk(
+ _character: PopochiuCharacter, _start_position: Vector2, _end_position: Vector2
+) -> void:
+ _on_unblocked()
+
+
+func _on_classic_sentence_toggled(button_pressed: bool) -> void:
+ hover_text_cursor.visible = not button_pressed
+ _9_verb_panel.hover_text_centered.visible = button_pressed
+
+
+func _on_settings_option_selected(option_name: String) -> void:
+ match option_name:
+ "save":
+ save_and_load_popup.open_save()
+ "load":
+ save_and_load_popup.open_load()
+ "history":
+ history_popup.open()
+ "quit":
+ quit_popup.open()
+
+
+func _show_command_on(item_1_name: String, item_2_name := "") -> void:
+ var preposition = "on"
+ if PopochiuUtils.e.current_command == NineVerbCommands.Commands.GIVE:
+ preposition = "to"
+ PopochiuUtils.g.show_hover_text("%s %s %s %s" % [
+ PopochiuUtils.e.get_current_command_name(), item_1_name, preposition, item_2_name
+ ])
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd.uid
new file mode 100644
index 0000000..e158fb1
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd.uid
@@ -0,0 +1 @@
+uid://dxdpjtcbpbkyp
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.tscn
new file mode 100644
index 0000000..94e788d
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.tscn
@@ -0,0 +1,159 @@
+[gd_scene load_steps=22 format=3 uid="uid://bd0fika4hyhvw"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_5somw"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui.gd" id="2_6nea2"]
+[ext_resource type="Texture2D" uid="uid://d0fwvj88bhggm" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png" id="3_fpt6m"]
+[ext_resource type="PackedScene" uid="uid://bn7o13nv11ka1" path="res://addons/popochiu/engine/objects/gui/components/dialog_text/dialog_overhead/dialog_overhead.tscn" id="5_gejku"]
+[ext_resource type="PackedScene" uid="uid://bdgs3xsbq3gdd" path="res://addons/popochiu/engine/objects/gui/components/system_text/system_text.tscn" id="5_ygb3y"]
+[ext_resource type="PackedScene" uid="uid://cuokybjvunmhq" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.tscn" id="6_tiq5g"]
+[ext_resource type="PackedScene" uid="uid://dhsfl8ot4j5fj" path="res://addons/popochiu/engine/objects/gui/components/dialog_menu/dialog_menu.tscn" id="7_ypv20"]
+[ext_resource type="PackedScene" uid="uid://esorelppu4hw" path="res://addons/popochiu/engine/objects/gui/components/hover_text/hover_text.tscn" id="9_pfhkt"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd" id="10_kg6cq"]
+[ext_resource type="PackedScene" uid="uid://crla6to4mm0p7" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.tscn" id="11_etexu"]
+[ext_resource type="PackedScene" uid="uid://cndputybyj57n" path="res://addons/popochiu/engine/objects/gui/components/popups/save_and_load_popup/save_and_load_popup.tscn" id="12_q44n2"]
+[ext_resource type="PackedScene" uid="uid://dfrsiyyqncspo" path="res://addons/popochiu/engine/objects/gui/components/popups/history_popup/history_popup.tscn" id="13_780pa"]
+[ext_resource type="PackedScene" uid="uid://dv1gec8q4h6b7" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/quit_popup/9_verb_quit_popup.tscn" id="14_0vlip"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_0ckh2"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(32, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_jysoy"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(64, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_m2brv"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(96, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_flm5d"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(160, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_wwabf"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(0, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_vpmp7"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(128, 0, 32, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_0twu0"]
+atlas = ExtResource("3_fpt6m")
+region = Rect2(0, 0, 32, 32)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_xtf0b"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_0ckh2")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_jysoy")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_m2brv")
+}],
+"loop": true,
+"name": &"active",
+"speed": 8.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_flm5d")
+}],
+"loop": true,
+"name": &"gui",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_wwabf")
+}],
+"loop": true,
+"name": &"normal",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_vpmp7")
+}],
+"loop": true,
+"name": &"wait",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_0twu0")
+}],
+"loop": true,
+"name": &"walk_to",
+"speed": 5.0
+}]
+
+[node name="9VerbGUI" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_5somw")
+script = ExtResource("2_6nea2")
+
+[node name="Cursor" type="AnimatedSprite2D" parent="."]
+texture_filter = 1
+sprite_frames = SubResource("SpriteFrames_xtf0b")
+animation = &"active"
+
+[node name="9VerbPanel" parent="." instance=ExtResource("6_tiq5g")]
+unique_name_in_owner = true
+layout_mode = 1
+
+[node name="DialogOverhead" parent="." instance=ExtResource("5_gejku")]
+layout_mode = 1
+
+[node name="DialogMenu" parent="." instance=ExtResource("7_ypv20")]
+visible = false
+layout_mode = 1
+
+[node name="HoverTextCursor" parent="." instance=ExtResource("9_pfhkt")]
+unique_name_in_owner = true
+layout_mode = 1
+size_flags_vertical = 3
+script = ExtResource("10_kg6cq")
+follows_cursor = true
+
+[node name="SystemText" parent="." instance=ExtResource("5_ygb3y")]
+layout_mode = 1
+
+[node name="Popups" type="Control" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+metadata/_edit_lock_ = true
+
+[node name="9VerbSettingsPopup" parent="Popups" instance=ExtResource("11_etexu")]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+
+[node name="SaveAndLoadPopup" parent="Popups" instance=ExtResource("12_q44n2")]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+
+[node name="HistoryPopup" parent="Popups" instance=ExtResource("13_780pa")]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+
+[node name="9VerbQuitPopup" parent="Popups" instance=ExtResource("14_0vlip")]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui_info.tres b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui_info.tres
new file mode 100644
index 0000000..ec99494
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/9_verb_gui_info.tres
@@ -0,0 +1,15 @@
+[gd_resource type="Resource" script_class="PopochiuGUIInfo" load_steps=3 format=3 uid="uid://ecktw1j2mpea"]
+
+[ext_resource type="Texture2D" uid="uid://brnmaiifdxwm" path="res://addons/popochiu/icons/ico_9verb.png" id="1_4efef"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/others/popochiu_gui_info.gd" id="1_pkhv6"]
+
+[resource]
+script = ExtResource("1_pkhv6")
+title = "9 Verb (LucasArts)"
+description = "- Uses the 9 Verbs (commands) of LucasArts games: [b]Open[/b], [b]Pick Up[/b], [b]Push[/b], [b]Close[/b], [b]Look At[/b], [b]Pull[/b], [b]Give[/b], [b]Talk To[/b], [b]Use[/b].
+- [b]Right click[/b] to trigger the suggested command or walk.
+- [b]Inventory grid[/b] on the bottom.
+- [b]Settings popup[/b] that opens with a button in the top-right corner.
+
+Like in games such as Day of the Tentacle, Thimbleweed Park, The Secret of Monkey Island."
+icon = ExtResource("1_4efef")
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd
new file mode 100644
index 0000000..afe754a
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd
@@ -0,0 +1,86 @@
+extends PopochiuHoverText
+
+@export var follows_cursor := false
+
+var _gui_width := 0.0
+var _gui_height := 0.0
+# Used to fix a warning shown by Godot related to the anchors of the node and changing its size
+# during a _ready() execution
+var _can_change_size := false
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ super()
+
+ _gui_width = PopochiuUtils.e.width
+ _gui_height = PopochiuUtils.e.height
+
+ if PopochiuUtils.e.settings.scale_gui:
+ _gui_width /= PopochiuUtils.e.scale.x
+ _gui_height /= PopochiuUtils.e.scale.y
+
+ PopochiuUtils.e.current_command = NineVerbCommands.Commands.WALK_TO
+
+ set_process(follows_cursor)
+ label.autowrap_mode = (
+ TextServer.AUTOWRAP_OFF if follows_cursor else TextServer.AUTOWRAP_WORD_SMART
+ )
+
+ _show_text()
+ PopochiuUtils.e.ready.connect(set.bind("_can_change_size", true))
+
+
+func _process(_delta: float) -> void:
+ label.position = get_viewport().get_mouse_position()
+
+ if PopochiuUtils.e.settings.scale_gui:
+ label.position /= PopochiuUtils.e.scale
+
+ label.position -= label.size / 2.0
+ label.position.y -= PopochiuUtils.cursor.get_cursor_height() / 2
+
+ # Check viewport limits
+ if label.position.x < 0.0:
+ label.position.x = 0.0
+ elif label.position.x + label.size.x > _gui_width:
+ label.position.x = _gui_width - label.size.x
+
+ if label.position.y < 0.0:
+ label.position.y = 0.0
+ elif label.position.y + label.size.y > _gui_height:
+ label.position.y = _gui_height - label.size.y
+
+
+#endregion
+
+#region Private ####################################################################################
+func _show_text(txt := "") -> void:
+ label.text = ""
+
+ if follows_cursor and _can_change_size:
+ label.size = Vector2.ZERO
+
+ if txt.is_empty():
+ if (
+ PopochiuUtils.e.current_command == NineVerbCommands.Commands.WALK_TO
+ and is_instance_valid(PopochiuUtils.e.get_hovered())
+ ):
+ super("%s %s" % [
+ PopochiuUtils.e.get_current_command_name(),
+ PopochiuUtils.e.get_hovered().description
+ ])
+ elif PopochiuUtils.e.current_command != NineVerbCommands.Commands.WALK_TO:
+ super(PopochiuUtils.e.get_current_command_name())
+ elif not txt.is_empty() and not PopochiuUtils.i.active:
+ super("%s %s" % [PopochiuUtils.e.get_current_command_name(), txt])
+ elif PopochiuUtils.i.active:
+ super(txt)
+
+ if follows_cursor and _can_change_size:
+ label.size += Vector2.ONE * (PopochiuUtils.cursor.get_cursor_height() / 2)
+ # Adding 2.0 fixes a visual bug that was showing the first character of the text cut
+ label.size.x += 2.0
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd.uid
new file mode 100644
index 0000000..8454804
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd.uid
@@ -0,0 +1 @@
+uid://cdetm38csm35w
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd
new file mode 100644
index 0000000..ef5e53e
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd
@@ -0,0 +1,22 @@
+@tool
+extends PopochiuInventoryGrid
+
+@onready var settings: TextureButton = %Settings
+
+
+#region Godot ######################################################################################
+func _ready():
+ super()
+
+ # Connect to child signals
+ settings.pressed.connect(_on_settings_pressed)
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_settings_pressed() -> void:
+ PopochiuUtils.g.gui.settings_requested.emit()
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd.uid
new file mode 100644
index 0000000..0649c71
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd.uid
@@ -0,0 +1 @@
+uid://brpj52iw0ywho
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.tscn
new file mode 100644
index 0000000..97a5f2b
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.tscn
@@ -0,0 +1,132 @@
+[gd_scene load_steps=18 format=3 uid="uid://djan6vy0xq8dq"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_7ovtr"]
+[ext_resource type="PackedScene" uid="uid://b4juyi6em7wja" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_slot.tscn" id="2_goalc"]
+[ext_resource type="Texture2D" uid="uid://k5k85xjvtqwc" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/images/9verb_inventory_up.png" id="2_i17ns"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.gd" id="2_vgmo0"]
+[ext_resource type="Texture2D" uid="uid://co5fkuv4jgfbc" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/images/9verb_inventory_down.png" id="3_uqfpl"]
+[ext_resource type="Texture2D" uid="uid://dcl6wrqgsdqa1" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_ico_settings.png" id="5_npkld"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_5xjfw"]
+atlas = ExtResource("2_i17ns")
+region = Rect2(0, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_mq4sk"]
+atlas = ExtResource("2_i17ns")
+region = Rect2(32, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_2rabq"]
+atlas = ExtResource("2_i17ns")
+region = Rect2(16, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_hw2h8"]
+atlas = ExtResource("2_i17ns")
+region = Rect2(48, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_tx0je"]
+atlas = ExtResource("5_npkld")
+region = Rect2(0, 0, 16, 15)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_4olg0"]
+atlas = ExtResource("5_npkld")
+region = Rect2(32, 0, 16, 15)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_xswvt"]
+atlas = ExtResource("5_npkld")
+region = Rect2(16, 0, 16, 15)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_6237a"]
+atlas = ExtResource("3_uqfpl")
+region = Rect2(0, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_obc06"]
+atlas = ExtResource("3_uqfpl")
+region = Rect2(32, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_dt380"]
+atlas = ExtResource("3_uqfpl")
+region = Rect2(16, 0, 16, 16)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_jgd5d"]
+atlas = ExtResource("3_uqfpl")
+region = Rect2(48, 0, 16, 16)
+
+[node name="9VerbInventoryGrid" type="HBoxContainer"]
+custom_minimum_size = Vector2(191, 49)
+offset_right = 191.0
+offset_bottom = 49.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+mouse_filter = 0
+theme = ExtResource("1_7ovtr")
+theme_override_constants/separation = 1
+script = ExtResource("2_vgmo0")
+slot_scene = ExtResource("2_goalc")
+h_separation = 1
+v_separation = 1
+
+[node name="ScrollButtons" type="VBoxContainer" parent="."]
+custom_minimum_size = Vector2(24, 0)
+layout_mode = 2
+theme_override_constants/separation = 1
+
+[node name="UpContainer" type="PanelContainer" parent="ScrollButtons"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Up" type="TextureButton" parent="ScrollButtons/UpContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 3
+texture_normal = SubResource("AtlasTexture_5xjfw")
+texture_pressed = SubResource("AtlasTexture_mq4sk")
+texture_hover = SubResource("AtlasTexture_2rabq")
+texture_disabled = SubResource("AtlasTexture_hw2h8")
+stretch_mode = 3
+
+[node name="SettingsContainer" type="PanelContainer" parent="ScrollButtons"]
+layout_mode = 2
+
+[node name="Settings" type="TextureButton" parent="ScrollButtons/SettingsContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+custom_minimum_size = Vector2(24, 15)
+layout_mode = 2
+texture_normal = SubResource("AtlasTexture_tx0je")
+texture_pressed = SubResource("AtlasTexture_4olg0")
+texture_hover = SubResource("AtlasTexture_xswvt")
+ignore_texture_size = true
+stretch_mode = 5
+
+[node name="DownContainer" type="PanelContainer" parent="ScrollButtons"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Down" type="TextureButton" parent="ScrollButtons/DownContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 3
+texture_normal = SubResource("AtlasTexture_6237a")
+texture_pressed = SubResource("AtlasTexture_obc06")
+texture_hover = SubResource("AtlasTexture_dt380")
+texture_disabled = SubResource("AtlasTexture_jgd5d")
+stretch_mode = 3
+
+[node name="ScrollContainer" type="ScrollContainer" parent="."]
+custom_minimum_size = Vector2(99, 49)
+layout_mode = 2
+size_flags_horizontal = 3
+scroll_vertical_custom_step = 27.0
+horizontal_scroll_mode = 3
+vertical_scroll_mode = 3
+
+[node name="Box" type="GridContainer" parent="ScrollContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_constants/h_separation = 1
+theme_override_constants/v_separation = 1
+columns = 4
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_slot.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_slot.tscn
new file mode 100644
index 0000000..432ab36
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_slot.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://b4juyi6em7wja"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_xvh2s"]
+
+[node name="9VerbInventorySlot" type="PanelContainer"]
+custom_minimum_size = Vector2(40, 24)
+offset_right = 40.0
+offset_bottom = 24.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme = ExtResource("1_xvh2s")
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/images/9verb_inventory_down.png b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/images/9verb_inventory_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..451d2746f099ad5b7041ef72f358cbf5c19d6dc9
GIT binary patch
literal 321
zcmV-H0lxl;P)Px#`$wj#>MGBJD&YJJ~LN*5oz-8-Xu9MRu981`fh{jXmv`DZa%A8Eh%;Lr)jc!o@e*D
zYxm4M!{IjoEzt5Fj(zjuru>%oaSXGd%7D`Q*o$OA>3!@)vY_-n_99tOdLMhOET}Bt
ziHruJCo&p@p2%nrdV%Nln;C#&drtur+j|P2*r<3BA);FBdcTgBX!*%}l=Fh(BWJPk
zRYw%x#b;F%AL27J5xqZs5MS|k`6EQdCJ_1JBa2wCU$8mPx#>`6pHR9J=Wl`#&3FbqZA(j|kX-ij@U&Bm>eGB6=JR9{MiZQL+L@V2D=!27KO
z(anv;)^k3_c$j}$H(!?Z%tLHBzfa|3&dqtqAC;gL0C{RG0rJ#X0_3Ts1W1qL__LOH
zNH>RkNeF}X{aqgNCCsxs5BZYB?8?{jL`2gxeXo(yE?;km^1xAoC=VPZi1Og51W6uf
zCG18ZgaM-Fo(A&_QFBitF+ void:
+ hover_text_centered.hide()
+
+
+#endregion
+
+#region Public #####################################################################################
+func unpress_commands() -> void:
+ commands_container.unpress_commands()
+
+
+func highlight_command(command_id: int, highlighted := true) -> void:
+ commands_container.highlight_command(command_id, highlighted)
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.gd.uid
new file mode 100644
index 0000000..18320e4
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.gd.uid
@@ -0,0 +1 @@
+uid://fa7wjtjsxuv7
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.tscn
new file mode 100644
index 0000000..653c2f5
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.tscn
@@ -0,0 +1,177 @@
+[gd_scene load_steps=11 format=3 uid="uid://cuokybjvunmhq"]
+
+[ext_resource type="PackedScene" uid="uid://esorelppu4hw" path="res://addons/popochiu/engine/objects/gui/components/hover_text/hover_text.tscn" id="1_8t0fs"]
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_o0fnb"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_panel/9_verb_panel.gd" id="2_55o6l"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_hover_text/9_verb_hover_text.gd" id="2_qt1af"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd" id="3_q8l3d"]
+[ext_resource type="ButtonGroup" uid="uid://y1thfsxxjowe" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/resources/9_verb_button_group.tres" id="4_6lnif"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd" id="5_bpewk"]
+[ext_resource type="PackedScene" uid="uid://djan6vy0xq8dq" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/9_verb_inventory_grid/9_verb_inventory_grid.tscn" id="6_r1cmu"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_b57cn"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mksfu"]
+
+[node name="9VerbPanel" type="Control" groups=["popochiu_gui_component"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_o0fnb")
+script = ExtResource("2_55o6l")
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 12
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -64.0
+grow_horizontal = 2
+grow_vertical = 0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_b57cn")
+metadata/_edit_group_ = true
+
+[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
+layout_mode = 2
+theme_override_constants/separation = 1
+alignment = 2
+
+[node name="HoverTextCentered" parent="PanelContainer/VBoxContainer" instance=ExtResource("1_8t0fs")]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+theme = null
+script = ExtResource("2_qt1af")
+follows_cursor = false
+
+[node name="Verbs&InventoryContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_mksfu")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer"]
+layout_mode = 2
+size_flags_vertical = 8
+theme_override_constants/separation = 1
+
+[node name="CommandsContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 1
+script = ExtResource("3_q8l3d")
+
+[node name="Row1" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer"]
+custom_minimum_size = Vector2(0, 16)
+layout_mode = 2
+theme_override_constants/separation = 1
+
+[node name="Open" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row1"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Open"
+script = ExtResource("5_bpewk")
+command = 1
+
+[node name="PickUp" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row1"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Pick Up"
+script = ExtResource("5_bpewk")
+command = 2
+
+[node name="Push" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row1"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Push"
+script = ExtResource("5_bpewk")
+command = 3
+
+[node name="Row2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer"]
+custom_minimum_size = Vector2(0, 15)
+layout_mode = 2
+theme_override_constants/separation = 1
+
+[node name="Close" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row2"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Close"
+script = ExtResource("5_bpewk")
+command = 4
+
+[node name="LookAt" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row2"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Look At"
+script = ExtResource("5_bpewk")
+command = 5
+
+[node name="Pull" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row2"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Pull"
+script = ExtResource("5_bpewk")
+command = 6
+
+[node name="Row3" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer"]
+custom_minimum_size = Vector2(0, 16)
+layout_mode = 2
+theme_override_constants/separation = 1
+
+[node name="Give" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row3"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Give"
+script = ExtResource("5_bpewk")
+command = 7
+
+[node name="TalkTo" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row3"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Talk To"
+script = ExtResource("5_bpewk")
+command = 8
+
+[node name="Use" type="Button" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer/CommandsContainer/Row3"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+toggle_mode = true
+button_group = ExtResource("4_6lnif")
+text = "Use"
+script = ExtResource("5_bpewk")
+command = 9
+
+[node name="9VerbInventoryGrid" parent="PanelContainer/VBoxContainer/Verbs&InventoryContainer/HBoxContainer" instance=ExtResource("6_r1cmu")]
+layout_mode = 2
+size_flags_horizontal = 1
+theme = null
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd
new file mode 100644
index 0000000..5229356
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd
@@ -0,0 +1,19 @@
+extends Button
+
+@export var command: NineVerbCommands.Commands = NineVerbCommands.Commands.WALK_TO
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ pressed.connect(_on_pressed)
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_pressed() -> void:
+ PopochiuUtils.e.current_command = command
+ PopochiuUtils.g.show_hover_text()
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd.uid
new file mode 100644
index 0000000..2d9e9c5
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_command_button.gd.uid
@@ -0,0 +1 @@
+uid://bc5c35ga21s5b
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd
new file mode 100644
index 0000000..fbcd5b9
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd
@@ -0,0 +1,28 @@
+extends BoxContainer
+
+
+#region Public #####################################################################################
+func press_command(command: int) -> void:
+ var btn: BaseButton = find_child(PopochiuUtils.e.get_command_name(command).to_pascal_case())
+
+ if btn:
+ btn.button_pressed = true
+
+
+func unpress_commands() -> void:
+ for btn in find_children("*", "BaseButton") as Array[BaseButton]:
+ btn.set_pressed_no_signal(false)
+
+ if btn.has_focus():
+ btn.release_focus()
+
+
+func highlight_command(command: int, highlighted := true) -> void:
+ var btn: BaseButton = find_child(PopochiuUtils.e.get_command_name(command).to_pascal_case())
+
+ if btn:
+ @warning_ignore("standalone_ternary")
+ btn.grab_focus() if highlighted else btn.release_focus()
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd.uid
new file mode 100644
index 0000000..f7ae4b2
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/commands_container/9_verb_commands_container.gd.uid
@@ -0,0 +1 @@
+uid://cuommy7lje5u7
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/quit_popup/9_verb_quit_popup.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/components/quit_popup/9_verb_quit_popup.tscn
new file mode 100644
index 0000000..50ccf62
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/quit_popup/9_verb_quit_popup.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://dv1gec8q4h6b7"]
+
+[ext_resource type="PackedScene" uid="uid://bnjo044fkdcq7" path="res://addons/popochiu/engine/objects/gui/components/popups/quit_popup/quit_popup.tscn" id="1_8vq27"]
+
+[node name="9VerbQuitPopup" instance=ExtResource("1_8vq27")]
+script_name = &"9VerbQuitPopup"
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd
new file mode 100644
index 0000000..7d5065d
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd
@@ -0,0 +1,43 @@
+@tool
+extends PopochiuPopup
+
+signal option_selected(option_name: String)
+signal classic_sentence_toggled(pressed: bool)
+
+@onready var classic_sentence: CheckButton = %ClassicSentence
+@onready var save_btn: Button = %Save
+@onready var load_btn: Button = %Load
+@onready var history_btn: Button = %History
+@onready var quit_btn: Button = %Quit
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ super()
+
+ if Engine.is_editor_hint(): return
+
+ # Connect to child signals
+ save_btn.pressed.connect(option_selected.emit.bind("save"))
+ load_btn.pressed.connect(option_selected.emit.bind("load"))
+ history_btn.pressed.connect(option_selected.emit.bind("history"))
+ quit_btn.pressed.connect(option_selected.emit.bind("quit"))
+ classic_sentence.toggled.connect(_on_classic_sentence_toggled)
+
+ # Connect to autoloads signals
+ # Fix #219: Close the popup whenever a slot is selected for saving or loading
+ PopochiuUtils.e.game_saved.connect(close)
+ PopochiuUtils.e.game_load_started.connect(close)
+
+ if OS.has_feature("web"):
+ quit_btn.hide()
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_classic_sentence_toggled(button_pressed: bool) -> void:
+ classic_sentence_toggled.emit(button_pressed)
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd.uid b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd.uid
new file mode 100644
index 0000000..461bfae
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd.uid
@@ -0,0 +1 @@
+uid://c2f2ryfmudn56
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.tscn b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.tscn
new file mode 100644
index 0000000..cc48149
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.tscn
@@ -0,0 +1,120 @@
+[gd_scene load_steps=8 format=3 uid="uid://crla6to4mm0p7"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_iqhqs"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/9_verb/components/settings_popup/9_verb_settings_popup.gd" id="2_fpv5p"]
+[ext_resource type="Texture2D" uid="uid://cmxrewai8t2lm" path="res://addons/popochiu/engine/objects/gui/resources/images/close.png" id="3_4d6ih"]
+[ext_resource type="StyleBox" uid="uid://dbajakvkltfaj" path="res://addons/popochiu/engine/objects/gui/components/popups/popochiu_popup_panel_container.tres" id="3_biwat"]
+[ext_resource type="Texture2D" uid="uid://p32i25numi5e" path="res://addons/popochiu/engine/objects/gui/resources/images/close_highlight.png" id="4_duspy"]
+[ext_resource type="PackedScene" uid="uid://drx0r8w00ivck" path="res://addons/popochiu/engine/objects/gui/components/sound_volumes/sound_volumes.tscn" id="5_k2hr6"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4bri7"]
+
+[node name="9VerbSettingsPopup" type="Control" groups=["popochiu_gui_popup"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_iqhqs")
+script = ExtResource("2_fpv5p")
+script_name = &"9VerbSettingsPopup"
+title = "Settings"
+
+[node name="Overlay" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_4bri7")
+
+[node name="PanelContainer" type="PanelContainer" parent="Overlay"]
+custom_minimum_size = Vector2(264, 0)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = ExtResource("3_biwat")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Overlay/PanelContainer"]
+layout_mode = 2
+
+[node name="HeaderContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Settings"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Close" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 4
+texture_normal = ExtResource("3_4d6ih")
+texture_pressed = ExtResource("4_duspy")
+texture_hover = ExtResource("4_duspy")
+
+[node name="OptionsContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer"]
+layout_mode = 2
+
+[node name="SoundVolumes" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/VBoxContainer" instance=ExtResource("5_k2hr6")]
+layout_mode = 2
+
+[node name="ClassicSentence" type="CheckButton" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/VBoxContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+tooltip_text = "Show hover text centered"
+text = "Classic sentence"
+
+[node name="Buttons" type="VBoxContainer" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(96, 0)
+layout_mode = 2
+
+[node name="Save" type="Button" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/Buttons"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Save"
+
+[node name="Load" type="Button" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/Buttons"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Load"
+
+[node name="History" type="Button" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/Buttons"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+text = "History"
+
+[node name="Quit" type="Button" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/Buttons"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Quit game"
+
+[node name="Cancel" type="Button" parent="Overlay/PanelContainer/VBoxContainer/OptionsContainer/Buttons"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Resume game"
+
+[node name="FooterContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+visible = false
+layout_mode = 2
+size_flags_vertical = 10
+alignment = 2
+
+[node name="Ok" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+text = "ok"
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png b/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c1f084c6d0ae9285e1313588ecbbb706c6d378d
GIT binary patch
literal 541
zcmV+&0^Px$*GWV{RCt{2o6(MhAPhz6X8!+|yDvhJfr0|99q&nu(Q)S%X(^Q15C8xG00000
z00000000000Qf;@^6z=!cX`wY&iR}D0%q<%v=L){&JN&^kF^08iH;_X_9M?MgP8-7
zS@N;SfW2UMm5IFtKy)|`^%u9X_x9$jEGK$SEd7i^jn_?LDJW9{!%}psGsztYcR%WXGw3D20ov~T3@n3(qA16
zC!O5sE9214K>W&fn!&%4;Wa>|!FgljD9pt(GqycSzheXK)^6EQyRVUyi!8idPoT9P
z90D0&-iFs^fT*cG{VQ!b&L&aF#aT`F7;(9At)^d|U!b3Br9-*>EqgArVk6AL`Sa0-
zLpY`6-S$*Vt%~|dPrBX>GoKD??!J3(Wl*WqDV0cfIS2so6WlFEU=0AgQ~neptqDdJ!B_(T?_dxI
fpaB1;4ZsNh=D->Zja$qq00000NkvXXu0mjf8*T9K
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png.import b/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png.import
new file mode 100644
index 0000000..925679c
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0fwvj88bhggm"
+path="res://.godot/imported/9verb_cursor.png-30129414d11ed7d1ed7ef281b7adc46c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_cursor.png"
+dest_files=["res://.godot/imported/9verb_cursor.png-30129414d11ed7d1ed7ef281b7adc46c.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/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_ico_settings.png b/addons/popochiu/engine/objects/gui/templates/9_verb/images/9verb_ico_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b0f0fa5274d1f555064dcbfc2b26a5789642ae4
GIT binary patch
literal 253
zcmeAS@N?(olHy`uVBq!ia0vp^20+Zu!3HE3>G}KzQjEnx?oJHr&dIz4a<+TAIEHw1
zzMbO8bwq*3b^qZUR{v*-&r_KHGrUZ4Sk&vcBtY<&0=Mt}YeDiKHcY!PQ~bEGa^C6v
zJqs8bI<^$=a+Bs}nD8>lZt}W6zqd4TIB{H!SX?cZ;?#3LYt2R5Zl6cO$)?v{%yYF|
z`sd!B@cPdwyQZ99qP_pG> void:
+ lbl_game_name.text = game_name
+
+
+func reset_score() -> void:
+ score = 0
+ _update_text()
+
+
+func add_score(value: int) -> void:
+ score += value
+ _update_text()
+
+
+func subtract_score(value: int) -> void:
+ score -= value
+ _update_text()
+
+
+#endregion
+
+#region Private ####################################################################################
+func _update_text() -> void:
+ lbl_score.text = "%d/%d" % [score, max_score]
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.gd.uid
new file mode 100644
index 0000000..707ab04
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.gd.uid
@@ -0,0 +1 @@
+uid://bojwm5vvfycj5
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.tscn
new file mode 100644
index 0000000..f94b9a8
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.tscn
@@ -0,0 +1,42 @@
+[gd_scene load_steps=4 format=3 uid="uid://cv2o5p3gp1fgx"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_26r7d"]
+[ext_resource type="PackedScene" uid="uid://esorelppu4hw" path="res://addons/popochiu/engine/objects/gui/components/hover_text/hover_text.tscn" id="1_tlpex"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_bar/sierra_bar.gd" id="2_u87it"]
+
+[node name="SierraBar" type="Control" groups=["popochiu_gui_component"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_26r7d")
+script = ExtResource("2_u87it")
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 15.0
+grow_horizontal = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="LblGameName" type="Label" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Sierra GUI"
+
+[node name="HoverText" parent="PanelContainer/HBoxContainer" instance=ExtResource("1_tlpex")]
+layout_mode = 2
+size_flags_horizontal = 3
+theme = null
+
+[node name="LblScore" type="Label" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Score: 0"
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd
new file mode 100644
index 0000000..9dbecaf
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd
@@ -0,0 +1,19 @@
+extends TextureButton
+
+@export var command: SierraCommands.Commands = 0
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ toggled.connect(on_toggled)
+
+
+#endregion
+
+#region Public #####################################################################################
+func on_toggled(is_pressed: bool) -> void:
+ if is_pressed:
+ PopochiuUtils.e.current_command = command
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd.uid
new file mode 100644
index 0000000..e3af7e5
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd.uid
@@ -0,0 +1 @@
+uid://b2uaof6tlimie
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/images/btn_down.png b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/images/btn_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..451d2746f099ad5b7041ef72f358cbf5c19d6dc9
GIT binary patch
literal 321
zcmV-H0lxl;P)Px#`$wj#>MGBJD&YJJ~LN*5oz-8-Xu9MRu981`fh{jXmv`DZa%A8Eh%;Lr)jc!o@e*D
zYxm4M!{IjoEzt5Fj(zjuru>%oaSXGd%7D`Q*o$OA>3!@)vY_-n_99tOdLMhOET}Bt
ziHruJCo&p@p2%nrdV%Nln;C#&drtur+j|P2*r<3BA);FBdcTgBX!*%}l=Fh(BWJPk
zRYw%x#b;F%AL27J5xqZs5MS|k`6EQdCJ_1JBa2wCU$8mPx#>`6pHR9J=Wl`#&3FbqZA(j|kX-ij@U&Bm>eGB6=JR9{MiZQL+L@V2D=!27KO
z(anv;)^k3_c$j}$H(!?Z%tLHBzfa|3&dqtqAC;gL0C{RG0rJ#X0_3Ts1W1qL__LOH
zNH>RkNeF}X{aqgNCCsxs5BZYB?8?{jL`2gxeXo(yE?;km^1xAoC=VPZi1Og51W6uf
zCG18ZgaM-Fo(A&_QFBitF+ void:
+ super()
+
+ interact.pressed.connect(_on_interact_pressed)
+ look.pressed.connect(_on_look_pressed)
+ talk.pressed.connect(_on_talk_pressed)
+
+
+#endregion
+
+#region Virtual ####################################################################################
+func _open() -> void:
+ _command_when_opened = PopochiuUtils.e.current_command
+ PopochiuUtils.e.current_command = -1
+
+ for button: TextureButton in %CommandsContainer.get_children():
+ button.set_pressed_no_signal(false)
+
+
+func _close() -> void:
+ if PopochiuUtils.i.active:
+ PopochiuUtils.cursor.set_secondary_cursor_texture(PopochiuUtils.i.active.texture)
+ PopochiuUtils.cursor.hide_main_cursor()
+ else:
+ if PopochiuUtils.e.current_command == -1:
+ PopochiuUtils.e.current_command = _command_when_opened
+
+ PopochiuUtils.cursor.show_cursor(PopochiuUtils.e.get_current_command_name().to_snake_case())
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_interact_pressed() -> void:
+ _select_command(SierraCommands.Commands.INTERACT)
+
+
+func _on_look_pressed() -> void:
+ _select_command(SierraCommands.Commands.LOOK)
+
+
+func _on_talk_pressed() -> void:
+ _select_command(SierraCommands.Commands.TALK)
+
+
+func _select_command(command: int) -> void:
+ if is_instance_valid(PopochiuUtils.i.active):
+ PopochiuUtils.i.active = null
+
+ PopochiuUtils.e.current_command = command
+
+ # Force changing the cursor passing `true` as second parameter
+ PopochiuUtils.cursor.show_cursor(PopochiuUtils.e.get_current_command_name().to_snake_case(), true)
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.gd.uid
new file mode 100644
index 0000000..f95f3d0
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.gd.uid
@@ -0,0 +1 @@
+uid://byrkusljcxqsg
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.tscn
new file mode 100644
index 0000000..a2d6c93
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.tscn
@@ -0,0 +1,195 @@
+[gd_scene load_steps=31 format=3 uid="uid://dc7crw22yevoo"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_ok1rg"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_popup.gd" id="2_xj17e"]
+[ext_resource type="Texture2D" uid="uid://cmxrewai8t2lm" path="res://addons/popochiu/engine/objects/gui/resources/images/close.png" id="3_7aa5u"]
+[ext_resource type="Texture2D" uid="uid://p32i25numi5e" path="res://addons/popochiu/engine/objects/gui/resources/images/close_highlight.png" id="4_vd0bg"]
+[ext_resource type="PackedScene" uid="uid://26dqxcqhmj44" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_grid.tscn" id="5_i15hx"]
+[ext_resource type="ButtonGroup" uid="uid://dyskyd66yevlj" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_button_group.tres" id="6_gcms1"]
+[ext_resource type="Texture2D" uid="uid://mbfkdny6pub7" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png" id="7_ietfy"]
+[ext_resource type="Texture2D" uid="uid://57nl6xfjetoe" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_look.png" id="8_m3ulb"]
+[ext_resource type="Texture2D" uid="uid://b5vpolfm4o5f4" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_talk.png" id="9_ur807"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0yihc"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_d512i"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(0, 0, 0, 0.705882)
+expand_margin_left = 4.0
+expand_margin_top = 4.0
+expand_margin_right = 4.0
+expand_margin_bottom = 4.0
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_t6f3x"]
+atlas = ExtResource("7_ietfy")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_2tl6r"]
+atlas = ExtResource("7_ietfy")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_u6es1"]
+atlas = ExtResource("7_ietfy")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_3r3in"]
+atlas = ExtResource("8_m3ulb")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_2idn6"]
+atlas = ExtResource("8_m3ulb")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_mndsc"]
+atlas = ExtResource("8_m3ulb")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_hb12v"]
+atlas = ExtResource("9_ur807")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_b4bqk"]
+atlas = ExtResource("9_ur807")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_w2dlm"]
+atlas = ExtResource("9_ur807")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rqb31"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3xhdb"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_vkbfs"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_lha4x"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ba8hg"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ksnpe"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7a16g"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5f4c"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7d0vl"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_dpu0r"]
+
+[node name="SierraInventoryPopup" type="Control" groups=["popochiu_gui_popup"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_ok1rg")
+script = ExtResource("2_xj17e")
+script_name = &"SierraInventoryPopup"
+title = "Inventory"
+
+[node name="Overlay" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_0yihc")
+
+[node name="PanelContainer" type="PanelContainer" parent="Overlay"]
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_d512i")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Overlay/PanelContainer"]
+layout_mode = 2
+
+[node name="HeaderContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Inventory"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Close" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 4
+texture_normal = ExtResource("3_7aa5u")
+texture_pressed = ExtResource("4_vd0bg")
+texture_hover = ExtResource("4_vd0bg")
+
+[node name="SierraInventoryGrid" parent="Overlay/PanelContainer/VBoxContainer" instance=ExtResource("5_i15hx")]
+layout_mode = 2
+
+[node name="FooterContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+
+[node name="CommandsContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="Interact" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer/CommandsContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+button_group = ExtResource("6_gcms1")
+texture_normal = SubResource("AtlasTexture_t6f3x")
+texture_pressed = SubResource("AtlasTexture_2tl6r")
+texture_hover = SubResource("AtlasTexture_u6es1")
+
+[node name="Look" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer/CommandsContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+button_group = ExtResource("6_gcms1")
+texture_normal = SubResource("AtlasTexture_3r3in")
+texture_pressed = SubResource("AtlasTexture_2idn6")
+texture_hover = SubResource("AtlasTexture_mndsc")
+
+[node name="Talk" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer/CommandsContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+button_group = ExtResource("6_gcms1")
+texture_normal = SubResource("AtlasTexture_hb12v")
+texture_pressed = SubResource("AtlasTexture_b4bqk")
+texture_hover = SubResource("AtlasTexture_w2dlm")
+
+[node name="Ok" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+theme_override_styles/focus = SubResource("StyleBoxEmpty_rqb31")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_3xhdb")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_vkbfs")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_lha4x")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_ba8hg")
+text = "OK"
+
+[node name="Cancel" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+theme_override_styles/focus = SubResource("StyleBoxEmpty_ksnpe")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_7a16g")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_g5f4c")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_7d0vl")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_dpu0r")
+text = "Back"
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd
new file mode 100644
index 0000000..a171361
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd
@@ -0,0 +1,76 @@
+extends PanelContainer
+
+@export var hover_color := Color("ffffff")
+@export var selected_color := Color("edf171")
+
+var _is_selected := false
+
+@onready var _style_box_flat: StyleBoxFlat = get_theme_stylebox("panel").duplicate()
+@onready var _dflt_border_color := _style_box_flat.border_color
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ add_theme_stylebox_override("panel", _style_box_flat)
+
+ # Connect to own signals
+ mouse_entered.connect(_on_mouse_entered)
+ mouse_exited.connect(_on_mouse_exited)
+ child_entered_tree.connect(_on_item_assigned)
+ child_exiting_tree.connect(_on_item_removed)
+
+
+#endregion
+
+#region Public #####################################################################################
+func get_content_height() -> float:
+ # Subtract the value of the sum of the top and bottom borders of the StyleBoxFlat of this slot
+ return size.y - 2
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_mouse_entered() -> void:
+ _style_box_flat.border_color = hover_color
+
+
+func _on_mouse_exited() -> void:
+ _style_box_flat.border_color = _dflt_border_color if not _is_selected else selected_color
+
+
+func _on_item_assigned(node: Node) -> void:
+ if not node is PopochiuInventoryItem:
+ return
+
+ var inventory_item: PopochiuInventoryItem = node
+
+ inventory_item.mouse_entered.connect(_on_mouse_entered)
+ inventory_item.mouse_exited.connect(_on_mouse_exited)
+ inventory_item.selected.connect(_on_item_selected)
+ inventory_item.unselected.connect(_on_item_unselected)
+
+
+func _on_item_removed(node: Node) -> void:
+ if not node is PopochiuInventoryItem:
+ return
+
+ var inventory_item: PopochiuInventoryItem = node
+
+ inventory_item.mouse_entered.disconnect(_on_mouse_entered)
+ inventory_item.mouse_exited.disconnect(_on_mouse_exited)
+ inventory_item.selected.disconnect(_on_item_selected)
+ inventory_item.unselected.disconnect(_on_item_unselected)
+
+
+func _on_item_selected(item: PopochiuInventoryItem) -> void:
+ _style_box_flat.border_color = selected_color
+ _is_selected = true
+
+
+func _on_item_unselected() -> void:
+ _is_selected = false
+ _style_box_flat.border_color = _dflt_border_color
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd.uid
new file mode 100644
index 0000000..4892dc2
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd.uid
@@ -0,0 +1 @@
+uid://6ori6koegrn6
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.tscn
new file mode 100644
index 0000000..417315b
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.tscn
@@ -0,0 +1,18 @@
+[gd_scene load_steps=4 format=3 uid="uid://yw6qpn52gnp5"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_6ds34"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_inventory_popup/sierra_inventory_slot/sierra_inventory_slot.gd" id="1_ettj2"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7pmgd"]
+draw_center = false
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.482353, 0.482353, 0.482353, 1)
+
+[node name="SierraInventorySlot" type="PanelContainer"]
+custom_minimum_size = Vector2(24, 24)
+theme = ExtResource("1_6ds34")
+theme_override_styles/panel = SubResource("StyleBoxFlat_7pmgd")
+script = ExtResource("1_ettj2")
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd
new file mode 100644
index 0000000..af65e18
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd
@@ -0,0 +1,20 @@
+extends HBoxContainer
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ PopochiuUtils.e.command_selected.connect(_on_command_selected)
+
+
+#endregion
+
+#region Public #####################################################################################
+func _on_command_selected() -> void:
+ for b in get_children():
+ (b as TextureButton).set_pressed_no_signal(false)
+
+ (get_child(PopochiuUtils.e.current_command) as TextureButton).set_pressed_no_signal(true)
+ PopochiuUtils.cursor.show_cursor(PopochiuUtils.e.get_current_command_name().to_snake_case())
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd.uid
new file mode 100644
index 0000000..e5dbe04
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd.uid
@@ -0,0 +1 @@
+uid://cqoxmvinvsqj0
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd
new file mode 100644
index 0000000..f587d9e
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd
@@ -0,0 +1,78 @@
+extends Control
+
+## Defines the height in pixels of the zone where moving the mouse in the top of the screen will
+## make the bar to show. Note: This value will be affected by the Experimental Scale GUI checkbox
+## in Project Settings > Popochiu > GUI.
+@export var input_zone_height := 4
+
+@onready var panel_container: PanelContainer = $PanelContainer
+@onready var inventory = %Inventory
+@onready var settings = %Settings
+@onready var help = %Help
+@onready var quit = %Quit
+
+
+#region Godot ######################################################################################
+func _ready():
+ inventory.pressed.connect(_on_inventory_pressed)
+ settings.pressed.connect(_on_settings_pressed)
+ help.pressed.connect(_on_help_pressed)
+ quit.pressed.connect(_on_quit_pressed)
+
+ hide()
+
+
+func _input(event: InputEvent) -> void:
+ if PopochiuUtils.g.is_blocked: return
+
+ if event is InputEventMouseMotion:
+ var rect := panel_container.get_rect()
+
+ if not visible:
+ rect.size.y = input_zone_height
+
+ if PopochiuUtils.e.settings.scale_gui:
+ rect = Rect2(
+ panel_container.get_rect().position * PopochiuUtils.e.scale,
+ (Vector2(
+ panel_container.get_rect().size.x,
+ panel_container.get_rect().size.y if visible
+ else panel_container.get_rect().size.y / 2.0
+ )) * PopochiuUtils.e.scale
+ )
+
+ if not visible and rect.has_point(get_global_mouse_position()):
+ # Show the top menu
+ if not PopochiuUtils.i.active:
+ PopochiuUtils.cursor.show_cursor("gui")
+ show()
+ elif visible and not rect.has_point(get_global_mouse_position()):
+ # Hide the top menu
+ if not PopochiuUtils.i.active:
+ PopochiuUtils.cursor.show_cursor(PopochiuUtils.e.get_current_command_name().to_snake_case())
+ hide()
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_inventory_pressed() -> void:
+ hide()
+ PopochiuUtils.g.popup_requested.emit("SierraInventoryPopup")
+
+
+func _on_settings_pressed() -> void:
+ hide()
+ PopochiuUtils.g.popup_requested.emit("SierraSettingsPopup")
+
+
+func _on_help_pressed() -> void:
+ # TODO: Open the help popup
+ pass
+
+
+func _on_quit_pressed() -> void:
+ PopochiuUtils.g.popup_requested.emit("QuitPopup")
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd.uid
new file mode 100644
index 0000000..55abd0e
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd.uid
@@ -0,0 +1 @@
+uid://bj2m0cts3sjo5
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.tscn
new file mode 100644
index 0000000..d37ff42
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.tscn
@@ -0,0 +1,204 @@
+[gd_scene load_steps=35 format=3 uid="uid://bhx2hkpkjs7dk"]
+
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_menu.gd" id="1_8uwkl"]
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_ocp4m"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_menu/sierra_commands_container.gd" id="2_3ic0i"]
+[ext_resource type="Texture2D" uid="uid://cnxdologw7ax8" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_walk.png" id="2_eg6ow"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_command_button/sierra_command_button.gd" id="3_lg2l4"]
+[ext_resource type="Texture2D" uid="uid://57nl6xfjetoe" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_look.png" id="4_sthn3"]
+[ext_resource type="Texture2D" uid="uid://mbfkdny6pub7" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png" id="5_3vslp"]
+[ext_resource type="Texture2D" uid="uid://b5vpolfm4o5f4" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_talk.png" id="6_0y8dr"]
+[ext_resource type="Texture2D" uid="uid://binqewyag102g" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_inventory.png" id="8_uijy7"]
+[ext_resource type="Texture2D" uid="uid://d3hyq5v4c2seb" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_settings.png" id="9_g1qod"]
+[ext_resource type="Texture2D" uid="uid://djve4vu1lpi34" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_help.png" id="10_bvuyo"]
+[ext_resource type="Texture2D" uid="uid://c1gik8lkdekx4" path="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_quit.png" id="11_marqj"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_csu2p"]
+atlas = ExtResource("2_eg6ow")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ylk7h"]
+atlas = ExtResource("2_eg6ow")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ao1oe"]
+atlas = ExtResource("2_eg6ow")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_irg4s"]
+atlas = ExtResource("4_sthn3")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_sijr3"]
+atlas = ExtResource("4_sthn3")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_msotb"]
+atlas = ExtResource("4_sthn3")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_u5ilp"]
+atlas = ExtResource("5_3vslp")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_nkumn"]
+atlas = ExtResource("5_3vslp")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ddbjm"]
+atlas = ExtResource("5_3vslp")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_r0y6q"]
+atlas = ExtResource("6_0y8dr")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_yyrpv"]
+atlas = ExtResource("6_0y8dr")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_m2m36"]
+atlas = ExtResource("6_0y8dr")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_a3v2b"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_uvguw"]
+atlas = ExtResource("8_uijy7")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_mdjye"]
+atlas = ExtResource("8_uijy7")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_odwa6"]
+atlas = ExtResource("8_uijy7")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_wy7fm"]
+atlas = ExtResource("9_g1qod")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_eccvv"]
+atlas = ExtResource("9_g1qod")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_0ahol"]
+atlas = ExtResource("9_g1qod")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_f8jt5"]
+atlas = ExtResource("11_marqj")
+region = Rect2(0, 0, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_c0o1t"]
+atlas = ExtResource("11_marqj")
+region = Rect2(0, 24, 24, 24)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_hs767"]
+atlas = ExtResource("11_marqj")
+region = Rect2(0, 24, 24, 24)
+
+[node name="SierraMenu" type="Control" groups=["popochiu_gui_component"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_ocp4m")
+script = ExtResource("1_8uwkl")
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 24.0
+grow_horizontal = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="SierraCommandsContainer" type="HBoxContainer" parent="PanelContainer/HBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 0
+script = ExtResource("2_3ic0i")
+
+[node name="Walk" type="TextureButton" parent="PanelContainer/HBoxContainer/SierraCommandsContainer"]
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+texture_normal = SubResource("AtlasTexture_csu2p")
+texture_pressed = SubResource("AtlasTexture_ylk7h")
+texture_hover = SubResource("AtlasTexture_ao1oe")
+script = ExtResource("3_lg2l4")
+
+[node name="Look" type="TextureButton" parent="PanelContainer/HBoxContainer/SierraCommandsContainer"]
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+texture_normal = SubResource("AtlasTexture_irg4s")
+texture_pressed = SubResource("AtlasTexture_sijr3")
+texture_hover = SubResource("AtlasTexture_msotb")
+script = ExtResource("3_lg2l4")
+command = 1
+
+[node name="Interact" type="TextureButton" parent="PanelContainer/HBoxContainer/SierraCommandsContainer"]
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+texture_normal = SubResource("AtlasTexture_u5ilp")
+texture_pressed = SubResource("AtlasTexture_nkumn")
+texture_hover = SubResource("AtlasTexture_ddbjm")
+script = ExtResource("3_lg2l4")
+command = 2
+
+[node name="Talk" type="TextureButton" parent="PanelContainer/HBoxContainer/SierraCommandsContainer"]
+texture_filter = 1
+layout_mode = 2
+toggle_mode = true
+texture_normal = SubResource("AtlasTexture_r0y6q")
+texture_pressed = SubResource("AtlasTexture_yyrpv")
+texture_hover = SubResource("AtlasTexture_m2m36")
+script = ExtResource("3_lg2l4")
+command = 3
+
+[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/HBoxContainer"]
+texture_filter = 1
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxEmpty_a3v2b")
+
+[node name="Inventory" type="TextureButton" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+texture_normal = SubResource("AtlasTexture_uvguw")
+texture_pressed = SubResource("AtlasTexture_mdjye")
+texture_hover = SubResource("AtlasTexture_odwa6")
+
+[node name="Settings" type="TextureButton" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 2
+texture_normal = SubResource("AtlasTexture_wy7fm")
+texture_pressed = SubResource("AtlasTexture_eccvv")
+texture_hover = SubResource("AtlasTexture_0ahol")
+
+[node name="Help" type="TextureButton" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+visible = false
+texture_filter = 1
+layout_mode = 2
+texture_normal = ExtResource("10_bvuyo")
+
+[node name="Quit" type="TextureButton" parent="PanelContainer/HBoxContainer"]
+unique_name_in_owner = true
+visible = false
+texture_filter = 1
+layout_mode = 2
+texture_normal = SubResource("AtlasTexture_f8jt5")
+texture_pressed = SubResource("AtlasTexture_c0o1t")
+texture_hover = SubResource("AtlasTexture_hs767")
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd
new file mode 100644
index 0000000..c283e08
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd
@@ -0,0 +1,42 @@
+@tool
+extends PopochiuPopup
+
+signal option_selected(option_name)
+
+@onready var save: Button = %Save
+@onready var load: Button = %Load
+@onready var sound: Button = %Sound
+@onready var text: Button = %Text
+@onready var quit: Button = %Quit
+
+
+#region Godot ######################################################################################
+func _ready() -> void:
+ super()
+
+ if Engine.is_editor_hint(): return
+
+ # Connect to childrens' signals
+ save.pressed.connect(_on_option_pressed.bind("save"))
+ load.pressed.connect(_on_option_pressed.bind("load"))
+ sound.pressed.connect(_on_option_pressed.bind("sound"))
+ text.pressed.connect(_on_option_pressed.bind("text"))
+ quit.pressed.connect(_on_option_pressed.bind("quit"))
+
+ # Connect to autoloads signals
+ # Fix #219: Close the popup whenever a slot is selected for saving or loading
+ PopochiuUtils.e.game_saved.connect(close)
+ PopochiuUtils.e.game_load_started.connect(close)
+
+ if OS.has_feature("web"):
+ quit.hide()
+
+
+#endregion
+
+#region Private ####################################################################################
+func _on_option_pressed(option_name: String) -> void:
+ option_selected.emit(option_name)
+
+
+#endregion
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd.uid b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd.uid
new file mode 100644
index 0000000..728a510
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd.uid
@@ -0,0 +1 @@
+uid://cob07o556udc
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.tscn
new file mode 100644
index 0000000..8526d01
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.tscn
@@ -0,0 +1,111 @@
+[gd_scene load_steps=7 format=3 uid="uid://c24vj4s0u08jr"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_mo7nx"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/templates/sierra/components/sierra_settings_popup/sierra_settings_popup.gd" id="2_3iqg8"]
+[ext_resource type="Texture2D" uid="uid://cmxrewai8t2lm" path="res://addons/popochiu/engine/objects/gui/resources/images/close.png" id="3_65lvt"]
+[ext_resource type="StyleBox" uid="uid://dbajakvkltfaj" path="res://addons/popochiu/engine/objects/gui/components/popups/popochiu_popup_panel_container.tres" id="3_qdhes"]
+[ext_resource type="Texture2D" uid="uid://p32i25numi5e" path="res://addons/popochiu/engine/objects/gui/resources/images/close_highlight.png" id="4_38rye"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fkove"]
+
+[node name="SierraSettingsPopup" type="Control" groups=["popochiu_gui_popup"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_mo7nx")
+script = ExtResource("2_3iqg8")
+script_name = &"SierraSettingsPopup"
+title = "Options"
+
+[node name="Overlay" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_fkove")
+
+[node name="PanelContainer" type="PanelContainer" parent="Overlay"]
+custom_minimum_size = Vector2(120, 0)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = ExtResource("3_qdhes")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Overlay/PanelContainer"]
+layout_mode = 2
+
+[node name="HeaderContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Options"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Close" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+visible = false
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 4
+texture_normal = ExtResource("3_65lvt")
+texture_pressed = ExtResource("4_38rye")
+texture_hover = ExtResource("4_38rye")
+
+[node name="BodyContainer" type="VBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+custom_minimum_size = Vector2(112, 0)
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer"]
+layout_mode = 2
+
+[node name="Save" type="Button" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Save"
+
+[node name="Load" type="Button" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Load"
+
+[node name="Sound" type="Button" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Sound options"
+
+[node name="Text" type="Button" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Text options"
+
+[node name="Quit" type="Button" parent="Overlay/PanelContainer/VBoxContainer/BodyContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Quit"
+
+[node name="FooterContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+alignment = 1
+
+[node name="Ok" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+text = "OK"
+
+[node name="Cancel" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Back"
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/components/sound_popup/sierra_sound_popup.tscn b/addons/popochiu/engine/objects/gui/templates/sierra/components/sound_popup/sierra_sound_popup.tscn
new file mode 100644
index 0000000..0ca5ffa
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/components/sound_popup/sierra_sound_popup.tscn
@@ -0,0 +1,81 @@
+[gd_scene load_steps=8 format=3 uid="uid://mh7ymcslp4xv"]
+
+[ext_resource type="Theme" uid="uid://dpequqav4rjaf" path="res://addons/popochiu/engine/objects/gui/resources/base_gui_theme.tres" id="1_wcf4y"]
+[ext_resource type="Script" path="res://addons/popochiu/engine/objects/gui/components/popups/popochiu_popup.gd" id="2_mv3ym"]
+[ext_resource type="Texture2D" uid="uid://cmxrewai8t2lm" path="res://addons/popochiu/engine/objects/gui/resources/images/close.png" id="3_3cpvg"]
+[ext_resource type="StyleBox" uid="uid://dbajakvkltfaj" path="res://addons/popochiu/engine/objects/gui/components/popups/popochiu_popup_panel_container.tres" id="3_bth8c"]
+[ext_resource type="Texture2D" uid="uid://p32i25numi5e" path="res://addons/popochiu/engine/objects/gui/resources/images/close_highlight.png" id="4_5cjf6"]
+[ext_resource type="PackedScene" uid="uid://drx0r8w00ivck" path="res://addons/popochiu/engine/objects/gui/components/sound_volumes/sound_volumes.tscn" id="5_tjqww"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ygj01"]
+
+[node name="SierraSoundPopup" type="Control" groups=["popochiu_gui_popup"]]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_wcf4y")
+script = ExtResource("2_mv3ym")
+script_name = &"SierraSoundPopup"
+title = "Sound options"
+
+[node name="Overlay" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_ygj01")
+
+[node name="PanelContainer" type="PanelContainer" parent="Overlay"]
+custom_minimum_size = Vector2(0, 140)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = ExtResource("3_bth8c")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Overlay/PanelContainer"]
+layout_mode = 2
+
+[node name="HeaderContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Sound options"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Close" type="TextureButton" parent="Overlay/PanelContainer/VBoxContainer/HeaderContainer"]
+unique_name_in_owner = true
+visible = false
+texture_filter = 1
+layout_mode = 2
+size_flags_vertical = 4
+texture_normal = ExtResource("3_3cpvg")
+texture_pressed = ExtResource("4_5cjf6")
+texture_hover = ExtResource("4_5cjf6")
+
+[node name="SoundVolumes" parent="Overlay/PanelContainer/VBoxContainer" instance=ExtResource("5_tjqww")]
+layout_mode = 2
+
+[node name="FooterContainer" type="HBoxContainer" parent="Overlay/PanelContainer/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+alignment = 1
+
+[node name="Ok" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+text = "OK"
+
+[node name="Cancel" type="Button" parent="Overlay/PanelContainer/VBoxContainer/FooterContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Back"
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_help.png b/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_help.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbe38431678ab022fc13cf50234bd262bb0043dd
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|3O!vMLp(a)
zhB)#aP~cen`~Uo#sd9H(%x0-(y$M_*(mg{~z+unxy+6Ge%kw`oFOU&e4rfU@xaODp
z&&4;IKC6kpPLOylo)8>jTlU2B*kP*%1*P8dzs#Px$5=lfsR9J=WmP-zVAPk1f>^)O&;Eq$Wn;Y~@9DrHq7!v7AK{FZu#Do~=M@tI@
z_&1gHGb`V6!Uh=3kpx;~2#F|4s1rz(@o0%uygA#MNw03woOt=A1Xf4e+?Wr~*HIkuE7zztb0S
zUa)-;lbUYr04b%W@%oq{x*^;R+YC`k=@6tP@lHoX
qAR@IUr1wEQWFk`br|ap9RDA$+iTL%C(fwZl0000jQJ
literal 0
HcmV?d00001
diff --git a/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png.import b/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png.import
new file mode 100644
index 0000000..6e9e14a
--- /dev/null
+++ b/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://mbfkdny6pub7"
+path="res://.godot/imported/btn_interact.png-70e04edd4fb17ba2c34cabb13d7856ce.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/popochiu/engine/objects/gui/templates/sierra/images/btn_interact.png"
+dest_files=["res://.godot/imported/btn_interact.png-70e04edd4fb17ba2c34cabb13d7856ce.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/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_inventory.png b/addons/popochiu/engine/objects/gui/templates/sierra/images/btn_inventory.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1880d9c962d2d5452dac3ed1f9bf899022cb493
GIT binary patch
literal 269
zcmeAS@N?(olHy`uVBq!ia0vp^5Vzo#ddnW5vSL3j|dx`Tsq)TJU?B!8*D8r