diff --git a/assets/sfx/sfx_game_over_lose.mp3 b/assets/sfx/sfx_game_over_lose.mp3 new file mode 100644 index 00000000..9a4e4870 Binary files /dev/null and b/assets/sfx/sfx_game_over_lose.mp3 differ diff --git a/assets/sfx/sfx_game_over_lose.mp3.import b/assets/sfx/sfx_game_over_lose.mp3.import new file mode 100644 index 00000000..eb29c7d1 --- /dev/null +++ b/assets/sfx/sfx_game_over_lose.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://bpxwbk7r6rtfi" +path="res://.godot/imported/sfx_game_over_lose.mp3-f717ab837e7673ddd99e34ffedbf110d.mp3str" + +[deps] + +source_file="res://assets/sfx/sfx_game_over_lose.mp3" +dest_files=["res://.godot/imported/sfx_game_over_lose.mp3-f717ab837e7673ddd99e34ffedbf110d.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/sfx/sfx_game_over_win.mp3 b/assets/sfx/sfx_game_over_win.mp3 new file mode 100644 index 00000000..01bd457b Binary files /dev/null and b/assets/sfx/sfx_game_over_win.mp3 differ diff --git a/assets/sfx/sfx_game_over_win.mp3.import b/assets/sfx/sfx_game_over_win.mp3.import new file mode 100644 index 00000000..836caa80 --- /dev/null +++ b/assets/sfx/sfx_game_over_win.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://dyckrr2uht3p6" +path="res://.godot/imported/sfx_game_over_win.mp3-9cb0b1b226fef69f748c9009dd90e32d.mp3str" + +[deps] + +source_file="res://assets/sfx/sfx_game_over_win.mp3" +dest_files=["res://.godot/imported/sfx_game_over_win.mp3-9cb0b1b226fef69f748c9009dd90e32d.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/sfx/sfx_right.mp3 b/assets/sfx/sfx_right.mp3 new file mode 100644 index 00000000..a8df1a70 Binary files /dev/null and b/assets/sfx/sfx_right.mp3 differ diff --git a/assets/sfx/sfx_right.mp3.import b/assets/sfx/sfx_right.mp3.import new file mode 100644 index 00000000..6cdaff13 --- /dev/null +++ b/assets/sfx/sfx_right.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://s0cxaexjq5l2" +path="res://.godot/imported/sfx_right.mp3-a07cd051aeafb7fae04c4e1e31c2891c.mp3str" + +[deps] + +source_file="res://assets/sfx/sfx_right.mp3" +dest_files=["res://.godot/imported/sfx_right.mp3-a07cd051aeafb7fae04c4e1e31c2891c.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/sfx/sfx_wrong.mp3 b/assets/sfx/sfx_wrong.mp3 new file mode 100644 index 00000000..d672f87d Binary files /dev/null and b/assets/sfx/sfx_wrong.mp3 differ diff --git a/assets/sfx/sfx_wrong.mp3.import b/assets/sfx/sfx_wrong.mp3.import new file mode 100644 index 00000000..7127733f --- /dev/null +++ b/assets/sfx/sfx_wrong.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://2imrfcmquc7d" +path="res://.godot/imported/sfx_wrong.mp3-905fabb1947e91dd6908053ea413db85.mp3str" + +[deps] + +source_file="res://assets/sfx/sfx_wrong.mp3" +dest_files=["res://.godot/imported/sfx_wrong.mp3-905fabb1947e91dd6908053ea413db85.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/vfx/cross.png b/assets/vfx/cross.png new file mode 100644 index 00000000..80f9117f Binary files /dev/null and b/assets/vfx/cross.png differ diff --git a/assets/vfx/cross.png.import b/assets/vfx/cross.png.import new file mode 100644 index 00000000..6523353c --- /dev/null +++ b/assets/vfx/cross.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqw5oyt88v05u" +path="res://.godot/imported/cross.png-2366f14ab7afd691863602d33c39a13e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/vfx/cross.png" +dest_files=["res://.godot/imported/cross.png-2366f14ab7afd691863602d33c39a13e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/sources/minigames/frog/frog.gd b/sources/minigames/frog/frog.gd index ce07f710..a6d64e17 100644 --- a/sources/minigames/frog/frog.gd +++ b/sources/minigames/frog/frog.gd @@ -4,8 +4,25 @@ signal drowned() signal jumped() @onready var animation_player: = $AnimationPlayer +@onready var audio_player: = $AudioStreamPlayer2D @onready var sprite: = $Sprite +const jump_sounds: = [ + preload("res://assets/minigames/frog/audio/frog_jump_random_01.mp3"), + preload("res://assets/minigames/frog/audio/frog_jump_random_02.mp3"), + preload("res://assets/minigames/frog/audio/frog_jump_random_03.mp3"), + preload("res://assets/minigames/frog/audio/frog_jump_random_04.mp3"), + preload("res://assets/minigames/frog/audio/frog_jump_random_05.mp3"), +] + +const frog_sounds: = [ + preload("res://assets/minigames/frog/audio/frog_random_01.mp3"), + preload("res://assets/minigames/frog/audio/frog_random_02.mp3"), + preload("res://assets/minigames/frog/audio/frog_random_03.mp3"), + preload("res://assets/minigames/frog/audio/frog_random_04.mp3"), + preload("res://assets/minigames/frog/audio/frog_random_05.mp3"), +] + func jump_to(destination: Vector2) -> void: animation_player.play("jump") @@ -18,6 +35,18 @@ func drown() -> void: animation_player.play("drown") +func _play_jump_sound() -> void: + audio_player.stream = jump_sounds[randi() % jump_sounds.size()] + audio_player.play() + + +func _play_frog_sound() -> void: + var r: = randf() + if r <= 0.75: + audio_player.stream = frog_sounds[randi() % frog_sounds.size()] + audio_player.play() + + func _on_animation_player_animation_finished(animation_name: StringName) -> void: if animation_name == "drown": drowned.emit() diff --git a/sources/minigames/frog/frog.tscn b/sources/minigames/frog/frog.tscn index cddc03c5..846ca3e7 100644 --- a/sources/minigames/frog/frog.tscn +++ b/sources/minigames/frog/frog.tscn @@ -102,6 +102,20 @@ tracks/1/keys = { "update": 0, "values": [0.0] } +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"_play_frog_sound" +}] +} [sub_resource type="Animation" id="Animation_0dpgo"] resource_name = "idle_side_1" @@ -158,6 +172,20 @@ tracks/1/keys = { "update": 0, "values": [0.0] } +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"_play_frog_sound" +}] +} [sub_resource type="Animation" id="Animation_ir23o"] resource_name = "jump" @@ -187,6 +215,20 @@ tracks/1/keys = { "update": 0, "values": [0.0] } +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"_play_jump_sound" +}] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_at27w"] _data = { @@ -210,6 +252,8 @@ libraries = { } autoplay = "idle_front_1" +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] + [node name="Sprite" type="Sprite2D" parent="."] material = ExtResource("2_i6km5") scale = Vector2(1.5, 1.5) diff --git a/sources/minigames/frog/frog_minigame.gd b/sources/minigames/frog/frog_minigame.gd index 617a77a9..2ce2ac82 100644 --- a/sources/minigames/frog/frog_minigame.gd +++ b/sources/minigames/frog/frog_minigame.gd @@ -124,6 +124,8 @@ func _on_track_lilypad_in_center(lilypad: Control, track: Control) -> void: await frog.jumped if lilypad.is_distractor: + await lilypad.wrong() + lilypad.disappear() frog.drown() await frog.drowned @@ -148,6 +150,11 @@ func _on_track_lilypad_in_center(lilypad: Control, track: Control) -> void: frog.jump_to(end.global_position) await frog.jumped + for other_track in lilypad_tracks_container.get_children(): + if other_track != track: + other_track.right() + await track.right() + frog.jump_to(frog_despawn_point.global_position) await frog.jumped diff --git a/sources/minigames/frog/frog_minigame.tscn b/sources/minigames/frog/frog_minigame.tscn index 144774ce..c3ef5c3c 100644 --- a/sources/minigames/frog/frog_minigame.tscn +++ b/sources/minigames/frog/frog_minigame.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://dl5wx8l0awoi0"] +[gd_scene load_steps=22 format=3 uid="uid://dl5wx8l0awoi0"] [ext_resource type="PackedScene" uid="uid://8awe4usnucyv" path="res://sources/minigames/base/base_minigame.tscn" id="1_ng5er"] [ext_resource type="Script" path="res://sources/minigames/frog/frog_minigame.gd" id="2_0xg3r"] @@ -14,9 +14,52 @@ [ext_resource type="Texture2D" uid="uid://dg4n6nv84tl3u" path="res://assets/minigames/frog/graphics/grass_right.png" id="6_bvdcd"] [ext_resource type="Texture2D" uid="uid://ct24yoo1efipg" path="res://assets/minigames/frog/graphics/reed_01.png" id="7_161vn"] [ext_resource type="Texture2D" uid="uid://djg2gkxxjgqwx" path="res://assets/minigames/frog/graphics/reed_02.png" id="8_ps7uv"] +[ext_resource type="Shader" path="res://sources/minigames/frog/river.gdshader" id="8_uf2wy"] [ext_resource type="Texture2D" uid="uid://b51kxs3qm3wiw" path="res://assets/minigames/frog/graphics/rock.png" id="13_lifwj"] [ext_resource type="PackedScene" uid="uid://bloyucpsbvpx8" path="res://sources/minigames/frog/frog.tscn" id="13_o6mls"] +[sub_resource type="Animation" id="Animation_rgirw"] +resource_name = "flow" +length = 2.0 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("River:material:shader_parameter/y_offset") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} + +[sub_resource type="Animation" id="Animation_utuls"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("River:material:shader_parameter/y_offset") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_c1hhy"] +_data = { +"RESET": SubResource("Animation_utuls"), +"flow": SubResource("Animation_rgirw") +} + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_doj3f"] +shader = ExtResource("8_uf2wy") +shader_parameter/y_offset = 0.0 + [node name="FrogMinigame" instance=ExtResource("1_ng5er")] script = ExtResource("2_0xg3r") difficulty = 1 @@ -40,7 +83,15 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="River" type="TextureRect" parent="GameRoot/Background" index="0"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="GameRoot/Background" index="0"] +libraries = { +"": SubResource("AnimationLibrary_c1hhy") +} +autoplay = "flow" + +[node name="River" type="TextureRect" parent="GameRoot/Background" index="1"] +texture_repeat = 2 +material = SubResource("ShaderMaterial_doj3f") layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -50,7 +101,7 @@ grow_vertical = 2 mouse_filter = 2 texture = ExtResource("2_wg03r") -[node name="LeftSand" type="TextureRect" parent="GameRoot/Background" index="1"] +[node name="LeftSand" type="TextureRect" parent="GameRoot/Background" index="2"] layout_mode = 1 anchors_preset = 9 anchor_bottom = 1.0 @@ -59,7 +110,7 @@ grow_vertical = 2 mouse_filter = 2 texture = ExtResource("3_eaixk") -[node name="LeftGrass" type="TextureRect" parent="GameRoot/Background" index="2"] +[node name="LeftGrass" type="TextureRect" parent="GameRoot/Background" index="3"] layout_mode = 1 anchors_preset = 9 anchor_bottom = 1.0 @@ -68,7 +119,7 @@ grow_vertical = 2 mouse_filter = 2 texture = ExtResource("4_mvhry") -[node name="RightSand" type="TextureRect" parent="GameRoot/Background" index="3"] +[node name="RightSand" type="TextureRect" parent="GameRoot/Background" index="4"] layout_mode = 1 anchors_preset = 11 anchor_left = 1.0 @@ -80,7 +131,7 @@ grow_vertical = 2 mouse_filter = 2 texture = ExtResource("5_6ofrr") -[node name="RightGrass" type="TextureRect" parent="GameRoot/Background" index="4"] +[node name="RightGrass" type="TextureRect" parent="GameRoot/Background" index="5"] layout_mode = 1 anchors_preset = 11 anchor_left = 1.0 @@ -92,7 +143,7 @@ grow_vertical = 2 mouse_filter = 2 texture = ExtResource("6_bvdcd") -[node name="Rocks" type="Control" parent="GameRoot/Background" index="5"] +[node name="Rocks" type="Control" parent="GameRoot/Background" index="6"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 diff --git a/sources/minigames/frog/lilypad.gd b/sources/minigames/frog/lilypad.gd index 61a7b12d..ad30fe64 100644 --- a/sources/minigames/frog/lilypad.gd +++ b/sources/minigames/frog/lilypad.gd @@ -7,6 +7,8 @@ signal disappeared() @onready var button: = $TextureButton @onready var label: = %Label @onready var highlight_fx: = $HighlightFX +@onready var right_fx: = $RightFX +@onready var wrong_fx: = $WrongFX var stimulus: Dictionary: set = _set_stimulus @@ -24,6 +26,16 @@ func highlight() -> void: highlight_fx.play() +func right() -> void: + right_fx.play() + await right_fx.finished + + +func wrong() -> void: + wrong_fx.play() + await wrong_fx.finished + + func stop_highlight() -> void: if not is_distractor: highlight_fx.stop() diff --git a/sources/minigames/frog/lilypad.tscn b/sources/minigames/frog/lilypad.tscn index e6bf507f..de0edada 100644 --- a/sources/minigames/frog/lilypad.tscn +++ b/sources/minigames/frog/lilypad.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=9 format=3 uid="uid://bkswcqcmf7a0r"] +[gd_scene load_steps=11 format=3 uid="uid://bkswcqcmf7a0r"] [ext_resource type="Material" uid="uid://cbs2x6nv6jl63" path="res://sources/minigames/frog/lilypad_material.tres" id="1_pbo2v"] [ext_resource type="Script" path="res://sources/minigames/frog/lilypad.gd" id="2_pdqed"] [ext_resource type="Texture2D" uid="uid://bl4csvpvhsgqh" path="res://assets/minigames/frog/graphics/lilypad_enabled.png" id="3_1ueu4"] [ext_resource type="Texture2D" uid="uid://bafwfqkof2og7" path="res://assets/minigames/frog/graphics/lilypad_disabled.png" id="4_0e8ya"] [ext_resource type="PackedScene" uid="uid://cge0uyn30tcpv" path="res://sources/utils/fx/highlight.tscn" id="5_1llgv"] +[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="6_wslmk"] +[ext_resource type="PackedScene" uid="uid://dlmbxcgiv8tpr" path="res://sources/utils/fx/wrong.tscn" id="7_241b6"] [sub_resource type="Animation" id="Animation_852sr"] length = 0.001 @@ -88,5 +90,9 @@ text = "A" horizontal_alignment = 1 vertical_alignment = 1 +[node name="RightFX" parent="." instance=ExtResource("6_wslmk")] + +[node name="WrongFX" parent="." instance=ExtResource("7_241b6")] + [connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"] [connection signal="pressed" from="TextureButton" to="." method="_on_texture_button_pressed"] diff --git a/sources/minigames/frog/lilypad_track.gd b/sources/minigames/frog/lilypad_track.gd index 405f4396..f9364dc0 100644 --- a/sources/minigames/frog/lilypad_track.gd +++ b/sources/minigames/frog/lilypad_track.gd @@ -2,6 +2,7 @@ extends Control signal lilypad_in_center(lilypad: Control) +@onready var audio_player: = $AudioStreamPlayer2D @onready var spawn_timer: = $SpawnTimer const lilypad_class: = preload("res://sources/minigames/frog/lilypad.tscn") @@ -54,6 +55,11 @@ func stop() -> void: ready_to_spawn = false +func right() -> void: + for lilypad in lilypads: + await lilypad.right() + + func _spawn_lilypad() -> void: var lilypad: = lilypad_class.instantiate() lilypads.append(lilypad) @@ -130,6 +136,8 @@ func _set_stimuli(value: Array) -> void: func _on_lilypad_pressed(lilypad: Control) -> void: + audio_player.play() + ready_to_spawn = false for tween in tweens: diff --git a/sources/minigames/frog/lilypad_track.tscn b/sources/minigames/frog/lilypad_track.tscn index efe9b4ad..b2ef9b6b 100644 --- a/sources/minigames/frog/lilypad_track.tscn +++ b/sources/minigames/frog/lilypad_track.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3 uid="uid://byqqa5hk1hmv5"] +[gd_scene load_steps=3 format=3 uid="uid://byqqa5hk1hmv5"] [ext_resource type="Script" path="res://sources/minigames/frog/lilypad_track.gd" id="1_0nn04"] +[ext_resource type="AudioStream" uid="uid://b2idirdf5bdrl" path="res://assets/minigames/frog/audio/frog_taplily.mp3" id="2_8qte0"] [node name="LilypadTrack" type="Control"] layout_mode = 3 @@ -13,6 +14,9 @@ size_flags_horizontal = 3 size_flags_vertical = 3 script = ExtResource("1_0nn04") +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("2_8qte0") + [node name="SpawnTimer" type="Timer" parent="."] one_shot = true autostart = true diff --git a/sources/minigames/frog/river.gdshader b/sources/minigames/frog/river.gdshader new file mode 100644 index 00000000..9e83bd5f --- /dev/null +++ b/sources/minigames/frog/river.gdshader @@ -0,0 +1,10 @@ +shader_type canvas_item; + +uniform float y_offset: hint_range(0.0, 1.0) = 0.0; + + +void fragment() +{ + vec2 uv = UV - vec2(0.0, y_offset); + COLOR = texture(TEXTURE, uv); +} diff --git a/sources/utils/fx/highlight.tscn b/sources/utils/fx/highlight.tscn index 89caaca2..2596776d 100644 --- a/sources/utils/fx/highlight.tscn +++ b/sources/utils/fx/highlight.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://sources/utils/fx/highlight.gd" id="1_uj18s"] [ext_resource type="Texture2D" uid="uid://c161hyri7yhme" path="res://assets/vfx/fx_01.png" id="2_3sm6p"] -[sub_resource type="Animation" id="Animation_enql5"] +[sub_resource type="Animation" id="Animation_mfajw"] length = 0.001 tracks/0/type = "bezier" tracks/0/imported = false @@ -73,9 +73,9 @@ tracks/5/keys = { "times": PackedFloat32Array(0) } -[sub_resource type="Animation" id="Animation_upcal"] -resource_name = "highlight" -loop_mode = 1 +[sub_resource type="Animation" id="Animation_ud7pl"] +resource_name = "win" +length = 3.0 tracks/0/type = "bezier" tracks/0/imported = false tracks/0/enabled = true @@ -85,7 +85,7 @@ tracks/0/loop_wrap = true tracks/0/keys = { "handle_modes": PackedInt32Array(0, 0), "points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 1) +"times": PackedFloat32Array(0, 3) } tracks/1/type = "bezier" tracks/1/imported = false @@ -96,7 +96,7 @@ tracks/1/loop_wrap = true tracks/1/keys = { "handle_modes": PackedInt32Array(0, 0), "points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 1) +"times": PackedFloat32Array(0, 3) } tracks/2/type = "bezier" tracks/2/imported = false @@ -107,7 +107,7 @@ tracks/2/loop_wrap = true tracks/2/keys = { "handle_modes": PackedInt32Array(0, 0, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 0.1, 1) +"times": PackedFloat32Array(0, 0.1, 3) } tracks/3/type = "bezier" tracks/3/imported = false @@ -118,7 +118,7 @@ tracks/3/loop_wrap = true tracks/3/keys = { "handle_modes": PackedInt32Array(0, 0), "points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 1) +"times": PackedFloat32Array(0, 3) } tracks/4/type = "bezier" tracks/4/imported = false @@ -129,7 +129,7 @@ tracks/4/loop_wrap = true tracks/4/keys = { "handle_modes": PackedInt32Array(0, 0), "points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 1) +"times": PackedFloat32Array(0, 3) } tracks/5/type = "bezier" tracks/5/imported = false @@ -140,10 +140,10 @@ tracks/5/loop_wrap = true tracks/5/keys = { "handle_modes": PackedInt32Array(0, 0, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0, 0.1, 1) +"times": PackedFloat32Array(0, 0.1, 3) } -[sub_resource type="Animation" id="Animation_ty014"] +[sub_resource type="Animation" id="Animation_7q7mv"] resource_name = "stop" length = 0.1 tracks/0/type = "bezier" @@ -213,11 +213,11 @@ tracks/5/keys = { "times": PackedFloat32Array(0) } -[sub_resource type="AnimationLibrary" id="AnimationLibrary_20b8s"] +[sub_resource type="AnimationLibrary" id="AnimationLibrary_g6flg"] _data = { -"RESET": SubResource("Animation_enql5"), -"highlight": SubResource("Animation_upcal"), -"stop": SubResource("Animation_ty014") +"RESET": SubResource("Animation_mfajw"), +"highlight": SubResource("Animation_ud7pl"), +"stop": SubResource("Animation_7q7mv") } [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_3qhub"] @@ -228,7 +228,7 @@ script = ExtResource("1_uj18s") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { -"": SubResource("AnimationLibrary_20b8s") +"": SubResource("AnimationLibrary_g6flg") } [node name="Rays" type="Sprite2D" parent="."] diff --git a/sources/utils/fx/right.gd b/sources/utils/fx/right.gd new file mode 100644 index 00000000..733f1354 --- /dev/null +++ b/sources/utils/fx/right.gd @@ -0,0 +1,14 @@ +extends Node2D + +signal finished() + +@onready var animation_player: = $AnimationPlayer + + +func play() -> void: + animation_player.play("right") + + +func _on_animation_player_animation_finished(animation_name: StringName) -> void: + if animation_name == "right": + finished.emit() diff --git a/sources/utils/fx/right.tscn b/sources/utils/fx/right.tscn new file mode 100644 index 00000000..e78aa503 --- /dev/null +++ b/sources/utils/fx/right.tscn @@ -0,0 +1,262 @@ +[gd_scene load_steps=15 format=3 uid="uid://cn2rw06pltyiu"] + +[ext_resource type="Script" path="res://sources/utils/fx/right.gd" id="1_83pnv"] +[ext_resource type="AudioStream" uid="uid://s0cxaexjq5l2" path="res://assets/sfx/sfx_right.mp3" id="2_ebh1q"] +[ext_resource type="Texture2D" uid="uid://3idggaf5hbbm" path="res://assets/vfx/fx_02.png" id="3_2nlkh"] +[ext_resource type="Texture2D" uid="uid://c161hyri7yhme" path="res://assets/vfx/fx_01.png" id="4_coc6y"] +[ext_resource type="Texture2D" uid="uid://dxl5h3tqf21cv" path="res://assets/vfx/fx_03.png" id="5_300xs"] + +[sub_resource type="Animation" id="Animation_sc4ca"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Rays:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Rays:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Rays:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5), +"times": PackedFloat32Array(0) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Halo:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Halo:scale:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Halo:modulate:a") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5), +"times": PackedFloat32Array(0) +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("GPUParticles2D:emitting") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("AudioStreamPlayer2D:playing") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_xu0xr"] +resource_name = "right" +length = 3.0 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Halo:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 3) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Halo:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 3) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Halo:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.1, 3) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Rays:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 3) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Rays:scale:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 3) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Rays:modulate:a") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.1, 3) +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("GPUParticles2D:emitting") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("AudioStreamPlayer2D:playing") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_k8dqy"] +_data = { +"RESET": SubResource("Animation_sc4ca"), +"right": SubResource("Animation_xu0xr") +} + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_v3jt2"] +blend_mode = 1 + +[sub_resource type="Gradient" id="Gradient_u3fxj"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_1y1y0"] +gradient = SubResource("Gradient_u3fxj") +width = 32 + +[sub_resource type="Curve" id="Curve_4x1t7"] +max_value = 0.8 +_data = [Vector2(0, 0.8), 0.0, 0.0, 0, 0, Vector2(1, 0), -2.08937, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_ebpu0"] +width = 32 +curve = SubResource("Curve_4x1t7") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_dwcrn"] +particle_flag_disable_z = true +direction = Vector3(0, -1, 0) +initial_velocity_min = 100.0 +initial_velocity_max = 200.0 +angular_velocity_max = 720.0 +gravity = Vector3(0, 98, 0) +scale_curve = SubResource("CurveTexture_ebpu0") +color_ramp = SubResource("GradientTexture1D_1y1y0") + +[node name="RightFX" type="Node2D"] +script = ExtResource("1_83pnv") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_k8dqy") +} + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("2_ebh1q") + +[node name="Rays" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0) +material = SubResource("CanvasItemMaterial_v3jt2") +scale = Vector2(0.8, 0.8) +texture = ExtResource("3_2nlkh") + +[node name="Halo" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0) +scale = Vector2(0.8, 0.8) +texture = ExtResource("4_coc6y") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +emitting = false +amount = 16 +process_material = SubResource("ParticleProcessMaterial_dwcrn") +texture = ExtResource("5_300xs") +lifetime = 2.5 +one_shot = true +explosiveness = 1.0 + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"] diff --git a/sources/utils/fx/wrong.gd b/sources/utils/fx/wrong.gd new file mode 100644 index 00000000..57438729 --- /dev/null +++ b/sources/utils/fx/wrong.gd @@ -0,0 +1,14 @@ +extends Node2D + +signal finished() + +@onready var animation_player: = $AnimationPlayer + + +func play() -> void: + animation_player.play("wrong") + + +func _on_animation_player_animation_finished(animation_name: StringName) -> void: + if animation_name == "wrong": + finished.emit() diff --git a/sources/utils/fx/wrong.tscn b/sources/utils/fx/wrong.tscn new file mode 100644 index 00000000..e648757d --- /dev/null +++ b/sources/utils/fx/wrong.tscn @@ -0,0 +1,164 @@ +[gd_scene load_steps=8 format=3 uid="uid://dlmbxcgiv8tpr"] + +[ext_resource type="AudioStream" uid="uid://2imrfcmquc7d" path="res://assets/sfx/sfx_wrong.mp3" id="1_qd4na"] +[ext_resource type="Script" path="res://sources/utils/fx/wrong.gd" id="1_sgjc5"] +[ext_resource type="Texture2D" uid="uid://c161hyri7yhme" path="res://assets/vfx/fx_01.png" id="3_r5miu"] +[ext_resource type="Texture2D" uid="uid://bqw5oyt88v05u" path="res://assets/vfx/cross.png" id="4_7ijh5"] + +[sub_resource type="Animation" id="Animation_tj5mf"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Halo:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Halo:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Halo:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5), +"times": PackedFloat32Array(0) +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AudioStreamPlayer2D:playing") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_dn23k"] +resource_name = "wrong" +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Halo:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Halo:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Halo:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.1, 1) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Cross:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Cross:scale:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.8, -0.25, 0, 0.25, 0.5, 1.6, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Cross:modulate:a") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.05, 0.5, 1, -0.05, 0, 0.5, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.1, 1) +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("AudioStreamPlayer2D:playing") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_c86ui"] +_data = { +"RESET": SubResource("Animation_tj5mf"), +"wrong": SubResource("Animation_dn23k") +} + +[node name="WrongFX" type="Node2D"] +script = ExtResource("1_sgjc5") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_c86ui") +} + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("1_qd4na") + +[node name="Halo" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0) +scale = Vector2(0.8, 0.8) +texture = ExtResource("3_r5miu") + +[node name="Cross" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0) +scale = Vector2(0.8, 0.8) +texture = ExtResource("4_7ijh5") + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"]