Compare commits
No commits in common. "83a8973e6bfb4a7219703b891312177d1f7ca92a" and "86af2e812a67fbbd5ebe7b50b2f01bbda7033e2c" have entirely different histories.
83a8973e6b
...
86af2e812a
|
|
@ -7,9 +7,6 @@ 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.",
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,15 @@ 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
|
||||||
|
|
@ -15,13 +20,18 @@ 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(frame and canvas_layer, "Interactable must have canvas and frame attached")
|
assert(note and frame and canvas_layer, "Interactable must have views and frame attached")
|
||||||
|
|
||||||
|
view.scale = Vector3.ZERO
|
||||||
frame.modulate.a = 0.0
|
frame.modulate.a = 0.0
|
||||||
light.visible = false
|
light.visible = false
|
||||||
|
|
||||||
|
|
@ -39,41 +49,48 @@ 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)
|
||||||
|
|
@ -87,6 +104,7 @@ 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:
|
||||||
|
|
@ -179,20 +197,22 @@ 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 _show_prompt() -> void:
|
func _update_prompt() -> void:
|
||||||
|
|
||||||
var overrides : Array[StringName] = []
|
|
||||||
if playable is StoryPlayable:
|
if playable is StoryPlayable:
|
||||||
P.interaction(I18n.get_scene_caption(playable.scene_id))
|
if collected:
|
||||||
overrides = ["listen again" if collected else "MementoLabel_collect"]
|
prompt.text = TranslationServer.translate("read again")
|
||||||
P.center(P.pick("collect_memento_ui"), overrides)
|
else:
|
||||||
|
prompt.text = TranslationServer.translate("MementoLabel_collect")
|
||||||
elif playable is CardBoard:
|
elif playable is CardBoard:
|
||||||
P.interaction("Mind Board")
|
prompt.text = TranslationServer.translate("find connections")
|
||||||
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)
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://dreokijo757l1"]
|
[gd_scene load_steps=8 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"]
|
||||||
|
|
@ -29,6 +32,53 @@ 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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,7 @@ 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)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
left_bottom(prompts)
|
show_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,20 +73,13 @@ func instruction(text: String) -> void:
|
||||||
%Instruction.get_parent().show()
|
%Instruction.get_parent().show()
|
||||||
|
|
||||||
|
|
||||||
func left_bottom(controls: Array[Control], overrides: Array[StringName] = []) -> void:
|
func show_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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,6 @@ 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
|
||||||
|
|
||||||
|
|
@ -61,7 +60,6 @@ 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"]
|
||||||
|
|
@ -77,7 +75,6 @@ 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
|
||||||
|
|
@ -112,7 +109,6 @@ 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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue