using Content.Server.Physics.Components;
using Content.Server.Singularity.Components;
using Content.Shared.Anomaly.Components;
using Content.Shared.Anomaly.Effects;
using Content.Shared.Anomaly.Effects.Components;
using Content.Shared.Radiation.Components;
namespace Content.Server.Anomaly.Effects;
///
/// This handles logic and events relating to and
///
public sealed class GravityAnomalySystem : SharedGravityAnomalySystem
{
///
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnSeverityChanged);
SubscribeLocalEvent(OnStabilityChanged);
}
private void OnSeverityChanged(Entity anomaly, ref AnomalySeverityChangedEvent args)
{
if (TryComp(anomaly, out var radSource))
radSource.Intensity = anomaly.Comp.MaxRadiationIntensity * args.Severity;
if (TryComp(anomaly, out var gravityWell))
{
var accel = MathHelper.Lerp(anomaly.Comp.MinAccel, anomaly.Comp.MaxAccel, args.Severity);
gravityWell.BaseRadialAcceleration = accel;
var radialAccel = MathHelper.Lerp(anomaly.Comp.MinRadialAccel, anomaly.Comp.MaxRadialAccel, args.Severity);
gravityWell.BaseTangentialAcceleration = radialAccel;
}
if (TryComp(anomaly, out var randomWalk))
{
var speed = MathHelper.Lerp(anomaly.Comp.MinSpeed, anomaly.Comp.MaxSpeed, args.Severity);
randomWalk.MinSpeed = speed - anomaly.Comp.SpeedVariation;
randomWalk.MaxSpeed = speed + anomaly.Comp.SpeedVariation;
}
}
private void OnStabilityChanged(Entity anomaly, ref AnomalyStabilityChangedEvent args)
{
if (TryComp(anomaly, out var gravityWell))
gravityWell.MaxRange = anomaly.Comp.MaxGravityWellRange * args.Stability;
}
}