From b5f394f129312fb7df8dd33d83092bc6579ccf3d Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Tue, 8 Jul 2025 17:36:21 -0600 Subject: [PATCH] Hello tutorial! --- levels/ghost_ship/level/airlock/airlock.tscn | 17 +++- project.godot | 13 +++ src/game/tutorial/tutorial.gd | 45 ++++++++++ .../tutorial/tutorial.gd.uid} | 0 .../tutorial/tutorial.tscn} | 90 ++++++++++++------- src/game/tutorial/tutorial_area.gd | 14 +++ src/game/tutorial/tutorial_area.gd.uid | 1 + .../tutorial_manager/tutorial_manager.tscn | 7 ++ .../tutorial_manager/tutorial_manager_type.gd | 20 +++++ .../tutorial_manager_type.gd.uid | 1 + src/game/tutorial/tutorial_timer.gd | 12 +++ src/game/tutorial/tutorial_timer.gd.uid | 1 + src/player/hold_component.gd | 2 + src/player/player.gd | 1 + src/player/player.tscn | 15 +++- src/props/interactive.gd | 1 + src/props/physics/holdable.gd | 1 + src/ui/elements/tutorial/tutorial_message.gd | 13 --- src/ui/hud/player_hud.tscn | 34 ++++--- 19 files changed, 232 insertions(+), 56 deletions(-) create mode 100644 src/game/tutorial/tutorial.gd rename src/{ui/elements/tutorial/tutorial_message.gd.uid => game/tutorial/tutorial.gd.uid} (100%) rename src/{ui/elements/tutorial/tutorial_message.tscn => game/tutorial/tutorial.tscn} (91%) create mode 100644 src/game/tutorial/tutorial_area.gd create mode 100644 src/game/tutorial/tutorial_area.gd.uid create mode 100644 src/game/tutorial/tutorial_manager/tutorial_manager.tscn create mode 100644 src/game/tutorial/tutorial_manager/tutorial_manager_type.gd create mode 100644 src/game/tutorial/tutorial_manager/tutorial_manager_type.gd.uid create mode 100644 src/game/tutorial/tutorial_timer.gd create mode 100644 src/game/tutorial/tutorial_timer.gd.uid delete mode 100644 src/ui/elements/tutorial/tutorial_message.gd diff --git a/levels/ghost_ship/level/airlock/airlock.tscn b/levels/ghost_ship/level/airlock/airlock.tscn index 081be56..ba816fa 100644 --- a/levels/ghost_ship/level/airlock/airlock.tscn +++ b/levels/ghost_ship/level/airlock/airlock.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=63 format=3 uid="uid://cwhmn3w8hoads"] +[gd_scene load_steps=65 format=3 uid="uid://cwhmn3w8hoads"] [ext_resource type="ArrayMesh" uid="uid://dpr5cgq743f4s" path="res://assets/level/floor/floor_9x9.mesh" id="1_isxnv"] [ext_resource type="PackedScene" uid="uid://cdi5sl60mw1po" path="res://src/world/gunkable/gunkable.tscn" id="2_si4vj"] @@ -32,6 +32,7 @@ [ext_resource type="Script" uid="uid://040xta01xqxd" path="res://src/props/physics/holdable.gd" id="28_knpho"] [ext_resource type="PackedScene" uid="uid://30o8ltnnxpxo" path="res://src/effects/floating_dust.tscn" id="29_ib88w"] [ext_resource type="Texture2D" uid="uid://c1v1sj6b8rwrl" path="res://levels/ghost_ship/level/airlock/overhead_light_airlock_mask_C.png" id="31_2dnfr"] +[ext_resource type="Script" uid="uid://c3i315cnqikok" path="res://src/game/tutorial/tutorial_area.gd" id="33_a8g8h"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_yvipw"] data = PackedVector3Array(4.5, 0, 4.5, -4.5, 0, 4.5, 4.5, 0, -4.5, 4.5, 0, -4.5, -4.5, 0, 4.5, -4.5, 0, -4.5) @@ -186,6 +187,9 @@ turbulence_noise_strength = 0.1 turbulence_noise_scale = 0.3 turbulence_influence_min = 0.0 +[sub_resource type="BoxShape3D" id="BoxShape3D_2dnfr"] +size = Vector3(9, 3, 8.7) + [node name="Airlock" type="Node3D"] [node name="Bounds" type="Node3D" parent="."] @@ -457,4 +461,15 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) visibility_aabb = AABB(-4.5, -1.5, -4.5, 9, 3, 9) process_material = SubResource("ParticleProcessMaterial_otfxe") +[node name="FireTutorialArea" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) +collision_layer = 0 +collision_mask = 8 +script = ExtResource("33_a8g8h") +tutorial_key = &"game/tutorial/progress/fire" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FireTutorialArea"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.15) +shape = SubResource("BoxShape3D_2dnfr") + [editable path="Props/EmptySuitChamber"] diff --git a/project.godot b/project.godot index c66402c..bb496e2 100644 --- a/project.godot +++ b/project.godot @@ -29,6 +29,7 @@ BeehaveGlobalDebugger="*res://addons/beehave/debug/global_debugger.gd" GameRuntime="*res://src/game/game_runtime.gd" ItemCatalog="*res://src/items/item_catalog.tscn" GameSettings="*res://src/game/game_settings.gd" +TutorialManager="*res://src/game/tutorial/tutorial_manager/tutorial_manager.tscn" [debug] @@ -83,6 +84,18 @@ debug/enable_debug_menu=false debug/enable_debug_menu.debug=true config/input/object_rotation_sensitivity_y=0.5 config/input/object_rotation_sensitivity_x=0.5 +tutorial/progress/look=false +tutorial/progress/move=false +tutorial/progress/jump=false +tutorial/progress/sneak=false +tutorial/progress/sprint=false +tutorial/progress/fire=false +tutorial/progress/tool_switch=false +tutorial/progress/tool_prev_next=false +tutorial/progress/mode_switch=false +tutorial/progress/interact=false +tutorial/progress/pick_up=false +tutorial/progress/rotate=false [global_group] diff --git a/src/game/tutorial/tutorial.gd b/src/game/tutorial/tutorial.gd new file mode 100644 index 0000000..68fb46b --- /dev/null +++ b/src/game/tutorial/tutorial.gd @@ -0,0 +1,45 @@ +class_name Tutorial extends Control + +@export var tutorial_key: StringName + +var _displaying := false + +@onready var animation_tree: AnimationTree = %AnimationTree +@onready +var animation_state: AnimationNodeStateMachinePlayback = animation_tree["parameters/playback"] + +## Handy typed singleton access. +static var manager: TutorialManagerType: + get(): + return TutorialManager + + +func _ready() -> void: + if tutorial_activated(): + # We've already been activated -- should disable ourselves + queue_free() + Tutorial.manager.disable_all.connect(_disable) + ProjectSettings.settings_changed.connect(on_settings_changed) + + +func tutorial_activated() -> bool: + return ProjectSettings.get(tutorial_key) + + +func fade_in() -> void: + animation_state.travel("fade_in") + + +func fade_out() -> void: + animation_state.travel("fade_out") + + +func on_settings_changed() -> void: + if not _displaying and tutorial_activated(): + _displaying = true + fade_in() + + +func _disable() -> void: + ProjectSettings.set_setting(tutorial_key, true) + queue_free() diff --git a/src/ui/elements/tutorial/tutorial_message.gd.uid b/src/game/tutorial/tutorial.gd.uid similarity index 100% rename from src/ui/elements/tutorial/tutorial_message.gd.uid rename to src/game/tutorial/tutorial.gd.uid diff --git a/src/ui/elements/tutorial/tutorial_message.tscn b/src/game/tutorial/tutorial.tscn similarity index 91% rename from src/ui/elements/tutorial/tutorial_message.tscn rename to src/game/tutorial/tutorial.tscn index 9fc67ef..2ba580d 100644 --- a/src/ui/elements/tutorial/tutorial_message.tscn +++ b/src/game/tutorial/tutorial.tscn @@ -2,7 +2,7 @@ [ext_resource type="Theme" uid="uid://b07fevr214mmr" path="res://src/ui/hud/hud_theme.tres" id="1_b0qfw"] [ext_resource type="FontFile" uid="uid://qadtckvw0t3l" path="res://assets/fonts/fontawesome-free-6.7.2-desktop/otfs/Font Awesome 6 Free-Solid-900.otf" id="2_81007"] -[ext_resource type="Script" uid="uid://cy8mquhxkqgmd" path="res://src/ui/elements/tutorial/tutorial_message.gd" id="2_ipu78"] +[ext_resource type="Script" uid="uid://cy8mquhxkqgmd" path="res://src/game/tutorial/tutorial.gd" id="2_ipu78"] [sub_resource type="Animation" id="Animation_81007"] length = 0.001 @@ -117,34 +117,49 @@ tracks/3/keys = { "update": 1, "values": [false, true] } +tracks/4/type = "method" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("FadeOutTimer") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [-1], +"method": &"start" +}] +} -[sub_resource type="Animation" id="Animation_ipu78"] -resource_name = "idle" -length = 1.6 -loop_mode = 1 +[sub_resource type="Animation" id="Animation_xxgh3"] +resource_name = "fade_out" +length = 0.4 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("HBoxContainer/InfoIcon:modulate") +tracks/0/path = NodePath(".:modulate") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.8, 1.6), -"transitions": PackedFloat32Array(1.618, 0.618, 1.618), +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0), Color(1, 1, 1, 1)] +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -tracks/1/type = "value" +tracks/1/type = "method" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath(".:modulate") +tracks/1/path = NodePath(".") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0), +"times": PackedFloat32Array(0.4), "transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(1, 1, 1, 1)] +"values": [{ +"args": [], +"method": &"queue_free" +}] } tracks/2/type = "value" tracks/2/imported = false @@ -183,34 +198,33 @@ tracks/4/keys = { "values": [true] } -[sub_resource type="Animation" id="Animation_xxgh3"] -resource_name = "fade_out" -length = 0.4 +[sub_resource type="Animation" id="Animation_ipu78"] +resource_name = "idle" +length = 1.6 +loop_mode = 1 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:modulate") +tracks/0/path = NodePath("HBoxContainer/InfoIcon:modulate") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.4), -"transitions": PackedFloat32Array(1, 1), +"times": PackedFloat32Array(0, 0.8, 1.6), +"transitions": PackedFloat32Array(1.618, 0.618, 1.618), "update": 0, -"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0), Color(1, 1, 1, 1)] } -tracks/1/type = "method" +tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath(".") +tracks/1/path = NodePath(".:modulate") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0.4), +"times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"queue_free" -}] +"update": 0, +"values": [Color(1, 1, 1, 1)] } tracks/2/type = "value" tracks/2/imported = false @@ -291,10 +305,20 @@ states/idle/position = Vector2(510, 100) transitions = ["Start", "fade_in", SubResource("AnimationNodeStateMachineTransition_xxgh3"), "fade_in", "idle", SubResource("AnimationNodeStateMachineTransition_qt0bd"), "idle", "fade_out", SubResource("AnimationNodeStateMachineTransition_trep3"), "fade_out", "End", SubResource("AnimationNodeStateMachineTransition_cheth")] graph_offset = Vector2(-527, -79) -[node name="TutorialMessage" type="Control"] +[node name="Tutorial" type="Control"] visible = false +custom_minimum_size = Vector2(0, 48) layout_mode = 3 -anchors_preset = 0 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_top = -24.0 +offset_bottom = 24.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 theme = ExtResource("1_b0qfw") script = ExtResource("2_ipu78") @@ -338,3 +362,9 @@ unique_name_in_owner = true root_node = NodePath("%AnimationTree/../..") tree_root = SubResource("AnimationNodeStateMachine_o3pjn") anim_player = NodePath("..") + +[node name="FadeOutTimer" type="Timer" parent="."] +wait_time = 12.0 + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="timeout" from="FadeOutTimer" to="." method="fade_out"] diff --git a/src/game/tutorial/tutorial_area.gd b/src/game/tutorial/tutorial_area.gd new file mode 100644 index 0000000..6e826f3 --- /dev/null +++ b/src/game/tutorial/tutorial_area.gd @@ -0,0 +1,14 @@ +extends Area3D + +@export var tutorial_key: StringName + + +func _ready() -> void: + body_entered.connect(_on_body_entered) + collision_layer = 0 + collision_mask = 0b1000 + + +func _on_body_entered(_body: Node3D) -> void: + Tutorial.manager.activate(tutorial_key) + queue_free() diff --git a/src/game/tutorial/tutorial_area.gd.uid b/src/game/tutorial/tutorial_area.gd.uid new file mode 100644 index 0000000..f787ca8 --- /dev/null +++ b/src/game/tutorial/tutorial_area.gd.uid @@ -0,0 +1 @@ +uid://c3i315cnqikok diff --git a/src/game/tutorial/tutorial_manager/tutorial_manager.tscn b/src/game/tutorial/tutorial_manager/tutorial_manager.tscn new file mode 100644 index 0000000..d44b1ba --- /dev/null +++ b/src/game/tutorial/tutorial_manager/tutorial_manager.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=3 uid="uid://yky8xs8ftm4p"] + +[ext_resource type="Script" uid="uid://dnkittj7dgx6y" path="res://src/game/tutorial/tutorial_manager/tutorial_manager_type.gd" id="1_ggtp4"] + +[node name="TutorialManager" type="Node"] +script = ExtResource("1_ggtp4") +metadata/_custom_type_script = "uid://dnkittj7dgx6y" diff --git a/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd b/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd new file mode 100644 index 0000000..0464042 --- /dev/null +++ b/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd @@ -0,0 +1,20 @@ +class_name TutorialManagerType extends Node +## Global autoloaded singleton that manages the game's tutorial. + +signal disable_all + + +func activate(key: StringName) -> void: + ProjectSettings.set_setting(key, true) + Game.settings.write() + + +func reset_tutorial() -> void: + # TODO how to iterate through all settings keys in a path? + pass + + +func disable_tutorial() -> void: + disable_all.emit() + # XXX does this ensure the call to write will happen after all signals resolve? + Game.settings.write.call_deferred() diff --git a/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd.uid b/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd.uid new file mode 100644 index 0000000..0b47688 --- /dev/null +++ b/src/game/tutorial/tutorial_manager/tutorial_manager_type.gd.uid @@ -0,0 +1 @@ +uid://dnkittj7dgx6y diff --git a/src/game/tutorial/tutorial_timer.gd b/src/game/tutorial/tutorial_timer.gd new file mode 100644 index 0000000..974de72 --- /dev/null +++ b/src/game/tutorial/tutorial_timer.gd @@ -0,0 +1,12 @@ +extends Timer + +@export var tutorial_key: StringName + + +func _ready() -> void: + timeout.connect(_on_timeout) + + +func _on_timeout() -> void: + Tutorial.manager.activate(tutorial_key) + queue_free() diff --git a/src/game/tutorial/tutorial_timer.gd.uid b/src/game/tutorial/tutorial_timer.gd.uid new file mode 100644 index 0000000..c3baf15 --- /dev/null +++ b/src/game/tutorial/tutorial_timer.gd.uid @@ -0,0 +1 @@ +uid://dg55jdoyctdq6 diff --git a/src/player/hold_component.gd b/src/player/hold_component.gd index a080f94..daf97ab 100644 --- a/src/player/hold_component.gd +++ b/src/player/hold_component.gd @@ -54,6 +54,8 @@ func attach(prop: RigidBody3D, hold_distance: float) -> void: held.emit() + Tutorial.manager.activate("game/tutorial/progress/rotate") + func drop() -> void: _held_object.linear_damp = _original_damping diff --git a/src/player/player.gd b/src/player/player.gd index 9e52d64..176cc17 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -273,4 +273,5 @@ func serialize() -> Dictionary: func deserialize(state: Dictionary) -> void: @warning_ignore("unsafe_cast") inventory.assign(state["inventory"] as Dictionary) + #endregion diff --git a/src/player/player.tscn b/src/player/player.tscn index 969150b..0a5e6de 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=67 format=3 uid="uid://bwe2jdmvinhqd"] +[gd_scene load_steps=68 format=3 uid="uid://bwe2jdmvinhqd"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] @@ -37,6 +37,7 @@ [ext_resource type="AudioStream" uid="uid://ck86vhmbg3xnj" path="res://assets/sfx/footsteps/plastic/plastic5.wav" id="30_p6grl"] [ext_resource type="Script" uid="uid://c5o1d2shq2qig" path="res://src/world/game_sound/game_sound_emitter.gd" id="31_wcxbk"] [ext_resource type="Script" uid="uid://b5loa2u6s5l5c" path="res://src/player/rigid_body_physics.gd" id="36_phdu6"] +[ext_resource type="Script" uid="uid://dg55jdoyctdq6" path="res://src/game/tutorial/tutorial_timer.gd" id="38_evlgt"] [sub_resource type="Animation" id="Animation_x42xx"] length = 0.001 @@ -809,3 +810,15 @@ mesh = SubResource("PlaneMesh_p6grl") [node name="RigidBodyPhysics" type="Node" parent="."] script = ExtResource("36_phdu6") + +[node name="LookTutorialTimer" type="Timer" parent="."] +wait_time = 3.0 +autostart = true +script = ExtResource("38_evlgt") +tutorial_key = &"game/tutorial/progress/look" + +[node name="MoveTutorialTimer" type="Timer" parent="."] +wait_time = 5.0 +autostart = true +script = ExtResource("38_evlgt") +tutorial_key = &"game/tutorial/progress/move" diff --git a/src/props/interactive.gd b/src/props/interactive.gd index bb42271..51be3dc 100644 --- a/src/props/interactive.gd +++ b/src/props/interactive.gd @@ -26,6 +26,7 @@ func _ready() -> void: func select() -> void: + Tutorial.manager.activate("game/tutorial/progress/interact") Player.instance.hud.interact_hud.set_interactive(self) diff --git a/src/props/physics/holdable.gd b/src/props/physics/holdable.gd index ef6da1d..3b85ffc 100644 --- a/src/props/physics/holdable.gd +++ b/src/props/physics/holdable.gd @@ -23,6 +23,7 @@ func _default_controller() -> RigidBody3D: func select() -> void: + Tutorial.manager.activate("game/tutorial/progress/pick_up") Player.instance.hud.hold_hud.select_prop() diff --git a/src/ui/elements/tutorial/tutorial_message.gd b/src/ui/elements/tutorial/tutorial_message.gd deleted file mode 100644 index db63267..0000000 --- a/src/ui/elements/tutorial/tutorial_message.gd +++ /dev/null @@ -1,13 +0,0 @@ -class_name TutorialMessage extends Control - -@onready var animation_tree: AnimationTree = %AnimationTree -@onready -var animation_state: AnimationNodeStateMachinePlayback = animation_tree["parameters/playback"] - - -func fade_in() -> void: - animation_state.travel("fade_in") - - -func fade_out() -> void: - animation_state.travel("fade_out") diff --git a/src/ui/hud/player_hud.tscn b/src/ui/hud/player_hud.tscn index 17cb897..9c0144d 100644 --- a/src/ui/hud/player_hud.tscn +++ b/src/ui/hud/player_hud.tscn @@ -8,7 +8,7 @@ [ext_resource type="Script" uid="uid://cjs2fen6jo0g0" path="res://src/ui/rumbler.gd" id="4_ud8na"] [ext_resource type="Script" uid="uid://ctvu31jkk1un2" path="res://src/ui/hud/hold_hud.gd" id="5_65kmv"] [ext_resource type="FontFile" uid="uid://oq8ue2qrfijg" path="res://assets/fonts/Silkscreen/Silkscreen-Regular.ttf" id="7_iwjh7"] -[ext_resource type="PackedScene" uid="uid://bce8b2erx64vg" path="res://src/ui/elements/tutorial/tutorial_message.tscn" id="9_8np55"] +[ext_resource type="PackedScene" uid="uid://bce8b2erx64vg" path="res://src/game/tutorial/tutorial.tscn" id="9_8np55"] [ext_resource type="Theme" uid="uid://doq7ay6f7dgfo" path="res://src/ui/menus/menu.theme" id="10_c1hvd"] [sub_resource type="Animation" id="Animation_iwjh7"] @@ -429,10 +429,10 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -offset_left = -19.0897 -offset_top = -18.6342 -offset_right = -19.0897 -offset_bottom = -18.6342 +offset_left = -18.4746 +offset_top = -23.3094 +offset_right = -18.4746 +offset_bottom = -23.3094 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("4_ud8na") @@ -565,6 +565,7 @@ grow_vertical = 2 [node name="LookTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/look" [node name="Mouse" type="Label" parent="TutorialContainer/VBoxContainer/LookTutorial/HBoxContainer/MessageContainer" index="0"] layout_mode = 2 @@ -577,6 +578,7 @@ text = "TUTORIAL_LOOK" [node name="MoveTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/move" [node name="WASD" type="Label" parent="TutorialContainer/VBoxContainer/MoveTutorial/HBoxContainer/MessageContainer" index="0"] layout_mode = 2 @@ -589,6 +591,7 @@ text = "TUTORIAL_MOVE" [node name="JumpTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/jump" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/JumpTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -601,6 +604,7 @@ text = "TUTORIAL_JUMP" [node name="SneakTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/sneak" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/SneakTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -614,6 +618,7 @@ text = "TUTORIAL_SNEAK" [node name="SprintTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/sprint" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/SprintTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -627,6 +632,7 @@ text = "TUTORIAL_SPRINT" [node name="FireTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/fire" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/FireTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -640,6 +646,7 @@ text = "TUTORIAL_FIRE" [node name="ToolSwitchTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/tool_switch" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/ToolSwitchTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -662,32 +669,34 @@ text = "UI_ETC" [node name="Message" parent="TutorialContainer/VBoxContainer/ToolSwitchTutorial/HBoxContainer/MessageContainer" index="3"] text = "TUTORIAL_SWITCH_TOOL" -[node name="PrevNextToolTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] +[node name="ToolPrevNextTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/tool_prev_next" -[node name="InputPrompt" parent="TutorialContainer/VBoxContainer/PrevNextToolTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] +[node name="InputPrompt" parent="TutorialContainer/VBoxContainer/ToolPrevNextTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 text = "❓" action = &"select_prev_tool" show_name = false -[node name="slash" type="Label" parent="TutorialContainer/VBoxContainer/PrevNextToolTutorial/HBoxContainer/MessageContainer" index="1"] +[node name="slash" type="Label" parent="TutorialContainer/VBoxContainer/ToolPrevNextTutorial/HBoxContainer/MessageContainer" index="1"] layout_mode = 2 theme = ExtResource("10_c1hvd") theme_type_variation = &"InputPrompt" text = "/" -[node name="InputPrompt2" parent="TutorialContainer/VBoxContainer/PrevNextToolTutorial/HBoxContainer/MessageContainer" index="2" instance=ExtResource("4_iwjh7")] +[node name="InputPrompt2" parent="TutorialContainer/VBoxContainer/ToolPrevNextTutorial/HBoxContainer/MessageContainer" index="2" instance=ExtResource("4_iwjh7")] layout_mode = 2 text = "❓" action = &"select_next_tool" show_name = false -[node name="Message" parent="TutorialContainer/VBoxContainer/PrevNextToolTutorial/HBoxContainer/MessageContainer" index="3"] +[node name="Message" parent="TutorialContainer/VBoxContainer/ToolPrevNextTutorial/HBoxContainer/MessageContainer" index="3"] text = "TUTORIAL_PREV_NEXT_TOOL" [node name="ModeSwitchTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/mode_switch" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/ModeSwitchTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -700,6 +709,7 @@ text = "TUTORIAL_MODE" [node name="InteractTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/interact" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/InteractTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -712,6 +722,7 @@ text = "TUTORIAL_INTERACT" [node name="PickUpTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/pick_up" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/PickUpTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -724,6 +735,7 @@ text = "TUTORIAL_PICK_UP" [node name="RotateTutorial" parent="TutorialContainer/VBoxContainer" instance=ExtResource("9_8np55")] layout_mode = 2 +tutorial_key = &"game/tutorial/progress/rotate" [node name="InputPrompt" parent="TutorialContainer/VBoxContainer/RotateTutorial/HBoxContainer/MessageContainer" index="0" instance=ExtResource("4_iwjh7")] layout_mode = 2 @@ -742,7 +754,7 @@ text = "TUTORIAL_ROTATE" [editable path="TutorialContainer/VBoxContainer/SprintTutorial"] [editable path="TutorialContainer/VBoxContainer/FireTutorial"] [editable path="TutorialContainer/VBoxContainer/ToolSwitchTutorial"] -[editable path="TutorialContainer/VBoxContainer/PrevNextToolTutorial"] +[editable path="TutorialContainer/VBoxContainer/ToolPrevNextTutorial"] [editable path="TutorialContainer/VBoxContainer/ModeSwitchTutorial"] [editable path="TutorialContainer/VBoxContainer/InteractTutorial"] [editable path="TutorialContainer/VBoxContainer/PickUpTutorial"]