Files
tbd-station-14/Content.Client/Nuke/NukeMenu.xaml.cs
Cojoke 00034622c3 Nuke Now Requires the Disk to be Inserted to Toggle Anchor (#29565)
* Nuke Now Requires the Disk to be Inserted to Toggle Anchor

* message stating you need the disk to toggle floor bolts
2024-09-09 13:30:26 -06:00

125 lines
4.6 KiB
C#

using System;
using Content.Shared.Nuke;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Localization;
namespace Content.Client.Nuke
{
[GenerateTypedNameReferences]
public sealed partial class NukeMenu : DefaultWindow
{
public event Action<int>? OnKeypadButtonPressed;
public event Action? OnClearButtonPressed;
public event Action? OnEnterButtonPressed;
public NukeMenu()
{
RobustXamlLoader.Load(this);
FillKeypadGrid();
}
/// <summary>
/// Fill keypad buttons in keypad grid
/// </summary>
private void FillKeypadGrid()
{
// add 3 rows of keypad buttons (1-9)
for (var i = 1; i <= 9; i++)
{
AddKeypadButton(i);
}
// clear button
var clearBtn = new Button()
{
Text = "C"
};
clearBtn.OnPressed += _ => OnClearButtonPressed?.Invoke();
KeypadGrid.AddChild(clearBtn);
// zero button
AddKeypadButton(0);
// enter button
var enterBtn = new Button()
{
Text = "E"
};
enterBtn.OnPressed += _ => OnEnterButtonPressed?.Invoke();
KeypadGrid.AddChild(enterBtn);
}
private void AddKeypadButton(int i)
{
var btn = new Button()
{
Text = i.ToString()
};
btn.OnPressed += _ => OnKeypadButtonPressed?.Invoke(i);
KeypadGrid.AddChild(btn);
}
public void UpdateState(NukeUiState state)
{
string firstMsg, secondMsg;
ArmButton.Text = Loc.GetString("nuke-user-interface-arm-button");
switch (state.Status)
{
case NukeStatus.AWAIT_DISK:
firstMsg = Loc.GetString("nuke-user-interface-first-status-device-locked");
secondMsg = Loc.GetString("nuke-user-interface-second-status-await-disk");
break;
case NukeStatus.AWAIT_CODE:
firstMsg = Loc.GetString("nuke-user-interface-first-status-input-code");
secondMsg = Loc.GetString("nuke-user-interface-second-status-current-code",
("code", VisualizeCode(state.EnteredCodeLength, state.MaxCodeLength)));
break;
case NukeStatus.AWAIT_ARM:
firstMsg = Loc.GetString("nuke-user-interface-first-status-device-ready");
secondMsg = Loc.GetString("nuke-user-interface-second-status-time",
("time", state.RemainingTime));
break;
case NukeStatus.ARMED:
firstMsg = Loc.GetString("nuke-user-interface-first-status-device-armed");
secondMsg = Loc.GetString("nuke-user-interface-second-status-time",
("time", state.RemainingTime));
ArmButton.Text = Loc.GetString("nuke-user-interface-disarm-button");
break;
case NukeStatus.COOLDOWN:
firstMsg = Loc.GetString("nuke-user-interface-first-status-device-cooldown");
secondMsg = Loc.GetString("nuke-user-interface-second-status-cooldown-time",
("time", state.CooldownTime));
break;
default:
// shouldn't normally be here
firstMsg = Loc.GetString("nuke-user-interface-status-error");
secondMsg = Loc.GetString("nuke-user-interface-status-error");
break;
}
FirstStatusLabel.Text = firstMsg;
SecondStatusLabel.Text = secondMsg;
EjectButton.Disabled = !state.DiskInserted || state.Status == NukeStatus.ARMED || !state.IsAnchored;
AnchorButton.Disabled = state.Status == NukeStatus.ARMED;
AnchorButton.Pressed = state.IsAnchored;
ArmButton.Disabled = !state.AllowArm || !state.IsAnchored;
}
private string VisualizeCode(int codeLength, int maxLength)
{
var code = new string('*', codeLength);
var blanksCount = maxLength - codeLength;
var blanks = new string('_', blanksCount);
return code + blanks;
}
}
}