This commit is contained in:
Rendo 2025-07-17 01:48:23 +05:00
commit f0be16c9f2
11 changed files with 214 additions and 142 deletions

View file

@ -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;
}
}

View file

@ -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)