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:
|
||||
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.",
|
||||
|
|
|
|||
|
|
@ -3,10 +3,15 @@ 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
|
||||
|
|
@ -15,13 +20,18 @@ var active : bool = false
|
|||
|
||||
var shown : 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
|
||||
|
||||
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
|
||||
light.visible = false
|
||||
|
||||
|
|
@ -39,41 +49,48 @@ 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)
|
||||
|
|
@ -87,6 +104,7 @@ 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:
|
||||
|
|
@ -179,20 +197,22 @@ 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 _show_prompt() -> void:
|
||||
|
||||
var overrides : Array[StringName] = []
|
||||
func _update_prompt() -> void:
|
||||
if playable is StoryPlayable:
|
||||
P.interaction(I18n.get_scene_caption(playable.scene_id))
|
||||
overrides = ["listen again" if collected else "MementoLabel_collect"]
|
||||
P.center(P.pick("collect_memento_ui"), overrides)
|
||||
if collected:
|
||||
prompt.text = TranslationServer.translate("read again")
|
||||
else:
|
||||
prompt.text = TranslationServer.translate("MementoLabel_collect")
|
||||
elif playable is CardBoard:
|
||||
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)
|
||||
prompt.text = TranslationServer.translate("find connections")
|
||||
|
|
|
|||
|
|
@ -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="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"]
|
||||
|
|
@ -29,6 +32,53 @@ 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)
|
||||
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@ 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)
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
left_bottom(prompts)
|
||||
show_left_bottom(prompts)
|
||||
interaction("Hello World.")
|
||||
instruction("lorem ipsum dolor sit amet")
|
||||
await get_tree().create_timer(2.5).timeout
|
||||
|
|
@ -73,20 +73,13 @@ func instruction(text: String) -> void:
|
|||
%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)
|
||||
|
||||
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()
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ mouse_filter = 2
|
|||
[node name="CenterZone" type="MarginContainer" parent="CanvasLayer/SafeZone/CenterContainer"]
|
||||
custom_minimum_size = Vector2(700, 700)
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_top = 42
|
||||
theme_override_constants/margin_right = 42
|
||||
|
||||
|
|
@ -61,7 +60,6 @@ theme_override_constants/margin_right = 42
|
|||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 0
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_ba0r8")
|
||||
|
||||
[node name="Interaction" type="Label" parent="CanvasLayer/SafeZone/CenterContainer/CenterZone/TopCenter"]
|
||||
|
|
@ -77,7 +75,6 @@ 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
|
||||
|
|
@ -112,7 +109,6 @@ offset_left = -230.5
|
|||
offset_right = 230.5
|
||||
offset_bottom = 98.33334
|
||||
grow_horizontal = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Instruction" type="Label" parent="CanvasLayer/SafeZone/Top"]
|
||||
unique_name_in_owner = true
|
||||
|
|
|
|||
Loading…
Reference in New Issue