Win and loose conditions
This commit is contained in:
parent
804122a3bd
commit
b551c7f012
15 changed files with 193 additions and 122 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue