From 7cfd1930eda71ac4413a58f40e87deb109683b69 Mon Sep 17 00:00:00 2001 From: Harmony Honey Date: Sun, 9 Apr 2023 13:52:51 -0400 Subject: [PATCH] DoorUnlock Cutscene looking fancy!!^.^ --- src/actor/door/Door.gd | 2 + src/actor/door/DoorBig.gd | 9 ++- src/actor/door/DoorBig.tscn | 1 - src/autoload/Audio.tscn | 12 +++- src/autoload/Cam.gd | 2 +- src/cutscene/Cutscene.tscn | 3 +- src/cutscene/DoorUnlock.gd | 114 +++++++++++++++++++++++++++--------- 7 files changed, 108 insertions(+), 35 deletions(-) diff --git a/src/actor/door/Door.gd b/src/actor/door/Door.gd index c7ccff1..dbdc3ac 100644 --- a/src/actor/door/Door.gd +++ b/src/actor/door/Door.gd @@ -23,6 +23,8 @@ func _exit_tree(): Shared.doors.erase(self) func _ready(): + if Engine.editor_hint: return + # set is_locked if scene not found var f = File.new() arrow.is_locked = !f.file_exists(scene_path) diff --git a/src/actor/door/DoorBig.gd b/src/actor/door/DoorBig.gd index 57d600c..99ff04e 100644 --- a/src/actor/door/DoorBig.gd +++ b/src/actor/door/DoorBig.gd @@ -23,9 +23,7 @@ func _ready(): door_name = Shared.map_name + ":" + name is_cutscene = gem_count > 0 and !Shared.doors_unlocked.has(door_name) - if door_mat: - for i in 2: - door_mat.set_shader_param(["gem_col", "gem_fill"][i] , colors[(0 if is_cutscene else 2) + i]) + gem_color(!is_cutscene) label.modulate.a = 0.0 @@ -77,3 +75,8 @@ func activate(): func on_enter(): if !Shared.doors_unlocked.has(door_name): Shared.doors_unlocked.append(door_name) + +func gem_color(is_gold := false): + if door_mat: + for i in 2: + door_mat.set_shader_param(["gem_col", "gem_fill"][i] , colors[(2 if is_gold else 0) + i]) diff --git a/src/actor/door/DoorBig.tscn b/src/actor/door/DoorBig.tscn index 6bc6866..6d8c683 100644 --- a/src/actor/door/DoorBig.tscn +++ b/src/actor/door/DoorBig.tscn @@ -41,7 +41,6 @@ node_path = NodePath("..") [node name="Arrow" parent="." index="1"] col_size = Vector2( 100, 100 ) image_pos = Vector2( 0, -150 ) -is_locked = true [node name="Sprites" type="Node2D" parent="." index="2"] diff --git a/src/autoload/Audio.tscn b/src/autoload/Audio.tscn index e369e65..cee2a71 100644 --- a/src/autoload/Audio.tscn +++ b/src/autoload/Audio.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=24 format=2] +[gd_scene load_steps=26 format=2] [ext_resource path="res://src/autoload/Audio.gd" type="Script" id=1] [ext_resource path="res://media/audio/sfx/coin1.wav" type="AudioStream" id=2] @@ -19,10 +19,12 @@ [ext_resource path="res://media/audio/sfx/player_land.wav" type="AudioStream" id=17] [ext_resource path="res://media/audio/sfx/player_jump.wav" type="AudioStream" id=18] [ext_resource path="res://media/audio/sfx/btn3.wav" type="AudioStream" id=19] +[ext_resource path="res://media/audio/sfx/piano_high.wav" type="AudioStream" id=20] [ext_resource path="res://media/audio/music/ost1.mp3" type="AudioStream" id=21] [ext_resource path="res://media/audio/music/ost3.mp3" type="AudioStream" id=22] [ext_resource path="res://media/audio/music/ost4.mp3" type="AudioStream" id=23] [ext_resource path="res://media/audio/music/ost2.mp3" type="AudioStream" id=24] +[ext_resource path="res://media/audio/sfx/guitar_pluck.wav" type="AudioStream" id=25] [node name="Audio" type="Node"] pause_mode = 2 @@ -76,6 +78,14 @@ bus = "SFX" stream = ExtResource( 6 ) bus = "SFX" +[node name="Piano" type="AudioStreamPlayer" parent="Gem"] +stream = ExtResource( 20 ) +bus = "SFX" + +[node name="Socket" type="AudioStreamPlayer" parent="Gem"] +stream = ExtResource( 25 ) +bus = "SFX" + [node name="Clock" type="Node" parent="."] [node name="Collect" type="AudioStreamPlayer" parent="Clock"] diff --git a/src/autoload/Cam.gd b/src/autoload/Cam.gd index 803ef6d..d6d4ca4 100644 --- a/src/autoload/Cam.gd +++ b/src/autoload/Cam.gd @@ -87,7 +87,7 @@ func _process(delta): emit_signal("moved") func set_target_node(arg): - if is_instance_valid(target_node): target_node.disconnect("turn_cam", self, "turn") + if is_instance_valid(target_node) and target_node.has_signal("turn_cam"): target_node.disconnect("turn_cam", self, "turn") target_node = arg if is_instance_valid(target_node) and target_node.has_signal("turn_cam"): target_node.connect("turn_cam", self, "turn") diff --git a/src/cutscene/Cutscene.tscn b/src/cutscene/Cutscene.tscn index b09b43b..ddf974b 100644 --- a/src/cutscene/Cutscene.tscn +++ b/src/cutscene/Cutscene.tscn @@ -25,8 +25,9 @@ script = ExtResource( 4 ) [node name="DoorUnlock" type="Node" parent="."] script = ExtResource( 5 ) -turn_speed = 3.0 [node name="Gem" parent="DoorUnlock" instance=ExtResource( 7 )] [node name="Gems" type="Node2D" parent="DoorUnlock"] +z_index = 48 +z_as_relative = false diff --git a/src/cutscene/DoorUnlock.gd b/src/cutscene/DoorUnlock.gd index ffe03fe..9fe0506 100644 --- a/src/cutscene/DoorUnlock.gd +++ b/src/cutscene/DoorUnlock.gd @@ -5,72 +5,130 @@ onready var gems_node := $Gems onready var gems := [] export var radius := 150.0 -export var turn_speed := 1.0 +export var turn_speed := 3.0 + +var door var gem_count = 0 var clock := 0.0 +var time := 10.0 +var step := 0 +signal done -var gem_ease := EaseMover.new(2.0) - -var gem_offset := 0.3 +export var gem_offset := 0.2 var gem_time := 1.0 +var gem_last := 0.0 +var gem_step := 0.0 + +var gem_shrink := Vector2(50, 0.5) +var socket_pos := Vector2.ZERO + +var socket_ease := EaseMover.new(1.0) +var click_ease := EaseMover.new(0.5) + + func _ready(): set_physics_process(false) gem.visible = false + gem.scale = Vector2.ZERO for i in 50: gems_node.add_child(gem.duplicate()) gems = gems_node.get_children() + + gem.z_index = gems_node.z_index + 1 + gem.z_as_relative = false func _physics_process(delta): clock += delta + gem_last = gem_step + gem_step = floor(clock / gem_offset) + + var shrink = clamp(clock - gem_shrink.x, 0.0, gem_shrink.y) / gem_shrink.y + + if gem_step != gem_last and gem_step < gem_count: + Audio.play("gem_piano", 0.5 + (gem_step * 0.1)) + for i in gems.size(): var f = clock - (gem_offset * i) var frac = clamp(f, 0.0, gem_time) / gem_time var under = abs(min(f, 0.0)) var a = (TAU * (float(i) / float(gem_count))) + ((clock + under) * turn_speed) - var pos = Vector2(radius, 0).rotated(a) + var pos = Vector2(radius * (1.0 - shrink) * -sign(turn_speed), 0).rotated(a) gems[i].position = gems_node.to_local(Shared.player.global_position).linear_interpolate(pos, frac) - gems[i].scale = Vector2.ONE * ease(frac, 0.5) + gems[i].scale = Vector2.ONE * ease(frac - shrink, 0.5) + gem.scale = Vector2.ONE * lerp(0.0, 2.5, shrink) + + if step == 2: + gem.global_position = gems_node.global_position.linear_interpolate(socket_pos, socket_ease.count(delta)) + elif step == 3: + click_ease.count(delta) + var w = ease(abs(wrapf(click_ease.frac() * 2.0, -1.0, 1.0)), -5) + gem.scale = Vector2.ONE * lerp(2.5, 2.2, w) + + if clock > time: + step += 1 + + match step: + 1: + time += 2.0 + Audio.play("clock_collect", 0.8, 1.2) + #door.is_fade = true + Cam.target_node = gem + 2: + time += socket_ease.time + socket_ease.clock = 0.0 + gems_node.visible = false + 3: + time += click_ease.time + click_ease.clock = 0.0 + Audio.play("gem_show", 0.2, 0.4) + 4: + door.gem_color(true) + gem.visible = false + + emit_signal("done") + set_physics_process(false) func act(d): if !is_instance_valid(d): return + door = d Cutscene.is_playing = true - gems_node.global_position = d.global_position + Shared.rot(Vector2(0, -300), d.dir) + gems_node.global_position = door.global_position + Shared.rot(Vector2(0, -300), door.dir) + gem.position = gems_node.position + socket_pos = door.global_position + Shared.rot(Vector2(0, -10), door.dir) + Cam.target_node = null - Cam.target_pos = d.global_position.linear_interpolate(gems_node.global_position, 2.0 / 3.0) + Cam.target_pos = door.global_position.linear_interpolate(gems_node.global_position, 2.0 / 3.0) Cam.start_zoom(0) - gem_count = d.gem_count - d.is_cutscene = false - - for i in gems.size(): - gems[i].visible = i < gem_count - - if i < gem_count: - gems[i].position = Vector2(radius, 0).rotated(TAU * (float(i) / float(gem_count))) - - clock = 0.0 - set_physics_process(true) - - yield(get_tree().create_timer(2.0), "timeout") - - - d.is_fade = true + gem_count = door.gem_count + door.is_cutscene = false UI.up.show = false - Audio.play("gem_collect", 0.6, 0.8) - yield(get_tree().create_timer(3.0), "timeout") + gem.visible = true + gem.scale = Vector2.ZERO + gems_node.visible = true + for i in gems.size(): + gems[i].visible = i < gem_count + gems[i].scale = Vector2.ZERO + + clock = 0.0 + step = 0 + time = (gem_count * gem_offset) + gem_time + gem_shrink.x = time + if randf() > 0.5: turn_speed = -turn_speed + + set_physics_process(true) + yield(self, "done") Cam.target_node = Shared.player - - set_physics_process(false) Cutscene.is_playing = false