Compare commits

..

2 Commits

6 changed files with 35 additions and 92 deletions

View File

@ -7,6 +7,9 @@ func get_memento_prompt(count: int) -> StringName:
func get_story_caption(id: Scenes.id) -> StringName: func get_story_caption(id: Scenes.id) -> StringName:
return TranslationServer.translate(_story_captions.get(id, "")) 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] = { const _memento_prompts: Dictionary[int, StringName] = {
1: "There are three Mementos left to find.", 1: "There are three Mementos left to find.",

View File

@ -3,15 +3,10 @@ class_name Interactable extends Area3D
@export var interaction: PackedScene = null @export var interaction: PackedScene = null
var playable : Playable = null var playable : Playable = null
@onready var view: Node3D = $View
@onready var frame: Sprite3D = $Frame @onready var frame: Sprite3D = $Frame
@onready var light: OmniLight3D = $OmniLight3D @onready var light: OmniLight3D = $OmniLight3D
@onready var canvas_layer: CanvasLayer = $CanvasLayer @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 @onready var original_light_energy : float = light.light_energy
@export var billboard : bool = true @export var billboard : bool = true
@ -20,18 +15,13 @@ var active : bool = false
var shown : bool = false var shown : bool = false
var hover : bool = false var hover : bool = false
var collected : bool = false: var collected : bool = false
set(value):
collected = value
if is_inside_tree():
_update_prompt()
var tween: Tween = null var tween: Tween = null
func _ready() -> void: 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 frame.modulate.a = 0.0
light.visible = false light.visible = false
@ -49,48 +39,41 @@ func _delayed_ready() ->void:
playable.unique_name_in_owner = true playable.unique_name_in_owner = true
## To be called by room ## To be called by room
func pull_save_state() -> void: func pull_save_state() -> void:
_update_caption()
# Check if this scene was already completed (for re-entering rooms) # Check if this scene was already completed (for re-entering rooms)
if playable is StoryPlayable: if playable is StoryPlayable:
var story := playable as StoryPlayable var story := playable as StoryPlayable
collected = Scenes.is_sequence_repeating(story.scene_id) collected = Scenes.is_sequence_repeating(story.scene_id)
else:
_update_prompt()
func _player_active(value: bool) -> void: func _player_active(value: bool) -> void:
active = value active = value
func expand() -> void: func expand() -> void:
_show_prompt()
shown = true shown = true
light.visible = true light.visible = true
light.light_energy = 0 light.light_energy = 0
if tween: tween.kill() if tween: tween.kill()
else: else:
view.scale = Vector3.ZERO
note.rotation.z = -PI*0.5 # Godot angle wrapping is ... something
frame.modulate = Color.TRANSPARENT frame.modulate = Color.TRANSPARENT
frame.scale = Vector3(1.5, 1.5, 1.5) frame.scale = Vector3(1.5, 1.5, 1.5)
tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) 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, "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(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) tween.parallel().tween_property(light, "light_energy", original_light_energy, 1.0).set_trans(Tween.TRANS_QUART)
func collapse() -> void: func collapse() -> void:
P.clear()
if not shown: return if not shown: return
shown = false shown = false
if tween: tween.kill() if tween: tween.kill()
tween = create_tween().set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_BACK) 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, "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(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) 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: func _process_billboard() -> void:
if billboard and shown: if billboard and shown:
var player_view := State.player_view 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) frame.look_at(player_view.global_position, Vector3.UP, true)
func _process_hover() -> void: func _process_hover() -> void:
@ -197,22 +179,20 @@ func interact() -> void:
# player is re-enabled by the inner code, or the room proceeds to next scene # 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 ## 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 playable is StoryPlayable:
if collected: P.interaction(I18n.get_scene_caption(playable.scene_id))
prompt.text = TranslationServer.translate("read again") overrides = ["listen again" if collected else "MementoLabel_collect"]
else: P.center(P.pick("collect_memento_ui"), overrides)
prompt.text = TranslationServer.translate("MementoLabel_collect")
elif playable is CardBoard: 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("Move on")
overrides = ["Move on"]
P.center(P.pick("collect_memento_ui"), overrides)

View File

@ -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="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://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"] [ext_resource type="PackedScene" uid="uid://bdnesuqroi7ss" path="res://vfx/collectable_particles.tscn" id="6_a6wx8"]
[sub_resource type="SphereShape3D" id="SphereShape3D_ih54h"] [sub_resource type="SphereShape3D" id="SphereShape3D_ih54h"]
@ -32,53 +29,6 @@ no_depth_test = true
render_priority = 100 render_priority = 100
texture = ExtResource("2_ih54h") 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")] [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) transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0, 0, 0)

View File

@ -222,7 +222,6 @@ option_memento_ui={
crouch={ crouch={
"deadzone": 0.2, "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) "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) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
] ]
} }

View File

@ -55,7 +55,7 @@ func _show(container: Control, controls: Array[Control], overrides: Array[String
func test() -> void: func test() -> void:
await get_tree().create_timer(0.5).timeout await get_tree().create_timer(0.5).timeout
var prompts := pick("ui_cancel", "ui_accept") var prompts := pick("ui_cancel", "ui_accept")
show_left_bottom(prompts) left_bottom(prompts)
interaction("Hello World.") interaction("Hello World.")
instruction("lorem ipsum dolor sit amet") instruction("lorem ipsum dolor sit amet")
await get_tree().create_timer(2.5).timeout await get_tree().create_timer(2.5).timeout
@ -73,13 +73,20 @@ func instruction(text: String) -> void:
%Instruction.get_parent().show() %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) _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: func clear() -> void:
_clear(%LeftBottom) _clear(%LeftBottom)
_clear(%RightBottom) _clear(%RightBottom)
_clear(%Center)
_clearInteraction() _clearInteraction()
_clearInstruction() _clearInstruction()

View File

@ -53,6 +53,7 @@ mouse_filter = 2
[node name="CenterZone" type="MarginContainer" parent="CanvasLayer/SafeZone/CenterContainer"] [node name="CenterZone" type="MarginContainer" parent="CanvasLayer/SafeZone/CenterContainer"]
custom_minimum_size = Vector2(700, 700) custom_minimum_size = Vector2(700, 700)
layout_mode = 2 layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_top = 42 theme_override_constants/margin_top = 42
theme_override_constants/margin_right = 42 theme_override_constants/margin_right = 42
@ -60,6 +61,7 @@ theme_override_constants/margin_right = 42
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 4 size_flags_horizontal = 4
size_flags_vertical = 0 size_flags_vertical = 0
mouse_filter = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_ba0r8") theme_override_styles/panel = SubResource("StyleBoxFlat_ba0r8")
[node name="Interaction" type="Label" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/TopCenter"] [node name="Interaction" type="Label" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/TopCenter"]
@ -75,6 +77,7 @@ size_flags_horizontal = 4
size_flags_vertical = 8 size_flags_vertical = 8
[node name="Center" type="VBoxContainer" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/CenterAnchor"] [node name="Center" type="VBoxContainer" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/CenterAnchor"]
unique_name_in_owner = true
layout_mode = 1 layout_mode = 1
anchors_preset = 7 anchors_preset = 7
anchor_left = 0.5 anchor_left = 0.5
@ -109,6 +112,7 @@ offset_left = -230.5
offset_right = 230.5 offset_right = 230.5
offset_bottom = 98.33334 offset_bottom = 98.33334
grow_horizontal = 2 grow_horizontal = 2
mouse_filter = 2
[node name="Instruction" type="Label" parent="CanvasLayer/SafeZone/Top"] [node name="Instruction" type="Label" parent="CanvasLayer/SafeZone/Top"]
unique_name_in_owner = true unique_name_in_owner = true