50% rule
This commit is contained in:
parent
f2e4768b7e
commit
f0be16c9f2
11 changed files with 214 additions and 142 deletions
|
|
@ -1,4 +1,6 @@
|
|||
using Godot;
|
||||
using Newlon.Components.Zombies;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Newlon.Components.Level;
|
||||
|
||||
|
|
@ -8,6 +10,9 @@ public partial class LevelRunner : Node
|
|||
private AdventureLevelResource resource;
|
||||
private int waveIndex = -1;
|
||||
private bool hugeWaveApproaching = false;
|
||||
public float waveHealth = 0;
|
||||
public float waveHealthMax = 0;
|
||||
public List<RuntimeZombieData> zombies = [];
|
||||
[Export] private RowSpawner rowSpawner;
|
||||
[Export] private Timer waveTimer;
|
||||
[Export] private float approachNotificationTime;
|
||||
|
|
@ -30,7 +35,7 @@ public partial class LevelRunner : Node
|
|||
hugeWaveApproaching = true;
|
||||
EmitSignal(SignalName.HugeWaveApproachingCallback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SetLevelResource(AdventureLevelResource data)
|
||||
|
|
@ -50,6 +55,8 @@ public partial class LevelRunner : Node
|
|||
if (resource.waves[waveIndex].isHugeWave) EmitSignal(SignalName.HugeWaveInitiated, waveIndex);
|
||||
rowSpawner.Add(resource.waves[waveIndex].zombiesOrdered);
|
||||
|
||||
ClearZombies();
|
||||
|
||||
if (waveIndex == resource.waves.Count - 1)
|
||||
{
|
||||
EmitSignal(SignalName.FinalWaveInitiated);
|
||||
|
|
@ -59,4 +66,42 @@ 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)
|
||||
{
|
||||
if (waveIndex == resource.waves.Count - 1) return;
|
||||
|
||||
waveHealth += delta;
|
||||
if (waveHealth / waveHealthMax <= resource.wavePercentage)
|
||||
{
|
||||
if (resource.waves[waveIndex + 1].isHugeWave && waveTimer.TimeLeft > 6)
|
||||
{
|
||||
waveTimer.WaitTime = 6;
|
||||
waveTimer.Start();
|
||||
ClearZombies();
|
||||
}
|
||||
else
|
||||
{
|
||||
waveTimer.Stop();
|
||||
SummonWave();
|
||||
}
|
||||
}
|
||||
}
|
||||
public void ClearZombies()
|
||||
{
|
||||
foreach (var zom in zombies)
|
||||
{
|
||||
if (zom != null)
|
||||
{
|
||||
zom.HPChangedMixed -= OnHPChanged;
|
||||
}
|
||||
}
|
||||
|
||||
zombies.Clear();
|
||||
}
|
||||
public void AddZombie(RuntimeZombieData zombie)
|
||||
{
|
||||
zombies.Add(zombie);
|
||||
waveHealthMax += zombie.MaxHP;
|
||||
zombie.HPChangedMixed += OnHPChanged;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,11 +10,12 @@ public partial class RowSpawner : Node2D
|
|||
{
|
||||
private Queue<RowSpawn> queue = [];
|
||||
[Export] private Timer delayTimer;
|
||||
[Export] private LevelRunner runner;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
{
|
||||
delayTimer.Timeout += FormSquad;
|
||||
}
|
||||
}
|
||||
|
||||
private void FormSquad()
|
||||
{
|
||||
|
|
@ -37,6 +38,7 @@ public partial class RowSpawner : Node2D
|
|||
PoolContainer.Instance.Zombies.AddChild(zombie);
|
||||
|
||||
zombie.GlobalPosition = new Vector2(GlobalPosition.X, Utility.LeftFieldBoundary.Y + lane * Utility.TileHeight);
|
||||
runner.AddZombie(zombie);
|
||||
}
|
||||
|
||||
public void Add(Array<RowSpawn> rowSpawns)
|
||||
|
|
|
|||
|
|
@ -7,13 +7,14 @@ public partial class RuntimeZombieData : Entity
|
|||
[Export]
|
||||
private Armor _armor;
|
||||
[Signal] public delegate void HasBeenKilledEventHandler(RuntimeZombieData who);
|
||||
[Signal] public delegate void HPChangedMixedEventHandler(float delta);
|
||||
public bool AbleToEat = true;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
|
||||
|
||||
OnHPChanged += HPChangedMixedInvokerSource;
|
||||
LocalTimescale += (float)GD.RandRange(-0.05, 0.05);
|
||||
}
|
||||
|
||||
|
|
@ -48,6 +49,14 @@ public partial class RuntimeZombieData : Entity
|
|||
KillByDamage();
|
||||
}
|
||||
}
|
||||
public void HPChangedMixedInvokerSource(float delta, Node source)
|
||||
{
|
||||
EmitSignal(SignalName.HPChangedMixed, delta);
|
||||
}
|
||||
public void HPChangedMixedInvoker(float delta)
|
||||
{
|
||||
EmitSignal(SignalName.HPChangedMixed, delta);
|
||||
}
|
||||
#region Death sequence
|
||||
private bool _killed = false;
|
||||
public override void KillByDamage()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue