diff --git a/prefabs/enemies/living_armor.tscn b/prefabs/enemies/living_armor.tscn index 8830302..125417d 100644 --- a/prefabs/enemies/living_armor.tscn +++ b/prefabs/enemies/living_armor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://bpusphyhhg074"] +[gd_scene load_steps=7 format=3 uid="uid://bpusphyhhg074"] [ext_resource type="SpriteFrames" uid="uid://cw4pv1qucngxu" path="res://sprites/enemies/armor/living_armor.tres" id="1_j445m"] [ext_resource type="Script" path="res://scripts/enemies/LivingArmor.cs" id="1_ofbsx"] @@ -7,10 +7,17 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_d1ojb"] size = Vector2(15, 15) +[sub_resource type="CircleShape2D" id="CircleShape2D_ex1co"] +radius = 150.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_62y1x"] +radius = 15.0 + [node name="LivingArmor" type="CharacterBody2D"] collision_layer = 5 collision_mask = 5 script = ExtResource("1_ofbsx") +MovingSpeed = 35.0 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] sprite_frames = ExtResource("1_j445m") @@ -28,5 +35,21 @@ polygon = PackedVector2Array(-7, -4, -7, 15, 8, 15, 8, -4, 5, -11, -4, -11) position = Vector2(0.5, 7.5) shape = SubResource("RectangleShape2D_d1ojb") +[node name="AreaOfSight" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AreaOfSight"] +shape = SubResource("CircleShape2D_ex1co") + +[node name="PlayerCollision" type="Area2D" parent="."] +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerCollision"] +position = Vector2(1, 8) +shape = SubResource("CircleShape2D_62y1x") + [connection signal="area_entered" from="LightSense" to="." method="_OnLightEntered"] [connection signal="area_exited" from="LightSense" to="." method="_OnLightExited"] +[connection signal="body_entered" from="AreaOfSight" to="." method="_OnBodyEntered"] +[connection signal="body_exited" from="AreaOfSight" to="." method="_OnBodyExited"] +[connection signal="body_entered" from="PlayerCollision" to="." method="_OnPlayerCollision"] +[connection signal="body_exited" from="PlayerCollision" to="." method="_OnPlayerCollisionExited"] diff --git a/prefabs/enemies/wretched.tscn b/prefabs/enemies/wretched.tscn new file mode 100644 index 0000000..967a61b --- /dev/null +++ b/prefabs/enemies/wretched.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=6 format=3 uid="uid://bmyjqerhno5vi"] + +[ext_resource type="SpriteFrames" uid="uid://blijqhtsnyq7n" path="res://sprites/enemies/wretched/wretched.tres" id="1_aqrsj"] +[ext_resource type="Script" path="res://scripts/enemies/Wretched.cs" id="1_ec388"] +[ext_resource type="PackedScene" uid="uid://cf0wpahgwygxx" path="res://prefabs/light_sense.tscn" id="2_16fib"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_svj4b"] +size = Vector2(24, 16) + +[sub_resource type="CircleShape2D" id="CircleShape2D_nortt"] +radius = 15.0 + +[node name="Wretched" type="CharacterBody2D"] +collision_layer = 5 +collision_mask = 5 +script = ExtResource("1_ec388") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +sprite_frames = ExtResource("1_aqrsj") +animation = &"NonActivatedUp" +frame_progress = 0.776966 + +[node name="Sprite2D" type="Sprite2D" parent="AnimatedSprite2D"] + +[node name="LightSense" parent="." instance=ExtResource("2_16fib")] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="LightSense"] +polygon = PackedVector2Array(-5, -16, -7, -3, -7, 9, -11, 14, -11, 16, 8, 16, 8, 8, 7, 4, 7, -16) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(1, 8) +shape = SubResource("RectangleShape2D_svj4b") + +[node name="PlayerCollision" type="Area2D" parent="."] +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerCollision"] +position = Vector2(1, 8) +shape = SubResource("CircleShape2D_nortt") + +[connection signal="area_entered" from="LightSense" to="." method="_OnLightEntered"] +[connection signal="body_entered" from="PlayerCollision" to="." method="_OnPlayerCollision"] diff --git a/prefabs/entities/spikes.tscn b/prefabs/entities/spikes.tscn index 352f092..6fbfe54 100644 --- a/prefabs/entities/spikes.tscn +++ b/prefabs/entities/spikes.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=3 uid="uid://dqx43vr727ft8"] [ext_resource type="Script" path="res://scripts/entities/Spikes.cs" id="1_r27mb"] -[ext_resource type="SpriteFrames" uid="uid://0xgmr60v1vxg" path="res://sprites/tiles/floor/spikes/spikes.tres" id="2_t76h0"] +[ext_resource type="SpriteFrames" uid="uid://uith5rxps4s" path="res://sprites/tiles/floor/spikes/spikes.tres" id="2_t76h0"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_guqiy"] size = Vector2(32, 32) diff --git a/scenes/main_scene.tscn b/scenes/main_scene.tscn index f9362c6..f2faf59 100644 --- a/scenes/main_scene.tscn +++ b/scenes/main_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3 uid="uid://dhn7yt46fyac8"] +[gd_scene load_steps=27 format=3 uid="uid://dhn7yt46fyac8"] [ext_resource type="PackedScene" uid="uid://bhulqhxesd5gc" path="res://prefabs/player.tscn" id="1_65a7v"] [ext_resource type="AudioStream" uid="uid://bsy2d0bl3lgg0" path="res://sounds/crank.ogg" id="1_cweq4"] @@ -11,14 +11,15 @@ [ext_resource type="Script" path="res://scripts/GameCamera.cs" id="6_quua3"] [ext_resource type="Script" path="res://scripts/PointLight2DWorkaround.cs" id="6_slohe"] [ext_resource type="PackedScene" uid="uid://ccg3n7sobsvdw" path="res://prefabs/enemies/watcher.tscn" id="10_fsiss"] -[ext_resource type="PackedScene" path="res://prefabs/enemies/living_armor.tscn" id="11_x3ep3"] +[ext_resource type="PackedScene" uid="uid://bpusphyhhg074" path="res://prefabs/enemies/living_armor.tscn" id="11_x3ep3"] [ext_resource type="PackedScene" uid="uid://bj1ixwjdpnooo" path="res://prefabs/entities/pressure_plate.tscn" id="12_ynt5e"] [ext_resource type="PackedScene" uid="uid://dqx43vr727ft8" path="res://prefabs/entities/spikes.tscn" id="13_w1hk1"] [ext_resource type="Script" path="res://scripts/DeathScreen.cs" id="15_12mhe"] +[ext_resource type="PackedScene" uid="uid://bmyjqerhno5vi" path="res://prefabs/enemies/wretched.tscn" id="16_ejflu"] [sub_resource type="Curve" id="Curve_o5byr"] -_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.0824742, 0.273684), -10.2105, 0.0, 0, 0, Vector2(0.242268, 0.494737), -5.10526, 0.0, 0, 0, Vector2(0.396907, 0.736842), -7.6579, 0.0, 0, 0, Vector2(0.737113, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] -point_count = 6 +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_wg1ao"] light_mode = 2 @@ -26,7 +27,7 @@ light_mode = 2 [sub_resource type="ShaderMaterial" id="ShaderMaterial_m680d"] shader = ExtResource("5_64d71") -[sub_resource type="ViewportTexture" id="ViewportTexture_psi2l"] +[sub_resource type="ViewportTexture" id="ViewportTexture_1dtfl"] viewport_path = NodePath("FlashlightViewport") [sub_resource type="CircleShape2D" id="CircleShape2D_prnh4"] @@ -122,7 +123,7 @@ CameraBounds = Vector2(30, 20) [node name="PointLight2D" type="PointLight2D" parent="PlayerCamera" node_paths=PackedStringArray("LightViewport")] blend_mode = 2 range_item_cull_mask = 2 -texture = SubResource("ViewportTexture_psi2l") +texture = SubResource("ViewportTexture_1dtfl") script = ExtResource("6_slohe") LightViewport = NodePath("../../FlashlightViewport") @@ -195,18 +196,6 @@ position = Vector2(116, -76) [node name="LivingArmor" parent="." instance=ExtResource("11_x3ep3")] position = Vector2(-70, -67) -[node name="LivingArmor2" parent="." instance=ExtResource("11_x3ep3")] -position = Vector2(-86, -51) -Facing = 2 - -[node name="LivingArmor3" parent="." instance=ExtResource("11_x3ep3")] -position = Vector2(-54, -50) -Facing = 0 - -[node name="LivingArmor4" parent="." instance=ExtResource("11_x3ep3")] -position = Vector2(-70, -36) -Facing = 1 - [node name="pressure_plate" parent="." instance=ExtResource("12_ynt5e")] position = Vector2(31, 51) @@ -227,4 +216,10 @@ Enabled = true SpikesTimeout = 0.5 StartOffset = 0.5 +[node name="Wretched" parent="." instance=ExtResource("16_ejflu")] +position = Vector2(-120, 42) + +[node name="Wretched2" parent="." instance=ExtResource("16_ejflu")] +position = Vector2(-139, -39) + [connection signal="timeout" from="CanvasLayer/DeathScreen/Timer" to="CanvasLayer/DeathScreen" method="Timeout"] diff --git a/scripts/Constants.cs b/scripts/Constants.cs index 9eacdf4..088df03 100644 --- a/scripts/Constants.cs +++ b/scripts/Constants.cs @@ -10,5 +10,6 @@ public static class Constants public const float MaxFlashlightDistance = 96; public const float MinFlashlightDistance = 16; public const float MaxFlashlightEnergy = 100; - public const float FlashlightEnergyPerCharge = 5; + public const float FlashlightEnergyPerCharge = 40; + public const float FlashlightDischargeModifier = 10; } diff --git a/scripts/Flashlight.cs b/scripts/Flashlight.cs index 86e3185..8558d70 100644 --- a/scripts/Flashlight.cs +++ b/scripts/Flashlight.cs @@ -20,7 +20,7 @@ public partial class Flashlight : Node [Export] public AudioStreamPlayer CrankSoundPlayer; private float FlashlightRadius = Constants.MaxFlashlightRadius; - private float FlashlightEnergy = Constants.MaxFlashlightEnergy; + private float FlashlightEnergy = 0; private float FlashlightChargeTimeout = 1; public override void _Ready() @@ -86,7 +86,8 @@ public partial class Flashlight : Node CrankSoundPlayer.Play(); } - FlashlightEnergy = Mathf.Clamp(FlashlightEnergy - (float)delta, 0, Constants.MaxFlashlightEnergy); + FlashlightEnergy = Mathf.Clamp(FlashlightEnergy - (float)delta * Constants.FlashlightDischargeModifier, + 0, Constants.MaxFlashlightEnergy); FlashlightGroup.Modulate = new Color(BrightnessCurve.Sample(FlashlightEnergy / Constants.MaxFlashlightEnergy), 1, 1, 1); CollisionCircle.Disabled = CollisionPlayerCircle.Disabled = CollisionPolygon.Disabled = FlashlightEnergy < 10; diff --git a/scripts/enemies/LivingArmor.cs b/scripts/enemies/LivingArmor.cs index 690ff52..e5bd767 100644 --- a/scripts/enemies/LivingArmor.cs +++ b/scripts/enemies/LivingArmor.cs @@ -1,5 +1,6 @@ using Godot; using System; +using System.Collections.Generic; public partial class LivingArmor : CharacterBody2D { @@ -9,7 +10,7 @@ public partial class LivingArmor : CharacterBody2D Moving, Attack } - + public enum SideFace { Left, @@ -17,10 +18,10 @@ public partial class LivingArmor : CharacterBody2D Right, Down } - + [Export] public SideFace Facing = SideFace.Down; [Export] public float MovingSpeed = 16f; - + public State CurrentState { get => _state; @@ -46,7 +47,11 @@ public partial class LivingArmor : CharacterBody2D private float _timeSinceState; private AnimatedSprite2D _sprite; private bool _isLitUp; - + //private readonly List _bodiesInSight = new List(); + private readonly List _bodiesInSight = new List(); + private readonly List _bodiesNearBy = new List(); + private Node2D _target = null; + public override void _Ready() { _sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D"); @@ -66,6 +71,7 @@ public partial class LivingArmor : CharacterBody2D animationName = "down_walk"; break; } + _sprite.Play(animationName); _sprite.Stop(); } @@ -87,7 +93,42 @@ public partial class LivingArmor : CharacterBody2D break; case State.Moving: - var direction = (Player.Instance.Position - Position).Normalized(); + foreach (var body in _bodiesNearBy) + { + switch (body) + { + case Wretched wretched: + wretched.Kill(this); + break; + case Player player: + player.Kill(this); + break; + } + } + SearchTarget(); + switch (_target) + { + case Player player: + if (!player.Alive) + { + _bodiesInSight.Remove(player); + _target = null; + } + break; + case Wretched wretched: + if (!wretched.IsAlive) + { + _bodiesInSight.Remove(wretched); + _target = null; + } + break; + } + if (_target is null) + { + _state = State.Waiting; + return; + } + var direction = (_target.Position - Position).Normalized(); Velocity = direction * MovingSpeed; var animationName = "side_walk"; @@ -106,9 +147,39 @@ public partial class LivingArmor : CharacterBody2D //MoveAndCollide(direction); break; } + CheckIfLitUp(); } + private void SearchTarget() + { + float targetDistance = -1; + foreach (var body in _bodiesInSight) + { + var distance = (body.Position - Position).Length(); + GD.Print($"{body.Name}"); + switch (body) + { + case Wretched wretched: + if (targetDistance < 0 || targetDistance > distance) + { + targetDistance = distance; + _target = wretched; + } + break; + case Player player: + + if (_target is Wretched) + { + continue; + } + + _target = player; + break; + } + } + } + private void _OnLightEntered(Area2D area) { if (area.GetParentOrNull() is null) @@ -120,13 +191,7 @@ public partial class LivingArmor : CharacterBody2D private void _OnPlayerCollision(Node2D body) { - if (body is not Player player) - return; - - if (CurrentState is State.Waiting) - return; - - player.Kill(this); + _bodiesNearBy.Add(body); } private void _OnLightExited(Area2D area) @@ -139,6 +204,7 @@ public partial class LivingArmor : CharacterBody2D private void _OnPlayerCollisionExited(Node2D body) { + _bodiesNearBy.Remove(body); } void CheckIfLitUp() @@ -148,10 +214,31 @@ public partial class LivingArmor : CharacterBody2D CurrentState = State.Waiting; return; } - + if (CurrentState is State.Moving or State.Attack) return; - CurrentState = State.Moving; } + + + private void _OnBodyEntered(Node2D body) + { + if (body is not Wretched and not Player) + return; + + _bodiesInSight.Add(body); + } + + + private void _OnBodyExited(Node2D body) + { + if (body is not Wretched and not Player) + return; + if (body == _target) + { + _target = null; + } + _bodiesInSight.Remove(body); + } } + diff --git a/scripts/enemies/Wretched.cs b/scripts/enemies/Wretched.cs new file mode 100644 index 0000000..9e959ee --- /dev/null +++ b/scripts/enemies/Wretched.cs @@ -0,0 +1,161 @@ +using Godot; +using System; + +public partial class Wretched : CharacterBody2D +{ + [Signal] + public delegate void KilledEventHandler(); + + public enum State + { + Waiting, + Moving, + Attack + } + + public enum SideFace + { + Left, + Up, + Right, + Down + } + + [Export] public SideFace Facing = SideFace.Down; + [Export] public float MovingSpeed = 32f; + [Export] public bool IsAlive = true; + + + public State CurrentState + { + get => _state; + + private set + { + _state = value; + _timeSinceState = 0; + + switch (_state) + { + case State.Waiting: + break; + case State.Moving: + break; + case State.Attack: + break; + } + } + } + + private State _state; + private float _timeSinceState; + private AnimatedSprite2D _sprite; + private bool _isActivated; + + public override void _Ready() + { + _sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D"); + CurrentState = State.Waiting; + var animationName = "NonActivatedSide"; + switch (Facing) + { + case SideFace.Left: + _sprite.FlipH = true; + break; + case SideFace.Right: + break; + case SideFace.Up: + animationName = "NonActivatedUp"; + break; + case SideFace.Down: + animationName = "NonActivatedDown"; + break; + } + _sprite.Play(animationName); + _sprite.Stop(); + } + + public override void _Process(double delta) + { + } + + public override void _PhysicsProcess(double delta) + { + if (!IsAlive) + return; + _timeSinceState += (float)delta; + + switch (_state) + { + case State.Attack: + break; + case State.Waiting: + break; + + case State.Moving: + var direction = (Player.Instance.Position - Position).Normalized(); + Velocity = direction * MovingSpeed; + + var animationName = "ActivatedSide"; + + if (Velocity.Y > 0.001f) + animationName = "ActivatedDown"; + else if (Velocity.Y < 0.001f) + animationName = "ActivatedUp"; + + if (Mathf.Abs(Velocity.X) >= Mathf.Abs(Velocity.Y)) + animationName = "ActivatedSide"; + + _sprite.FlipH = Velocity.X < 0.001f && animationName == "ActivatedSide"; + _sprite.Play(animationName); + MoveAndSlide(); + break; + } + CheckIfLitUp(); + } + + private void _OnLightEntered(Area2D area) + { + if (area.GetParentOrNull() is null) + return; + + _isActivated = true; + } + + + private void _OnPlayerCollision(Node2D body) + { + if (body is not Player player) + return; + + if (CurrentState is State.Waiting) + return; + + player.Kill(this); + } + + void CheckIfLitUp() + { + if (!_isActivated) + { + CurrentState = State.Waiting; + return; + } + + if (CurrentState is State.Moving or State.Attack) + return; + + CurrentState = State.Moving; + } + + public void Kill(Node2D killer) + { + if (!IsAlive) + return; + + GD.Print($"{this.Name} was killed by {killer.Name}"); + IsAlive = false; + EmitSignal(SignalName.Killed); + QueueFree(); // TODO + } +} diff --git a/scripts/entities/Spikes.cs b/scripts/entities/Spikes.cs index 08da980..ce57212 100644 --- a/scripts/entities/Spikes.cs +++ b/scripts/entities/Spikes.cs @@ -58,13 +58,19 @@ public partial class Spikes : Area2D private void _OnEntered(Node2D body) { - if (body is not Player player) - return; - if (_state is State.Waiting) return; - - player.Kill(this); + switch (body) + { + case Wretched wretched: + wretched.Kill(this); + break; + case Player player: + player.Kill(this); + break; + default: + return; + } } diff --git a/sprites/enemies/wretched/wretched.tres b/sprites/enemies/wretched/wretched.tres new file mode 100644 index 0000000..f4c72f2 --- /dev/null +++ b/sprites/enemies/wretched/wretched.tres @@ -0,0 +1,171 @@ +[gd_resource type="SpriteFrames" load_steps=23 format=3 uid="uid://blijqhtsnyq7n"] + +[ext_resource type="Texture2D" uid="uid://jt8w0gpcde42" path="res://sprites/enemies/wretched/wretched_bottom.png" id="1_42h2f"] +[ext_resource type="Texture2D" uid="uid://dx8chnbe6vmow" path="res://sprites/enemies/wretched/wretched_side.png" id="2_8muft"] +[ext_resource type="Texture2D" uid="uid://ceffjiq2vofiu" path="res://sprites/enemies/wretched/wretched_up.png" id="3_y353x"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_e1ng1"] +atlas = ExtResource("1_42h2f") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h7wwv"] +atlas = ExtResource("1_42h2f") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d2riq"] +atlas = ExtResource("1_42h2f") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j1sxl"] +atlas = ExtResource("1_42h2f") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1tjil"] +atlas = ExtResource("1_42h2f") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qo1on"] +atlas = ExtResource("1_42h2f") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gd2f2"] +atlas = ExtResource("2_8muft") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j1id5"] +atlas = ExtResource("2_8muft") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jujmv"] +atlas = ExtResource("2_8muft") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5cpt1"] +atlas = ExtResource("2_8muft") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8hfxb"] +atlas = ExtResource("3_y353x") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t3n7s"] +atlas = ExtResource("3_y353x") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_k755r"] +atlas = ExtResource("3_y353x") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7cl4u"] +atlas = ExtResource("3_y353x") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3l3jb"] +atlas = ExtResource("3_y353x") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xtic1"] +atlas = ExtResource("3_y353x") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gj6u3"] +atlas = ExtResource("1_42h2f") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8toq8"] +atlas = ExtResource("2_8muft") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d30l2"] +atlas = ExtResource("3_y353x") +region = Rect2(0, 0, 32, 32) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_e1ng1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h7wwv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d2riq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j1sxl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1tjil") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qo1on") +}], +"loop": true, +"name": &"ActivatedDown", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_gd2f2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j1id5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jujmv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5cpt1") +}], +"loop": true, +"name": &"ActivatedSide", +"speed": 6.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_8hfxb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t3n7s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k755r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7cl4u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3l3jb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xtic1") +}], +"loop": true, +"name": &"ActivatedUp", +"speed": 6.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_gj6u3") +}], +"loop": true, +"name": &"NonActivatedDown", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_8toq8") +}], +"loop": true, +"name": &"NonActivatedSide", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_d30l2") +}], +"loop": true, +"name": &"NonActivatedUp", +"speed": 5.0 +}] diff --git a/sprites/enemies/wretched/wretched_bottom.png b/sprites/enemies/wretched/wretched_bottom.png index 795527d..b67e591 100644 Binary files a/sprites/enemies/wretched/wretched_bottom.png and b/sprites/enemies/wretched/wretched_bottom.png differ diff --git a/sprites/enemies/wretched/wretched_side.png b/sprites/enemies/wretched/wretched_side.png index f96c8ef..7fbae7f 100644 Binary files a/sprites/enemies/wretched/wretched_side.png and b/sprites/enemies/wretched/wretched_side.png differ diff --git a/sprites/enemies/wretched/wretched_up.png b/sprites/enemies/wretched/wretched_up.png index 01be299..e3e245e 100644 Binary files a/sprites/enemies/wretched/wretched_up.png and b/sprites/enemies/wretched/wretched_up.png differ diff --git a/sprites_orig/enemies/wretched/wretched_bottom.png b/sprites_orig/enemies/wretched/wretched_bottom.png new file mode 100644 index 0000000..795527d Binary files /dev/null and b/sprites_orig/enemies/wretched/wretched_bottom.png differ diff --git a/sprites_orig/enemies/wretched/wretched_side.png b/sprites_orig/enemies/wretched/wretched_side.png new file mode 100644 index 0000000..f96c8ef Binary files /dev/null and b/sprites_orig/enemies/wretched/wretched_side.png differ diff --git a/sprites_orig/enemies/wretched/wretched_up.png b/sprites_orig/enemies/wretched/wretched_up.png new file mode 100644 index 0000000..01be299 Binary files /dev/null and b/sprites_orig/enemies/wretched/wretched_up.png differ