using Robust.Shared.Random; using Content.Server.Chat.Managers; using Content.Server.Disease.Zombie.Components; using Content.Shared.MobState.Components; namespace Content.Server.StationEvents.Events { /// /// Revives several dead entities as zombies /// public sealed class ZombieOutbreak : StationEvent { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; public override string Name => "ZombieOutbreak"; public override int EarliestStart => 50; public override float Weight => WeightLow / 2; public override string? StartAudio => "/Audio/Announcements/bloblarm.ogg"; protected override float EndAfter => 1.0f; public override int? MaxOccurrences => 1; /// /// Finds 1-3 random, dead entities accross the station /// and turns them into zombies. /// public override void Startup() { base.Startup(); List deadList = new(); foreach (var mobState in _entityManager.EntityQuery()) { if (mobState.IsDead() || mobState.IsCritical()) deadList.Add(mobState); } _random.Shuffle(deadList); var toInfect = _random.Next(1, 3); /// Now we give it to people in the list of dead entities earlier. foreach (var target in deadList) { if (toInfect-- == 0) break; _entityManager.EnsureComponent(target.Owner); } _chatManager.DispatchStationAnnouncement(Loc.GetString("station-event-zombie-outbreak-announcement"), playDefaultSound: false, colorOverride: Color.DarkMagenta); } } }