From 46a79eae61d8616b73845b4de86da3865649121b Mon Sep 17 00:00:00 2001 From: Tiger Jove Date: Fri, 23 Jan 2026 15:23:53 +0100 Subject: [PATCH] feat: first basic prompt --- src/dev-util/i18n.gd | 3 + src/logic-scenes/interactable/interactable.gd | 57 +++++++------------ .../interactable/interactable.tscn | 52 +---------------- src/project.godot | 1 - src/ui/prompter/prompter.gd | 11 +++- src/ui/prompter/prompter.tscn | 1 + 6 files changed, 33 insertions(+), 92 deletions(-) diff --git a/src/dev-util/i18n.gd b/src/dev-util/i18n.gd index 555a552..f6cb6f3 100644 --- a/src/dev-util/i18n.gd +++ b/src/dev-util/i18n.gd @@ -7,6 +7,9 @@ func get_memento_prompt(count: int) -> StringName: func get_story_caption(id: Scenes.id) -> StringName: return TranslationServer.translate(_story_captions.get(id, "")) +func get_scene_caption(id: Scenes.id) -> StringName: + return _story_captions.get(id) + const _memento_prompts: Dictionary[int, StringName] = { 1: "There are three Mementos left to find.", diff --git a/src/logic-scenes/interactable/interactable.gd b/src/logic-scenes/interactable/interactable.gd index 9b21eff..b52a5c3 100644 --- a/src/logic-scenes/interactable/interactable.gd +++ b/src/logic-scenes/interactable/interactable.gd @@ -3,15 +3,10 @@ class_name Interactable extends Area3D @export var interaction: PackedScene = null var playable : Playable = null -@onready var view: Node3D = $View @onready var frame: Sprite3D = $Frame @onready var light: OmniLight3D = $OmniLight3D @onready var canvas_layer: CanvasLayer = $CanvasLayer -@onready var note: Node3D = $View/Sprite3D -@onready var caption : Label3D = %Caption -@onready var prompt : Label3D = %Prompt - @onready var original_light_energy : float = light.light_energy @export var billboard : bool = true @@ -20,18 +15,13 @@ var active : bool = false var shown : bool = false var hover : bool = false -var collected : bool = false: - set(value): - collected = value - if is_inside_tree(): - _update_prompt() +var collected : bool = false var tween: Tween = null func _ready() -> void: - assert(note and frame and canvas_layer, "Interactable must have views and frame attached") + assert(frame and canvas_layer, "Interactable must have canvas and frame attached") - view.scale = Vector3.ZERO frame.modulate.a = 0.0 light.visible = false @@ -49,48 +39,41 @@ func _delayed_ready() ->void: playable.unique_name_in_owner = true - - ## To be called by room func pull_save_state() -> void: - _update_caption() # Check if this scene was already completed (for re-entering rooms) if playable is StoryPlayable: var story := playable as StoryPlayable collected = Scenes.is_sequence_repeating(story.scene_id) - else: - _update_prompt() func _player_active(value: bool) -> void: active = value func expand() -> void: + _show_prompt() shown = true light.visible = true light.light_energy = 0 if tween: tween.kill() else: - view.scale = Vector3.ZERO - note.rotation.z = -PI*0.5 # Godot angle wrapping is ... something frame.modulate = Color.TRANSPARENT frame.scale = Vector3(1.5, 1.5, 1.5) tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) - tween.parallel().tween_property(view, "scale", Vector3.ONE, 1.0).set_delay(0.5) - tween.parallel().tween_property(note, "rotation:z", 0, 0.8).set_delay(0.5) tween.parallel().tween_property(frame, "modulate:a", 1.0, 2.0).set_trans(Tween.TRANS_QUAD) tween.parallel().tween_property(frame, "scale", Vector3.ONE, 1.0).set_trans(Tween.TRANS_QUART) tween.parallel().tween_property(light, "light_energy", original_light_energy, 1.0).set_trans(Tween.TRANS_QUART) func collapse() -> void: + P.clear() + if not shown: return shown = false if tween: tween.kill() tween = create_tween().set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_BACK) - tween.parallel().tween_property(view, "scale", Vector3.ZERO, 0.3) tween.parallel().tween_property(frame, "modulate:a", 0, 0.5).set_trans(Tween.TRANS_QUAD) tween.parallel().tween_property(frame, "scale", Vector3.ONE * 2.0, 1.0).set_trans(Tween.TRANS_QUAD) tween.parallel().tween_property(light, "light_energy", 0, 1.0).set_trans(Tween.TRANS_QUAD) @@ -104,7 +87,6 @@ func _process(_delta: float) -> void: func _process_billboard() -> void: if billboard and shown: var player_view := State.player_view - view.look_at(player_view.global_position, Vector3.UP, true) frame.look_at(player_view.global_position, Vector3.UP, true) func _process_hover() -> void: @@ -197,22 +179,21 @@ func interact() -> void: # player is re-enabled by the inner code, or the room proceeds to next scene -## Updates caption label based on the instantiated interaction_ui -func _update_caption() -> void: - if playable is StoryPlayable: - var story := playable as StoryPlayable - caption.text = I18n.get_story_caption(story.scene_id) - if playable is CardBoard: - caption.text = TranslationServer.translate("Mind Board") - if playable is CardBurner: - caption.text = TranslationServer.translate("leave") ## Updates prompt label based on the interaction type and collected state -func _update_prompt() -> void: +func _show_prompt() -> void: + + + var overrides : Array[StringName] = [] if playable is StoryPlayable: - if collected: - prompt.text = TranslationServer.translate("read again") - else: - prompt.text = TranslationServer.translate("MementoLabel_collect") + P.interaction(I18n.get_scene_caption(playable.scene_id)) + overrides = ["read again" if collected else "MementoLabel_collect"] + P.center(P.pick("collect_memento_ui"), overrides) elif playable is CardBoard: - prompt.text = TranslationServer.translate("find connections") + P.interaction("Mind Board") + overrides = ["find connections"] + P.center(P.pick("collect_memento_ui"), overrides) + elif playable is CardBurner: + P.interaction("Door") + overrides = ["leave"] + P.center(P.pick("collect_memento_ui"), overrides) diff --git a/src/logic-scenes/interactable/interactable.tscn b/src/logic-scenes/interactable/interactable.tscn index 43eec72..3f94a1f 100644 --- a/src/logic-scenes/interactable/interactable.tscn +++ b/src/logic-scenes/interactable/interactable.tscn @@ -1,10 +1,7 @@ -[gd_scene load_steps=8 format=3 uid="uid://dreokijo757l1"] +[gd_scene load_steps=5 format=3 uid="uid://dreokijo757l1"] [ext_resource type="Script" uid="uid://bp6s7vhdd6btk" path="res://logic-scenes/interactable/interactable.gd" id="1_ih54h"] [ext_resource type="Texture2D" uid="uid://0j2nrhijh7lm" path="res://import/interface-elements/frame-square.png" id="2_ih54h"] -[ext_resource type="Texture2D" uid="uid://epjksqlw8frf" path="res://logic-scenes/collectable/decorative_paper.png" id="3_cjk23"] -[ext_resource type="FontFile" uid="uid://c084lmfai0iig" path="res://import/fonts/ArchitectsDaughter-Regular.ttf" id="4_dujq2"] -[ext_resource type="FontFile" uid="uid://qalmecrbkxyp" path="res://import/fonts/icon.ttf" id="5_wl31y"] [ext_resource type="PackedScene" uid="uid://bdnesuqroi7ss" path="res://vfx/collectable_particles.tscn" id="6_a6wx8"] [sub_resource type="SphereShape3D" id="SphereShape3D_ih54h"] @@ -32,53 +29,6 @@ no_depth_test = true render_priority = 100 texture = ExtResource("2_ih54h") -[node name="View" type="Node3D" parent="."] -transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.52599776, 0.1, 0) - -[node name="Sprite3D" type="Sprite3D" parent="View"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.072, -0.047, -0.1) -pixel_size = 0.0007 -no_depth_test = true -render_priority = 50 -texture = ExtResource("3_cjk23") - -[node name="Caption" type="Label3D" parent="View/Sprite3D"] -unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.031703584, 0) -double_sided = false -no_depth_test = true -render_priority = 75 -modulate = Color(0.21239993, 0.12440842, 0.055158928, 1) -text = "lorem ipsum -dolor git amend" -font = ExtResource("4_dujq2") -font_size = 10 -outline_size = 0 - -[node name="Icon" type="Label3D" parent="View/Sprite3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.13325092, -0.084207475, 3.5527137e-15) -double_sided = false -no_depth_test = true -render_priority = 75 -modulate = Color(0.21239993, 0.12440842, 0.055158928, 1) -text = "xbox_button_a " -font = ExtResource("5_wl31y") -font_size = 10 -outline_size = 0 - -[node name="Prompt" type="Label3D" parent="View/Sprite3D/Icon"] -unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0353532, 0, 0) -double_sided = false -no_depth_test = true -render_priority = 75 -modulate = Color(0.2901961, 0.18039216, 0.08627451, 0.8901961) -text = "Action Prompt" -font = ExtResource("4_dujq2") -font_size = 8 -outline_size = 0 -horizontal_alignment = 0 - [node name="collectable_particles" parent="." instance=ExtResource("6_a6wx8")] transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0, 0, 0) diff --git a/src/project.godot b/src/project.godot index e9729a0..39cdfba 100644 --- a/src/project.godot +++ b/src/project.godot @@ -222,7 +222,6 @@ option_memento_ui={ crouch={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":7,"pressure":0.0,"pressed":false,"script":null) ] } diff --git a/src/ui/prompter/prompter.gd b/src/ui/prompter/prompter.gd index 98ddaf6..a24e24b 100644 --- a/src/ui/prompter/prompter.gd +++ b/src/ui/prompter/prompter.gd @@ -55,7 +55,7 @@ func _show(container: Control, controls: Array[Control], overrides: Array[String func test() -> void: await get_tree().create_timer(0.5).timeout var prompts := pick("ui_cancel", "ui_accept") - show_left_bottom(prompts) + left_bottom(prompts) interaction("Hello World.") instruction("lorem ipsum dolor sit amet") await get_tree().create_timer(2.5).timeout @@ -73,13 +73,20 @@ func instruction(text: String) -> void: %Instruction.get_parent().show() -func show_left_bottom(controls: Array[Control], overrides: Array[StringName] = []) -> void: +func left_bottom(controls: Array[Control], overrides: Array[StringName] = []) -> void: _show(%LeftBottom, controls, overrides) +func center(controls: Array[Control], overrides: Array[StringName] = []) -> void: + _show(%Center, controls, overrides) + +func right_bottom(controls: Array[Control], overrides: Array[StringName] = []) -> void: + _show(%RightBottom, controls, overrides) + func clear() -> void: _clear(%LeftBottom) _clear(%RightBottom) + _clear(%Center) _clearInteraction() _clearInstruction() diff --git a/src/ui/prompter/prompter.tscn b/src/ui/prompter/prompter.tscn index 3074d87..b511445 100644 --- a/src/ui/prompter/prompter.tscn +++ b/src/ui/prompter/prompter.tscn @@ -75,6 +75,7 @@ size_flags_horizontal = 4 size_flags_vertical = 8 [node name="Center" type="VBoxContainer" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/CenterAnchor"] +unique_name_in_owner = true layout_mode = 1 anchors_preset = 7 anchor_left = 0.5