Files
tbd-station-14/Content.Server/Nuke/NukeCodeSystem.cs
Alex Evgrashin df970b2283 Nuke fixes (#6868)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2022-02-23 17:00:51 -07:00

86 lines
2.5 KiB
C#

using Content.Server.Chat.Managers;
using Content.Server.Communications;
using Content.Shared.GameTicking;
using Robust.Shared.Random;
namespace Content.Server.Nuke
{
/// <summary>
/// Nuclear code is generated once per round
/// One code works for all nukes
/// </summary>
public sealed class NukeCodeSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IChatManager _chat = default!;
private const int CodeLength = 6;
public string Code { get; private set; } = default!;
public override void Initialize()
{
base.Initialize();
GenerateNewCode();
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRestart);
}
private void OnRestart(RoundRestartCleanupEvent ev)
{
GenerateNewCode();
}
/// <summary>
/// Checks if code is equal to current bombs code
/// </summary>
public bool IsCodeValid(string code)
{
return code == Code;
}
/// <summary>
/// Generate a new nuclear bomb code. Replacing old one.
/// </summary>
public void GenerateNewCode()
{
var ret = "";
for (var i = 0; i < CodeLength; i++)
{
var c = (char) _random.Next('0', '9' + 1);
ret += c;
}
Code = ret;
}
/// <summary>
/// Send a nuclear code to all communication consoles
/// </summary>
/// <returns>True if at least one console received codes</returns>
public bool SendNukeCodes()
{
// todo: this should probably be handled by fax system
var wasSent = false;
var consoles = EntityManager.EntityQuery<CommunicationsConsoleComponent>();
foreach (var console in consoles)
{
if (!EntityManager.TryGetComponent((console).Owner, out TransformComponent? transform))
continue;
var consolePos = transform.MapPosition;
EntityManager.SpawnEntity("NukeCodePaper", consolePos);
wasSent = true;
}
if (wasSent)
{
var msg = Loc.GetString("nuke-component-announcement-send-codes");
_chat.DispatchStationAnnouncement(msg);
}
return wasSent;
}
}
}