RoboticsConsoleWindow.xaml.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using Content.Client.Stylesheets;
  2. using Content.Client.UserInterface.Controls;
  3. using Content.Shared.Lock;
  4. using Content.Shared.Robotics;
  5. using Content.Shared.Robotics.Components;
  6. using Robust.Client.AutoGenerated;
  7. using Robust.Client.GameObjects;
  8. using Robust.Client.UserInterface.XAML;
  9. using Robust.Shared.Prototypes;
  10. using Robust.Shared.Timing;
  11. using Robust.Shared.Utility;
  12. namespace Content.Client.Robotics.UI;
  13. [GenerateTypedNameReferences]
  14. public sealed partial class RoboticsConsoleWindow : FancyWindow
  15. {
  16. [Dependency] private readonly IEntityManager _entMan = default!;
  17. [Dependency] private readonly IGameTiming _timing = default!;
  18. private readonly LockSystem _lock;
  19. private readonly SpriteSystem _sprite;
  20. public Action<string>? OnDisablePressed;
  21. public Action<string>? OnDestroyPressed;
  22. private string? _selected;
  23. private Dictionary<string, CyborgControlData> _cyborgs = new();
  24. public EntityUid Entity;
  25. public RoboticsConsoleWindow()
  26. {
  27. RobustXamlLoader.Load(this);
  28. IoCManager.InjectDependencies(this);
  29. _lock = _entMan.System<LockSystem>();
  30. _sprite = _entMan.System<SpriteSystem>();
  31. Cyborgs.OnItemSelected += args =>
  32. {
  33. if (Cyborgs[args.ItemIndex].Metadata is not string address)
  34. return;
  35. _selected = address;
  36. PopulateData();
  37. };
  38. Cyborgs.OnItemDeselected += _ =>
  39. {
  40. _selected = null;
  41. PopulateData();
  42. };
  43. // these won't throw since buttons are only visible if a borg is selected
  44. DisableButton.OnPressed += _ =>
  45. {
  46. OnDisablePressed?.Invoke(_selected!);
  47. };
  48. DestroyButton.OnPressed += _ =>
  49. {
  50. OnDestroyPressed?.Invoke(_selected!);
  51. };
  52. // cant put multiple styles in xaml for some reason
  53. DestroyButton.StyleClasses.Add(StyleBase.ButtonCaution);
  54. }
  55. public void SetEntity(EntityUid uid)
  56. {
  57. Entity = uid;
  58. }
  59. public void UpdateState(RoboticsConsoleState state)
  60. {
  61. _cyborgs = state.Cyborgs;
  62. // clear invalid selection
  63. if (_selected is {} selected && !_cyborgs.ContainsKey(selected))
  64. _selected = null;
  65. var hasCyborgs = _cyborgs.Count > 0;
  66. NoCyborgs.Visible = !hasCyborgs;
  67. CyborgsContainer.Visible = hasCyborgs;
  68. PopulateCyborgs();
  69. PopulateData();
  70. var locked = _lock.IsLocked(Entity);
  71. DangerZone.Visible = !locked;
  72. LockedMessage.Visible = locked;
  73. }
  74. private void PopulateCyborgs()
  75. {
  76. // _selected might get set to null when recreating so copy it first
  77. var selected = _selected;
  78. Cyborgs.Clear();
  79. foreach (var (address, data) in _cyborgs)
  80. {
  81. var item = Cyborgs.AddItem(data.Name, _sprite.Frame0(data.ChassisSprite!), metadata: address);
  82. item.Selected = address == selected;
  83. }
  84. _selected = selected;
  85. }
  86. private void PopulateData()
  87. {
  88. if (_selected is not {} selected)
  89. {
  90. SelectCyborg.Visible = true;
  91. BorgContainer.Visible = false;
  92. return;
  93. }
  94. SelectCyborg.Visible = false;
  95. BorgContainer.Visible = true;
  96. var data = _cyborgs[selected];
  97. var model = data.ChassisName;
  98. BorgSprite.Texture = _sprite.Frame0(data.ChassisSprite!);
  99. var batteryColor = data.Charge switch {
  100. < 0.2f => "red",
  101. < 0.4f => "orange",
  102. < 0.6f => "yellow",
  103. < 0.8f => "green",
  104. _ => "blue"
  105. };
  106. var text = new FormattedMessage();
  107. text.AddMarkupOrThrow($"{Loc.GetString("robotics-console-model", ("name", model))}\n");
  108. text.AddMarkupOrThrow(Loc.GetString("robotics-console-designation"));
  109. text.AddText($" {data.Name}\n"); // prevent players trolling by naming borg [color=red]satan[/color]
  110. text.AddMarkupOrThrow($"{Loc.GetString("robotics-console-battery", ("charge", (int)(data.Charge * 100f)), ("color", batteryColor))}\n");
  111. text.AddMarkupOrThrow($"{Loc.GetString("robotics-console-brain", ("brain", data.HasBrain))}\n");
  112. text.AddMarkupOrThrow(Loc.GetString("robotics-console-modules", ("count", data.ModuleCount)));
  113. BorgInfo.SetMessage(text);
  114. // how the turntables
  115. DisableButton.Disabled = !(data.HasBrain && data.CanDisable);
  116. }
  117. protected override void FrameUpdate(FrameEventArgs args)
  118. {
  119. base.FrameUpdate(args);
  120. if (_entMan.TryGetComponent(Entity, out RoboticsConsoleComponent? console))
  121. {
  122. DestroyButton.Disabled = _timing.CurTime < console.NextDestroy;
  123. }
  124. else
  125. {
  126. DestroyButton.Disabled = true;
  127. }
  128. }
  129. }