move upgrades to tank, serialize objects directly

This commit is contained in:
Vinzenz Schroeter 2024-05-08 00:29:33 +02:00
parent b1df817ece
commit 827b3a9330
16 changed files with 135 additions and 180 deletions

View file

@ -2,19 +2,27 @@ using System.Diagnostics;
namespace TanksServer.GameLogic;
internal sealed class CollectPowerUp(
MapEntityManager entityManager
) : ITickStep
internal sealed class CollectPowerUp : ITickStep
{
private readonly Predicate<PowerUp> _collectPredicate = b => TryCollect(b, entityManager.Tanks);
private readonly Predicate<PowerUp> _collectPredicate;
private readonly GameRules _rules;
private readonly MapEntityManager _entityManager;
public CollectPowerUp(MapEntityManager entityManager,
IOptions<GameRules> options)
{
_entityManager = entityManager;
_rules = options.Value;
_collectPredicate = b => TryCollect(b, entityManager.Tanks);
}
public ValueTask TickAsync(TimeSpan delta)
{
entityManager.RemoveWhere(_collectPredicate);
_entityManager.RemoveWhere(_collectPredicate);
return ValueTask.CompletedTask;
}
private static bool TryCollect(PowerUp powerUp, IEnumerable<Tank> tanks)
private bool TryCollect(PowerUp powerUp, IEnumerable<Tank> tanks)
{
var position = powerUp.Position;
foreach (var tank in tanks)
@ -34,32 +42,38 @@ internal sealed class CollectPowerUp(
return false;
}
private static void ApplyPowerUpEffect(PowerUp powerUp, Tank tank)
private void ApplyPowerUpEffect(PowerUp powerUp, Tank tank)
{
switch (powerUp.Type)
{
case PowerUpType.MagazineType:
if (powerUp.MagazineType == null)
throw new UnreachableException();
tank.Magazine = tank.Magazine with
{
Type = tank.Magazine.Type | powerUp.MagazineType.Value,
UsedBullets = 0
};
if (tank.ReloadingUntil >= DateTime.Now)
tank.ReloadingUntil = DateTime.Now;
break;
case PowerUpType.MagazineSize:
tank.Magazine = tank.Magazine with
tank.MaxBullets = (byte)int.Clamp(tank.MaxBullets + 1, 1, 32);
break;
case PowerUpType.BulletAcceleration:
tank.BulletStats = tank.BulletStats with
{
MaxBullets = (byte)int.Clamp(tank.Magazine.MaxBullets + 1, 1, 32)
Acceleration = tank.BulletStats.Acceleration * _rules.BulletAccelerationUpgradeStrength
};
break;
case PowerUpType.ExplosiveBullets:
tank.BulletStats = tank.BulletStats with { Explosive = true };
break;
case PowerUpType.SmartBullets:
tank.BulletStats = tank.BulletStats with { Smart = true };
break;
case PowerUpType.BulletSpeed:
tank.BulletStats = tank.BulletStats with
{
Speed = tank.BulletStats.Speed * _rules.BulletSpeedUpgradeStrength
};
break;
default:
throw new UnreachableException();
throw new NotImplementedException($"unknown type {powerUp.Type}");
}
}
}