78 lines
2.0 KiB
C#
78 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
public class DangersModel : IDisposable
|
|
{
|
|
public List<EnemyShip> AliveShips;
|
|
public List<AbstractProjectile> Projectiles;
|
|
|
|
public event Action<DangersModel> OnUpdate;
|
|
public event Action<AbstractProjectile> OnProjectileSpawned;
|
|
|
|
public DangersModel()
|
|
{
|
|
AliveShips = new List<EnemyShip>();
|
|
Projectiles = new List<AbstractProjectile>();
|
|
|
|
EnemyShip.ShipReleased += ShipReleased;
|
|
EnemyShip.ShipSpawned += ShipSpawned;
|
|
|
|
}
|
|
|
|
public void ShipSpawned(EnemyShip enemyShip)
|
|
{
|
|
if (enemyShip == null) return;
|
|
if (AliveShips.Contains(enemyShip)) return;
|
|
|
|
AliveShips.Add(enemyShip);
|
|
|
|
var weapon = enemyShip.Shooter.weapon;
|
|
if (weapon != null)
|
|
{
|
|
weapon.OnShoot -= ProjectileSpawned;
|
|
weapon.OnShoot += ProjectileSpawned;
|
|
}
|
|
|
|
OnUpdate?.Invoke(this);
|
|
}
|
|
|
|
public void ShipReleased(EnemyShip enemyShip)
|
|
{
|
|
if (AliveShips.Contains(enemyShip))
|
|
{
|
|
var weapon = enemyShip.Shooter.weapon;
|
|
if (weapon != null)
|
|
weapon.OnShoot -= ProjectileSpawned;
|
|
AliveShips.Remove(enemyShip);
|
|
}
|
|
OnUpdate?.Invoke(this);
|
|
}
|
|
|
|
public void ProjectileSpawned(AbstractProjectile projectile)
|
|
{
|
|
Projectiles.Add(projectile);
|
|
OnUpdate?.Invoke(this);
|
|
OnProjectileSpawned?.Invoke(projectile);
|
|
}
|
|
public void ProjectileReleased(AbstractProjectile projectile)
|
|
{
|
|
if (Projectiles.Contains(projectile))
|
|
Projectiles.Remove(projectile);
|
|
OnUpdate?.Invoke(this);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
EnemyShip.ShipReleased -= ShipReleased;
|
|
EnemyShip.ShipSpawned -= ShipSpawned;
|
|
|
|
foreach (var ship in AliveShips)
|
|
{
|
|
if (ship?.Shooter.weapon != null)
|
|
ship.Shooter.weapon.OnShoot -= ProjectileSpawned;
|
|
}
|
|
AliveShips.Clear();
|
|
Projectiles.Clear();
|
|
}
|
|
}
|