diff --git a/Resources/Sprites/player.tres b/Resources/Sprites/player.tres index 3eeec3d0..a2b78496 100644 --- a/Resources/Sprites/player.tres +++ b/Resources/Sprites/player.tres @@ -1,6 +1,52 @@ -[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://bc7mghjx75qip"] +[gd_resource type="SpriteFrames" load_steps=28 format=3 uid="uid://bc7mghjx75qip"] [ext_resource type="Texture2D" uid="uid://ddwhrlrgj6i00" path="res://Sprites/Actors/Cirno.png" id="1_nsg0m"] +[ext_resource type="Texture2D" uid="uid://bvjyivjk530r5" path="res://Sprites/Actors/Cirno_Surprised.png" id="1_smg7h"] +[ext_resource type="Texture2D" uid="uid://calorbo7lwx72" path="res://Sprites/Actors/Cirno_Drowning.png" id="2_dod2v"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_qt0xq"] +atlas = ExtResource("1_smg7h") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j8jir"] +atlas = ExtResource("1_smg7h") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6sqmb"] +atlas = ExtResource("2_dod2v") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bl8yu"] +atlas = ExtResource("2_dod2v") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a680j"] +atlas = ExtResource("2_dod2v") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cab7f"] +atlas = ExtResource("2_dod2v") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_la2t0"] +atlas = ExtResource("2_dod2v") +region = Rect2(64, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_eqxxe"] +atlas = ExtResource("2_dod2v") +region = Rect2(80, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7j3x3"] +atlas = ExtResource("2_dod2v") +region = Rect2(96, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j4qq6"] +atlas = ExtResource("2_dod2v") +region = Rect2(112, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_34li8"] +atlas = ExtResource("2_dod2v") +region = Rect2(128, 0, 16, 16) [sub_resource type="AtlasTexture" id="AtlasTexture_6tpxx"] atlas = ExtResource("1_nsg0m") @@ -58,6 +104,62 @@ region = Rect2(32, 16, 16, 16) animations = [{ "frames": [{ "duration": 1.0, +"texture": SubResource("AtlasTexture_qt0xq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j8jir") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qt0xq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j8jir") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qt0xq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j8jir") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6sqmb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bl8yu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a680j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cab7f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_la2t0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eqxxe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7j3x3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7j3x3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j4qq6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_34li8") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"Drowning", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, "texture": SubResource("AtlasTexture_6tpxx") }], "loop": true, diff --git a/Scenes/Actors/fsm_player.tscn b/Scenes/Actors/fsm_player.tscn index 7fbd3e65..9101b00f 100644 --- a/Scenes/Actors/fsm_player.tscn +++ b/Scenes/Actors/fsm_player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=57 format=3 uid="uid://c4pr2707hbeph"] +[gd_scene load_steps=58 format=3 uid="uid://c4pr2707hbeph"] [ext_resource type="Script" uid="uid://d2ubk5gucny6s" path="res://Scripts/Components/FSM/PlayerFSMProxy.cs" id="1_g3wua"] [ext_resource type="Script" uid="uid://bw2hakslndaxm" path="res://Scripts/Components/FSM/PlayerStateMachine.cs" id="1_mpmil"] @@ -18,6 +18,7 @@ [ext_resource type="PackedScene" uid="uid://biugfbp0yae2s" path="res://Scenes/Particles/DeathParticles.tscn" id="9_0pyos"] [ext_resource type="Script" uid="uid://d208gvthkstvc" path="res://Scripts/Components/Actors/PlayerCrosshairProvider.cs" id="9_s0ir4"] [ext_resource type="Texture2D" uid="uid://cfrvb1moh857m" path="res://Sprites/Crosshair.png" id="10_8dcio"] +[ext_resource type="Script" uid="uid://bgve2lktony00" path="res://Scripts/Components/FSM/Player/Drowning.cs" id="10_es1gk"] [ext_resource type="Script" uid="uid://3jxrxcqp3ndr" path="res://Scripts/Components/Actors/PlayerHitboxSpriteProvider.cs" id="10_gp3hw"] [ext_resource type="Texture2D" uid="uid://bwjrdlnysft15" path="res://Sprites/Actors/Focus_Circle.png" id="12_8dcio"] [ext_resource type="Texture2D" uid="uid://bf37ce6jskdel" path="res://Sprites/SmallHitbox.png" id="13_pmkfo"] @@ -274,14 +275,20 @@ _animationProvider = NodePath("../../AnimationProvider") _inputProvider = NodePath("../../InputProvider") _healthProvider = NodePath("../../DamageReceiver/HealthProvider") +[node name="Drowning" type="Node2D" parent="StateMachine" node_paths=PackedStringArray("_animationProvider")] +script = ExtResource("10_es1gk") +_animationProvider = NodePath("../../AnimationProvider") + [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_b3hxm") [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] material = ExtResource("4_5qlss") sprite_frames = ExtResource("4_s0ir4") -animation = &"walk_down" -frame_progress = 0.50115 +animation = &"Drowning" +autoplay = "idle" +frame = 15 +frame_progress = 0.860925 [node name="WeaponProvider" type="Node2D" parent="."] script = ExtResource("5_gp3hw") diff --git a/Scenes/Maps/PlayerFSMTest.tscn b/Scenes/Maps/PlayerFSMTest.tscn index aec00b07..ae9c46fc 100644 --- a/Scenes/Maps/PlayerFSMTest.tscn +++ b/Scenes/Maps/PlayerFSMTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=54 format=4 uid="uid://dqyfnby0t7gu1"] +[gd_scene load_steps=56 format=4 uid="uid://dqyfnby0t7gu1"] [ext_resource type="Script" uid="uid://doxmbokehw8ci" path="res://Scripts/GameManager.cs" id="1_c3v4x"] [ext_resource type="Resource" uid="uid://cs3ihltcn2166" path="res://Resources/Items/IcicleGun.tres" id="3_6314l"] @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://c4pr2707hbeph" path="res://Scenes/Actors/fsm_player.tscn" id="8_c3v4x"] [ext_resource type="Material" uid="uid://cdaeormgf78de" path="res://Resources/Materials/Static_Scanlines.tres" id="8_cub4j"] [ext_resource type="Script" uid="uid://cfya7sndh7vy2" path="res://Scenes/CameraController.gd" id="9_dj0ui"] +[ext_resource type="Script" uid="uid://crpkvxepkcrir" path="res://Scripts/Components/Actors/ForceFieldCollisionDisabler.cs" id="9_wt88c"] [ext_resource type="PackedScene" uid="uid://cmr6fclttrpkb" path="res://Scenes/Items/Ammo1.tscn" id="10_6314l"] [ext_resource type="PackedScene" uid="uid://d0j1bmgbefyp2" path="res://Scenes/Actors/Lightbridge.tscn" id="10_k6t8d"] [ext_resource type="Script" uid="uid://c5nxsq3tyxcx6" path="res://Scripts/InventoryManager.cs" id="10_qmakk"] @@ -57,6 +58,9 @@ size = Vector2(30, 52.5) [sub_resource type="RectangleShape2D" id="RectangleShape2D_cub4j"] size = Vector2(30, 50.25) +[sub_resource type="RectangleShape2D" id="RectangleShape2D_31m6w"] +size = Vector2(30, 53.5) + [sub_resource type="Gradient" id="Gradient_2vu2h"] colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1) @@ -130,6 +134,13 @@ shape = SubResource("RectangleShape2D_rff8l") position = Vector2(413, 106.875) shape = SubResource("RectangleShape2D_cub4j") +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Tilemaps/AcidHitboxes/Acid" node_paths=PackedStringArray("_door")] +position = Vector2(385, 107.75) +shape = SubResource("RectangleShape2D_31m6w") +script = ExtResource("9_wt88c") +_door = NodePath("../../LightBridge2") +Invert = true + [node name="LightBridge" type="Node2D" parent="Tilemaps/AcidHitboxes"] position = Vector2(501.697, 121.54) metadata/_edit_group_ = true diff --git a/Scenes/test.tscn b/Scenes/test.tscn index 14c21d27..63754ea2 100644 --- a/Scenes/test.tscn +++ b/Scenes/test.tscn @@ -195,7 +195,7 @@ ActivationType = 0 Targets = Array[NodePath]([NodePath("../Rumia")]) WaitForCompletion = true -[sub_resource type="Resource" id="Resource_bwt6v"] +[sub_resource type="Resource" id="Resource_gd7x4"] resource_local_to_scene = true script = ExtResource("49_0si7g") Target = NodePath(".") @@ -798,7 +798,7 @@ Events = Array[ExtResource("42_gd7x4")]([SubResource("Resource_068l7"), SubResou [node name="BossBattleStartScript" parent="Factory Tilemaps/LevelProps" instance=ExtResource("43_kf3qc")] position = Vector2(-1487, -396) -Events = Array[ExtResource("42_gd7x4")]([SubResource("Resource_4f4id"), SubResource("Resource_s2o7m"), SubResource("Resource_b1dht"), SubResource("Resource_xrgpy"), SubResource("Resource_bwt6v")]) +Events = Array[ExtResource("42_gd7x4")]([SubResource("Resource_4f4id"), SubResource("Resource_s2o7m"), SubResource("Resource_b1dht"), SubResource("Resource_xrgpy"), SubResource("Resource_gd7x4")]) [node name="Enemy13" parent="Factory Tilemaps/LevelProps" instance=ExtResource("47_u1ve6")] position = Vector2(-1657, -788) diff --git a/Scripts/Components/Actors/PlayerAnimationProvider.cs b/Scripts/Components/Actors/PlayerAnimationProvider.cs index 09c8aede..b52e3a89 100644 --- a/Scripts/Components/Actors/PlayerAnimationProvider.cs +++ b/Scripts/Components/Actors/PlayerAnimationProvider.cs @@ -24,6 +24,9 @@ public partial class PlayerAnimationProvider : Node2D public StringName WalkDownAnimationName {get; private set;} = "walk_down"; [Export] public StringName WalkUpAnimationName {get; private set;} = "walk_up"; + + [Export] + public StringName DrowningAnimationName {get; private set;} = "Drowning"; [ExportCategory("Shaders")] [Export] public ShaderMaterial BlinkMaterial {get; private set;} @@ -33,6 +36,13 @@ public partial class PlayerAnimationProvider : Node2D [Export] public StringName ScanlineDensityPropertyName { get; private set; } = new("scanline_density"); private GTween _blinkTween; + + [Signal] public delegate void OnAnimationEndedEventHandler(StringName animationName); + + public override void _Ready() + { + _animatedSprite.AnimationFinished += () => EmitSignal(SignalName.OnAnimationEnded, _animatedSprite.Animation); + } public void ShowSprite() { @@ -142,6 +152,13 @@ public partial class PlayerAnimationProvider : Node2D this.CreateSibling(_deathParticles, this.GlobalPosition); _animatedSprite.Visible = false; } + + public void PlayDrowningAnimation() + { + _animatedSprite.Visible = true; + _animatedSprite.Play(DrowningAnimationName); + _animatedSprite.SpeedScale = 1; + } public void PlayShieldAnimation() { diff --git a/Scripts/Components/Actors/PlayerDamageReceiver.cs b/Scripts/Components/Actors/PlayerDamageReceiver.cs index 7ee7bd63..cdd4f8c5 100644 --- a/Scripts/Components/Actors/PlayerDamageReceiver.cs +++ b/Scripts/Components/Actors/PlayerDamageReceiver.cs @@ -1,4 +1,5 @@ using System; +using Cirno.Scripts.Components.FSM; using Godot; namespace Cirno.Scripts.Components.Actors; @@ -42,9 +43,13 @@ public partial class PlayerDamageReceiver : Area2D get => _shieldProvider.CurrentResource; set => _shieldProvider.CurrentResource = value; } + + private IStateMachine _stateMachine; - public void Init() + public void Init(IStateMachine machine) { + _stateMachine = machine; + Invulnerable = GlobalState.Instance.SessionSettings.GodMode; _healthProvider.ResourceChanged += ((value, maxValue) => @@ -107,7 +112,8 @@ public partial class PlayerDamageReceiver : Area2D { if (!Enabled) return; GD.Print("Acid death"); - _healthProvider.CurrentResource = 0; + _stateMachine.SetState(PlayerState.Drowning); + //_healthProvider.CurrentResource = 0; } public void Hit(float damage, DamageType type = DamageType.Neutral) diff --git a/Scripts/Components/FSM/Player/Active.cs b/Scripts/Components/FSM/Player/Active.cs index 2f88ec66..d0bc4937 100644 --- a/Scripts/Components/FSM/Player/Active.cs +++ b/Scripts/Components/FSM/Player/Active.cs @@ -64,7 +64,7 @@ public partial class Active : PlayerStateBase //_hud.UpdateShield(value, maxValue); }; - _damageReceiver.Init(); + _damageReceiver.Init(StateMachine); _damageReceiver.RefillHealth(); _damageReceiver.RefillShield(); diff --git a/Scripts/Components/FSM/Player/Drowning.cs b/Scripts/Components/FSM/Player/Drowning.cs new file mode 100644 index 00000000..68ea4920 --- /dev/null +++ b/Scripts/Components/FSM/Player/Drowning.cs @@ -0,0 +1,31 @@ +using Godot; + +namespace Cirno.Scripts.Components.FSM.Player; + +public partial class Drowning : PlayerStateBase +{ + public override PlayerState StateId => PlayerState.Drowning; + + [Export] + private PlayerAnimationProvider _animationProvider; + + public override void EnterState() + { + _animationProvider.PlayDrowningAnimation(); + + _animationProvider.OnAnimationEnded += AnimationProviderOnOnAnimationEnded; + // Wait for animation over and switch to death + + + } + + private void AnimationProviderOnOnAnimationEnded(StringName animationName) + { + if (animationName != _animationProvider.DrowningAnimationName) return; + + _animationProvider.OnAnimationEnded -= AnimationProviderOnOnAnimationEnded; + + StateMachine.SetState(PlayerState.Dead); + + } +} \ No newline at end of file diff --git a/Scripts/Components/FSM/Player/Drowning.cs.uid b/Scripts/Components/FSM/Player/Drowning.cs.uid new file mode 100644 index 00000000..57101f36 --- /dev/null +++ b/Scripts/Components/FSM/Player/Drowning.cs.uid @@ -0,0 +1 @@ +uid://bgve2lktony00 diff --git a/Scripts/PlayerMovement.cs b/Scripts/PlayerMovement.cs index 22a5545e..12da0962 100644 --- a/Scripts/PlayerMovement.cs +++ b/Scripts/PlayerMovement.cs @@ -588,4 +588,5 @@ public enum PlayerState UnTeleporting, Controlling, Dead, + Drowning, } \ No newline at end of file diff --git a/Sprites/Actors/Cirno.aseprite b/Sprites/Actors/Cirno.aseprite index 886aad11..b9f8a97b 100644 --- a/Sprites/Actors/Cirno.aseprite +++ b/Sprites/Actors/Cirno.aseprite @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25d9f61ebdb413dd604f8f13db73225ae033f7ba822e41c5ae419f4d5f3a608b -size 4439 +oid sha256:03d1756acb883c4b3b9a614b286992482418061b45b2770a0ef35447d6df1d6b +size 8917 diff --git a/Sprites/Actors/Cirno_Drowning.png b/Sprites/Actors/Cirno_Drowning.png new file mode 100644 index 00000000..b5a68063 --- /dev/null +++ b/Sprites/Actors/Cirno_Drowning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7ffbc21c13501f77e989694c24a5296ef0176a77c85c885e1074962e40f5aec +size 877 diff --git a/Sprites/Actors/Cirno_Drowning.png.import b/Sprites/Actors/Cirno_Drowning.png.import new file mode 100644 index 00000000..3714d59d --- /dev/null +++ b/Sprites/Actors/Cirno_Drowning.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://calorbo7lwx72" +path="res://.godot/imported/Cirno_Drowning.png-9637a2b29d8ed3f0e666c2c65c8b8699.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Sprites/Actors/Cirno_Drowning.png" +dest_files=["res://.godot/imported/Cirno_Drowning.png-9637a2b29d8ed3f0e666c2c65c8b8699.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Sprites/Actors/Cirno_Surprised.png b/Sprites/Actors/Cirno_Surprised.png new file mode 100644 index 00000000..b1d5d814 --- /dev/null +++ b/Sprites/Actors/Cirno_Surprised.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ebe8bcc7db5859b323e37cec422c5eac97d22dfad03ac954bbd9f550949449d +size 442 diff --git a/Sprites/Actors/Cirno_Surprised.png.import b/Sprites/Actors/Cirno_Surprised.png.import new file mode 100644 index 00000000..615ef8c2 --- /dev/null +++ b/Sprites/Actors/Cirno_Surprised.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvjyivjk530r5" +path="res://.godot/imported/Cirno_Surprised.png-cb1fc228a9e5f07a7c2cd5414df6d36f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Sprites/Actors/Cirno_Surprised.png" +dest_files=["res://.godot/imported/Cirno_Surprised.png-cb1fc228a9e5f07a7c2cd5414df6d36f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Sprites/DoorVertical.aseprite b/Sprites/DoorVertical.aseprite index f28c94c3..67697321 100644 --- a/Sprites/DoorVertical.aseprite +++ b/Sprites/DoorVertical.aseprite @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56e6ebfe2b4a6b6cd12f35042add5682ba64a174c25b57b68e4b6b0172f2adda -size 681 +oid sha256:02009b755d508ae9050e8408476a3de4dbd41f776424079796bdcf56aa857bfd +size 1532