servicepoint-tanks/TanksServer/TickSteps/SpawnNewTanks.cs

45 lines
1.2 KiB
C#
Raw Normal View History

2024-04-07 20:16:22 +02:00
using TanksServer.Models;
using TanksServer.Services;
2024-04-07 13:02:49 +02:00
2024-04-07 19:52:16 +02:00
namespace TanksServer.TickSteps;
2024-04-07 13:02:49 +02:00
2024-04-07 20:16:22 +02:00
internal sealed class SpawnNewTanks(TankManager tanks, MapService map, SpawnQueueProvider queueProvider) : ITickStep
2024-04-07 13:02:49 +02:00
{
public Task TickAsync()
{
2024-04-07 20:16:22 +02:00
while (queueProvider.Queue.TryDequeue(out var player))
2024-04-07 13:02:49 +02:00
{
var tank = new Tank(player, ChooseSpawnPosition())
{
Rotation = Random.Shared.Next(0, 16)
};
tanks.Add(tank);
}
return Task.CompletedTask;
}
2024-04-07 17:17:11 +02:00
private FloatPosition ChooseSpawnPosition()
2024-04-07 13:02:49 +02:00
{
List<TilePosition> candidates = new();
for (var x = 0; x < MapService.TilesPerRow; x++)
for (var y = 0; y < MapService.TilesPerColumn; y++)
{
var tile = new TilePosition(x, y);
if (map.IsCurrentlyWall(tile))
continue;
2024-04-07 17:17:11 +02:00
// TODO: check tanks and bullets
2024-04-07 13:02:49 +02:00
candidates.Add(tile);
}
var chosenTile = candidates[Random.Shared.Next(candidates.Count)];
2024-04-07 17:17:11 +02:00
return new FloatPosition(
2024-04-07 13:02:49 +02:00
chosenTile.X * MapService.TileSize,
chosenTile.Y * MapService.TileSize
);
}
}