From c75601c06d8c2650fe3c14163af94195d141a4dc Mon Sep 17 00:00:00 2001 From: Oier Bravo Urtasun Date: Tue, 9 Sep 2025 02:08:31 +0200 Subject: [PATCH] UI cleanup, reorder & unify --- .../assets/dialog_box.svg | 47 +++++++ .../dialog_tip.tscn | 8 +- .../theme.tres | 7 +- .../theme/dialog.tres | 20 +-- .../types/avatar.gd.uid | 2 +- .../types/floating.gd | 75 +++++----- .../types/floating.tscn | 55 ++++++-- .../fonts/caslonantique.tres | 2 +- .../fonts/determination.ttf | Bin 0 -> 150948 bytes .../escoria-ui-return-monkey-island/game.gd | 69 +++++----- .../escoria-ui-return-monkey-island/game.tscn | 129 ++++++++---------- .../inventory/esc_inventory_button.gd | 5 + .../inventory/esc_inventory_button.gd.uid | 1 + .../inventory/inventory_container.gd | 5 + .../inventory/inventory_container.gd.uid | 1 + .../inventory/inventory_ui.gd | 18 ++- .../inventory/inventory_ui.tscn | 68 ++------- .../language_selector/language_selector.tscn | 4 +- .../menus/main_menu/main_menu.tscn | 9 +- .../menus/options/options.tscn | 117 +++++----------- .../menus/pause_menu/pause_menu.tscn | 17 ++- .../overrides/esc_inventory_item.gd | 4 + .../overrides/inventory_item.gd.uid | 1 + ...c_rich_tooltip.gd => rtmi_rich_tooltip.gd} | 2 +- .../rtmi_rich_tooltip.gd.uid | 1 + ...ch_tooltip.tscn => rtmi_rich_tooltip.tscn} | 2 +- .../shaders/outline.gdshader | 64 +++++++++ .../shaders/outline.gdshader.uid | 1 + .../shadermaterial_outline_green5px.tres | 11 ++ .../theme/inventory_ui.tres | 11 ++ .../theme/menu.tres | 20 ++- .../theme/ui.tres | 18 ++- .../video_player/video_player.tscn | 49 ++++--- gymkhana/characters/eneko/eneko_smoking.tscn | 34 ++--- gymkhana/characters/oier/oier.tscn | 2 +- project.godot | 2 +- 36 files changed, 505 insertions(+), 376 deletions(-) create mode 100644 addons/escoria-ui-return-monkey-island-dialog-simple/assets/dialog_box.svg create mode 100644 addons/escoria-ui-return-monkey-island/fonts/determination.ttf create mode 100644 addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd create mode 100644 addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd.uid create mode 100644 addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd create mode 100644 addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd.uid create mode 100644 addons/escoria-ui-return-monkey-island/overrides/inventory_item.gd.uid rename addons/escoria-ui-return-monkey-island/{esc_rich_tooltip.gd => rtmi_rich_tooltip.gd} (99%) create mode 100644 addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd.uid rename addons/escoria-ui-return-monkey-island/{esc_rich_tooltip.tscn => rtmi_rich_tooltip.tscn} (95%) create mode 100644 addons/escoria-ui-return-monkey-island/shaders/outline.gdshader create mode 100644 addons/escoria-ui-return-monkey-island/shaders/outline.gdshader.uid create mode 100644 addons/escoria-ui-return-monkey-island/shaders/shadermaterial_outline_green5px.tres create mode 100644 addons/escoria-ui-return-monkey-island/theme/inventory_ui.tres diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/assets/dialog_box.svg b/addons/escoria-ui-return-monkey-island-dialog-simple/assets/dialog_box.svg new file mode 100644 index 00000000..8c6eac6f --- /dev/null +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/assets/dialog_box.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/dialog_tip.tscn b/addons/escoria-ui-return-monkey-island-dialog-simple/dialog_tip.tscn index c9823d7b..f7545dc1 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/dialog_tip.tscn +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/dialog_tip.tscn @@ -3,9 +3,9 @@ [ext_resource type="Script" uid="uid://d1pg38kdwg07d" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/dialog_tip.gd" id="2"] [node name="Label" type="Label"] -offset_left = 1057.0 -offset_top = 533.0 -offset_right = 1259.0 -offset_bottom = 551.0 +offset_left = 1000.0 +offset_top = 500.0 +offset_right = 1237.0 +offset_bottom = 523.0 text = "Haz click para acelerar el texto" script = ExtResource("2") diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/theme.tres b/addons/escoria-ui-return-monkey-island-dialog-simple/theme.tres index 20519d3a..452d6317 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/theme.tres +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/theme.tres @@ -1,4 +1,6 @@ -[gd_resource type="Theme" load_steps=4 format=3 uid="uid://dlo07cyfhpilq"] +[gd_resource type="Theme" load_steps=5 format=3 uid="uid://dlo07cyfhpilq"] + +[ext_resource type="FontFile" uid="uid://vqqxktsw0f34" path="res://addons/escoria-ui-return-monkey-island/fonts/determination.ttf" id="1_yc5i3"] [sub_resource type="StyleBoxFlat" id="1"] content_margin_left = 4.0 @@ -19,6 +21,7 @@ corner_radius_bottom_left = 5 [sub_resource type="StyleBoxFlat" id="3"] bg_color = Color(0, 0, 0, 0.388235) +draw_center = false corner_radius_top_left = 5 corner_radius_top_right = 5 corner_radius_bottom_right = 5 @@ -33,7 +36,9 @@ Label/colors/font_color = Color(1, 1, 1, 1) Label/colors/font_color_shadow = Color(0, 0, 0, 0) Label/colors/font_outline_modulate = Color(1, 0, 0, 1) Label/colors/label_box_bg = Color(0, 0, 0, 0.745098) +Label/fonts/font = ExtResource("1_yc5i3") Label/styles/normal = SubResource("1") RichTextLabel/font_sizes/font_size = 20 +RichTextLabel/fonts/normal_font = ExtResource("1_yc5i3") RichTextLabel/styles/focus = SubResource("2") RichTextLabel/styles/normal = SubResource("3") diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/theme/dialog.tres b/addons/escoria-ui-return-monkey-island-dialog-simple/theme/dialog.tres index 054cfb2b..e6c42833 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/theme/dialog.tres +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/theme/dialog.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=4 format=3 uid="uid://dvwfrnya2nhxu"] +[gd_resource type="Theme" load_steps=3 format=3 uid="uid://dvwfrnya2nhxu"] [sub_resource type="StyleBoxFlat" id="1"] content_margin_left = 4.0 @@ -10,29 +10,17 @@ corner_radius_top_right = 5 corner_radius_bottom_right = 5 expand_margin_left = 19.0 -[sub_resource type="StyleBoxFlat" id="2"] -bg_color = Color(0, 0, 0, 0.509804) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yu8vd"] +bg_color = Color(0, 0, 0, 0.607843) corner_radius_top_left = 5 corner_radius_top_right = 5 corner_radius_bottom_right = 5 corner_radius_bottom_left = 5 -[sub_resource type="StyleBoxFlat" id="3"] -bg_color = Color(0, 0, 0, 0.388235) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 -expand_margin_left = 5.0 -expand_margin_top = 5.0 -expand_margin_right = 5.0 -expand_margin_bottom = 5.0 - [resource] Label/colors/font_color = Color(1, 1, 1, 1) Label/colors/font_color_shadow = Color(0, 0, 0, 0) Label/colors/font_outline_modulate = Color(1, 0, 0, 1) Label/colors/label_box_bg = Color(0, 0, 0, 0.745098) Label/styles/normal = SubResource("1") -RichTextLabel/styles/focus = SubResource("2") -RichTextLabel/styles/normal = SubResource("3") +Panel/styles/panel = SubResource("StyleBoxFlat_yu8vd") diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/types/avatar.gd.uid b/addons/escoria-ui-return-monkey-island-dialog-simple/types/avatar.gd.uid index a2aa2f2a..8b66ed81 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/types/avatar.gd.uid +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/types/avatar.gd.uid @@ -1 +1 @@ -uid://yv6l5iarc1ki +uid://cfkvypxfuu2mt diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd b/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd index 4c93d934..e222cdec 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd @@ -1,5 +1,5 @@ -# A dialog UI using a label above the head of the character -extends RichTextLabel +# A dialog GUI showing a dialog box and character portraits +extends Window # Signal emitted when text has been said @@ -22,7 +22,6 @@ var _reading_speed_in_wpm: int # Used to extract words from lines of text. var _word_regex: RegEx = RegEx.new() - # Current character speaking, to keep track of reference for animation purposes var _current_character @@ -33,18 +32,23 @@ var _is_speeding_up: bool = false var _current_line: String -# Tween node for text animation -@onready var tween: Tween3 = Tween3.new(self) - # The node showing the text -@onready var text_node: RichTextLabel = self +@onready var text_node = $TextureRect/MarginContainer/HSplitContainer/text + +# The tween node for text animations +@onready var tween: Tween3 = Tween3.new(self) # Whether the dialog manager is paused @onready var is_paused: bool = true var dialog_location_node = null -# Enable bbcode and catch the signal when a tween completed +@export var centered_text: bool + +var X_POSITION_OFFSET: int = -10 +var Y_POSITION_OFFSET: int = -20 + +# Build up the UI func _ready(): _text_time_per_character = ProjectSettings.get_setting( RTMISimpleDialogSettings.TEXT_TIME_PER_LETTER_MS @@ -96,7 +100,7 @@ func _ready(): _word_regex.compile("\\S+") - bbcode_enabled = true + text_node.bbcode_enabled = true tween.finished.connect(_on_dialog_line_typed.bind("", "")) @@ -108,18 +112,6 @@ func _ready(): _current_line = "" -func _process(delta): - if _current_character.is_inside_tree() and \ - is_instance_valid(dialog_location_node): - # Position the RichTextLabel on the character's dialog position, if any. - position = dialog_location_node.get_global_transform_with_canvas().origin - position.x -= size.x / 2 - - _account_for_margin_x() - - _account_for_margin_y() - - # Make a character say something # # #### Parameters @@ -154,9 +146,10 @@ func say(character: String, line: String) : var text_color = _current_character.dialog_color var text_color_html = text_color.to_html(false) - text_node.text = "[center][color=#" + text_color_html + "]" \ - .format([text_color_html]) + tr(line) + "[/color][center]" - + text_node.text = "[color=#" + text_color_html + "]" \ + .format([text_color_html]) + tr(line) + "[/color]" + if centered_text: + text_node.text = "[center]" + text_node.text + "[/center]" if _current_character.is_inside_tree() and \ is_instance_valid(dialog_location_node): position = dialog_location_node.get_global_transform_with_canvas().origin @@ -184,14 +177,12 @@ func say(character: String, line: String) : set_process(true) -# Called by the dialog player when user wants to finish dialogue fast. +# Called by the dialog player when the func speedup(): if not _is_speeding_up: _is_speeding_up = true var time_show_full_text = _fast_text_time_per_character / 1000 * len(_current_line) - tween.reset() - tween.interpolate_property(text_node, "visible_ratio", text_node.visible_ratio, 1.0, time_show_full_text, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) @@ -201,7 +192,6 @@ func speedup(): # Called by the dialog player when user wants to finish dialogue immediately. func finish(): tween.reset() - tween.interpolate_property(text_node, "visible_ratio", text_node.visible_ratio, 1.0, 0.0) tween.play() @@ -209,8 +199,11 @@ func finish(): # To be called if voice audio has finished. func voice_audio_finished(): - _stop_character_talking() + _stop_character_talking() + # Handler to deal with this node being removed +func _on_tree_exiting() -> void: + _stop_character_talking() # The dialog line was printed, start the waiting time and then finish # the dialog @@ -233,8 +226,11 @@ func _get_number_of_words() -> int: return _word_regex.search_all(text_node.get_text()).size() + # Ending the dialog func _on_dialog_finished(): + $Timer.stop() + # Only trigger to clear the text if we aren't limiting the clearing trigger to a click. if not ESCProjectSettingsManager.get_setting(RTMISimpleDialogSettings.CLEAR_TEXT_BY_CLICK_ONLY): say_finished.emit() @@ -244,28 +240,27 @@ func _on_dialog_finished(): func _on_paused(): if tween.is_running(): is_paused = true - visible = false tween.stop() # Handler managing resume notification from Escoria func _on_resumed(): if not tween.is_running(): + # We can't rely on "show()" to make an invisible popup reappear, as per the docs for + # CanvasItem. Instead, we need to use one of the popup_* methods. + if is_inside_tree(): + popup_centered() + is_paused = false - visible = true tween.resume() - - - # Handler to deal with this node being removed -func _on_tree_exiting() -> void: - _stop_character_talking() - - + func _stop_character_talking(): # Make the speaking item animation stop talking, if it is still alive if is_instance_valid(_current_character) and _current_character != null: _current_character.stop_talking() +func _on_tree_exited(): + queue_free() func _account_for_margin_x() -> void: if position.x < 0: @@ -275,7 +270,7 @@ func _account_for_margin_x() -> void: ProjectSettings.get("display/window/size/viewport_width") if screen_margin_x > 0: - position.x -= screen_margin_x + position.x -= screen_margin_x + X_POSITION_OFFSET func _account_for_margin_y() -> void: @@ -286,4 +281,4 @@ func _account_for_margin_y() -> void: ProjectSettings.get("display/window/size/viewport_height") if screen_margin_y > 0: - position.y -= screen_margin_y + position.y -= screen_margin_y + Y_POSITION_OFFSET diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.tscn b/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.tscn index f351a93a..603cfc00 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.tscn +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.tscn @@ -1,18 +1,47 @@ -[gd_scene load_steps=3 format=3 uid="uid://x2crry528c4o"] +[gd_scene load_steps=4 format=3 uid="uid://cp75ofyuetxux"] -[ext_resource type="Script" uid="uid://d12nyx86nlc6h" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd" id="1"] -[ext_resource type="Theme" uid="uid://dvwfrnya2nhxu" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/theme/dialog.tres" id="2"] +[ext_resource type="Script" uid="uid://bupgxuw37bw5t" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/types/floating.gd" id="1"] +[ext_resource type="Theme" uid="uid://dlo07cyfhpilq" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/theme.tres" id="2_f1tsx"] +[ext_resource type="Texture2D" uid="uid://cxdch2m3xopvy" path="res://addons/escoria-ui-return-monkey-island-dialog-simple/assets/dialog_box.svg" id="2_x8ib0"] -[node name="dialog_label" type="RichTextLabel"] -offset_right = 672.0 -offset_bottom = 97.0 -theme = ExtResource("2") -bbcode_enabled = true -text = "[center]Here be some text.[/center]" -text = "Here be some text." -fit_content_height = true +[node name="dialog_box" type="Window"] +transparent_bg = true +position = Vector2i(0, 36) +size = Vector2i(600, 150) +unresizable = true +borderless = true +transparent = true +popup_window = true script = ExtResource("1") -[node name="Tween" type="Tween" parent="."] - [node name="Timer" type="Timer" parent="."] + +[node name="TextureRect" type="TextureRect" parent="."] +offset_right = 597.0 +offset_bottom = 149.0 +texture = ExtResource("2_x8ib0") + +[node name="MarginContainer" type="MarginContainer" parent="TextureRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="HSplitContainer" type="HSplitContainer" parent="TextureRect/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 35 +dragger_visibility = 1 + +[node name="text" type="RichTextLabel" parent="TextureRect/MarginContainer/HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_f1tsx") +bbcode_enabled = true +text = "Here be some text" +justification_flags = 171 diff --git a/addons/escoria-ui-return-monkey-island/fonts/caslonantique.tres b/addons/escoria-ui-return-monkey-island/fonts/caslonantique.tres index e4dd0120..fc56b5d7 100644 --- a/addons/escoria-ui-return-monkey-island/fonts/caslonantique.tres +++ b/addons/escoria-ui-return-monkey-island/fonts/caslonantique.tres @@ -1,6 +1,6 @@ [gd_resource type="FontFile" load_steps=2 format=3 uid="uid://cne31d6e0513y"] -[ext_resource type="FontFile" uid="uid://v5cnd4d0uvv3" path="res://addons/escoria-ui-return-monkey-island/fonts/caslonantique.ttf" id="1"] +[ext_resource type="FontFile" uid="uid://dbuthr0652qv7" path="res://addons/escoria-ui-return-monkey-island/fonts/caslonantique.ttf" id="1"] [resource] fallbacks = Array[Font]([ExtResource("1")]) diff --git a/addons/escoria-ui-return-monkey-island/fonts/determination.ttf b/addons/escoria-ui-return-monkey-island/fonts/determination.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69e732bba7bd845586f1859239f0390692dd93aa GIT binary patch literal 150948 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 void: toggle_room_selector_visibility() if event is InputEventMouseMotion: - #_current_mouse_pos = get_global_mouse_position() # Escoria core _current_mouse_pos = get_viewport().get_mouse_position() update_tooltip_following_mouse_position(tooltip_node) - update_tooltip_following_mouse_position(tooltip2_node) @@ -274,8 +274,8 @@ func left_double_click_on_bg(position: Vector2) -> void: func element_focused(element_id: String) -> void: var target_obj = escoria.object_manager.get_object(element_id).node if target_obj is ESCItem or ESCItemWithTooltip: - $tooltip_layer/tooltip.set_target(target_obj.tooltip_name) - $tooltip_layer/tooltip.set_target_object(target_obj) + tooltip_node.set_target(target_obj.tooltip_name) + tooltip_node.set_target_object(target_obj) if is_instance_valid(last_target): last_target.get_component('outline').highlight(false) @@ -287,8 +287,8 @@ func element_focused(element_id: String) -> void: func element_unfocused() -> void: - $tooltip_layer/tooltip.set_target("") - $tooltip_layer/tooltip.set_target_object(null) + tooltip_node.set_target("") + tooltip_node.set_target_object(null) if(last_target != null): last_target.get_component('outline').highlight(false) last_target = null @@ -358,34 +358,37 @@ func right_click_on_inventory_item(inventory_item_global_id: String, event: Inpu + func inventory_item_focused(inventory_item_global_id: String) -> void: var target_obj = escoria.object_manager.get_object(inventory_item_global_id).node if target_obj is ESCItemWithTooltip: - #$tooltip_layer/tooltip.set_target(target_obj.action3_text) - $tooltip_layer/tooltip.set_target_object(target_obj) + tooltip_node.set_target_object(target_obj) + func inventory_item_unfocused() -> void: element_unfocused() func open_inventory(): - $CanvasLayer/ui/HBoxContainer/inventory_ui.show_inventory() + pass func close_inventory(): - $CanvasLayer/ui/HBoxContainer/inventory_ui.hide_inventory() + pass func hide_ui(): - $CanvasLayer/ui/HBoxContainer/inventory_ui.hide_ui() - $CanvasLayer/ui/HBoxContainer/inventory_ui.hide() - $CanvasLayer/ui.hide() - $dialog_layer.hide() + #inventory_ui.hide_ui() + #inventory_ui.hide() + #$game_layer.hide() + $game_layer.visible = false + #$dialog_layer.hide() func show_ui(): if escoria.room_manager.GLOBAL_CURRENT_SCENE != "turno_cocina_creditos": - $CanvasLayer/ui/HBoxContainer/inventory_ui.show() - $CanvasLayer/ui/HBoxContainer/inventory_ui.show_ui() - $CanvasLayer/ui.show() - $dialog_layer.show() + #inventory_ui.show() + #inventory_ui.show_ui() + #$ui_layer/game_ui.show() + #$dialog_layer.show() + $game_layer.show() func hide_main_menu(): @@ -448,7 +451,7 @@ func get_custom_data() -> Dictionary: # Update the tooltip position -func update_tooltip_following_mouse_position(tooltip: ESCRichTooltip): +func update_tooltip_following_mouse_position(tooltip: RTMIRichTooltip): if tooltip == null: return if(escoria.action_manager.current_tool == null): @@ -459,7 +462,7 @@ func update_tooltip_following_mouse_position(tooltip: ESCRichTooltip): set_tooltip_position("tooltip2", tooltip, tooltip.get_tooltip2_size(), tooltip.offset_from_cursor_action4) -func set_tooltip_position(nodeId: String, tooltip: ESCRichTooltip, size: Vector2, offset: Vector2): +func set_tooltip_position(nodeId: String, tooltip: RTMIRichTooltip, size: Vector2, offset: Vector2): var mouse_position = calculateMousePosition(size) var corrected_position = correctPosition(tooltip, size, mouse_position, offset) tooltip.get_node(nodeId).position = corrected_position @@ -474,7 +477,7 @@ func calculateMousePosition(size: Vector2): #return _current_mouse_pos - size return _current_mouse_pos -func correctPosition(tooltip: ESCRichTooltip, size: Vector2, mouse_position: Vector2, offset: Vector2): +func correctPosition(tooltip: RTMIRichTooltip, size: Vector2, mouse_position: Vector2, offset: Vector2): # clamp TOP if tooltip.tooltip_distance_to_edge_top(_current_mouse_pos) <= mouse_tooltip_margin: @@ -502,26 +505,26 @@ func _on_event_done(return_code: int, _event_name: String): Input.set_custom_mouse_cursor(null) # Show tooltips, they were hidden while performing action - $tooltip_layer/tooltip.show() + tooltip_node.show() func _on_MenuButton_pressed() -> void: pause_game() func get_video_player() -> Node: - return $CanvasLayer/video_player + return $menu_layer/video_player func play_video(video_file: String) -> void: hide_ui() clear_tooltip() - $CanvasLayer/video_player.visible = true - $CanvasLayer/video_player.play(video_file) + get_video_player().visible = true + get_video_player().play(video_file) # Clears the tooltip content (if an ESCTooltip node exists in UI) # MODIFIED FOR RTMIUI func clear_tooltip(): if tooltip_node != null: - (tooltip_node as ESCRichTooltip).clear() + (tooltip_node as RTMIRichTooltip).clear() func play_pause_music(): @@ -557,4 +560,4 @@ func _on_MusicButton_pressed(): func _on_translation_button_pressed() -> void: - $CanvasLayer/language_selector.show() + $menu_layer/language_selector.show() diff --git a/addons/escoria-ui-return-monkey-island/game.tscn b/addons/escoria-ui-return-monkey-island/game.tscn index 4e572902..4c6c4cbe 100644 --- a/addons/escoria-ui-return-monkey-island/game.tscn +++ b/addons/escoria-ui-return-monkey-island/game.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://bl50queikqfjc" path="res://addons/escoria-ui-return-monkey-island/inventory/inventory_ui.tscn" id="1"] [ext_resource type="Script" uid="uid://dfl7khtlretr7" path="res://addons/escoria-core/game/scenes/dialogs/esc_dialog_player.gd" id="2"] [ext_resource type="PackedScene" uid="uid://dmw5gicuenj53" path="res://addons/escoria-core/game/scenes/camera_player/camera.tscn" id="3"] -[ext_resource type="PackedScene" uid="uid://d2kogebvoxy51" path="res://addons/escoria-ui-return-monkey-island/esc_rich_tooltip.tscn" id="4"] +[ext_resource type="PackedScene" uid="uid://d2kogebvoxy51" path="res://addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.tscn" id="4"] [ext_resource type="Script" uid="uid://lkc4isk3g0rj" path="res://addons/escoria-ui-return-monkey-island/game.gd" id="5"] [ext_resource type="Texture2D" uid="uid://ce2rx8nm1s6gh" path="res://addons/escoria-ui-return-monkey-island/icons/music-double-note.svg" id="6"] [ext_resource type="Texture2D" uid="uid://d0ta8viehhtdj" path="res://addons/escoria-ui-return-monkey-island/icons/translation.svg" id="6_yfacq"] @@ -20,20 +20,32 @@ [ext_resource type="Texture2D" uid="uid://e2xk0aimdte" path="res://addons/escoria-ui-return-monkey-island/icons/music-double-note-disabled.svg" id="16"] [ext_resource type="PackedScene" uid="uid://c0066wpl3qky4" path="res://addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.tscn" id="19_we0hb"] -[node name="game" type="Node2D"] +[node name="game" type="Node2D" node_paths=PackedStringArray("inventory_ui", "rtmi_tooltip_node")] script = ExtResource("5") -main_menu = NodePath("CanvasLayer/main_menu") -pause_menu = NodePath("CanvasLayer/pause_menu") +inventory_ui = NodePath("game_layer/ui_layer/Inventory") +rtmi_tooltip_node = NodePath("game_layer/tooltip_layer/tooltip") +main_menu = NodePath("menu_layer/main_menu") +pause_menu = NodePath("menu_layer/pause_menu") mouse_tooltip_margin = 70.0 editor_debug_mode = 1 -ui_parent_control_node = NodePath("CanvasLayer/ui") [node name="camera" parent="." instance=ExtResource("3")] -[node name="tooltip_layer" type="CanvasLayer" parent="."] +[node name="game_layer" type="CanvasLayer" parent="."] + +[node name="dialog_layer" type="CanvasLayer" parent="game_layer"] +layer = 3 + +[node name="ESCDialogsPlayer" type="Control" parent="game_layer/dialog_layer"] +layout_mode = 3 +anchors_preset = 0 +theme = ExtResource("9") +script = ExtResource("2") + +[node name="tooltip_layer" type="CanvasLayer" parent="game_layer"] layer = 2 -[node name="tooltip" parent="tooltip_layer" instance=ExtResource("4")] +[node name="tooltip" parent="game_layer/tooltip_layer" instance=ExtResource("4")] z_index = 10 color = Color(1, 1, 1, 1) offset_from_cursor_action1 = Vector2(0, 60) @@ -42,50 +54,34 @@ offset_from_cursor_action3 = Vector2(0, 60) offset_from_cursor_action4 = Vector2(0, -20) debug_mode = true -[node name="dialog_layer" type="CanvasLayer" parent="."] -layer = 3 +[node name="ui_layer" type="CanvasLayer" parent="game_layer"] -[node name="ESCDialogsPlayer" type="Control" parent="dialog_layer"] -layout_mode = 3 -anchors_preset = 0 -theme = ExtResource("9") -script = ExtResource("2") +[node name="DevTools" type="PanelContainer" parent="game_layer/ui_layer"] +offset_top = 622.0 +offset_right = 40.0 +offset_bottom = 662.0 -[node name="CanvasLayer" type="CanvasLayer" parent="."] - -[node name="ui" type="Control" parent="CanvasLayer"] -layout_mode = 3 -anchor_top = 0.9 +[node name="Tools" type="PanelContainer" parent="game_layer/ui_layer"] +anchors_preset = 1 +anchor_left = 1.0 anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -26.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 +offset_left = -220.0 +offset_bottom = 84.0 +grow_horizontal = 0 theme = ExtResource("9") -[node name="menu_button" type="Control" parent="CanvasLayer/ui"] -anchors_preset = 0 -offset_left = 1245.0 -offset_top = -643.0 -offset_right = 1245.0 -offset_bottom = -643.0 -grow_horizontal = 2 -grow_vertical = 2 +[node name="MarginContainer" type="MarginContainer" parent="game_layer/ui_layer/Tools"] +layout_mode = 2 -[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/ui/menu_button"] -layout_mode = 0 -offset_left = -179.0 -offset_top = 33.0 -offset_right = 21.0 -offset_bottom = 103.0 -alignment = 1 +[node name="HBoxContainer2" type="HBoxContainer" parent="game_layer/ui_layer/Tools/MarginContainer"] +layout_mode = 2 -[node name="TranslationButton" type="TextureButton" parent="CanvasLayer/ui/menu_button/HBoxContainer"] +[node name="TranslationButton" type="TextureButton" parent="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2"] layout_mode = 2 texture_normal = ExtResource("6_yfacq") texture_hover = ExtResource("7_we0hb") -[node name="MusicButton" type="TextureButton" parent="CanvasLayer/ui/menu_button/HBoxContainer"] +[node name="MusicButton" type="TextureButton" parent="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2"] custom_minimum_size = Vector2(64, 0) layout_mode = 2 script = ExtResource("14") @@ -94,46 +90,39 @@ musicEnabledHoverTexture = ExtResource("13") musicDisabledTexture = ExtResource("16") musicDisabledHoverTexture = ExtResource("15") -[node name="MenuButton" type="TextureButton" parent="CanvasLayer/ui/menu_button/HBoxContainer"] +[node name="MenuButton" type="TextureButton" parent="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2"] layout_mode = 2 texture_normal = ExtResource("13_we0hb") texture_hover = ExtResource("14_parhr") -[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/ui"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 +[node name="Inventory" parent="game_layer/ui_layer" instance=ExtResource("1")] +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 anchor_bottom = 1.0 -offset_left = -2.0 -offset_top = -8.0 -offset_right = -2.0 -offset_bottom = -16.0 +offset_left = -640.0 +offset_top = -120.0 +offset_right = 640.0 +offset_bottom = 0.0 grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 +grow_vertical = 0 -[node name="Spacer" type="Control" parent="CanvasLayer/ui/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 +[node name="menu_layer" type="CanvasLayer" parent="."] +layer = 2 -[node name="inventory_ui" parent="CanvasLayer/ui/HBoxContainer" instance=ExtResource("1")] -layout_mode = 2 - -[node name="pause_menu" parent="CanvasLayer" instance=ExtResource("8")] -visible = false -theme = ExtResource("9") - -[node name="main_menu" parent="CanvasLayer" instance=ExtResource("7")] +[node name="pause_menu" parent="menu_layer" instance=ExtResource("8")] visible = false -[node name="video_player" parent="CanvasLayer" instance=ExtResource("12")] +[node name="main_menu" parent="menu_layer" instance=ExtResource("7")] visible = false -layout_mode = 3 -anchors_preset = 0 -[node name="language_selector" parent="CanvasLayer" instance=ExtResource("19_we0hb")] +[node name="video_player" parent="menu_layer" instance=ExtResource("12")] +visible = false -[connection signal="pressed" from="CanvasLayer/ui/menu_button/HBoxContainer/TranslationButton" to="." method="_on_translation_button_pressed"] -[connection signal="pressed" from="CanvasLayer/ui/menu_button/HBoxContainer/MusicButton" to="." method="_on_MusicButton_pressed"] -[connection signal="pressed" from="CanvasLayer/ui/menu_button/HBoxContainer/MenuButton" to="." method="_on_MenuButton_pressed"] +[node name="language_selector" parent="menu_layer" instance=ExtResource("19_we0hb")] +visible = false + +[connection signal="pressed" from="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2/TranslationButton" to="." method="_on_translation_button_pressed"] +[connection signal="pressed" from="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2/MusicButton" to="." method="_on_MusicButton_pressed"] +[connection signal="pressed" from="game_layer/ui_layer/Tools/MarginContainer/HBoxContainer2/MenuButton" to="." method="_on_MenuButton_pressed"] diff --git a/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd b/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd new file mode 100644 index 00000000..884d988d --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd @@ -0,0 +1,5 @@ +# The inventory representation of an ESC item if pickable (only used by +# the inventory components) +extends ESCInventoryButton +class_name RTMIInventoryButton + diff --git a/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd.uid b/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd.uid new file mode 100644 index 00000000..b220673f --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/inventory/esc_inventory_button.gd.uid @@ -0,0 +1 @@ +uid://dxqu8pi7p6vng diff --git a/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd b/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd new file mode 100644 index 00000000..7b47c4f2 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd @@ -0,0 +1,5 @@ +# Inventory container handler that acts as a base for UIs inventory containers +extends ESCInventoryContainer +class_name RTMIInventoryContainer + + diff --git a/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd.uid b/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd.uid new file mode 100644 index 00000000..fe17e284 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/inventory/inventory_container.gd.uid @@ -0,0 +1 @@ +uid://245b34c8nyex diff --git a/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.gd b/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.gd index a2c2b68b..c2ab70c4 100644 --- a/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.gd +++ b/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.gd @@ -7,26 +7,30 @@ var inventory_visible: bool = false func _ready() -> void: super._ready() - $FloatingInventory/panel.position.x = ProjectSettings.get_setting("display/window/size/viewport_width") - $FloatingInventory/panel.size.x + #$FloatingInventory/panel.position.x = ProjectSettings.get_setting("display/window/size/viewport_width") - $FloatingInventory/panel.size.x func show_inventory(): - $FloatingInventory/panel.show() + #$FloatingInventory/panel.show() + self.show() inventory_visible = true func hide_inventory(): - $FloatingInventory/panel.hide() + #$FloatingInventory/panel.hide() + self.hide() inventory_visible = false func show_ui(): - $FloatingInventory/inventory_bg.show() - $FloatingInventory/panel/MarginContainer/ScrollContainer/container.show() + #$FloatingInventory/inventory_bg.show() + #$FloatingInventory/panel/MarginContainer/ScrollContainer/container.show() + self.show() inventory_visible = true func hide_ui(): - $FloatingInventory/inventory_bg.hide() - $FloatingInventory/panel/MarginContainer/ScrollContainer/container.hide() + self.hide() + #$FloatingInventory/inventory_bg.hide() + #$FloatingInventory/panel/MarginContainer/ScrollContainer/container.hide() inventory_visible = false diff --git a/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.tscn b/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.tscn index 76f25f32..ac6f54d8 100644 --- a/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.tscn +++ b/addons/escoria-ui-return-monkey-island/inventory/inventory_ui.tscn @@ -1,67 +1,23 @@ -[gd_scene load_steps=3 format=3 uid="uid://bl50queikqfjc"] +[gd_scene load_steps=4 format=3 uid="uid://bl50queikqfjc"] [ext_resource type="Script" uid="uid://1hedqas3odoy" path="res://addons/escoria-ui-return-monkey-island/inventory/inventory_ui.gd" id="1"] +[ext_resource type="Theme" uid="uid://23n73qci0qc3" path="res://addons/escoria-ui-return-monkey-island/theme/inventory_ui.tres" id="1_a1nc4"] [ext_resource type="Script" uid="uid://c4syt26p7mg66" path="res://addons/escoria-core/ui_library/inventory/esc_inventory_container.gd" id="3"] -[node name="inventory_ui" type="Control"] -custom_minimum_size = Vector2(90, 90) -layout_mode = 3 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_right = 768.0 -offset_bottom = 540.0 -scale = Vector2(0.4, 0.4) -size_flags_horizontal = 0 -size_flags_vertical = 3 +[node name="Inventory" type="PanelContainer"] +offset_right = 1280.0 +offset_bottom = 120.0 +theme = ExtResource("1_a1nc4") script = ExtResource("1") -inventory_ui_container = NodePath("FloatingInventory/panel/MarginContainer/ScrollContainer/container") +inventory_ui_container = NodePath("MarginContainer/ScrollContainer/container") -[node name="FloatingInventory" type="CanvasLayer" parent="."] - -[node name="inventory_bg" type="Polygon2D" parent="FloatingInventory"] -position = Vector2(0, -16) -color = Color(0.156863, 0.0627451, 0, 1) -polygon = PackedVector2Array(-3, 578, 1280, 578, 1280, 752, -3, 757) - -[node name="panel" type="TextureRect" parent="FloatingInventory"] -custom_minimum_size = Vector2(0, 160) -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -1276.0 -offset_top = -160.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -expand_mode = 1 - -[node name="MarginContainer" type="MarginContainer" parent="FloatingInventory/panel"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -4.0 -offset_top = 2.0 -offset_right = -16.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/margin_left = 20 -theme_override_constants/margin_top = 20 -theme_override_constants/margin_right = 20 -theme_override_constants/margin_bottom = 20 - -[node name="ScrollContainer" type="ScrollContainer" parent="FloatingInventory/panel/MarginContainer"] +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer"] layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 6 vertical_scroll_mode = 0 -[node name="container" type="HBoxContainer" parent="FloatingInventory/panel/MarginContainer/ScrollContainer"] +[node name="container" type="HBoxContainer" parent="MarginContainer/ScrollContainer"] layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 20 script = ExtResource("3") diff --git a/addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.tscn b/addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.tscn index 19e88453..4351c660 100644 --- a/addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.tscn +++ b/addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://c0066wpl3qky4"] +[gd_scene load_steps=5 format=3 uid="uid://c0066wpl3qky4"] [ext_resource type="Script" uid="uid://bb2dncmckwtj2" path="res://addons/escoria-ui-return-monkey-island/menus/language_selector/language_selector.gd" id="1_rfy64"] +[ext_resource type="Theme" uid="uid://djtwqnfbbt5t8" path="res://addons/escoria-ui-return-monkey-island/theme/menu.tres" id="1_ygmpa"] [ext_resource type="Texture2D" uid="uid://d0ta8viehhtdj" path="res://addons/escoria-ui-return-monkey-island/icons/translation.svg" id="2_502ci"] [ext_resource type="Theme" uid="uid://dvpaon5mw2w8l" path="res://addons/escoria-ui-return-monkey-island/theme.tres" id="2_jw4w0"] @@ -12,6 +13,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_ygmpa") script = ExtResource("1_rfy64") [node name="Panel" type="Panel" parent="."] diff --git a/addons/escoria-ui-return-monkey-island/menus/main_menu/main_menu.tscn b/addons/escoria-ui-return-monkey-island/menus/main_menu/main_menu.tscn index 6f63eebd..a75e98d4 100644 --- a/addons/escoria-ui-return-monkey-island/menus/main_menu/main_menu.tscn +++ b/addons/escoria-ui-return-monkey-island/menus/main_menu/main_menu.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=7 format=3 uid="uid://d3wdxi18u52c5"] +[gd_scene load_steps=8 format=3 uid="uid://d3wdxi18u52c5"] [ext_resource type="Script" uid="uid://cnlvmkxk41x6j" path="res://addons/escoria-ui-return-monkey-island/menus/main_menu/main_menu.gd" id="1"] +[ext_resource type="Theme" uid="uid://djtwqnfbbt5t8" path="res://addons/escoria-ui-return-monkey-island/theme/menu.tres" id="1_6gi1c"] [ext_resource type="Script" uid="uid://bfi05b2x5srm2" path="res://addons/escoria-ui-return-monkey-island/menus/RTMIMenuButtonWithSaveFeature.gd" id="2"] [ext_resource type="Texture2D" uid="uid://bgfi7t6khinjw" path="res://gymkhana/logo-small.png" id="3"] [ext_resource type="PackedScene" uid="uid://csxvnrljbqkr8" path="res://addons/escoria-ui-return-monkey-island/menus/options/options.tscn" id="4"] @@ -14,6 +15,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_6gi1c") script = ExtResource("1") [node name="load_game" parent="." instance=ExtResource("5")] @@ -41,7 +43,7 @@ anchor_right = 0.5 anchor_bottom = 1.0 offset_left = -308.0 offset_right = 308.0 -theme_override_constants/separation = 100 +theme_override_constants/separation = 50 alignment = 1 [node name="TextureRect" type="TextureRect" parent="main/main"] @@ -60,16 +62,19 @@ text = "NEW_GAME" script = ExtResource("5_4i6cp") [node name="load_game" type="Button" parent="main/main/buttons"] +custom_minimum_size = Vector2(0, 40) layout_mode = 2 text = "LOAD_GAME" script = ExtResource("2") [node name="options" type="Button" parent="main/main/buttons"] +custom_minimum_size = Vector2(0, 40) layout_mode = 2 text = "OPTIONS" script = ExtResource("5_4i6cp") [node name="quit" type="Button" parent="main/main/buttons"] +custom_minimum_size = Vector2(0, 40) layout_mode = 2 text = "QUIT" script = ExtResource("5_4i6cp") diff --git a/addons/escoria-ui-return-monkey-island/menus/options/options.tscn b/addons/escoria-ui-return-monkey-island/menus/options/options.tscn index 891a5808..43d000dd 100644 --- a/addons/escoria-ui-return-monkey-island/menus/options/options.tscn +++ b/addons/escoria-ui-return-monkey-island/menus/options/options.tscn @@ -1,156 +1,113 @@ -[gd_scene load_steps=3 format=3 uid="uid://csxvnrljbqkr8"] +[gd_scene load_steps=4 format=3 uid="uid://csxvnrljbqkr8"] -[ext_resource type="Texture2D" uid="uid://srnd5fwltb6k" path="res://addons/escoria-ui-return-monkey-island/menus/options/flags/de.png" id="1"] +[ext_resource type="Texture2D" uid="uid://yckfhmbqy4gy" path="res://addons/escoria-ui-return-monkey-island/menus/options/flags/de.png" id="1"] +[ext_resource type="Theme" uid="uid://djtwqnfbbt5t8" path="res://addons/escoria-ui-return-monkey-island/theme/menu.tres" id="1_h0rhj"] [ext_resource type="Script" uid="uid://bjl2eag8hh30h" path="res://addons/escoria-ui-return-monkey-island/menus/options/options.gd" id="4"] [node name="options" type="Control"] +layout_mode = 3 +anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +theme = ExtResource("1_h0rhj") script = ExtResource("4") [node name="Panel" type="Panel" parent="."] +layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { -"_editor_description_": "" -} [node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 alignment = 1 [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] -offset_left = 391.0 -offset_top = 241.0 -offset_right = 888.0 -offset_bottom = 484.0 +layout_mode = 2 size_flags_horizontal = 6 -theme_override_constants/margin_right = 20 -theme_override_constants/margin_top = 20 theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 theme_override_constants/margin_bottom = 20 [node name="options" type="GridContainer" parent="VBoxContainer/MarginContainer"] -offset_left = 20.0 -offset_top = 20.0 -offset_right = 477.0 -offset_bottom = 223.0 +layout_mode = 2 size_flags_vertical = 6 theme_override_constants/h_separation = 40 columns = 2 -__meta__ = { -"_edit_use_anchors_": false -} [node name="label" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 30.0 -offset_right = 137.0 -offset_bottom = 44.0 +layout_mode = 2 text = "OPTIONS_LANGUAGE" [node name="flags" type="HBoxContainer" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_right = 457.0 -offset_bottom = 75.0 +layout_mode = 2 size_flags_vertical = 3 theme_override_constants/separation = 30 alignment = 1 [node name="TextureRect2" type="TextureRect" parent="VBoxContainer/MarginContainer/options/flags"] -offset_right = 125.0 -offset_bottom = 75.0 +layout_mode = 2 texture = ExtResource("1") [node name="TextureRect3" type="TextureRect" parent="VBoxContainer/MarginContainer/options/flags"] -offset_left = 155.0 -offset_right = 280.0 -offset_bottom = 75.0 +layout_mode = 2 texture = ExtResource("1") [node name="label2" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 80.0 -offset_right = 137.0 -offset_bottom = 94.0 +layout_mode = 2 text = "GENERAL_VOLUME" [node name="general_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 79.0 -offset_right = 457.0 -offset_bottom = 95.0 +layout_mode = 2 size_flags_horizontal = 3 max_value = 1.0 step = 0.001 [node name="label3" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 100.0 -offset_right = 137.0 -offset_bottom = 114.0 +layout_mode = 2 text = "SOUND_VOLUME" [node name="sound_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 99.0 -offset_right = 457.0 -offset_bottom = 115.0 +layout_mode = 2 size_flags_horizontal = 3 max_value = 1.0 step = 0.001 [node name="label4" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 120.0 -offset_right = 137.0 -offset_bottom = 134.0 +layout_mode = 2 text = "MUSIC_VOLUME" [node name="music_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 119.0 -offset_right = 457.0 -offset_bottom = 135.0 +layout_mode = 2 size_flags_horizontal = 3 max_value = 1.0 step = 0.001 [node name="label5" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 140.0 -offset_right = 137.0 -offset_bottom = 154.0 +layout_mode = 2 text = "SPEECH_VOLUME" [node name="speech_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 139.0 -offset_right = 457.0 -offset_bottom = 155.0 +layout_mode = 2 size_flags_horizontal = 3 max_value = 1.0 step = 0.001 [node name="label6" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 164.0 -offset_right = 137.0 -offset_bottom = 178.0 +layout_mode = 2 text = "FULLSCREEN" [node name="fullscreen" type="CheckBox" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 159.0 -offset_right = 457.0 -offset_bottom = 183.0 +layout_mode = 2 [node name="label7" type="Label" parent="VBoxContainer/MarginContainer/options"] -offset_top = 188.0 -offset_right = 137.0 -offset_bottom = 202.0 +layout_mode = 2 text = "SPEECH_SPEED" [node name="speech_speed" type="HSlider" parent="VBoxContainer/MarginContainer/options"] -offset_left = 177.0 -offset_top = 187.0 -offset_right = 457.0 -offset_bottom = 203.0 +layout_mode = 2 size_flags_horizontal = 3 min_value = 10.0 max_value = 400.0 @@ -158,29 +115,17 @@ step = 10.0 value = 200.0 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] -offset_top = 488.0 -offset_right = 1280.0 -offset_bottom = 508.0 +layout_mode = 2 theme_override_constants/separation = 20 alignment = 1 [node name="back" type="Button" parent="VBoxContainer/HBoxContainer"] -offset_left = 549.0 -offset_right = 660.0 -offset_bottom = 20.0 +layout_mode = 2 text = "OPTIONS_BACK" -__meta__ = { -"_edit_use_anchors_": false -} [node name="apply" type="Button" parent="VBoxContainer/HBoxContainer"] -offset_left = 680.0 -offset_right = 731.0 -offset_bottom = 20.0 +layout_mode = 2 text = "APPLY" -__meta__ = { -"_edit_use_anchors_": false -} [connection signal="value_changed" from="VBoxContainer/MarginContainer/options/general_volume" to="." method="_on_general_volume_changed"] [connection signal="value_changed" from="VBoxContainer/MarginContainer/options/sound_volume" to="." method="_on_sound_volume_changed"] diff --git a/addons/escoria-ui-return-monkey-island/menus/pause_menu/pause_menu.tscn b/addons/escoria-ui-return-monkey-island/menus/pause_menu/pause_menu.tscn index 5ece9fe3..12a0b1ec 100644 --- a/addons/escoria-ui-return-monkey-island/menus/pause_menu/pause_menu.tscn +++ b/addons/escoria-ui-return-monkey-island/menus/pause_menu/pause_menu.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=8 format=3 uid="uid://dl7w8oqk1rmhw"] +[gd_scene load_steps=9 format=3 uid="uid://dl7w8oqk1rmhw"] [ext_resource type="Script" uid="uid://ctu22fcrvjv4t" path="res://addons/escoria-ui-return-monkey-island/menus/pause_menu/pause_menu.gd" id="1"] +[ext_resource type="Theme" uid="uid://djtwqnfbbt5t8" path="res://addons/escoria-ui-return-monkey-island/theme/menu.tres" id="1_e0gqa"] [ext_resource type="PackedScene" uid="uid://csxvnrljbqkr8" path="res://addons/escoria-ui-return-monkey-island/menus/options/options.tscn" id="2"] [ext_resource type="Texture2D" uid="uid://bgfi7t6khinjw" path="res://gymkhana/logo-small.png" id="3"] [ext_resource type="PackedScene" uid="uid://cj440t8pub603" path="res://addons/escoria-core/ui_library/menus/load_save/save/save_game.tscn" id="4"] @@ -15,6 +16,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_e0gqa") script = ExtResource("1") [node name="Panel" type="Panel" parent="."] @@ -33,6 +35,8 @@ layout_mode = 1 [node name="options" parent="." instance=ExtResource("2")] visible = false anchors_preset = 0 +anchor_right = 0.0 +anchor_bottom = 0.0 [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -46,49 +50,54 @@ offset_right = 308.0 offset_bottom = 44.0 grow_horizontal = 2 grow_vertical = 2 -scale = Vector2(0.92, 0.92) -theme_override_constants/separation = 100 +theme_override_constants/separation = 16 alignment = 1 [node name="TextureRect" type="TextureRect" parent="VBoxContainer"] layout_mode = 2 texture = ExtResource("3") +stretch_mode = 3 [node name="menuitems" type="VBoxContainer" parent="VBoxContainer"] layout_mode = 2 theme_override_constants/separation = 10 [node name="continue" type="Button" parent="VBoxContainer/menuitems"] -custom_minimum_size = Vector2(0, 150) +custom_minimum_size = Vector2(0, 120) layout_mode = 2 size_flags_vertical = 3 text = "CONTINUE_GAME" script = ExtResource("6_31lra") [node name="new_game" type="Button" parent="VBoxContainer/menuitems"] +custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_vertical = 3 text = "NEW_GAME" script = ExtResource("6_31lra") [node name="save_game" type="Button" parent="VBoxContainer/menuitems"] +custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_vertical = 3 text = "SAVE_GAME" script = ExtResource("7_e0gqa") [node name="load_game" type="Button" parent="VBoxContainer/menuitems"] +custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_vertical = 3 text = "LOAD_GAME" script = ExtResource("7_e0gqa") [node name="options" type="Button" parent="VBoxContainer/menuitems"] +custom_minimum_size = Vector2(0, 30) layout_mode = 2 text = "OPTIONS" script = ExtResource("6_31lra") [node name="quit" type="Button" parent="VBoxContainer/menuitems"] +custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_vertical = 3 text = "QUIT" diff --git a/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd b/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd index e1f8c7d0..30ba6e73 100644 --- a/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd +++ b/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd @@ -2,6 +2,8 @@ extends ESCInventoryItem class_name RTMIESCInventoryItem +var shader = preload("res://addons/escoria-ui-return-monkey-island/shaders/shadermaterial_outline_green5px.tres") + func _init(p_item: ESCItem) -> void: super._init(p_item) escoria.logger.info(self, "RTMIESCInventoryItem") @@ -10,3 +12,5 @@ func _init(p_item: ESCItem) -> void: texture_hovered = p_item._get_inventory_texture_hovered() if p_item is ESCItemWithTooltip: p_item.register_components() + p_item.hover_enabled = true + p_item.material = shader diff --git a/addons/escoria-ui-return-monkey-island/overrides/inventory_item.gd.uid b/addons/escoria-ui-return-monkey-island/overrides/inventory_item.gd.uid new file mode 100644 index 00000000..02ef48a3 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/overrides/inventory_item.gd.uid @@ -0,0 +1 @@ +uid://27e4yrrk30dp diff --git a/addons/escoria-ui-return-monkey-island/esc_rich_tooltip.gd b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd similarity index 99% rename from addons/escoria-ui-return-monkey-island/esc_rich_tooltip.gd rename to addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd index 1e125929..395fa62a 100644 --- a/addons/escoria-ui-return-monkey-island/esc_rich_tooltip.gd +++ b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd @@ -1,7 +1,7 @@ @tool # A tooltip displaying [] extends Node2D -class_name ESCRichTooltip +class_name RTMIRichTooltip # Maximum width of the label diff --git a/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd.uid b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd.uid new file mode 100644 index 00000000..a399ddd2 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd.uid @@ -0,0 +1 @@ +uid://b7sdsky8ovx75 diff --git a/addons/escoria-ui-return-monkey-island/esc_rich_tooltip.tscn b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.tscn similarity index 95% rename from addons/escoria-ui-return-monkey-island/esc_rich_tooltip.tscn rename to addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.tscn index df06cfdf..94c477a6 100644 --- a/addons/escoria-ui-return-monkey-island/esc_rich_tooltip.tscn +++ b/addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=5 format=3 uid="uid://d2kogebvoxy51"] -[ext_resource type="Script" uid="uid://bbf2w51korm6e" path="res://addons/escoria-ui-return-monkey-island/esc_rich_tooltip.gd" id="1"] +[ext_resource type="Script" uid="uid://bbf2w51korm6e" path="res://addons/escoria-ui-return-monkey-island/rtmi_rich_tooltip.gd" id="1"] [ext_resource type="Texture2D" uid="uid://cv545ye40v70b" path="res://addons/escoria-ui-return-monkey-island/cursors/rounded_mouse_right.png" id="2"] [ext_resource type="Texture2D" uid="uid://naf4ovsgrbyp" path="res://addons/escoria-ui-return-monkey-island/cursors/rounded_mouse_left.png" id="3"] [ext_resource type="Theme" uid="uid://bf2eet52fueam" path="res://addons/escoria-ui-return-monkey-island/theme/ui.tres" id="4"] diff --git a/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader b/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader new file mode 100644 index 00000000..a9250596 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader @@ -0,0 +1,64 @@ +// Source : https://godotshaders.com/shader/2d-outline-inline/ + +shader_type canvas_item; + +uniform vec4 color : source_color = vec4(1.0); +uniform float width : hint_range(0, 10) = 1.0; +uniform int pattern : hint_range(0, 2) = 0; // diamond, circle, square +uniform bool inside = false; +uniform bool add_margins = true; // only useful when inside is false + +void vertex() { + if (add_margins) { + VERTEX += (UV * 2.0 - 1.0) * width; + } +} + +bool hasContraryNeighbour(vec2 uv, vec2 texture_pixel_size, sampler2D texture) { + for (float i = -ceil(width); i <= ceil(width); i++) { + float x = abs(i) > width ? width * sign(i) : i; + float offset; + + if (pattern == 0) { + offset = width - abs(x); + } else if (pattern == 1) { + offset = floor(sqrt(pow(width + 0.5, 2) - x * x)); + } else if (pattern == 2) { + offset = width; + } + + for (float j = -ceil(offset); j <= ceil(offset); j++) { + float y = abs(j) > offset ? offset * sign(j) : j; + vec2 xy = uv + texture_pixel_size * vec2(x, y); + + if ((xy != clamp(xy, vec2(0.0), vec2(1.0)) || texture(texture, xy).a <= 0.0) == inside) { + return true; + } + } + } + + return false; +} + +void fragment() { + vec2 uv = UV; + + if (add_margins) { + vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(width * 2.0)); + + uv = (uv - texture_pixel_size * width) * TEXTURE_PIXEL_SIZE / texture_pixel_size; + + if (uv != clamp(uv, vec2(0.0), vec2(1.0))) { + COLOR.a = 0.0; + } else { + COLOR = texture(TEXTURE, uv); + } + } else { + COLOR = texture(TEXTURE, uv); + } + + if ((COLOR.a > 0.0) == inside && hasContraryNeighbour(uv, TEXTURE_PIXEL_SIZE, TEXTURE)) { + COLOR.rgb = inside ? mix(COLOR.rgb, color.rgb, color.a) : color.rgb; + COLOR.a += (1.0 - COLOR.a) * color.a; + } +} \ No newline at end of file diff --git a/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader.uid b/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader.uid new file mode 100644 index 00000000..b3f146ff --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/shaders/outline.gdshader.uid @@ -0,0 +1 @@ +uid://crapjow6genqs diff --git a/addons/escoria-ui-return-monkey-island/shaders/shadermaterial_outline_green5px.tres b/addons/escoria-ui-return-monkey-island/shaders/shadermaterial_outline_green5px.tres new file mode 100644 index 00000000..990819cb --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/shaders/shadermaterial_outline_green5px.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://bredlcniiy5bp"] + +[ext_resource type="Shader" uid="uid://crapjow6genqs" path="res://addons/escoria-ui-return-monkey-island/shaders/outline.gdshader" id="1_2bktm"] + +[resource] +shader = ExtResource("1_2bktm") +shader_parameter/color = Color(0, 1, 0, 1) +shader_parameter/width = 5.0 +shader_parameter/pattern = 0 +shader_parameter/inside = false +shader_parameter/add_margins = true diff --git a/addons/escoria-ui-return-monkey-island/theme/inventory_ui.tres b/addons/escoria-ui-return-monkey-island/theme/inventory_ui.tres new file mode 100644 index 00000000..91d59002 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island/theme/inventory_ui.tres @@ -0,0 +1,11 @@ +[gd_resource type="Theme" load_steps=2 format=3 uid="uid://23n73qci0qc3"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3hnbv"] +bg_color = Color(0.173269, 0.0886366, 0, 1) + +[resource] +MarginContainer/constants/margin_bottom = 15 +MarginContainer/constants/margin_left = 15 +MarginContainer/constants/margin_right = 15 +MarginContainer/constants/margin_top = 15 +PanelContainer/styles/panel = SubResource("StyleBoxFlat_3hnbv") diff --git a/addons/escoria-ui-return-monkey-island/theme/menu.tres b/addons/escoria-ui-return-monkey-island/theme/menu.tres index b526cc61..b54e4198 100644 --- a/addons/escoria-ui-return-monkey-island/theme/menu.tres +++ b/addons/escoria-ui-return-monkey-island/theme/menu.tres @@ -1,4 +1,6 @@ -[gd_resource type="Theme" load_steps=4 format=3 uid="uid://djtwqnfbbt5t8"] +[gd_resource type="Theme" load_steps=7 format=3 uid="uid://djtwqnfbbt5t8"] + +[ext_resource type="FontFile" uid="uid://vqqxktsw0f34" path="res://addons/escoria-ui-return-monkey-island/fonts/determination.ttf" id="1_p03cv"] [sub_resource type="StyleBoxFlat" id="1"] bg_color = Color(0.14902, 0.14902, 0.14902, 0.784314) @@ -8,9 +10,25 @@ bg_color = Color(0.285156, 0.285156, 0.285156, 0.784314) [sub_resource type="StyleBoxFlat" id="3"] bg_color = Color(0.027451, 0.027451, 0.027451, 0.745098) +expand_margin_left = 2.0 +expand_margin_top = 2.0 +expand_margin_right = 2.0 +expand_margin_bottom = 2.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_p03cv"] +bg_color = Color(0.219501, 0.219501, 0.219501, 1) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_p03cv"] [resource] +Button/fonts/font = ExtResource("1_p03cv") Button/styles/focus = SubResource("1") Button/styles/hover = SubResource("2") Button/styles/normal = SubResource("1") Button/styles/pressed = SubResource("3") +MarginContainer/constants/margin_bottom = 5 +MarginContainer/constants/margin_left = 5 +MarginContainer/constants/margin_right = 5 +MarginContainer/constants/margin_top = 5 +Panel/styles/panel = SubResource("StyleBoxFlat_p03cv") +PanelContainer/styles/panel = SubResource("StyleBoxEmpty_p03cv") diff --git a/addons/escoria-ui-return-monkey-island/theme/ui.tres b/addons/escoria-ui-return-monkey-island/theme/ui.tres index 2c9f5660..3f577ff2 100644 --- a/addons/escoria-ui-return-monkey-island/theme/ui.tres +++ b/addons/escoria-ui-return-monkey-island/theme/ui.tres @@ -1,4 +1,8 @@ -[gd_resource type="Theme" load_steps=4 format=3 uid="uid://bf2eet52fueam"] +[gd_resource type="Theme" load_steps=7 format=3 uid="uid://bf2eet52fueam"] + +[ext_resource type="FontFile" uid="uid://vqqxktsw0f34" path="res://addons/escoria-ui-return-monkey-island/fonts/determination.ttf" id="1_6h504"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6h504"] [sub_resource type="StyleBoxFlat" id="1"] content_margin_left = 4.0 @@ -10,6 +14,8 @@ corner_radius_top_right = 5 corner_radius_bottom_right = 5 expand_margin_left = 19.0 +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6h504"] + [sub_resource type="StyleBoxFlat" id="2"] bg_color = Color(0, 0, 0, 0.509804) corner_radius_top_left = 5 @@ -29,10 +35,20 @@ expand_margin_right = 5.0 expand_margin_bottom = 5.0 [resource] +Button/fonts/font = ExtResource("1_6h504") +Button/styles/hover = SubResource("StyleBoxFlat_6h504") Label/colors/font_color = Color(1, 1, 1, 1) Label/colors/font_color_shadow = Color(0, 0, 0, 0) Label/colors/font_outline_modulate = Color(1, 0, 0, 1) Label/colors/label_box_bg = Color(0, 0, 0, 0.745098) +Label/fonts/font = ExtResource("1_6h504") Label/styles/normal = SubResource("1") +MarginContainer/constants/margin_bottom = 5 +MarginContainer/constants/margin_left = 5 +MarginContainer/constants/margin_right = 5 +MarginContainer/constants/margin_top = 5 +PanelContainer/styles/panel = SubResource("StyleBoxEmpty_6h504") +RichTextLabel/fonts/mono_font = ExtResource("1_6h504") +RichTextLabel/fonts/normal_font = ExtResource("1_6h504") RichTextLabel/styles/focus = SubResource("2") RichTextLabel/styles/normal = SubResource("3") diff --git a/addons/escoria-ui-return-monkey-island/video_player/video_player.tscn b/addons/escoria-ui-return-monkey-island/video_player/video_player.tscn index ba2961f5..4941122f 100644 --- a/addons/escoria-ui-return-monkey-island/video_player/video_player.tscn +++ b/addons/escoria-ui-return-monkey-island/video_player/video_player.tscn @@ -1,39 +1,52 @@ [gd_scene load_steps=5 format=3 uid="uid://ctg3fukoficqk"] [ext_resource type="Script" uid="uid://ckl3iy3v3v68s" path="res://addons/escoria-ui-return-monkey-island/video_player/video_player.gd" id="1"] -[ext_resource type="Theme" uid="uid://djtwqnfbbt5t8" path="res://gymkhana.tres" id="2"] +[ext_resource type="Theme" uid="uid://bf2eet52fueam" path="res://addons/escoria-ui-return-monkey-island/theme/ui.tres" id="1_384st"] [sub_resource type="VideoStreamTheora" id="1"] [sub_resource type="Shortcut" id="3"] [node name="video_player" type="Control"] -offset_right = 1285.0 -offset_bottom = 753.0 +layout_mode = 3 +anchors_preset = 0 +offset_right = 1280.0 +offset_bottom = 720.0 +theme = ExtResource("1_384st") script = ExtResource("1") [node name="ColorRect" type="ColorRect" parent="."] -offset_left = -11.0 -offset_top = -3.0 -offset_right = 1285.0 -offset_bottom = 766.0 +layout_mode = 0 +offset_right = 1280.0 +offset_bottom = 720.0 color = Color(0, 0, 0, 1) [node name="VideoStreamPlayer" type="VideoStreamPlayer" parent="."] -offset_right = 1279.0 -offset_bottom = 771.0 +layout_mode = 0 +offset_right = 1280.0 +offset_bottom = 720.0 stream = SubResource("1") -expand = false -[node name="Skip" type="Button" parent="."] -offset_left = 1163.0 -offset_top = 680.0 -offset_right = 1250.0 -offset_bottom = 712.0 -theme = ExtResource("2") -shortcut_in_tooltip = false +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -125.0 +offset_top = -40.0 +grow_horizontal = 0 +grow_vertical = 0 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] +layout_mode = 2 + +[node name="Skip" type="Button" parent="PanelContainer/MarginContainer"] +layout_mode = 2 shortcut = SubResource("3") +shortcut_in_tooltip = false text = "Saltar video" [connection signal="finished" from="VideoStreamPlayer" to="." method="_on_VideoPlayer_finished"] -[connection signal="pressed" from="Skip" to="." method="_on_Skip_pressed"] +[connection signal="pressed" from="PanelContainer/MarginContainer/Skip" to="." method="_on_Skip_pressed"] diff --git a/gymkhana/characters/eneko/eneko_smoking.tscn b/gymkhana/characters/eneko/eneko_smoking.tscn index 774b6f46..e48407ab 100644 --- a/gymkhana/characters/eneko/eneko_smoking.tscn +++ b/gymkhana/characters/eneko/eneko_smoking.tscn @@ -2,23 +2,23 @@ [ext_resource type="Resource" uid="uid://c4lhcwvjqx5ty" path="res://gymkhana/characters/eneko/eneko_smoking_animatios.tres" id="1"] [ext_resource type="Script" uid="uid://clg4yrj7v7eae" path="res://addons/escoria-ui-return-monkey-island/esc_player_with_tooltip.gd" id="2"] -[ext_resource type="Texture2D" uid="uid://d3llwr16eq05e" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-005.png" id="4"] -[ext_resource type="Texture2D" uid="uid://bfsccuoj7pmbf" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-002.png" id="5"] -[ext_resource type="Texture2D" uid="uid://dttlqbxpeqwi2" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-003.png" id="6"] -[ext_resource type="Texture2D" uid="uid://cms1wfpspj3lm" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-001.png" id="7"] -[ext_resource type="Texture2D" uid="uid://dvn6aneqx6ki4" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-010.png" id="8"] -[ext_resource type="Texture2D" uid="uid://c3oauyuv2m63f" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-016.png" id="9"] -[ext_resource type="Texture2D" uid="uid://dj3afybpcing3" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-009.png" id="10"] -[ext_resource type="Texture2D" uid="uid://b2fp3wx3yc4ac" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-008.png" id="11"] -[ext_resource type="Texture2D" uid="uid://dc18o6ownjk4f" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-012.png" id="12"] -[ext_resource type="Texture2D" uid="uid://cwaa6byg1k8jp" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-013.png" id="13"] -[ext_resource type="Texture2D" uid="uid://b8dkc8xtqe4sh" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-004.png" id="14"] -[ext_resource type="Texture2D" uid="uid://bhj0jj26o1v24" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-006.png" id="15"] -[ext_resource type="Texture2D" uid="uid://cms3agh4k5nrs" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-007.png" id="16"] -[ext_resource type="Texture2D" uid="uid://deqj1jv3tlrnw" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-015.png" id="17"] -[ext_resource type="Texture2D" uid="uid://nrkwgky7ip6w" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-014.png" id="18"] +[ext_resource type="Texture2D" uid="uid://bb02qchp31qbk" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-005.png" id="4"] +[ext_resource type="Texture2D" uid="uid://d1077cyo2guax" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-002.png" id="5"] +[ext_resource type="Texture2D" uid="uid://cnnggyic1gucn" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-003.png" id="6"] +[ext_resource type="Texture2D" uid="uid://dv1wxodjpaugw" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-001.png" id="7"] +[ext_resource type="Texture2D" uid="uid://cekotf5gc6xbk" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-010.png" id="8"] +[ext_resource type="Texture2D" uid="uid://nfn7piw54ra0" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-016.png" id="9"] +[ext_resource type="Texture2D" uid="uid://cpi3eoydqcvqj" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-009.png" id="10"] +[ext_resource type="Texture2D" uid="uid://chr5s14dhyvqc" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-008.png" id="11"] +[ext_resource type="Texture2D" uid="uid://cjtv1xqse0yuy" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-012.png" id="12"] +[ext_resource type="Texture2D" uid="uid://6bsralxp8ndw" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-013.png" id="13"] +[ext_resource type="Texture2D" uid="uid://cxo2ep1tqvkqm" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-004.png" id="14"] +[ext_resource type="Texture2D" uid="uid://bs7od2dqskigr" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-006.png" id="15"] +[ext_resource type="Texture2D" uid="uid://c5ylkrfmvy4uj" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-007.png" id="16"] +[ext_resource type="Texture2D" uid="uid://bibmiuts6ow8w" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-015.png" id="17"] +[ext_resource type="Texture2D" uid="uid://ueswqch37ph4" path="res://gymkhana/characters/eneko/smoking_animation/unscreen-014.png" id="18"] [ext_resource type="Script" uid="uid://85bledusisk1" path="res://addons/escoria-core/game/core-scripts/esc_dialog_location.gd" id="19_maw5o"] -[ext_resource type="Texture2D" uid="uid://dh4jyr03r21c8" path="res://gymkhana/characters/eneko/assets/speak-2.png" id="20"] +[ext_resource type="Texture2D" uid="uid://d4lpmrlecmrj1" path="res://gymkhana/characters/eneko/assets/speak-2.png" id="20"] [sub_resource type="AtlasTexture" id="2"] atlas = ExtResource("20") @@ -127,6 +127,6 @@ flip_h = true polygon = PackedVector2Array(-5, 6, -4, 22, -7, 32, -10, 39, -6, 43, 7, 43, 12, 35, 14, 25, 12, 12, 10, -25, 31, -38, 32, 37, 48, 37, 49, 28, 46, 22, 50, -1, 51, -35, 57, -39, 57, -72, 58, -74, 70, -68, 76, -69, 79, -76, 78, -81, 72, -89, 67, -104, 56, -114, 47, -115, 45, -120, 46, -140, 38, -145, 34, -146, 28, -144, 24, -139, 22, -129, 24, -122, 23, -119, 17, -114, 5, -109, -7, -80, -7, -62, 4, -58, 5, -53, -7, -34) [node name="ESCDialogLocation" type="Marker2D" parent="."] -position = Vector2(40, -240) +position = Vector2(35, -270) script = ExtResource("19_maw5o") metadata/_custom_type_script = "uid://85bledusisk1" diff --git a/gymkhana/characters/oier/oier.tscn b/gymkhana/characters/oier/oier.tscn index 7f5b9435..99994e84 100644 --- a/gymkhana/characters/oier/oier.tscn +++ b/gymkhana/characters/oier/oier.tscn @@ -331,6 +331,6 @@ position = Vector2(5, -151) shape = SubResource("21") [node name="ESCDialogLocation" type="Marker2D" parent="."] -position = Vector2(10, -452) +position = Vector2(1, -452) script = ExtResource("5_10x32") metadata/_custom_type_script = "uid://85bledusisk1" diff --git a/project.godot b/project.godot index a8cfe58e..cbdd7a32 100644 --- a/project.godot +++ b/project.godot @@ -90,7 +90,7 @@ rtmi_dialog_simple/avatars_path="res://game/dialog_avatars" rtmi_dialog_simple/text_time_per_letter_ms=50 rtmi_dialog_simple/text_time_per_fast_letter_ms=10 rtmi_dialog_simple/clear_text_by_click_only=false -rtmi_dialog_simple/reading_speed_in_wpm=200 +rtmi_dialog_simple/reading_speed_in_wpm=100 rtmi_dialog_simple/left_click_action="Speed up" rtmi_dialog_simple/stop_talking_animation_on="End of audio" rtmi_ui/sound_library_folder="res://gymkhana/sounds/"