diff --git a/project.godot b/project.godot index ba758b4..cecd960 100644 --- a/project.godot +++ b/project.godot @@ -36,7 +36,6 @@ PlayerProgress="*res://scripts/PlayerProgress.cs" window/size/viewport_width=600 window/size/viewport_height=400 -window/size/mode=4 window/stretch/mode="canvas_items" [dotnet] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index 8939de4..0ba50d0 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -821,7 +821,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999832, 0.999832) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -833,13 +833,13 @@ metadata/_edit_lock_ = true [node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] position = Vector2(-2, 12) -scale = Vector2(0.999832, 0.999832) +scale = Vector2(0.999836, 0.999836) rest = Transform2D(1, 0, 0, 1, -2, 12) editor_settings/show_bone_gizmo = false [node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] position = Vector2(-2, 14) -scale = Vector2(0.999832, 0.999832) +scale = Vector2(0.999833, 0.999833) rest = Transform2D(1, 0, 0, 1, -2, 14) auto_calculate_length_and_angle = false length = 12.0 @@ -874,7 +874,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.999836, 0.999836) +scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -886,7 +886,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -902,7 +902,7 @@ metadata/_edit_lock_ = true [node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(1, -2) -scale = Vector2(0.999826, 0.999826) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, 1, -2) editor_settings/show_bone_gizmo = false @@ -910,7 +910,7 @@ editor_settings/show_bone_gizmo = false z_index = -1 use_parent_material = true position = Vector2(-14, -23) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -922,13 +922,13 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false [node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 8.0 @@ -956,8 +956,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.0770157 -skew = -0.000432968 +rotation = 0.0155712 +skew = -0.00043869 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -972,7 +972,7 @@ metadata/_edit_lock_ = true [node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-10, -25) -scale = Vector2(0.999825, 0.999825) +scale = Vector2(0.999822, 0.999822) rest = Transform2D(1, 0, 0, 1, -10, -25) editor_settings/show_bone_gizmo = false @@ -1010,9 +1010,9 @@ offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-3.00095, 2.9984) -rotation = 0.00747412 -scale = Vector2(0.999827, 0.999827) +position = Vector2(-2.75527, 2.40711) +rotation = 0.0250584 +scale = Vector2(0.999813, 0.999813) texture = SubResource("AtlasTexture_x5uj2") centered = false offset = Vector2(-12, -2) @@ -1029,7 +1029,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999813, 0.999813) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1085,8 +1085,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.0724117 -scale = Vector2(0.999999, 0.999999) +rotation = 0.120426 +scale = Vector2(0.999994, 0.999994) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) @@ -1095,8 +1095,8 @@ metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] show_behind_parent = true position = Vector2(-0.99983, 12.9978) -rotation = -0.0319581 -scale = Vector2(0.999658, 0.999658) +rotation = -0.107145 +scale = Vector2(0.999655, 0.999655) texture = SubResource("AtlasTexture_vlvtp") centered = false offset = Vector2(-4, -1) @@ -1112,13 +1112,13 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.999824, 0.999824) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false [node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999825, 0.999825) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 6.0 @@ -1168,7 +1168,7 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("4_u5syx") _speed = SubResource("Resource_ckb7n") -_speedControlMult = 0.133731 +_speedControlMult = 2.5893 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("12_he8da") diff --git a/scenes/templates/level_template.tscn b/scenes/templates/level_template.tscn index ce6cba2..5826b6a 100644 --- a/scenes/templates/level_template.tscn +++ b/scenes/templates/level_template.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=57 format=3 uid="uid://dd3yegl1xo44m"] +[gd_scene load_steps=56 format=3 uid="uid://dd3yegl1xo44m"] [ext_resource type="AudioStream" uid="uid://b6xb6mjdecg6a" path="res://assets/audio/sfx/level/readysetplant.mp3" id="1_4gg2g"] [ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/level/RuntimeLevelData.cs" id="1_31ltw"] @@ -583,15 +583,6 @@ Vector2i(1, 0): { } } -[sub_resource type="GDScript" id="GDScript_4gg2g"] -script/source = "extends Label - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - print(str($\"../LevelRunner\".waveHealth)) -" - [node name="StandardLevel" type="Node2D"] [node name="MainAnimationPlayer" type="AnimationPlayer" parent="."] @@ -904,13 +895,6 @@ ignore_time_scale = true [node name="ReadySetPlantPlayer" type="AudioStreamPlayer" parent="."] -[node name="Label" type="Label" parent="."] -offset_left = 308.0 -offset_top = 378.0 -offset_right = 348.0 -offset_bottom = 395.0 -script = SubResource("GDScript_4gg2g") - [connection signal="OnLevelStateChanged" from="Data" to="SunSpawner/Timer" method="OnLevelStateChanged"] [connection signal="OnLevelStateChanged" from="Data" to="ZombieLevelPrevewer" method="OnLevelStateChanged"] [connection signal="OnLevelStateChanged" from="Data" to="InitialSpawner" method="OnLevelStateChanged"] diff --git a/scripts/entities/Entity.cs b/scripts/entities/Entity.cs index 095be99..131d265 100644 --- a/scripts/entities/Entity.cs +++ b/scripts/entities/Entity.cs @@ -11,36 +11,52 @@ public partial class Entity : Node2D #region Health points [Export] public float MaxHP; public float HP; - [Signal] public delegate void OnHPChangedEventHandler(float deltaHP, Node origin); + [Signal] public delegate void OnHPChangedEventHandler(EntitySignalContext context); [Signal] public delegate void OnDamagedEventHandler(); public virtual void TakeDamage(float amount, Node origin) { EmitSignal(SignalName.OnDamaged); + var context = new EntitySignalContext() + { + target = this, + source = (Entity)origin, + actionAmount = amount + }; if (HP - amount <= 0) { - EmitSignal(SignalName.OnHPChanged, -HP, origin); + context.deltaHP = -HP; + EmitSignal(SignalName.OnHPChanged, context); HP = 0; KillByDamage(); } else { + context.deltaHP = -amount; HP -= amount; - EmitSignal(SignalName.OnHPChanged, -amount, origin); + EmitSignal(SignalName.OnHPChanged, context); } } public virtual void Heal(float amount, Node origin) { + var context = new EntitySignalContext() + { + target = this, + source = (Entity)origin, + actionAmount = amount + }; if (HP + amount > MaxHP) { - EmitSignal(SignalName.OnHPChanged, MaxHP - HP, origin); + context.deltaHP = MaxHP - HP; + EmitSignal(SignalName.OnHPChanged, context); HP = MaxHP; } else { + context.deltaHP = amount; HP += amount; - EmitSignal(SignalName.OnHPChanged, amount, origin); + EmitSignal(SignalName.OnHPChanged, context); } } diff --git a/scripts/entities/EntityHPObserver.cs b/scripts/entities/EntityHPObserver.cs index 9bc8418..1427694 100644 --- a/scripts/entities/EntityHPObserver.cs +++ b/scripts/entities/EntityHPObserver.cs @@ -14,7 +14,7 @@ public partial class EntityHPObserver : Node _observedEntity.OnHPChanged += OnHPChanged; } - private void OnHPChanged(float delta, Node origin) + private void OnHPChanged(EntitySignalContext context) { if (_setGreater == false && _observedEntity.HP / _observedEntity.MaxHP <= _threshold) { diff --git a/scripts/entities/EntitySignalContext.cs b/scripts/entities/EntitySignalContext.cs new file mode 100644 index 0000000..a938f09 --- /dev/null +++ b/scripts/entities/EntitySignalContext.cs @@ -0,0 +1,11 @@ +using Godot; + +namespace Newlon.Components; + +public partial class EntitySignalContext : RefCounted +{ + public Node source; + public Entity target; + public float actionAmount; + public float deltaHP; +} diff --git a/scripts/entities/EntitySignalContext.cs.uid b/scripts/entities/EntitySignalContext.cs.uid new file mode 100644 index 0000000..b1f3329 --- /dev/null +++ b/scripts/entities/EntitySignalContext.cs.uid @@ -0,0 +1 @@ +uid://cbdvo20dhiadw diff --git a/scripts/entities/FlashComponent.cs b/scripts/entities/FlashComponent.cs index 8334abd..109c479 100644 --- a/scripts/entities/FlashComponent.cs +++ b/scripts/entities/FlashComponent.cs @@ -14,7 +14,7 @@ public partial class FlashComponent : CanvasGroup _shaderMaterial = Material as ShaderMaterial; } - public void DamageFlash(int damage,Node origin) + public void DamageFlash(EntitySignalContext context) { Flash(); } diff --git a/scripts/entities/plants/NerdusReturnAttack.cs b/scripts/entities/plants/NerdusReturnAttack.cs index 10eb55d..7941a49 100644 --- a/scripts/entities/plants/NerdusReturnAttack.cs +++ b/scripts/entities/plants/NerdusReturnAttack.cs @@ -29,10 +29,10 @@ public partial class NerdusReturnAttack : Area2D entities.Remove(entity); } } - private void OnHPChanged(float delta, Node source) + private void OnHPChanged(EntitySignalContext context) { - if (delta >= 0) return; - returnAmount -= delta; + if (context.deltaHP >= 0) return; + returnAmount -= context.deltaHP; triggered = true; } public void ReturnAllDamage() diff --git a/scripts/entities/plants/ReturnEffect.cs b/scripts/entities/plants/ReturnEffect.cs index c481de1..e375645 100644 --- a/scripts/entities/plants/ReturnEffect.cs +++ b/scripts/entities/plants/ReturnEffect.cs @@ -9,10 +9,10 @@ public partial class ReturnEffect : Node [Export] private Effect _effectToReturn; - public void OnDamageRecieved(int delta,Node origin) + public void OnDamageRecieved(EntitySignalContext context) { - if (delta >= 0) return; - if (origin is RuntimeZombieData zombie) + if (context.deltaHP >= 0) return; + if (context.source is RuntimeZombieData zombie) { zombie.GiveEffect(_effectToReturn); } diff --git a/scripts/entities/plants/behaviours/HpBasedBehaviour.cs b/scripts/entities/plants/behaviours/HpBasedBehaviour.cs index c494e6c..c63af58 100644 --- a/scripts/entities/plants/behaviours/HpBasedBehaviour.cs +++ b/scripts/entities/plants/behaviours/HpBasedBehaviour.cs @@ -5,18 +5,11 @@ namespace Newlon.Components.Plants.Behaviours; public partial class HpBasedBehaviour : BaseBehaviour { - private RuntimePlantData _data; [Export] private Array parameters; - public override void _Ready() + public void OnHPChanged(EntitySignalContext context) { - base._Ready(); - _data = GetParent(); - } - - public void OnHPChanged(float amount, Node origin) - { - var calc = _data.HP / _data.MaxHP; + var calc = context.target.HP / context.target.MaxHP; foreach (var par in parameters) { _tree.Set(par, calc); diff --git a/scripts/entities/zombies/RuntimeZombieData.cs b/scripts/entities/zombies/RuntimeZombieData.cs index 8466708..ab146f9 100644 --- a/scripts/entities/zombies/RuntimeZombieData.cs +++ b/scripts/entities/zombies/RuntimeZombieData.cs @@ -7,7 +7,7 @@ public partial class RuntimeZombieData : Entity [Export] private Armor _armor; [Signal] public delegate void HasBeenKilledEventHandler(RuntimeZombieData who); - [Signal] public delegate void HPChangedMixedEventHandler(float delta); + [Signal] public delegate void HPChangedMixedEventHandler(EntitySignalContext context); public bool AbleToEat = true; public override void _Ready() @@ -20,6 +20,14 @@ public partial class RuntimeZombieData : Entity public override void Heal(float amount, Node origin) { + var context = new EntitySignalContext() + { + source = (Entity)origin, + target = this, + actionAmount = amount, + deltaHP = Mathf.Clamp(HP+amount,0,MaxHP-amount) + }; + if (_armor != null) { HP += _armor.Heal(amount); @@ -42,33 +50,54 @@ public partial class RuntimeZombieData : Entity } EmitSignal(SignalName.OnDamaged); + var context = new EntitySignalContext() + { + source = origin, + target = this, + actionAmount = amount + }; if (HP - damage <= 0) { var delta = -HP; HP = 0; - EmitSignal(SignalName.OnHPChanged, delta, origin); + EmitSignal(SignalName.OnHPChanged, context); + context.deltaHP = delta; KillByDamage(); } else { HP -= damage; - EmitSignal(SignalName.OnHPChanged, -damage, origin); + context.deltaHP = -damage; + EmitSignal(SignalName.OnHPChanged, context); } } - public void HPChangedMixedInvokerSource(float delta, Node source) + public void HPChangedMixedInvokerSource(EntitySignalContext context) { - EmitSignal(SignalName.HPChangedMixed, delta); + EmitSignal(SignalName.HPChangedMixed, context); } public void HPChangedMixedInvoker(float delta) { - EmitSignal(SignalName.HPChangedMixed, -delta); + + EmitSignal(SignalName.HPChangedMixed, new EntitySignalContext() + { + deltaHP = -delta, + source = null, + target = this, + actionAmount = delta + }); } - public float GetMaxHPMixed() + public float GetMaxHPMixed() { if (_armor != null) return MaxHP + _armor.MaxHP; return MaxHP; } + public float GetHPMixed() + { + if (_armor != null) + return HP + _armor._hp; + return HP; + } #region Death sequence private bool _killed = false; public override void KillByDamage() diff --git a/scripts/level/LevelRunner.cs b/scripts/level/LevelRunner.cs index aa3cfcb..b23c5fc 100644 --- a/scripts/level/LevelRunner.cs +++ b/scripts/level/LevelRunner.cs @@ -83,9 +83,16 @@ public partial class LevelRunner : Node waveTimer.WaitTime = resource.waves[waveIndex].customWaveDelay > 0 ? resource.waves[waveIndex].customWaveDelay : resource.standardWaveDelay; waveTimer.Start(); } - private void OnHPChanged(float delta) + private void OnHPChanged(EntitySignalContext context) { - waveHealth += delta; + waveHealth = 0; + foreach (var zombie in zombies) + { + if (zombie != null) + { + waveHealth += zombie.GetHPMixed(); + } + } if (waveIndex == resource.waves.Count - 1) return;