diff --git a/Animations/GameEnding.res b/Animations/GameEnding.res index c58dc6f..ede984c 100644 Binary files a/Animations/GameEnding.res and b/Animations/GameEnding.res differ diff --git a/Animations/OnHitHedron.res b/Animations/OnHitHedron.res new file mode 100644 index 0000000..7939b77 Binary files /dev/null and b/Animations/OnHitHedron.res differ diff --git a/Animations/OnHitOrb.res b/Animations/OnHitOrb.res new file mode 100644 index 0000000..fcf2ce3 Binary files /dev/null and b/Animations/OnHitOrb.res differ diff --git a/Animations/OnHitPyramid.res b/Animations/OnHitPyramid.res new file mode 100644 index 0000000..142bf64 Binary files /dev/null and b/Animations/OnHitPyramid.res differ diff --git a/Audio/BGM/BossTheme.ogg.import b/Audio/BGM/BossTheme.ogg.import index 5c0972b..d311c90 100644 --- a/Audio/BGM/BossTheme.ogg.import +++ b/Audio/BGM/BossTheme.ogg.import @@ -12,7 +12,7 @@ dest_files=["res://.godot/imported/BossTheme.ogg-459b51256339e59464889a466918555 [params] -loop=false +loop=true loop_offset=0 bpm=0 beat_count=0 diff --git a/Audio/SFX/HitObstacle.wav b/Audio/SFX/HitObstacle.wav new file mode 100644 index 0000000..e61742e Binary files /dev/null and b/Audio/SFX/HitObstacle.wav differ diff --git a/Audio/SFX/HitObstacle.wav.import b/Audio/SFX/HitObstacle.wav.import new file mode 100644 index 0000000..8b86858 --- /dev/null +++ b/Audio/SFX/HitObstacle.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://6yf38ykqn31u" +path="res://.godot/imported/HitObstacle.wav-1156edf3c0f09f2940143fa0f6a748cd.sample" + +[deps] + +source_file="res://Audio/SFX/HitObstacle.wav" +dest_files=["res://.godot/imported/HitObstacle.wav-1156edf3c0f09f2940143fa0f6a748cd.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=true +edit/normalize=true +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/Audio/SFX/hit.ogg b/Audio/SFX/hit.ogg new file mode 100644 index 0000000..44d3db4 Binary files /dev/null and b/Audio/SFX/hit.ogg differ diff --git a/Audio/SFX/hit.ogg.import b/Audio/SFX/hit.ogg.import new file mode 100644 index 0000000..f74a068 --- /dev/null +++ b/Audio/SFX/hit.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://fjla2rrw6ilt" +path="res://.godot/imported/hit.ogg-2e022f04d34e894511a1026c55efba44.oggvorbisstr" + +[deps] + +source_file="res://Audio/SFX/hit.ogg" +dest_files=["res://.godot/imported/hit.ogg-2e022f04d34e894511a1026c55efba44.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Enemies/Attacks/FireAtPlayer.cs b/Enemies/Attacks/FireAtPlayer.cs index 993d5e5..08d3601 100644 --- a/Enemies/Attacks/FireAtPlayer.cs +++ b/Enemies/Attacks/FireAtPlayer.cs @@ -9,6 +9,8 @@ public partial class FireAtPlayer : Timer private PackedScene _fireProjectile; [Export] private double _distanceToPlayer = 3; + [Export] + private AudioStreamPlayer _audioPlayer; public void OnFireAtPlayer() { @@ -23,6 +25,8 @@ public partial class FireAtPlayer : Timer projectile.Rotation = new Vector3(0, _enemy.Rotation.Y, 0); projectile.Position = _enemy.Position; AddChild(projectile); + _audioPlayer.Play(); + } } } diff --git a/Enemies/Attacks/GodCircuitAttacks/BossAttack.cs b/Enemies/Attacks/GodCircuitAttacks/BossAttack.cs new file mode 100644 index 0000000..5081f0d --- /dev/null +++ b/Enemies/Attacks/GodCircuitAttacks/BossAttack.cs @@ -0,0 +1,19 @@ +using Godot; + +public partial class BossAttack : Node3D +{ + public void OnOrbHit(Node node) + { + if (node is Character character && character.HasMethod(Character.MethodName.OnHit)) + { + GD.Print("Player hit: " + character.Name); + character.Call(Character.MethodName.OnHit, node); + Delete(); + } + } + + public void Delete() + { + QueueFree(); + } +} diff --git a/Enemies/Attacks/GodCircuitAttacks/HedronAttack.tscn b/Enemies/Attacks/GodCircuitAttacks/HedronAttack.tscn new file mode 100644 index 0000000..68a27ed --- /dev/null +++ b/Enemies/Attacks/GodCircuitAttacks/HedronAttack.tscn @@ -0,0 +1,574 @@ +[gd_scene load_steps=9 format=3 uid="uid://b75khmojjbq4f"] + +[ext_resource type="Script" path="res://Enemies/Attacks/GodCircuitAttacks/BossAttack.cs" id="1_xty5l"] +[ext_resource type="Texture2D" uid="uid://cpvq0rru8k7l5" path="res://Textures/Projectiles/Layer 3.png" id="2_kceeh"] +[ext_resource type="Texture2D" uid="uid://x8f4g1rccvud" path="res://Textures/Projectiles/Layer 4.png" id="3_1s7oj"] +[ext_resource type="AudioStream" uid="uid://cfj82os5p8i4p" path="res://Audio/SFX/shooting.wav" id="4_h0ftg"] + +[sub_resource type="Animation" id="Animation_8rgmo"] +resource_name = "PyramidAttack" +length = 8.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MainOrb/CollisionShape3D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 1, 0), Vector3(0, 1, 3)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("MainOrb/CollisionShape3D/Sprite3D:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0, 0), Vector3(0, 6.26573, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Triangle1/CollisionShape3D:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 3, 8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector3(0, 0, -2.01695), Vector3(0, 0, -2.01695), Vector3(15, 0, -2.017)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Triangle1:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Triangle2:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Triangle2/CollisionShape3D:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(3, 8), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0.0265542, 0, -2.01695), Vector3(0.027, 0, -15)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Triangle3:visible") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Triangle3/CollisionShape3D:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(3, 8), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0, -2.01695), Vector3(-15, 0, -2.017)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Triangle4:visible") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Triangle4/CollisionShape3D:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(3, 8), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0, -2.01695), Vector3(0, 0, 13)] +} +tracks/10/type = "method" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("MainOrb") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(2.9), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"Delete" +}] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Triangle1:monitoring") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Triangle1:monitorable") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Triangle2:monitoring") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Triangle2:monitorable") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Triangle3:monitoring") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Triangle3:monitorable") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Triangle4:monitoring") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Triangle4:monitorable") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} + +[sub_resource type="Animation" id="Animation_js2kt"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MainOrb/CollisionShape3D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 1, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("MainOrb/CollisionShape3D/Sprite3D:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 6.26573, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Triangle1/CollisionShape3D:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0, -2.01695)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Triangle1:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Triangle2:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Triangle2/CollisionShape3D:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0.0265542, 0, -2.01695)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Triangle3:visible") +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("Triangle3/CollisionShape3D:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0, -2.01695)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Triangle4:visible") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Triangle4/CollisionShape3D:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0, -2.01695)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Triangle1:monitoring") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Triangle1:monitorable") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Triangle2:monitoring") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Triangle2:monitorable") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Triangle3:monitoring") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Triangle3:monitorable") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Triangle4:monitoring") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Triangle4:monitorable") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ht5d6"] +_data = { +"PyramidAttack": SubResource("Animation_8rgmo"), +"RESET": SubResource("Animation_js2kt") +} + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_uh2on"] +radius = 0.266805 + +[node name="HedronAttack" type="Node3D"] + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "PyramidAttack" +libraries = { +"": SubResource("AnimationLibrary_ht5d6") +} + +[node name="MainOrb" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.710665) +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_xty5l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MainOrb"] +transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 1, 0) +shape = SubResource("CylinderShape3D_uh2on") + +[node name="Sprite3D" type="Sprite3D" parent="MainOrb/CollisionShape3D"] +transform = Transform3D(0.499924, 0, -0.00872726, 0, 0.5, 0, 0.00872726, 0, 0.499924, 0, 0, 0) +axis = 1 +texture = ExtResource("2_kceeh") + +[node name="Triangle1" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.234726, 1, 5.74115) +visible = false +collision_layer = 0 +collision_mask = 2 +monitoring = false +monitorable = false +script = ExtResource("1_xty5l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Triangle1"] +transform = Transform3D(-0.107302, 0, -0.590327, 0, 0.6, 0, 0.590327, 0, -0.107302, 0, 0, -2.01695) +shape = SubResource("CylinderShape3D_uh2on") + +[node name="Sprite3D" type="Sprite3D" parent="Triangle1/CollisionShape3D"] +transform = Transform3D(0.499924, 0, -0.00872631, 0, 0.5, 0, 0.00872631, 0, 0.499924, 0, 0, 0) +axis = 1 +texture = ExtResource("3_1s7oj") + +[node name="Triangle2" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 5.48792) +visible = false +collision_layer = 0 +collision_mask = 2 +monitoring = false +monitorable = false +script = ExtResource("1_xty5l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Triangle2"] +transform = Transform3D(0.592349, 0, -0.0955152, 0, 0.6, 0, 0.0955152, 0, 0.592349, 0.0265542, 0, -2.01695) +shape = SubResource("CylinderShape3D_uh2on") + +[node name="Sprite3D" type="Sprite3D" parent="Triangle2/CollisionShape3D"] +transform = Transform3D(0.499924, 0, -0.0087263, 0, 0.5, 0, 0.0087263, 0, 0.499924, 0, 0, 0) +axis = 1 +texture = ExtResource("3_1s7oj") + +[node name="Triangle3" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.230226, 1, 5.64647) +visible = false +collision_layer = 0 +collision_mask = 2 +monitoring = false +monitorable = false +script = ExtResource("1_xty5l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Triangle3"] +transform = Transform3D(0.119939, 0, 0.58789, 0, 0.6, 0, -0.58789, 0, 0.119939, 0, 0, -2.01695) +shape = SubResource("CylinderShape3D_uh2on") + +[node name="Sprite3D" type="Sprite3D" parent="Triangle3/CollisionShape3D"] +transform = Transform3D(0.499924, 0, -0.0087263, 0, 0.5, 0, 0.0087263, 0, 0.499924, 0, 0, 0) +axis = 1 +texture = ExtResource("3_1s7oj") + +[node name="Triangle4" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 5.94482) +visible = false +collision_layer = 0 +collision_mask = 2 +monitoring = false +monitorable = false +script = ExtResource("1_xty5l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Triangle4"] +transform = Transform3D(-0.599587, 0, 0.0222583, 0, 0.6, 0, -0.0222583, 0, -0.599587, 0, 0, -2.01695) +shape = SubResource("CylinderShape3D_uh2on") + +[node name="Sprite3D" type="Sprite3D" parent="Triangle4/CollisionShape3D"] +transform = Transform3D(0.499924, 0, -0.0087263, 0, 0.5, 0, 0.0087263, 0, 0.499924, 0, 0, 0) +axis = 1 +texture = ExtResource("3_1s7oj") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_h0ftg") +volume_db = 10.0 +autoplay = true + +[connection signal="body_entered" from="MainOrb" to="MainOrb" method="OnOrbHit"] +[connection signal="body_entered" from="Triangle1" to="Triangle1" method="OnOrbHit"] +[connection signal="body_entered" from="Triangle2" to="Triangle2" method="OnOrbHit"] +[connection signal="body_entered" from="Triangle3" to="Triangle3" method="OnOrbHit"] +[connection signal="body_entered" from="Triangle4" to="Triangle4" method="OnOrbHit"] diff --git a/Enemies/Attacks/GodCircuitAttacks/LaserAttack.tscn b/Enemies/Attacks/GodCircuitAttacks/LaserAttack.tscn index b1d3d65..a242ef1 100644 --- a/Enemies/Attacks/GodCircuitAttacks/LaserAttack.tscn +++ b/Enemies/Attacks/GodCircuitAttacks/LaserAttack.tscn @@ -1,22 +1,27 @@ -[gd_scene load_steps=4 format=3 uid="uid://uwia12i7yykb"] +[gd_scene load_steps=6 format=3 uid="uid://uwia12i7yykb"] +[ext_resource type="Script" path="res://Player/Base/Projectile.cs" id="1_4uor3"] [ext_resource type="Texture2D" uid="uid://bunon01jmxhbx" path="res://Textures/Projectiles/Layer 2.png" id="1_a70u8"] +[ext_resource type="AudioStream" uid="uid://cgun34h06gvpv" path="res://Audio/SFX/misc1.wav" id="3_vxciy"] [sub_resource type="Curve3D" id="Curve3D_n05rs"] _data = { -"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, -2, 1, 2, 0, 0, 0, 0, 0, 0, -2, 1, 4, 0, 0, 0, 0, 0, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, 2, 1, 6), -"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0) +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, -2, 1, 2, 0, 0, 0, 0, 0, 0, -2, 1, 3, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, -4, 1, 4, 0, 0, 0, 0, 0, 0, -4, 1, 5, 0, 0, 0, 0, 0, 0, 1, 1, 5, 0, 0, 0, 0, 0, 0, 1, 1, 10), +"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) } -point_count = 6 +point_count = 10 [sub_resource type="BoxShape3D" id="BoxShape3D_g5fdd"] size = Vector3(0.553759, 1.22067, 1.58866) [node name="Path3D" type="Path3D"] curve = SubResource("Curve3D_n05rs") +script = ExtResource("1_4uor3") +_projectileSpeed = 5.0 [node name="PathFollow3D" type="PathFollow3D" parent="."] -transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1, 0) +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 1, 1, 10) +progress = 27.0 [node name="RigidBody3D" type="RigidBody3D" parent="PathFollow3D"] collision_layer = 0 @@ -29,9 +34,16 @@ can_sleep = false freeze_mode = 1 [node name="CollisionShape3D" type="CollisionShape3D" parent="PathFollow3D/RigidBody3D"] +transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) shape = SubResource("BoxShape3D_g5fdd") [node name="Sprite3D" type="Sprite3D" parent="PathFollow3D/RigidBody3D/CollisionShape3D"] transform = Transform3D(-2.18557e-08, 0, 0.5, 0, 0.5, 0, -0.5, 0, -2.18557e-08, 0, 0, 0) axis = 1 texture = ExtResource("1_a70u8") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_vxciy") +autoplay = true + +[connection signal="body_entered" from="PathFollow3D/RigidBody3D" to="." method="OnPlayerHit"] diff --git a/Enemies/Attacks/GodCircuitAttacks/OrbAttack.tscn b/Enemies/Attacks/GodCircuitAttacks/OrbAttack.tscn deleted file mode 100644 index 0bb77d1..0000000 --- a/Enemies/Attacks/GodCircuitAttacks/OrbAttack.tscn +++ /dev/null @@ -1,46 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://cerac64r5jewa"] - -[ext_resource type="Script" path="res://Player/Base/Projectile.cs" id="1_cveok"] -[ext_resource type="Texture2D" uid="uid://cpvq0rru8k7l5" path="res://Textures/Projectiles/Layer 3.png" id="1_p5wrg"] - -[sub_resource type="Curve3D" id="Curve3D_h1xf0"] -_data = { -"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, -5, 0, 0, 0, 0, 0, 0, -2, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0), -"tilts": PackedFloat32Array(0, 0, 0, 0, 0) -} -point_count = 5 - -[sub_resource type="CylinderShape3D" id="CylinderShape3D_o3ugd"] -radius = 0.25 - -[node name="Orb Attack" type="Path3D"] -transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -3, 0, 1.5) -curve = SubResource("Curve3D_h1xf0") -script = ExtResource("1_cveok") -_projectileSpeed = 1.5 - -[node name="PathFollow3D" type="PathFollow3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) -rotation_mode = 0 - -[node name="RigidBody3D" type="RigidBody3D" parent="PathFollow3D"] -transform = Transform3D(1, 0, 7.10543e-15, 0, 1, 0, -7.10543e-15, 0, 1, 0, 0, 0) -collision_layer = 0 -collision_mask = 2 -continuous_cd = true -max_contacts_reported = 5 -contact_monitor = true -can_sleep = false -freeze = true -freeze_mode = 1 - -[node name="CollisionShape3D" type="CollisionShape3D" parent="PathFollow3D/RigidBody3D"] -transform = Transform3D(1, 0, 7.10543e-15, 0, 1, 0, -7.10543e-15, 0, 1, 0, 0, 0) -shape = SubResource("CylinderShape3D_o3ugd") - -[node name="Sprite3D" type="Sprite3D" parent="PathFollow3D/RigidBody3D/CollisionShape3D"] -transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0) -axis = 1 -texture = ExtResource("1_p5wrg") - -[connection signal="body_entered" from="PathFollow3D/RigidBody3D" to="." method="OnPlayerHit"] diff --git a/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.cs b/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.cs index 4b84200..caaeee9 100644 --- a/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.cs +++ b/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.cs @@ -5,7 +5,9 @@ public partial class PyramidAttack : Node3D [Export] private AnimationPlayer _animationPlayer; - public override void _Ready() + private bool isDeleted = false; + + public override void _EnterTree() { _animationPlayer.AnimationFinished += Delete; } @@ -20,10 +22,13 @@ public partial class PyramidAttack : Node3D } QueueFree(); + isDeleted = true; } public void Delete(StringName name) { - QueueFree(); + if (!isDeleted) + QueueFree(); + isDeleted = true; } } \ No newline at end of file diff --git a/Levels/Scripts/PyramidAttack.tscn b/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.tscn similarity index 71% rename from Levels/Scripts/PyramidAttack.tscn rename to Enemies/Attacks/GodCircuitAttacks/PyramidAttack.tscn index c6afc04..6eb42fe 100644 --- a/Levels/Scripts/PyramidAttack.tscn +++ b/Enemies/Attacks/GodCircuitAttacks/PyramidAttack.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=7 format=3 uid="uid://cql4evq5281n4"] +[gd_scene load_steps=8 format=3 uid="uid://cql4evq5281n4"] [ext_resource type="Script" path="res://Enemies/Attacks/GodCircuitAttacks/PyramidAttack.cs" id="1_yfldc"] [ext_resource type="Texture2D" uid="uid://531b68bg4tn6" path="res://Textures/Projectiles/Layer 1.png" id="2_lufet"] +[ext_resource type="AudioStream" uid="uid://cgun34h06gvpv" path="res://Audio/SFX/misc1.wav" id="3_6crjs"] [sub_resource type="Animation" id="Animation_8rgmo"] resource_name = "PyramidAttack" -length = 3.0 +length = 2.0 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -13,10 +14,10 @@ tracks/0/path = NodePath("Center/CollisionShape3D:position") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(0, 1, 0), Vector3(0, 1, 5)] +"values": [Vector3(0, 1, 0), Vector3(0, 1, 3)] } tracks/1/type = "value" tracks/1/imported = false @@ -25,10 +26,10 @@ tracks/1/path = NodePath("Center/CollisionShape3D:scale") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(1, 1, 1), Vector3(3, 3, 3)] +"values": [Vector3(0.3, 0.3, 0.3), Vector3(1, 1, 1)] } tracks/2/type = "value" tracks/2/imported = false @@ -37,10 +38,10 @@ tracks/2/path = NodePath("Left/CollisionShape3D:position") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(0, 1, 0), Vector3(0, 1, 5)] +"values": [Vector3(0, 1, 0), Vector3(0, 1, 3)] } tracks/3/type = "value" tracks/3/imported = false @@ -49,10 +50,10 @@ tracks/3/path = NodePath("Left/CollisionShape3D:scale") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(1, 1, 1), Vector3(3, 3, 3)] +"values": [Vector3(0.3, 0.3, 0.3), Vector3(1, 1, 1)] } tracks/4/type = "value" tracks/4/imported = false @@ -61,10 +62,10 @@ tracks/4/path = NodePath("Right/CollisionShape3D:position") tracks/4/interp = 1 tracks/4/loop_wrap = true tracks/4/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(0, 1, 0), Vector3(0, 1, 5)] +"values": [Vector3(0, 1, 0), Vector3(0, 1, 3)] } tracks/5/type = "value" tracks/5/imported = false @@ -73,10 +74,33 @@ tracks/5/path = NodePath("Right/CollisionShape3D:scale") tracks/5/interp = 1 tracks/5/loop_wrap = true tracks/5/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 2), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(1, 1, 1), Vector3(3, 3, 3)] +"values": [Vector3(0.3, 0, 0), Vector3(1, 1, 1)] +} +tracks/6/type = "audio" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("AudioStreamPlayer") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"clips": [], +"times": PackedFloat32Array() +} +tracks/6/use_blend = true +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("AudioStreamPlayer:playing") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 1.9), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] } [sub_resource type="Animation" id="Animation_js2kt"] @@ -153,6 +177,18 @@ tracks/5/keys = { "update": 0, "values": [Vector3(1, 1, 1)] } +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("AudioStreamPlayer: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_ht5d6"] _data = { @@ -163,7 +199,9 @@ _data = { [sub_resource type="CylinderShape3D" id="CylinderShape3D_uh2on"] radius = 0.266805 -[node name="PyramidAttack" type="Node3D"] +[node name="PyramidAttack" type="Node3D" node_paths=PackedStringArray("_animationPlayer")] +script = ExtResource("1_yfldc") +_animationPlayer = NodePath("AnimationPlayer") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] autoplay = "PyramidAttack" @@ -171,7 +209,7 @@ libraries = { "": SubResource("AnimationLibrary_ht5d6") } -[node name="Center" type="RigidBody3D" parent="." node_paths=PackedStringArray("_animationPlayer")] +[node name="Center" type="RigidBody3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.710665) collision_layer = 0 collision_mask = 2 @@ -181,8 +219,6 @@ max_contacts_reported = 5 contact_monitor = true can_sleep = false freeze_mode = 1 -script = ExtResource("1_yfldc") -_animationPlayer = NodePath("../AnimationPlayer") [node name="CollisionShape3D" type="CollisionShape3D" parent="Center"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) @@ -193,8 +229,8 @@ transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) axis = 1 texture = ExtResource("2_lufet") -[node name="Left" type="RigidBody3D" parent="." node_paths=PackedStringArray("_animationPlayer")] -transform = Transform3D(0.819152, 0, 0.573576, 0, 1, 0, -0.573576, 0, 0.819152, 0, 0, 0.710665) +[node name="Left" type="RigidBody3D" parent="."] +transform = Transform3D(0.939692, 0, 0.34202, 0, 1, 0, -0.34202, 0, 0.939692, 0, 0, 0.710665) collision_layer = 0 collision_mask = 2 gravity_scale = 0.0 @@ -202,8 +238,6 @@ continuous_cd = true max_contacts_reported = 5 contact_monitor = true can_sleep = false -script = ExtResource("1_yfldc") -_animationPlayer = NodePath("../AnimationPlayer") [node name="CollisionShape3D" type="CollisionShape3D" parent="Left"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) @@ -214,8 +248,8 @@ transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) axis = 1 texture = ExtResource("2_lufet") -[node name="Right" type="RigidBody3D" parent="." node_paths=PackedStringArray("_animationPlayer")] -transform = Transform3D(0.819152, 0, -0.573576, 0, 1, 0, 0.573576, 0, 0.819152, 0, 0, 0.710665) +[node name="Right" type="RigidBody3D" parent="."] +transform = Transform3D(0.939692, 0, -0.34202, 0, 1, 0, 0.34202, 0, 0.939692, 0, 0, 0.710665) collision_layer = 0 collision_mask = 2 gravity_scale = 0.0 @@ -224,8 +258,6 @@ max_contacts_reported = 5 contact_monitor = true can_sleep = false freeze_mode = 1 -script = ExtResource("1_yfldc") -_animationPlayer = NodePath("../AnimationPlayer") [node name="CollisionShape3D" type="CollisionShape3D" parent="Right"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) @@ -236,6 +268,9 @@ transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) axis = 1 texture = ExtResource("2_lufet") -[connection signal="body_entered" from="Center" to="Center" method="OnPlayerHit"] -[connection signal="body_entered" from="Left" to="Left" method="OnPlayerHit"] -[connection signal="body_entered" from="Right" to="Right" method="OnPlayerHit"] +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_6crjs") + +[connection signal="body_entered" from="Center" to="." method="OnPlayerHit"] +[connection signal="body_entered" from="Left" to="." method="OnPlayerHit"] +[connection signal="body_entered" from="Right" to="." method="OnPlayerHit"] diff --git a/Enemies/GodCircuit.tscn b/Enemies/GodCircuit.tscn index a826b4d..c18b9c2 100644 --- a/Enemies/GodCircuit.tscn +++ b/Enemies/GodCircuit.tscn @@ -36,38 +36,26 @@ tracks/1/keys = { tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("AudioStreamPlayer:playing") +tracks/2/path = NodePath("StaticBody3D/god circuit stage 1/Cube2:transparency") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] +"times": PackedFloat32Array(0.1, 3.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.5] } tracks/3/type = "value" tracks/3/imported = false tracks/3/enabled = true -tracks/3/path = NodePath("AudioStreamPlayer:stream") +tracks/3/path = NodePath("AudioStreamPlayer:playing") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, -"values": [ExtResource("3_yengs")] -} -tracks/4/type = "value" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("StaticBody3D/god circuit stage 1/Cube2:transparency") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/keys = { -"times": PackedFloat32Array(0.1, 6.5), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [0.0, 1.0] +"values": [true] } [sub_resource type="Animation" id="Animation_n85p2"] @@ -266,6 +254,7 @@ transform = Transform3D(-1, -7.54979e-08, 7.54979e-08, 7.54979e-08, 0, 1, -7.549 [node name="Cube" type="MeshInstance3D" parent="StaticBody3D/god circuit stage 1"] transform = Transform3D(-1, 7.54979e-08, -7.54979e-08, -7.54979e-08, 0, 1, 7.54979e-08, 1, 0, 0, 0, 0) +cast_shadow = 0 mesh = SubResource("ArrayMesh_vv6dc") skeleton = NodePath("") @@ -273,10 +262,12 @@ skeleton = NodePath("") transform = Transform3D(-1, 7.54979e-08, -7.54979e-08, -7.54979e-08, 0, 1, 7.54979e-08, 1, 0, 0, 0, 0) layers = 0 material_override = SubResource("ShaderMaterial_aqrc7") +cast_shadow = 0 mesh = SubResource("ArrayMesh_vv6dc") skeleton = NodePath("") [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource("3_yengs") +volume_db = 7.786 [connection signal="body_entered" from="StaticBody3D" to="." method="OnHit"] diff --git a/Enemies/MeleeEnemy.tscn b/Enemies/MeleeEnemy.tscn index c3d14be..3c9c50f 100644 --- a/Enemies/MeleeEnemy.tscn +++ b/Enemies/MeleeEnemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=49 format=3 uid="uid://bt5rolsyjmx55"] +[gd_scene load_steps=52 format=3 uid="uid://bt5rolsyjmx55"] [ext_resource type="Script" path="res://Enemies/Scripts/MeleeEnemy.cs" id="1_50och"] [ext_resource type="PackedScene" uid="uid://b1j0g6ikmnibm" path="res://Enemies/HPComponent.tscn" id="2_1leby"] @@ -149,7 +149,7 @@ albedo_color = Color(0.906332, 0.0657254, 0, 1) resource_name = "Material.001" cull_mode = 2 vertex_color_use_as_albedo = true -albedo_color = Color(0.906332, 0.577975, 0.0845021, 1) +albedo_color = Color(0.905882, 0.576471, 0.0862745, 1) [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ucce2"] resource_name = "Material.005" @@ -1177,6 +1177,43 @@ size = Vector3(0.641537, 0.560677, 0.708051) [sub_resource type="BoxShape3D" id="BoxShape3D_lqe1n"] size = Vector3(0.572433, 1.81406, 0.604365) +[sub_resource type="Animation" id="Animation_5doi8"] +resource_name = "OnHit" +length = 2.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeleeEnemy/Circle001:transparency") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.5, 0.0] +} + +[sub_resource type="Animation" id="Animation_rx3cp"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeleeEnemy/Circle001:transparency") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.5] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_mudtn"] +_data = { +"OnHit": SubResource("Animation_5doi8"), +"RESET": SubResource("Animation_rx3cp") +} + [node name="Melee Enemy" type="RigidBody3D" node_paths=PackedStringArray("_hp") groups=["Enemy"]] transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, -0.0175109, 0) disable_mode = 2 @@ -1188,6 +1225,7 @@ max_contacts_reported = 20 contact_monitor = true can_sleep = false script = ExtResource("1_50och") +_distanceToPlayer = 3.5 _hp = NodePath("HP Component") [node name="MeleeEnemy" type="Node3D" parent="."] @@ -1201,6 +1239,7 @@ skeleton = NodePath("") [node name="Circle001" type="MeshInstance3D" parent="MeleeEnemy"] transform = Transform3D(0.681135, 0, -0.799096, 0, 1.05, 0, 0.799096, 0, 0.681135, 0.0457887, 0.476383, 0.128917) +transparency = 0.5 cast_shadow = 0 mesh = SubResource("ArrayMesh_ngagc") skeleton = NodePath("") @@ -1255,7 +1294,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00804788, 1.02138, -0.02382 shape = SubResource("BoxShape3D_1nq5h") [node name="HP Component" parent="." instance=ExtResource("2_1leby")] -MaximumHP = 2 +MaximumHP = 1 [node name="Area3D" type="Area3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00804788, 1.01495, 0.00193942) @@ -1265,5 +1304,10 @@ collision_mask = 68 [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] shape = SubResource("BoxShape3D_lqe1n") +[node name="HitAnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_mudtn") +} + [connection signal="body_entered" from="Area3D" to="." method="OnPlayerHit"] [connection signal="body_entered" from="Area3D" to="." method="OnEnemyHit"] diff --git a/Enemies/RangedEnemy.tscn b/Enemies/RangedEnemy.tscn index 98c8011..7059ef0 100644 --- a/Enemies/RangedEnemy.tscn +++ b/Enemies/RangedEnemy.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=59 format=3 uid="uid://dahp73fwld24h"] +[gd_scene load_steps=60 format=3 uid="uid://dahp73fwld24h"] [ext_resource type="Script" path="res://Enemies/Scripts/RangedEnemy.cs" id="1_01lvj"] [ext_resource type="PackedScene" uid="uid://rlxnnw4yay7e" path="res://Enemies/Attacks/EnemyBullet.tscn" id="3_qenx3"] [ext_resource type="Script" path="res://Enemies/Attacks/FireAtPlayer.cs" id="3_qt2md"] [ext_resource type="PackedScene" uid="uid://b1j0g6ikmnibm" path="res://Enemies/HPComponent.tscn" id="4_1vt55"] +[ext_resource type="AudioStream" uid="uid://cfj82os5p8i4p" path="res://Audio/SFX/shooting.wav" id="5_m0x8e"] [sub_resource type="BoxShape3D" id="BoxShape3D_dm3u7"] size = Vector3(0.722, 1, 0.565) @@ -904,13 +905,14 @@ freeze_mode = 1 script = ExtResource("1_01lvj") _hp = NodePath("HP Component") -[node name="Timer" type="Timer" parent="." node_paths=PackedStringArray("_enemy")] +[node name="Timer" type="Timer" parent="." node_paths=PackedStringArray("_enemy", "_audioPlayer")] wait_time = 0.75 autostart = true script = ExtResource("3_qt2md") _enemy = NodePath("..") _fireProjectile = ExtResource("3_qenx3") _distanceToPlayer = 5.0 +_audioPlayer = NodePath("../AudioStreamPlayer") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0714533, 0.929308, 0.0138905) @@ -1064,7 +1066,12 @@ mesh = SubResource("ArrayMesh_lu7e3") skeleton = NodePath("") [node name="HP Component" parent="." instance=ExtResource("4_1vt55")] -MaximumHP = 2 +MaximumHP = 1 + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("5_m0x8e") +volume_db = -1.0 +max_polyphony = 10 [connection signal="body_entered" from="." to="." method="OnPlayerHit"] [connection signal="timeout" from="Timer" to="Timer" method="OnFireAtPlayer"] diff --git a/Enemies/Scripts/GodCircuit.cs b/Enemies/Scripts/GodCircuit.cs index 416dfee..59cef43 100644 --- a/Enemies/Scripts/GodCircuit.cs +++ b/Enemies/Scripts/GodCircuit.cs @@ -4,8 +4,6 @@ public partial class GodCircuit : Node3D { [Export] private AnimationPlayer _animationPlayer; - [Export] - private Timer _attackTimer; [Signal] public delegate void OnEnemyBossHitEventHandler(long damage); @@ -18,45 +16,46 @@ public partial class GodCircuit : Node3D private void OnHit(Node3D node) { - if (node is Character character && character.HasMethod(Character.MethodName.OnHit)) - { - GD.Print("Player hit: " + character.Name); - character.Call(Character.MethodName.OnHit, node); - } - else - { - var hpComponent = GetNode("HP Component"); - if (hpComponent.CurrentHP > 0) - { - GD.Print("Hit"); - _animationPlayer.Play("OnHit"); - hpComponent.TakeDamage(800000); - EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); + if (node is Character character && character.HasMethod(Character.MethodName.OnHit)) + { + GD.Print("Player hit: " + character.Name); + character.Call(Character.MethodName.OnHit, node); + } + else + { + var hpComponent = GetNode("HP Component"); + if (hpComponent.CurrentHP > 0) + { + GD.Print("Hit"); + _animationPlayer.Play("OnHit"); + hpComponent.TakeDamage(1); + EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); - if (hpComponent.CurrentHP <= 0) - { - EmitSignal(SignalName.DestroyRemainingOrbs); - _animationPlayer.Play("OnDeath"); - _animationPlayer.AnimationFinished += OnGameFinished; - } - } - } + if (hpComponent.CurrentHP <= 0) + { + EmitSignal(SignalName.DestroyRemainingOrbs); + _animationPlayer.Play("OnDeath"); + _animationPlayer.AnimationFinished += OnGameFinished; + } + } + } } private void OnBossOrbDestroyed() { - var hpComponent = GetNode("HP Component"); - _animationPlayer.Play("OnHit"); - hpComponent.TakeDamage(30000000); - EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); + var hpComponent = GetNode("HP Component"); + _animationPlayer.Play("OnHit"); + hpComponent.TakeDamage(60); + EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); - if (hpComponent.CurrentHP <= 0) - hpComponent.CurrentHP = 1; + if (hpComponent.CurrentHP <= 0) + hpComponent.CurrentHP = 1; } private void OnGameFinished(StringName animationName) { - QueueFree(); - EmitSignal(SignalName.OnGameEnding); + GD.Print("On game ending"); + EmitSignal(SignalName.OnGameEnding); + QueueFree(); } } diff --git a/Enemies/Scripts/MeleeEnemy.cs b/Enemies/Scripts/MeleeEnemy.cs index 892f653..44400b7 100644 --- a/Enemies/Scripts/MeleeEnemy.cs +++ b/Enemies/Scripts/MeleeEnemy.cs @@ -11,11 +11,10 @@ public partial class MeleeEnemy : BasicEnemy public override void _PhysicsProcess(double delta) { - var players = GetTree().GetNodesInGroup("Player"); + var players = GetTree().GetNodesInGroup("Player").Cast(); if (players.Any()) { - var convertedPlayers = players.Select(x => (Node3D)x); - var target = convertedPlayers.OrderBy(x => Position.DistanceTo(x.Position)).FirstOrDefault(); + var target = players.OrderBy(x => Position.DistanceTo(x.Position)).FirstOrDefault(); if (_targetingPlayer || Position.DistanceTo(target.Position) < _distanceToPlayer) { Position = Position.MoveToward(target.Position, _speed * (float)delta); diff --git a/GameLogic/GameManager.cs b/GameLogic/GameManager.cs index 072c3c7..f710a0d 100644 --- a/GameLogic/GameManager.cs +++ b/GameLogic/GameManager.cs @@ -6,7 +6,7 @@ using System.Linq; public partial class GameManager : Node { [Signal] - public delegate void OnPlayerGameOverEventHandler(); + public delegate void OnPlayerGameOverEventHandler(Player player); [Signal] public delegate void ReselectCharacterEventHandler(Player player); [Signal] @@ -23,133 +23,138 @@ public partial class GameManager : Node public override void _Ready() { - var main = GetTree().Root.GetNode
("/root/Main"); - for (var i = 0; i < main.NumberOfPlayers; i++) - { - var player = PlayerScenes[i].Instantiate(); - Players = Players.Append((Player)player); - GetTree().Root.AddChild(player); - } + var main = GetTree().Root.GetNode
("/root/Main"); + for (var i = 0; i < main.NumberOfPlayers; i++) + { + var player = PlayerScenes[i].Instantiate(); + var castedPlayer = (Player)player; + castedPlayer.PlayerNumber = i + 1; + Players = Players.Append(castedPlayer); + GetTree().Root.AddChild(player); + } } public void OnAllEnemiesDefeated() { - OnLevelClear(); + OnLevelClear(); } public void OnHandleCharacterSelectUI(Player player) { - EmitSignal(SignalName.ReselectCharacter, player); + EmitSignal(SignalName.ReselectCharacter, player); } public void SetToNextCharacter(Player player) { - player.CharacterIndex = (++player.CharacterIndex) % player.CharactersLeftOnStage.Count(); - GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); + player.CharacterIndex = (++player.CharacterIndex) % player.CharactersLeftOnStage.Count(); + GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); } public void SetToPreviousCharacter(Player player) { - player.CharacterIndex = player.CharacterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --player.CharacterIndex; + player.CharacterIndex = player.CharacterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --player.CharacterIndex; } public void ResetPlayerPosition(Player player) { - player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); - GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); + player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); + GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); } public void OnCharacterSelected(Player player) { - var sfxPlayer = GetTree().Root.GetNode("Main/SFXPlayer"); - var audioStream = ResourceLoader.Load("Audio/SFX/Select.wav"); - sfxPlayer.Stream = audioStream; - sfxPlayer.Play(); - if (player.CharactersLeftOnStage.Any()) - { - var character = player.CharactersLeftOnStage[player.CharacterIndex]; - var instance = (Character)character.Instantiate(); - instance.Initialize(player); - player.SelectedCharacter = instance; - player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); - GetTree().Root.AddChild(player.SelectedCharacter); - } + var sfxPlayer = GetTree().Root.GetNode("Main/SFXPlayer"); + var audioStream = ResourceLoader.Load("Audio/SFX/Select.wav"); + sfxPlayer.Stream = audioStream; + sfxPlayer.Play(); + if (player.CharactersLeftOnStage.Any()) + { + var character = player.CharactersLeftOnStage[player.CharacterIndex]; + var instance = (Character)character.Instantiate(); + instance.Initialize(player); + player.SelectedCharacter = instance; + player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); + GetTree().Root.AddChild(player.SelectedCharacter); + } } public void RemoveCharacter(Player player) { - ResetPlayerPosition(player); + ResetPlayerPosition(player); - player.CharactersLeftOnStage.RemoveAt(player.CharacterIndex); - if (player.SelectedCharacter is not null) - GetTree().Root.RemoveChild(player.SelectedCharacter); + player.CharactersLeftOnStage.RemoveAt(player.CharacterIndex); + if (player.SelectedCharacter is not null) + GetTree().Root.RemoveChild(player.SelectedCharacter); - player.CharacterIndex = 0; - if (player.CharactersLeftOnStage.Any()) - EmitSignal(SignalName.ReselectCharacter, player); + player.CharacterIndex = 0; + if (player.CharactersLeftOnStage.Any()) + EmitSignal(SignalName.ReselectCharacter, player); - if (!player.CharactersExited.Any() && !player.CharactersLeftOnStage.Any()) - SetGameOver(player, true); + if (!player.CharactersExited.Any() && !player.CharactersLeftOnStage.Any()) + SetGameOver(player, true); - if (Players.All(x => !x.CharactersLeftOnStage.Any()) && Players.Any(x => x.CharactersExited.Any())) - OnLevelClear(); + if (Players.All(x => !x.CharactersLeftOnStage.Any()) && Players.Any(x => x.CharactersExited.Any())) + OnLevelClear(); } public void RemoveCharacterAndAddToExit(Player player) { - ResetPlayerPosition(player); - player.CharactersExited.Add(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); - RemoveCharacter(player); + ResetPlayerPosition(player); + player.CharactersExited.Add(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); + RemoveCharacter(player); } public void SetGameOver(Player player, bool isGameOver) { - player.GameOver = isGameOver; - if (isGameOver) - EmitSignal(SignalName.OnPlayerGameOver); - GD.Print($"Game over for {player.Name}"); + player.GameOver = isGameOver; + if (isGameOver) + EmitSignal(SignalName.OnPlayerGameOver, player); + GD.Print($"Game over for {player.Name}"); } public void ReloadGameScene() { - GD.Print("Reloading scene"); - var players = GetTree().Root.GetChildren().OfType(); - foreach (var player in players) - player.QueueFree(); - var levels = GetTree().Root.GetChildren().OfType(); - foreach (var level in levels) - level.QueueFree(); - GetTree().ReloadCurrentScene(); + GD.Print("Reloading scene"); + var players = GetTree().Root.GetChildren().OfType(); + foreach (var player in players) + player.QueueFree(); + var levels = GetTree().Root.GetChildren().OfType(); + foreach (var level in levels) + level.QueueFree(); + GetTree().ReloadCurrentScene(); } public void OnLevelClear() { - var enemies = GetTree().GetNodesInGroup("Enemy").Where(x => !x.IsQueuedForDeletion()); - foreach (var enemy in enemies) - enemy.QueueFree(); + var enemies = GetTree().GetNodesInGroup("Enemy").Where(x => !x.IsQueuedForDeletion()); + foreach (var enemy in enemies) + enemy.QueueFree(); - var playerCharacters = GetTree().GetNodesInGroup("Player"); + var playerCharacters = GetTree().GetNodesInGroup("Player"); - EmitSignal(SignalName.ClearPlayerBG, 0); - EmitSignal(SignalName.ClearPlayerBG, 1); + EmitSignal(SignalName.ClearPlayerBG, 0); + EmitSignal(SignalName.ClearPlayerBG, 1); - foreach (var player in Players) - { - player.CharactersLeftOnStage.AddRange(player.CharactersExited); - player.CharactersExited.Clear(); - player.CharacterIndex = 0; - } + foreach (var player in Players) + { + player.CharactersLeftOnStage.AddRange(player.CharactersExited); + player.CharactersExited.Clear(); + player.CharacterIndex = 0; + } - foreach (var character in playerCharacters) - character.GetParent().RemoveChild(character); + foreach (var character in playerCharacters) + character.GetParent().RemoveChild(character); - var projectiles = GetTree().GetNodesInGroup("Projectile").Where(x => !x.IsQueuedForDeletion()); - foreach (var projectile in projectiles) - projectile.QueueFree(); + var projectiles = GetTree().GetNodesInGroup("Projectile").Where(x => !x.IsQueuedForDeletion()); + foreach (var projectile in projectiles) + projectile.QueueFree(); - var main = GetTree().Root.GetNode
("/root/Main"); - _levelIndex++; - main.LoadNextLevel(_levelIndex); + var main = GetTree().Root.GetNode
("/root/Main"); + if (_levelIndex < main.Levels.Count) + { + _levelIndex++; + main.LoadNextLevel(_levelIndex); + } } } diff --git a/GameLogic/Main.cs b/GameLogic/Main.cs index 81a63bc..65fcb9b 100644 --- a/GameLogic/Main.cs +++ b/GameLogic/Main.cs @@ -13,61 +13,66 @@ public partial class Main : Node public int NumberOfPlayers = 0; + public override void _Ready() + { + Input.MouseMode = Input.MouseModeEnum.Captured; + } + public override void _Process(double delta) { - _fpsCounter.Text = $"FPS: {Engine.GetFramesPerSecond()}"; + _fpsCounter.Text = $"FPS: {Engine.GetFramesPerSecond()}"; } public void LoadLevel(int indexToLoad, int numberOfPlayers) { - var sceneToLoad = Levels.ElementAt(indexToLoad); - CallDeferred(nameof(DeferredGoToScene), sceneToLoad); + var sceneToLoad = Levels.ElementAt(indexToLoad); + CallDeferred(nameof(DeferredGoToScene), sceneToLoad); - NumberOfPlayers = numberOfPlayers; + NumberOfPlayers = numberOfPlayers; - var gameManager = GameManager.Instantiate(); - AddChild(gameManager); - var gameManagerInstance = (GameManager)gameManager; + var gameManager = GameManager.Instantiate(); + AddChild(gameManager); + var gameManagerInstance = (GameManager)gameManager; - var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); - bgmPlayer.ProcessMode = ProcessModeEnum.Always; - bgmPlayer.SetBGMFromFilepath("Audio/BGM/An-Imitation-of-Heaven.ogg"); - bgmPlayer.PlayBGM(); + var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); + bgmPlayer.ProcessMode = ProcessModeEnum.Always; + bgmPlayer.SetBGMFromFilepath("Audio/BGM/An-Imitation-of-Heaven.ogg"); + bgmPlayer.PlayBGM(); - var animationNode = GetNode("SceneTransition/AnimationPlayer"); - animationNode.Play($"Level{indexToLoad + 1}"); - animationNode.AnimationFinished += EnableCharacterSelect; + var animationNode = GetNode("SceneTransition/AnimationPlayer"); + animationNode.Play($"Level{indexToLoad + 1}"); + animationNode.AnimationFinished += EnableCharacterSelect; } public void LoadNextLevel(int currentSceneIndex) { - if (currentSceneIndex < Levels.Count()) - { - var currentScene = Levels.ToList().ElementAt(currentSceneIndex); - CallDeferred(nameof(DeferredGoToScene), Levels.ElementAt(currentSceneIndex)); - var animationNode = GetNode("SceneTransition/AnimationPlayer"); - animationNode.Play($"Level{currentSceneIndex + 1}"); - animationNode.AnimationFinished += EnableCharacterSelect; - } + if (currentSceneIndex < Levels.Count()) + { + var currentScene = Levels.ToList().ElementAt(currentSceneIndex); + CallDeferred(nameof(DeferredGoToScene), Levels.ElementAt(currentSceneIndex)); + var animationNode = GetNode("SceneTransition/AnimationPlayer"); + animationNode.Play($"Level{currentSceneIndex + 1}"); + animationNode.AnimationFinished += EnableCharacterSelect; + } } private void DeferredGoToScene(PackedScene sceneToAdd) { - if (GetTree().GetFirstNodeInGroup("Level") != null) - GetTree().GetFirstNodeInGroup("Level").QueueFree(); - var nextScene = GD.Load(sceneToAdd.ResourcePath); - var newScene = nextScene.Instantiate(); - GetTree().Root.AddChild(newScene); + if (GetTree().GetFirstNodeInGroup("Level") != null) + GetTree().GetFirstNodeInGroup("Level").QueueFree(); + var nextScene = GD.Load(sceneToAdd.ResourcePath); + var newScene = nextScene.Instantiate(); + GetTree().Root.AddChild(newScene); } private void EnableCharacterSelect(StringName animationName) { - GD.Print("On animation finished: Enable characters"); - var gameManagerInstance = GetNode("GameManager"); - foreach (var player in gameManagerInstance.Players) - gameManagerInstance.OnHandleCharacterSelectUI(player); - GetTree().Paused = true; - var animationNode = GetNode("SceneTransition/AnimationPlayer"); - animationNode.AnimationFinished -= EnableCharacterSelect; + GD.Print("On animation finished: Enable characters"); + var gameManagerInstance = GetNode("GameManager"); + foreach (var player in gameManagerInstance.Players) + gameManagerInstance.OnHandleCharacterSelectUI(player); + GetTree().Paused = true; + var animationNode = GetNode("SceneTransition/AnimationPlayer"); + animationNode.AnimationFinished -= EnableCharacterSelect; } } diff --git a/GameLogic/Main.tscn b/GameLogic/Main.tscn index df9e056..5e02633 100644 --- a/GameLogic/Main.tscn +++ b/GameLogic/Main.tscn @@ -11,7 +11,7 @@ [ext_resource type="PackedScene" uid="uid://bsq7edeueqyjg" path="res://Levels/Scenes/Level7.tscn" id="8_pcp3p"] [ext_resource type="PackedScene" uid="uid://c4xcka4ekuur8" path="res://Levels/Scenes/Level8.tscn" id="9_n1hja"] [ext_resource type="PackedScene" uid="uid://djwln4at4ho44" path="res://Levels/Scenes/Level9.tscn" id="10_rs7ve"] -[ext_resource type="PackedScene" uid="uid://0hdnmilwrsq6" path="res://Levels/Scenes/Level10.tscn" id="11_o275c"] +[ext_resource type="PackedScene" uid="uid://tt886mv7pffe" path="res://Levels/Scenes/Level10.tscn" id="11_o275c"] [ext_resource type="PackedScene" uid="uid://cxj6yeddshy16" path="res://GameLogic/GameManager.tscn" id="11_wiyvp"] [ext_resource type="PackedScene" uid="uid://cvvjbka5nf52j" path="res://UI/SceneTransition.tscn" id="14_ai16y"] @@ -39,7 +39,7 @@ reflected_light_source = 1 [node name="Main" type="Node3D" node_paths=PackedStringArray("_fpsCounter")] script = ExtResource("1_g4hua") -Levels = Array[PackedScene]([ExtResource("11_o275c"), ExtResource("5_xj47l"), ExtResource("10_rs7ve"), ExtResource("2_jq3qe"), ExtResource("3_nhrqr"), ExtResource("2_0yhby"), ExtResource("7_58n7x"), ExtResource("6_xmedq"), ExtResource("8_pcp3p"), ExtResource("9_n1hja")]) +Levels = Array[PackedScene]([ExtResource("2_jq3qe"), ExtResource("3_nhrqr"), ExtResource("2_0yhby"), ExtResource("5_xj47l"), ExtResource("7_58n7x"), ExtResource("6_xmedq"), ExtResource("8_pcp3p"), ExtResource("9_n1hja"), ExtResource("10_rs7ve"), ExtResource("11_o275c")]) GameManager = ExtResource("11_wiyvp") _fpsCounter = NodePath("FPS Counter") @@ -54,6 +54,7 @@ visible = false z_as_relative = false [node name="FPS Counter" type="Label" parent="."] +visible = false z_index = 100 offset_left = 18.0 offset_top = 16.0 diff --git a/Levels/Scenes/BossOrb.cs b/Levels/Scenes/BossOrb.cs index 0836a3f..297f483 100644 --- a/Levels/Scenes/BossOrb.cs +++ b/Levels/Scenes/BossOrb.cs @@ -11,29 +11,37 @@ public partial class BossOrb : RigidBody3D [Export] private PackedScene _attack; - private bool _shouldAttack = false; + [Export] + private AnimationPlayer _animationPlayer; - public void OnOrbHit(Node3D node) + public bool CanAttack = false; + + public void OnOrbHit(Node node) { - _hp.TakeDamage(50000); - GD.Print(_hp.CurrentHP); - if (_hp.CurrentHP <= 0) + if (node is Character character && character.HasMethod(Character.MethodName.OnHit)) { - EmitSignal(SignalName.OnBossOrbExploded); - QueueFree(); + GD.Print("Player hit: " + character.Name); + character.Call(Character.MethodName.OnHit, node); + } + else + { + _hp.TakeDamage(1); + if (_animationPlayer != null) + _animationPlayer.Play("OnHit"); + GD.Print(_hp.CurrentHP); + if (_hp.CurrentHP <= 0) + { + EmitSignal(SignalName.OnBossOrbExploded); + QueueFree(); + } } } - public void OnFire(Node3D node) + public void OnFire() { - if (_shouldAttack) - { - var attackZone = GetNode("/root/Level10/AttackZone"); - var attack = _attack.Instantiate(); - attackZone.AddChild(attack); - } - - _shouldAttack = !_shouldAttack; + var attack = _attack.Instantiate(); + attack.GlobalPosition = GlobalPosition; + GetTree().Root.AddChild(attack); } public void DestroySelf() diff --git a/Levels/Scenes/GameEnding.cs b/Levels/Scenes/GameEnding.cs index 4d94410..f9ce2b3 100644 --- a/Levels/Scenes/GameEnding.cs +++ b/Levels/Scenes/GameEnding.cs @@ -3,6 +3,19 @@ using Godot; public partial class GameEnding : Node3D { public void OnGameEnding() + { + var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); + bgmPlayer.Stop(); + + var videoPlayer = GetNode("VideoStreamPlayer"); + videoPlayer.Play(); + videoPlayer.Finished += CutsceneOver; + + var gameManager = GetTree().Root.GetNode("Main/GameManager"); + gameManager.OnLevelClear(); + } + + public void CutsceneOver() { var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); bgmPlayer.ProcessMode = ProcessModeEnum.Always; @@ -11,5 +24,12 @@ public partial class GameEnding : Node3D var animationPlayer = GetNode("AnimationPlayer"); animationPlayer.Play("GameEnding"); + animationPlayer.AnimationFinished += AfterCredits; + } + + public void AfterCredits(StringName animationName) + { + var gameManager = GetTree().Root.GetNode("Main/GameManager"); + gameManager.ReloadGameScene(); } } diff --git a/Levels/Scenes/Level10.tscn b/Levels/Scenes/Level10.tscn index 573ba81..c842ef8 100644 --- a/Levels/Scenes/Level10.tscn +++ b/Levels/Scenes/Level10.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=152 format=3 uid="uid://0hdnmilwrsq6"] +[gd_scene load_steps=158 format=3 uid="uid://tt886mv7pffe"] [ext_resource type="Script" path="res://Levels/Scripts/FinalLevel.cs" id="1_sy7dk"] [ext_resource type="Material" uid="uid://04v0ve8qhqkv" path="res://Video/CloudScrollMaterial.tres" id="2_2sumr"] @@ -38,7 +38,14 @@ [ext_resource type="Texture2D" uid="uid://dsqvracnne1pi" path="res://Levels/Models/Stage10/FINAL STAGE_relativity.png" id="23_qjhvx"] [ext_resource type="Texture2D" uid="uid://5mlk2fw47ib5" path="res://Levels/Models/Stage10/FINAL STAGE_SPHERES.png" id="24_no4m6"] [ext_resource type="Script" path="res://Levels/Scenes/BossOrb.cs" id="34_ditjx"] -[ext_resource type="PackedScene" uid="uid://cql4evq5281n4" path="res://Levels/Scripts/PyramidAttack.tscn" id="34_kwn8s"] +[ext_resource type="PackedScene" uid="uid://cql4evq5281n4" path="res://Enemies/Attacks/GodCircuitAttacks/PyramidAttack.tscn" id="34_isrj4"] +[ext_resource type="PackedScene" uid="uid://uwia12i7yykb" path="res://Enemies/Attacks/GodCircuitAttacks/LaserAttack.tscn" id="37_jd5dy"] +[ext_resource type="Animation" uid="uid://cvpg4y8gcowbb" path="res://Animations/OnHitPyramid.res" id="38_cg4tc"] +[ext_resource type="Animation" uid="uid://v2hbm2nsfddk" path="res://Animations/OnHitOrb.res" id="39_4f5hv"] +[ext_resource type="AudioStream" uid="uid://6yf38ykqn31u" path="res://Audio/SFX/HitObstacle.wav" id="40_ku5el"] +[ext_resource type="PackedScene" uid="uid://b75khmojjbq4f" path="res://Enemies/Attacks/GodCircuitAttacks/HedronAttack.tscn" id="40_sb1e4"] +[ext_resource type="Animation" uid="uid://bhbo613dr52fg" path="res://Animations/OnHitHedron.res" id="42_8q562"] +[ext_resource type="PackedScene" uid="uid://b1tm30iteu5rh" path="res://Video/VideoPlayer.tscn" id="44_imo6u"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_hdhsy"] sky_top_color = Color(1, 1, 1, 1) @@ -1461,41 +1468,6 @@ size = Vector3(5, 20, 27.822) [sub_resource type="BoxShape3D" id="BoxShape3D_myhef"] size = Vector3(5, 20, 27.822) -[sub_resource type="Animation" id="Animation_iincs"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("ColorRect:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(1, 1, 1, 0)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Label:modulate") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(1, 1, 1, 0)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_l1ojm"] -_data = { -"GameEnding": ExtResource("13_plu01"), -"RESET": SubResource("Animation_iincs") -} - -[sub_resource type="LabelSettings" id="LabelSettings_gphy5"] - [sub_resource type="LabelSettings" id="LabelSettings_cs88m"] font = ExtResource("14_fcfkf") font_size = 24 @@ -1549,50 +1521,62 @@ _data = { "RESET": SubResource("Animation_wy7s8") } -[sub_resource type="BoxShape3D" id="BoxShape3D_eianc"] -size = Vector3(2.65825, 1.099, 1.20222) - [sub_resource type="CylinderShape3D" id="CylinderShape3D_los3u"] height = 3.85738 radius = 0.412024 -[sub_resource type="Animation" id="Animation_qiaxl"] -resource_name = "OnHit" -length = 0.25 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("PyramidSprite:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.2, 0.25), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 0, -"values": [Color(1, 1, 1, 1), Color(1, 0.054902, 0, 0.384314), Color(1, 1, 1, 1)] +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ua8sg"] +_data = { +"OnHit": ExtResource("38_cg4tc") } -[sub_resource type="Animation" id="Animation_kp4ef"] +[sub_resource type="AnimationLibrary" id="AnimationLibrary_xjg08"] +_data = { +"OnHit": ExtResource("39_4f5hv") +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_dwac1"] +_data = { +"OnHit": ExtResource("42_8q562") +} + +[sub_resource type="Animation" id="Animation_iincs"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("PyramidSprite:modulate") +tracks/0/path = NodePath("ColorRect:modulate") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [Color(1, 0.054902, 0, 0.384314)] +"values": [Color(1, 1, 1, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] } -[sub_resource type="AnimationLibrary" id="AnimationLibrary_hkeo4"] +[sub_resource type="AnimationLibrary" id="AnimationLibrary_l1ojm"] _data = { -"OnHit": SubResource("Animation_qiaxl"), -"RESET": SubResource("Animation_kp4ef") +"GameEnding": ExtResource("13_plu01"), +"RESET": SubResource("Animation_iincs") } +[sub_resource type="LabelSettings" id="LabelSettings_gphy5"] +font = ExtResource("14_fcfkf") +font_size = 48 + [node name="Level10" type="Node3D" groups=["Level"]] process_mode = 3 script = ExtResource("1_sy7dk") @@ -1773,7 +1757,7 @@ libraries = { transform = Transform3D(0.75, 0, 0, 0, 0.657759, 0.360351, 0, -0.360351, 0.657759, 0, 1.29734, -1.26966) [node name="HP Component" parent="God Circuit" instance=ExtResource("7_nvq88")] -MaximumHP = 100000000 +MaximumHP = 200 [node name="StaticBody3D" type="StaticBody3D" parent="."] collision_mask = 0 @@ -1794,39 +1778,6 @@ shape = SubResource("BoxShape3D_hf7lb") transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 9.03101) shape = SubResource("BoxShape3D_myhef") -[node name="GameEnding" type="Node3D" parent="."] -script = ExtResource("12_kefc8") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="GameEnding"] -libraries = { -"": SubResource("AnimationLibrary_l1ojm") -} - -[node name="ColorRect" type="ColorRect" parent="GameEnding"] -modulate = Color(1, 1, 1, 0) -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -1.0 -offset_bottom = 2.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(0, 0, 0, 1) - -[node name="Label" type="Label" parent="GameEnding"] -modulate = Color(1, 1, 1, 0) -anchors_preset = 5 -anchor_left = 0.5 -anchor_right = 0.5 -offset_left = -959.0 -offset_right = 959.0 -offset_bottom = 1077.0 -grow_horizontal = 2 -size_flags_horizontal = 4 -label_settings = SubResource("LabelSettings_gphy5") -horizontal_alignment = 1 -vertical_alignment = 1 - [node name="Boss GUI" type="Control" parent="."] layout_mode = 3 anchors_preset = 0 @@ -1843,12 +1794,13 @@ offset_top = 1004.0 offset_right = -449.0 offset_bottom = 1024.0 grow_horizontal = 2 -max_value = 1e+08 +max_value = 300.0 nine_patch_stretch = true texture_progress = ExtResource("5_jjg8p") script = ExtResource("2_53ar2") [node name="Label" type="Label" parent="Boss GUI"] +z_index = -1 layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -1871,24 +1823,16 @@ libraries = { [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Boss GUI"] stream = ExtResource("7_gnuti") - -[node name="AttackZone" type="Area3D" parent="."] -unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.23141, 0, -0.954215) -collision_layer = 128 -collision_mask = 128 - -[node name="CollisionShape3D" type="CollisionShape3D" parent="AttackZone"] -shape = SubResource("BoxShape3D_eianc") +max_polyphony = 15 [node name="BossOrbs" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.260435, 0, -1.52945) script = ExtResource("8_7itwt") -[node name="Pyramid" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp")] +[node name="Pyramid" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp", "_animationPlayer")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.064761, 0.75105, -2.67492) collision_layer = 128 -collision_mask = 68 +collision_mask = 196 gravity_scale = 0.0 continuous_cd = true max_contacts_reported = 10 @@ -1897,11 +1841,11 @@ can_sleep = false freeze_mode = 1 script = ExtResource("34_ditjx") _hp = NodePath("HP Component") -_attack = ExtResource("34_kwn8s") +_attack = ExtResource("34_isrj4") +_animationPlayer = NodePath("AnimationPlayer") [node name="PyramidSprite" type="Sprite3D" parent="BossOrbs/Pyramid"] transform = Transform3D(0.08, 0, 0, 0, 0.08, 0, 0, 0, 0.08, 0, 0, 0) -modulate = Color(1, 0.054902, 0, 0.384314) axis = 1 texture = ExtResource("10_dusre") @@ -1910,16 +1854,20 @@ transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0.051398 shape = SubResource("CylinderShape3D_los3u") [node name="HP Component" parent="BossOrbs/Pyramid" instance=ExtResource("7_nvq88")] -MaximumHP = 2000000 +MaximumHP = 15 [node name="AnimationPlayer" type="AnimationPlayer" parent="BossOrbs/Pyramid"] libraries = { -"": SubResource("AnimationLibrary_hkeo4") +"": SubResource("AnimationLibrary_ua8sg") } -[node name="Orb" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp")] +[node name="Timer" type="Timer" parent="BossOrbs/Pyramid"] +wait_time = 15.0 +autostart = true + +[node name="Orb" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp", "_animationPlayer")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.75045, 0.241416, 1.28096) -collision_layer = 128 +collision_layer = 0 collision_mask = 68 gravity_scale = 0.0 continuous_cd = true @@ -1929,7 +1877,8 @@ can_sleep = false freeze_mode = 1 script = ExtResource("34_ditjx") _hp = NodePath("HP Component") -_attack = ExtResource("34_kwn8s") +_attack = ExtResource("37_jd5dy") +_animationPlayer = NodePath("AnimationPlayer") [node name="CollisionShape3D" type="CollisionShape3D" parent="BossOrbs/Orb"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.473554, 0, 0.565499) @@ -1941,11 +1890,20 @@ axis = 1 texture = ExtResource("8_2yfol") [node name="HP Component" parent="BossOrbs/Orb" instance=ExtResource("7_nvq88")] -MaximumHP = 2000000 +MaximumHP = 15 -[node name="Hedron" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp")] +[node name="AnimationPlayer" type="AnimationPlayer" parent="BossOrbs/Orb"] +libraries = { +"": SubResource("AnimationLibrary_xjg08") +} + +[node name="Timer" type="Timer" parent="BossOrbs/Orb"] +wait_time = 13.0 +autostart = true + +[node name="Hedron" type="RigidBody3D" parent="BossOrbs" node_paths=PackedStringArray("_hp", "_animationPlayer")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.88775, 0.704458, 1.45723) -collision_layer = 128 +collision_layer = 0 collision_mask = 68 gravity_scale = 0.0 continuous_cd = true @@ -1955,7 +1913,8 @@ can_sleep = false freeze_mode = 1 script = ExtResource("34_ditjx") _hp = NodePath("HP Component") -_attack = ExtResource("34_kwn8s") +_attack = ExtResource("40_sb1e4") +_animationPlayer = NodePath("AnimationPlayer") [node name="HedronSprite" type="Sprite3D" parent="BossOrbs/Hedron"] transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) @@ -1967,13 +1926,75 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0136576, 0, 0) shape = SubResource("CylinderShape3D_los3u") [node name="HP Component" parent="BossOrbs/Hedron" instance=ExtResource("7_nvq88")] -MaximumHP = 2000000 +MaximumHP = 15 +[node name="AnimationPlayer" type="AnimationPlayer" parent="BossOrbs/Hedron"] +libraries = { +"": SubResource("AnimationLibrary_dwac1") +} + +[node name="Timer" type="Timer" parent="BossOrbs/Hedron"] +wait_time = 28.0 +autostart = true + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="BossOrbs"] +stream = ExtResource("40_ku5el") +volume_db = 1.0 +pitch_scale = 1.1 +max_polyphony = 15 + +[node name="GameEnding" type="Node3D" parent="."] +script = ExtResource("12_kefc8") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="GameEnding"] +libraries = { +"": SubResource("AnimationLibrary_l1ojm") +} + +[node name="ColorRect" type="ColorRect" parent="GameEnding"] +modulate = Color(1, 1, 1, 0) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1.0 +offset_bottom = 2.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="Label" type="Label" parent="GameEnding"] +modulate = Color(1, 1, 1, 0) +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -98.5 +offset_top = -34.5 +offset_right = 98.5 +offset_bottom = 34.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +text = "THE END" +label_settings = SubResource("LabelSettings_gphy5") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="VideoStreamPlayer" parent="GameEnding" instance=ExtResource("44_imo6u")] +autoplay = false + +[connection signal="DestroyRemainingOrbs" from="God Circuit" to="BossOrbs/Pyramid" method="DestroySelf"] +[connection signal="DestroyRemainingOrbs" from="God Circuit" to="BossOrbs/Orb" method="DestroySelf"] +[connection signal="DestroyRemainingOrbs" from="God Circuit" to="BossOrbs/Hedron" method="DestroySelf"] [connection signal="OnEnemyBossHit" from="God Circuit" to="Boss GUI/TextureProgressBar" method="UpdateBar"] -[connection signal="body_entered" from="AttackZone" to="BossOrbs/Pyramid" method="OnFire"] +[connection signal="OnGameEnding" from="God Circuit" to="GameEnding" method="OnGameEnding"] [connection signal="OnBossOrbExploded" from="BossOrbs/Pyramid" to="God Circuit" method="OnBossOrbDestroyed"] [connection signal="body_entered" from="BossOrbs/Pyramid" to="BossOrbs/Pyramid" method="OnOrbHit"] +[connection signal="timeout" from="BossOrbs/Pyramid/Timer" to="BossOrbs/Pyramid" method="OnFire"] [connection signal="OnBossOrbExploded" from="BossOrbs/Orb" to="God Circuit" method="OnBossOrbDestroyed"] [connection signal="body_entered" from="BossOrbs/Orb" to="BossOrbs/Orb" method="OnOrbHit"] +[connection signal="timeout" from="BossOrbs/Orb/Timer" to="BossOrbs/Orb" method="OnFire"] [connection signal="OnBossOrbExploded" from="BossOrbs/Hedron" to="God Circuit" method="OnBossOrbDestroyed"] [connection signal="body_entered" from="BossOrbs/Hedron" to="BossOrbs/Hedron" method="OnOrbHit"] +[connection signal="timeout" from="BossOrbs/Hedron/Timer" to="BossOrbs/Hedron" method="OnFire"] diff --git a/Levels/Scenes/Level3.tscn b/Levels/Scenes/Level3.tscn index 8c754b4..d34c7f0 100644 --- a/Levels/Scenes/Level3.tscn +++ b/Levels/Scenes/Level3.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=39 format=3 uid="uid://btl5fdyjewnwc"] +[gd_scene load_steps=40 format=3 uid="uid://btl5fdyjewnwc"] [ext_resource type="Script" path="res://Levels/Scripts/Level.cs" id="1_1xwm7"] [ext_resource type="PackedScene" uid="uid://jgf7k1r35km1" path="res://Levels/ExitPortal.tscn" id="3_2t766"] @@ -8,6 +8,7 @@ [ext_resource type="PackedScene" uid="uid://dahp73fwld24h" path="res://Enemies/RangedEnemy.tscn" id="5_8b1ug"] [ext_resource type="Texture2D" uid="uid://33cgwfy7mqcg" path="res://Levels/Models/Stage3/STAGE 3_LIon Marquee_2320x920_2.png" id="5_kwy6o"] [ext_resource type="PackedScene" uid="uid://bt5rolsyjmx55" path="res://Enemies/MeleeEnemy.tscn" id="6_b7xn3"] +[ext_resource type="AudioStream" uid="uid://6yf38ykqn31u" path="res://Audio/SFX/HitObstacle.wav" id="7_j16pm"] [ext_resource type="Script" path="res://Levels/Scripts/Door.cs" id="8_ow05j"] [ext_resource type="Shader" path="res://Levels/Scenes/Door.gdshader" id="9_05wf0"] [ext_resource type="Texture2D" uid="uid://cep6lm4mg58ua" path="res://Levels/Models/Stage3/STAGE 3_2317.png" id="11_eto36"] @@ -72,7 +73,7 @@ shader = ExtResource("9_05wf0") [sub_resource type="Animation" id="Animation_uk6to"] resource_name = "HitFlash" -length = 0.2 +length = 0.7 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = false @@ -97,6 +98,29 @@ tracks/1/keys = { "update": 0, "values": [Color(1, 1, 1, 1), Color(0.752941, 0, 0, 1), Color(1, 1, 1, 1)] } +tracks/2/type = "audio" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AudioStreamPlayer") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"clips": [], +"times": PackedFloat32Array() +} +tracks/2/use_blend = true +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AudioStreamPlayer:playing") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} [sub_resource type="Animation" id="Animation_27wc0"] length = 0.001 @@ -124,6 +148,18 @@ tracks/1/keys = { "update": 0, "values": [Color(1, 1, 1, 1)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AudioStreamPlayer:playing") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_lfq7u"] _data = { @@ -507,6 +543,9 @@ collision_mask = 32 transform = Transform3D(-4.37114e-08, 2.5411e-21, 1, 1.42109e-14, 1, -2.5411e-21, -1, -2.84217e-14, -4.37114e-08, -0.571146, 0.810928, 0.294388) shape = SubResource("BoxShape3D_yew2s") +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Door"] +stream = ExtResource("7_j16pm") + [node name="Exit Portal" parent="." instance=ExtResource("3_2t766")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.42152, -0.073884, -5.35807) diff --git a/Levels/Scenes/Level9.tscn b/Levels/Scenes/Level9.tscn index 5e97d7e..c0807a1 100644 --- a/Levels/Scenes/Level9.tscn +++ b/Levels/Scenes/Level9.tscn @@ -429,17 +429,14 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.102972, 0) mesh = SubResource("ArrayMesh_aecmk") skeleton = NodePath("") -[node name="Melee Enemy2" parent="STAGE 9/Plane" node_paths=PackedStringArray("_hp") instance=ExtResource("6_he4fx")] +[node name="Melee Enemy2" parent="STAGE 9/Plane" instance=ExtResource("6_he4fx")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.50991, 0, 1.92293) -_hp = NodePath("../../../Melee Enemy2/HP Component") -[node name="Melee Enemy2" parent="STAGE 9/Plane/Melee Enemy2" node_paths=PackedStringArray("_hp") instance=ExtResource("6_he4fx")] +[node name="Melee Enemy2" parent="STAGE 9/Plane/Melee Enemy2" instance=ExtResource("6_he4fx")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.932325, -0.367979, -6.01649) -_hp = NodePath("../../../../Melee Enemy2/HP Component") -[node name="Melee Enemy2" parent="STAGE 9/Plane/Melee Enemy2/Melee Enemy2" node_paths=PackedStringArray("_hp") instance=ExtResource("6_he4fx")] +[node name="Melee Enemy2" parent="STAGE 9/Plane/Melee Enemy2/Melee Enemy2" instance=ExtResource("6_he4fx")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.05054, -0.367979, -0.683629) -_hp = NodePath("../../../../../Melee Enemy2/HP Component") [node name="Cube" type="MeshInstance3D" parent="STAGE 9"] transform = Transform3D(-1.88868, 0, -9.70661e-08, 0, 1, 0, 6.1541e-07, 0, -0.297894, 2.97173, 0.129772, -3.56831) @@ -581,30 +578,30 @@ libraries = { [node name="Enemies" type="Node3D" parent="."] -[node name="Melee Enemy" parent="." instance=ExtResource("6_he4fx")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.07774, 0.251952, 1.13652) - -[node name="Melee Enemy2" parent="." instance=ExtResource("6_he4fx")] +[node name="Melee Enemy2" parent="Enemies" instance=ExtResource("6_he4fx")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.59927, 0, 2.47846) -[node name="RangedEnemy4" parent="." instance=ExtResource("5_g2lk8")] +[node name="Melee Enemy" parent="Enemies" instance=ExtResource("6_he4fx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.07774, 0.251952, 1.13652) + +[node name="RangedEnemy4" parent="Enemies" instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, -1.48224, -0.0960431, -2.952) -[node name="RangedEnemy" parent="." instance=ExtResource("5_g2lk8")] +[node name="RangedEnemy" parent="Enemies" instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, 1.88274, 0, -1.93627) -[node name="RangedEnemy6" parent="." node_paths=PackedStringArray("_hp") instance=ExtResource("5_g2lk8")] +[node name="RangedEnemy6" parent="Enemies" node_paths=PackedStringArray("_hp") instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, -4.88238, -0.396447, -4.21396) _hp = NodePath("../RangedEnemy2/HP Component") -[node name="RangedEnemy5" parent="." node_paths=PackedStringArray("_hp") instance=ExtResource("5_g2lk8")] +[node name="RangedEnemy5" parent="Enemies" node_paths=PackedStringArray("_hp") instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, -4.78224, -0.264298, 0.6371) _hp = NodePath("../RangedEnemy2/HP Component") -[node name="RangedEnemy2" parent="." instance=ExtResource("5_g2lk8")] +[node name="RangedEnemy2" parent="Enemies" instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, 0.526673, -0.132149, -3.13367) -[node name="RangedEnemy3" parent="." instance=ExtResource("5_g2lk8")] +[node name="RangedEnemy3" parent="Enemies" instance=ExtResource("5_g2lk8")] transform = Transform3D(-0.999999, 0, -0.00116936, 0, 1, 0, 0.00116936, 0, -0.999999, -0.307606, -0.298673, -3.61058) [node name="Exit Portal" parent="." instance=ExtResource("7_h6fqi")] diff --git a/Levels/Scripts/Level.cs b/Levels/Scripts/Level.cs index 376f92c..9afce9d 100644 --- a/Levels/Scripts/Level.cs +++ b/Levels/Scripts/Level.cs @@ -9,18 +9,23 @@ public partial class Level : Node3D public override void _EnterTree() { - _gameManager = GetTree().Root.GetNode("Main/GameManager"); - _enemies = GetNode("Enemies").GetChildren().OfType().ToList(); + _gameManager = GetTree().Root.GetNode("Main/GameManager"); + _enemies = GetNode("Enemies").GetChildren().OfType().ToList(); } public void OnEnemyDefeated(BasicEnemy enemy) { - if (_enemies.Contains(enemy)) - { - GD.Print("On enemy defeated " + enemy.Name); - _enemies.Remove(enemy); - if (!_enemies.Any()) - _gameManager.OnAllEnemiesDefeated(); - } + if (_enemies.Contains(enemy)) + { + GD.Print("On enemy defeated " + enemy.Name); + _enemies.Remove(enemy); + if (!_enemies.Any()) + _gameManager.OnAllEnemiesDefeated(); + } + } + + public void GameEnding() + { + QueueFree(); } } diff --git a/Player/Base/Player.cs b/Player/Base/Player.cs index 160f4fe..af844a9 100644 --- a/Player/Base/Player.cs +++ b/Player/Base/Player.cs @@ -29,9 +29,9 @@ public partial class Player : Node3D public override void _Ready() { - foreach (var character in PlayableCharacterScenes) - { - CharactersLeftOnStage.Add(character); - } + foreach (var character in PlayableCharacterScenes) + { + CharactersLeftOnStage.Add(character); + } } } diff --git a/UI/CharacterSelectUpdateService.cs b/UI/CharacterSelectUpdateService.cs index 17733a2..5880159 100644 --- a/UI/CharacterSelectUpdateService.cs +++ b/UI/CharacterSelectUpdateService.cs @@ -47,10 +47,9 @@ public partial class CharacterSelectUpdateService : Control node.Show(); } - public void ClearPlayerBGs(int playerIndex) + public void ClearPlayerBGs(Player player) { - GD.Print($"Hiding player"); - var allPortraits = GetNode($"P{playerIndex + 1}").GetChildren().OfType(); + var allPortraits = GetNode($"P{player.PlayerNumber}").GetChildren().OfType(); foreach (var bg in allPortraits) bg.Hide(); } diff --git a/UI/MainMenu.cs b/UI/MainMenu.cs index 097303a..ee83472 100644 --- a/UI/MainMenu.cs +++ b/UI/MainMenu.cs @@ -12,48 +12,48 @@ public partial class MainMenu : Node2D public override void _Ready() { - GetParent().GetNode("MainMenu/UIAnimations/LoreSplash").Show(); - _animationPlayer = GetTree().Root.GetNode("/root/Main/MainMenu/UIAnimations/AnimationPlayer"); - _animationPlayer.Play("IntroLore"); - var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); - bgmPlayer.SetBGMFromFilepath("Audio/BGM/TitleTheme.ogg"); - bgmPlayer.PlayBGM(); - _player1Input = new Player1Input(); - _player2Input = new Player2Input(); - _animationPlayer.AnimationFinished += OnIntroAnimationFinished; + GetParent().GetNode("MainMenu/UIAnimations/LoreSplash").Show(); + _animationPlayer = GetTree().Root.GetNode("/root/Main/MainMenu/UIAnimations/AnimationPlayer"); + _animationPlayer.Play("IntroLore"); + var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); + bgmPlayer.SetBGMFromFilepath("Audio/BGM/TitleTheme.ogg"); + bgmPlayer.PlayBGM(); + _player1Input = new Player1Input(); + _player2Input = new Player2Input(); + _animationPlayer.AnimationFinished += OnIntroAnimationFinished; } public override void _UnhandledInput(InputEvent @event) { - if (_animationPlayer.IsPlaying() && (Input.IsActionJustPressed(_player1Input.Fire()) || Input.IsActionJustPressed(_player2Input.Fire()))) - { - _animationPlayer.Seek(10); - GetNode("NewGame/1Player").GrabFocus(); - } + if (_animationPlayer.IsPlaying() && (Input.IsActionJustReleased(_player1Input.Fire()) || Input.IsActionJustReleased(_player2Input.Fire()))) + { + _animationPlayer.Seek(10); + GetNode("NewGame/1Player").GrabFocus(); + } } public void OnIntroAnimationFinished(StringName animationName) { - GetNode("NewGame/1Player").GrabFocus(); + GetNode("NewGame/1Player").GrabFocus(); } private void OneSinglePlayerPressed() { - Hide(); - var main = GetTree().Root.GetNode
("/root/Main"); - main.LoadLevel(0, 1); + Hide(); + var main = GetTree().Root.GetNode
("/root/Main"); + main.LoadLevel(0, 1); } private void OnTwoPlayerPressed() { - Hide(); - var main = GetTree().Root.GetNode
("/root/Main"); - main.LoadLevel(0, 2); + Hide(); + var main = GetTree().Root.GetNode
("/root/Main"); + main.LoadLevel(0, 2); } private void OnQuitButtonPressed() { - GetTree().Quit(); + GetTree().Quit(); } } diff --git a/UI/StageGUI.cs b/UI/StageGUI.cs index a317644..4d7aaaf 100644 --- a/UI/StageGUI.cs +++ b/UI/StageGUI.cs @@ -19,9 +19,12 @@ public partial class StageGUI : Control [Signal] public delegate void OnGameOverEventHandler(Array players); + [Export] + private AudioStreamPlayer _audioStreamPlayer; + private GameManager _gameManager; - public override void _EnterTree() + public override void _Ready() { _gameManager = GetTree().Root.GetNode("Main/GameManager"); } @@ -57,6 +60,8 @@ public partial class StageGUI : Control player.IsSelectingCharacter = false; EmitSignal(SignalName.OnCharacterSelectionMade, player); GetTree().Paused = false; + if (_audioStreamPlayer != null) + _audioStreamPlayer.Play(); } } diff --git a/UI/StageGUI.tscn b/UI/StageGUI.tscn index ea228c9..884ad61 100644 --- a/UI/StageGUI.tscn +++ b/UI/StageGUI.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://dq1gtd55p04do"] +[gd_scene load_steps=9 format=3 uid="uid://dq1gtd55p04do"] [ext_resource type="Script" path="res://UI/StageGUI.cs" id="1_wr2m0"] [ext_resource type="Texture2D" uid="uid://d18xmfbg47qpi" path="res://Textures/Portraits/blank-background.png" id="2_rh3al"] @@ -7,8 +7,9 @@ [ext_resource type="Texture2D" uid="uid://1pgw8he4k5va" path="res://Textures/Portraits/pisces-bg-char.png" id="5_y2ln6"] [ext_resource type="Texture2D" uid="uid://bacwvejc4hcou" path="res://Textures/Portraits/sag-bg-char.png" id="6_iltal"] [ext_resource type="Texture2D" uid="uid://o7uu4efxf36e" path="res://Textures/Portraits/scorpio-bg-char.png" id="7_tgrf5"] +[ext_resource type="AudioStream" uid="uid://cdps3mfvdxdud" path="res://Audio/SFX/select.wav" id="8_3x5jr"] -[node name="StageGUI" type="Control"] +[node name="StageGUI" type="Control" node_paths=PackedStringArray("_audioStreamPlayer")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -16,6 +17,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_wr2m0") +_audioStreamPlayer = NodePath("AudioStreamPlayer") metadata/_edit_horizontal_guides_ = [-342.0] [node name="SidebarLeft" type="TextureRect" parent="."] @@ -186,3 +188,6 @@ offset_bottom = 540.0 grow_horizontal = 0 grow_vertical = 2 texture = ExtResource("7_tgrf5") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("8_3x5jr") diff --git a/Video/ENDINGN CUTSCENE.ogv b/Video/ENDINGN CUTSCENE.ogv new file mode 100644 index 0000000..60d29f6 Binary files /dev/null and b/Video/ENDINGN CUTSCENE.ogv differ diff --git a/Video/VideoPlayer.tscn b/Video/VideoPlayer.tscn index df0f6c9..32c2000 100644 --- a/Video/VideoPlayer.tscn +++ b/Video/VideoPlayer.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://b1tm30iteu5rh"] -[ext_resource type="VideoStream" path="res://Video/ending mp4 version.ogv" id="1_nrrxq"] +[ext_resource type="VideoStream" path="res://Video/ENDINGN CUTSCENE.ogv" id="1_hs1w4"] [node name="VideoStreamPlayer" type="VideoStreamPlayer"] anchors_preset = 15 @@ -10,6 +10,6 @@ grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 4 size_flags_vertical = 4 -stream = ExtResource("1_nrrxq") +stream = ExtResource("1_hs1w4") autoplay = true expand = true diff --git a/Video/ending cutscene.avi b/Video/ending cutscene.avi deleted file mode 100644 index 2601111..0000000 Binary files a/Video/ending cutscene.avi and /dev/null differ diff --git a/Video/ending cutscene.ogv b/Video/ending cutscene.ogv deleted file mode 100644 index 315d51d..0000000 Binary files a/Video/ending cutscene.ogv and /dev/null differ diff --git a/Video/ending cutscene2.ogv b/Video/ending cutscene2.ogv deleted file mode 100644 index 2601111..0000000 Binary files a/Video/ending cutscene2.ogv and /dev/null differ diff --git a/Video/ending.ogg b/Video/ending.ogg deleted file mode 100644 index 111af58..0000000 Binary files a/Video/ending.ogg and /dev/null differ diff --git a/Video/ending.ogg.import b/Video/ending.ogg.import deleted file mode 100644 index 74d8a56..0000000 --- a/Video/ending.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://dkm05w517x2kd" -path="res://.godot/imported/ending.ogg-67a94d6ff101ec40851be5976a626a27.oggvorbisstr" - -[deps] - -source_file="res://Video/ending.ogg" -dest_files=["res://.godot/imported/ending.ogg-67a94d6ff101ec40851be5976a626a27.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/Video/output.ogv b/Video/output.ogv deleted file mode 100644 index c18ad76..0000000 Binary files a/Video/output.ogv and /dev/null differ diff --git a/project.godot b/project.godot index f4aaedf..14afb41 100644 --- a/project.godot +++ b/project.godot @@ -35,10 +35,10 @@ project/assembly_name="GameJam2023" ui_accept={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"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":4194309,"key_label":0,"unicode":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":71,"key_label":0,"unicode":103,"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":4194436,"key_label":0,"unicode":46,"echo":false,"script":null) ] } ui_select={ @@ -98,16 +98,18 @@ p1_down={ } p1_fire={ "deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":true,"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":71,"key_label":0,"unicode":103,"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":75,"key_label":0,"unicode":107,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":9,"pressure":0.0,"pressed":true,"script":null) ] } p1_altfire={ "deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":true,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":true,"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":76,"key_label":0,"unicode":108,"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":72,"key_label":0,"unicode":104,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] } exit={ @@ -148,12 +150,14 @@ p2_fire={ "deadzone": 0.5, "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":4194436,"key_label":0,"unicode":46,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) ] } p2_altfire={ "deadzone": 0.5, "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":4194310,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] }