using Content.Server.Anomaly.Components; using Content.Server.Cargo.Systems; using Content.Shared.Anomaly; using Robust.Shared.Timing; namespace Content.Server.Anomaly.Effects; /// /// This component reduces the value of the entity during decay /// public sealed class AnomalyCoreSystem : EntitySystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; public override void Initialize() { SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnGetPrice); } private void OnMapInit(Entity core, ref MapInitEvent args) { core.Comp.DecayMoment = _gameTiming.CurTime + TimeSpan.FromSeconds(core.Comp.TimeToDecay); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var component)) { if (component.IsDecayed) continue; //When time runs out, we completely decompose if (component.DecayMoment < _gameTiming.CurTime) Decay(uid, component); } } private void OnGetPrice(Entity core, ref PriceCalculationEvent args) { var timeLeft = core.Comp.DecayMoment - _gameTiming.CurTime; var lerp = (double) (timeLeft.TotalSeconds / core.Comp.TimeToDecay); lerp = Math.Clamp(lerp, 0, 1); args.Price = MathHelper.Lerp(core.Comp.EndPrice, core.Comp.StartPrice, lerp); } private void Decay(EntityUid uid, AnomalyCoreComponent component) { _appearance.SetData(uid, AnomalyCoreVisuals.Decaying, false); component.IsDecayed = true; } }