using System.Numerics;
using Content.Server._Sunrise.Boss.Components;
using Content.Server.Stunnable;
using Content.Shared._Sunrise.Boss.Components;
using Content.Shared._Sunrise.Boss.Events;
using Content.Shared.Actions;
using Robust.Shared.Map;
namespace Content.Server._Sunrise.Boss.Systems;
public sealed class HellSpawnSpiralSystem : EntitySystem
{
[Dependency] private readonly StunSystem _stun = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[DataField]
public string BulletProto = "BulletSkyFlare";
[DataField]
public TimeSpan TimeOffset = TimeSpan.FromSeconds(0.5);
///
public override void Initialize()
{
SubscribeLocalEvent(OnSpiral);
SubscribeLocalEvent(OnInit);
}
private void OnInit(EntityUid uid, HellSpawnSpiralComponent component, ComponentInit args)
{
_actions.AddAction(uid, ref component.SpiralActionEntity, component.SpiralAction);
}
private async void OnSpiral(EntityUid uid, HellSpawnSpiralComponent component, HellSpawnSpiralActionEvent args)
{
var xform = Transform(uid);
_stun.TryAddStunDuration(uid, TimeSpan.FromSeconds(2));
var vectors = GenerateVectors(component.FireballCount);
foreach (var vector in vectors)
{
SpawnSpiral(xform.Coordinates, vector);
}
args.Handled = true;
}
private List GenerateVectors(int N)
{
var vectors = new List();
var angleStep = 2 * Math.PI / N;
for (var i = 0; i < N; i++)
{
var angle = i * angleStep;
var x = (float)Math.Cos(angle);
var y = (float)Math.Sin(angle);
vectors.Add(new Vector2(x, y));
}
return vectors;
}
public void SpawnSpiral(EntityCoordinates origin, Vector2 offset)
{
var bullet = SpawnAtPosition(BulletProto,
new EntityCoordinates(origin.EntityId, origin.Position));
var spiralComp = EnsureComp(bullet);
spiralComp.TimeOffset = TimeOffset;
spiralComp.Offset = (float)Math.Acos(offset.X);
if (offset.Y < 0)
{
spiralComp.Offset = -spiralComp.Offset;
}
}
}