Win and loose conditions

This commit is contained in:
Rendo 2025-07-20 04:23:22 +05:00
commit b551c7f012
15 changed files with 193 additions and 122 deletions

View file

@ -24,16 +24,23 @@ public partial class Armor : Node
{
if(_lost)
return damage;
float returnAmount = 0;
_hp -= damage;
if(_hp <= 0)
{
returnAmount = -_hp;
_hp = 0;
EmitSignal(SignalName.ArmorLost);
_lost = true;
}
EmitSignal(SignalName.ArmorDamaged,_hp);
float returnAmount = damage - _hp;
if (returnAmount < 0)
returnAmount = 0;
if (_hp - damage <= 0)
{
var delta = _hp;
_hp = 0;
EmitSignal(SignalName.ArmorDamaged, delta);
EmitSignal(SignalName.ArmorLost);
_lost = true;
}
else
{
_hp -= damage;
EmitSignal(SignalName.ArmorDamaged, damage);
}
return returnAmount;
}

View file

@ -11,12 +11,12 @@ public partial class DegradingSprite : Sprite2D
public override void _Ready()
{
armor.ArmorDamaged += OnZombieHPChanged;
armor.ArmorDamaged += OnArmorHPChanged;
}
private void OnZombieHPChanged(float hp)
private void OnArmorHPChanged(float hp)
{
float percent = hp / armor.MaxHP;
float percent = armor._hp / armor.MaxHP;
for (int i = 0; i < degradationStages.Count; i++)
{
if (percent <= thresholdPercentage[i])

View file

@ -15,20 +15,32 @@ public partial class Entity : Node2D
public virtual void TakeDamage(float amount, Node origin)
{
HP -= amount;
EmitSignal(SignalName.OnHPChanged, -amount, origin);
EmitSignal(SignalName.OnDamaged);
if (HP <= 0)
if (HP - amount <= 0)
{
EmitSignal(SignalName.OnHPChanged, -HP, origin);
HP = 0;
KillByDamage();
}
else
{
HP -= amount;
EmitSignal(SignalName.OnHPChanged, -amount, origin);
}
}
public virtual void Heal(float amount, Node origin)
{
EmitSignal(SignalName.OnHPChanged, amount, origin);
HP += amount;
if (HP > MaxHP) HP = MaxHP;
if (HP + amount > MaxHP)
{
EmitSignal(SignalName.OnHPChanged, MaxHP - HP, origin);
HP = MaxHP;
}
else
{
HP += amount;
EmitSignal(SignalName.OnHPChanged, amount, origin);
}
}
public virtual void KillByDamage()

View file

@ -16,13 +16,13 @@ public partial class EntityHPObserver : Node
private void OnHPChanged(float delta, Node origin)
{
if (_setGreater == false && _observedEntity.HP / _observedEntity.MaxHP < _threshold)
if (_setGreater == false && _observedEntity.HP / _observedEntity.MaxHP <= _threshold)
{
EmitSignal(SignalName.ThresholdReached);
_observedEntity.OnHPChanged -= OnHPChanged;
QueueFree();
}
else if (_setGreater && _observedEntity.HP / _observedEntity.MaxHP > _threshold)
else if (_setGreater && _observedEntity.HP / _observedEntity.MaxHP >= _threshold)
{
EmitSignal(SignalName.ThresholdReached);
_observedEntity.OnHPChanged -= OnHPChanged;

View file

@ -35,18 +35,24 @@ public partial class RuntimeZombieData : Entity
}
public override void TakeDamage(float amount, Node origin)
{
var damage = amount;
if (_armor != null)
{
HP -= _armor.RecieveDamage(amount);
damage = _armor.RecieveDamage(amount);
}
EmitSignal(SignalName.OnDamaged);
if (HP - damage <= 0)
{
var delta = -HP;
HP = 0;
EmitSignal(SignalName.OnHPChanged, delta, origin);
KillByDamage();
}
else
HP -= amount;
EmitSignal(SignalName.OnHPChanged, -amount, origin);
EmitSignal(SignalName.OnDamaged);
if (HP <= 0)
{
KillByDamage();
HP -= damage;
EmitSignal(SignalName.OnHPChanged, -damage, origin);
}
}
public void HPChangedMixedInvokerSource(float delta, Node source)

View file

@ -2,7 +2,7 @@ extends Node
func _on_play_button_pressed() -> void:
LevelController.call("StartLevel",preload("uid://dd3yegl1xo44m"),preload("uid://ctbue7dex4umy"))
LevelController.call("StartLevel",preload("uid://dd3yegl1xo44m"),preload("uid://ds2js2vylygvy"))
$ChannelPlayer.call("Play")

View file

@ -1,3 +1,4 @@
using Godot;
using Newlon.Components.Level;
namespace Newlon.Components.GUI.Seedpackets;
@ -16,7 +17,7 @@ public class HotbarHandler : SeedpacketHandler, ISeedpacketPress, ISeedpacketPro
public void Process()
{
_owner.disablePacket = RuntimeLevelData.Instance.SunCount < _owner.GetResource().Cost;
_owner.disablePacket = RuntimeLevelData.Instance.SunCount < _owner.GetResource().Cost || RuntimeLevelData.Instance.GetLevelState() != RuntimeLevelData.LevelStates.Game;
}
public void OnUnfocused()
{

View file

@ -22,6 +22,7 @@ public partial class LevelRunner : Node
[Signal] public delegate void HugeWaveInitiatedEventHandler(int waveNumber);
[Signal] public delegate void FinalWaveInitiatedEventHandler();
public override void _Ready()
{
waveTimer.Timeout += SummonWave;
@ -51,6 +52,7 @@ public partial class LevelRunner : Node
private void SummonWave()
{
waveIndex += 1;
hugeWaveApproaching = false;
EmitSignal(SignalName.WaveChanged, waveIndex);
if (resource.waves[waveIndex].isHugeWave) EmitSignal(SignalName.HugeWaveInitiated, waveIndex);
@ -69,9 +71,10 @@ public partial class LevelRunner : Node
}
private void OnHPChanged(float delta)
{
if (waveIndex == resource.waves.Count - 1) return;
waveHealth += delta;
if (waveIndex == resource.waves.Count - 1) return;
if (waveHealth / waveHealthMax <= resource.wavePercentage)
{
if (resource.waves[waveIndex + 1].isHugeWave && waveTimer.TimeLeft > 6)
@ -107,5 +110,18 @@ public partial class LevelRunner : Node
waveHealthMax += zombie.GetMaxHPMixed();
waveHealth = waveHealthMax;
zombie.HPChangedMixed += OnHPChanged;
if (waveIndex == resource.waves.Count - 1)
{
zombie.HasBeenKilled += (who) =>
{
if (waveHealth <= 0)
{
RuntimeLevelData.Instance.SetLevelState(RuntimeLevelData.LevelStates.Win);
}
};
}
}
}

View file

@ -18,6 +18,7 @@ public partial class LoseCheckbox : Area2D
if (parent != null && parent is RuntimeZombieData zombieData)
{
if (zombieData.HP <= 0) return;
RuntimeLevelData.Instance.SetLevelState(RuntimeLevelData.LevelStates.Loose);
Engine.TimeScale = 1.0;
fadeAnimation.Play("fade");
GetTree().Paused = true;