Borg laws announcement (second attempt) (#19474)

This commit is contained in:
chromiumboy
2023-08-24 21:56:01 -05:00
committed by GitHub
parent c73a90e16c
commit 26caf16152
8 changed files with 98 additions and 19 deletions

View File

@@ -1,4 +1,4 @@
<Control xmlns="https://spacestation14.io" <Control xmlns="https://spacestation14.io"
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls" xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
Margin="0 0 0 10"> Margin="0 0 0 10">
@@ -13,6 +13,11 @@
<Label Name="LawNumberLabel" StyleClasses="StatusFieldTitle"/> <Label Name="LawNumberLabel" StyleClasses="StatusFieldTitle"/>
<customControls:HSeparator Margin="0 5 0 5"/> <customControls:HSeparator Margin="0 5 0 5"/>
<RichTextLabel Name="LawLabel"/> <RichTextLabel Name="LawLabel"/>
<BoxContainer Name="LawAnnouncementButtons" Orientation="Horizontal" HorizontalExpand="True" Margin="0 5 0 0">
<Label Text="{Loc laws-ui-state-law}" StyleClasses="StatusFieldTitle"/>
<Control Margin="5 0 0 0" />
<!-- Buttons are added via C# code-->
</BoxContainer>
</BoxContainer> </BoxContainer>
</PanelContainer> </PanelContainer>
</Control> </Control>

View File

@@ -1,21 +1,86 @@
using Content.Client.Chat.Managers;
using Content.Shared.Chat;
using Content.Shared.Radio;
using Content.Shared.Silicons.Laws; using Content.Shared.Silicons.Laws;
using Content.Shared.Speech;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client.Silicons.Laws.Ui; namespace Content.Client.Silicons.Laws.Ui;
[GenerateTypedNameReferences] [GenerateTypedNameReferences]
public sealed partial class LawDisplay : Control public sealed partial class LawDisplay : Control
{ {
public LawDisplay(SiliconLaw prototype) [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IChatManager _chatManager = default!;
[Dependency] private readonly EntityManager _entityManager = default!;
public event Action<BaseButton.ButtonEventArgs>? OnLawAnnouncementButtonPressed;
public LawDisplay(EntityUid uid, SiliconLaw law, HashSet<string>? radioChannels)
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
var identifier = prototype.LawIdentifierOverride ?? $"{prototype.Order}"; var identifier = law.LawIdentifierOverride ?? $"{law.Order}";
var lawIdentifier = Loc.GetString("laws-ui-law-header", ("id", identifier));
var lawDescription = Loc.GetString(law.LawString);
LawNumberLabel.Text = Loc.GetString("laws-ui-law-header", ("id", identifier)); LawNumberLabel.Text = lawIdentifier;
LawLabel.SetMessage(Loc.GetString(prototype.LawString)); LawLabel.SetMessage(lawDescription);
// If you can't talk, you can't state your laws...
if (!_entityManager.TryGetComponent<SpeechComponent>(uid, out var speech) || speech.SpeechSounds is null)
return;
var localButton = new Button
{
Text = Loc.GetString("hud-chatbox-select-channel-Local"),
Modulate = Color.DarkGray,
StyleClasses = { "chatSelectorOptionButton" },
MinHeight = 35,
MinWidth = 75,
};
localButton.OnPressed += _ =>
{
_chatManager.SendMessage($"{lawIdentifier}: {lawDescription}", ChatSelectChannel.Local);
};
LawAnnouncementButtons.AddChild(localButton);
if (radioChannels == null)
return;
foreach (var radioChannel in radioChannels)
{
if (!_prototypeManager.TryIndex<RadioChannelPrototype>(radioChannel, out var radioChannelProto))
continue;
var radioChannelButton = new Button
{
Text = Loc.GetString(radioChannelProto.Name),
Modulate = radioChannelProto.Color,
StyleClasses = { "chatSelectorOptionButton" },
MinHeight = 35,
MinWidth = 75,
};
radioChannelButton.OnPressed += _ =>
{
switch (radioChannel)
{
case SharedChatSystem.CommonChannel:
_chatManager.SendMessage($"{SharedChatSystem.RadioCommonPrefix} {lawIdentifier}: {lawDescription}", ChatSelectChannel.Radio); break;
default:
_chatManager.SendMessage($"{SharedChatSystem.RadioChannelPrefix}{radioChannelProto.KeyCode} {lawIdentifier}: {lawDescription}", ChatSelectChannel.Radio); break;
}
};
LawAnnouncementButtons.AddChild(radioChannelButton);
}
} }
} }

View File

@@ -9,10 +9,11 @@ public sealed class SiliconLawBoundUserInterface : BoundUserInterface
{ {
[ViewVariables] [ViewVariables]
private SiliconLawMenu? _menu; private SiliconLawMenu? _menu;
private EntityUid _owner;
public SiliconLawBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) public SiliconLawBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{ {
_owner = owner;
} }
protected override void Open() protected override void Open()
@@ -40,6 +41,6 @@ public sealed class SiliconLawBoundUserInterface : BoundUserInterface
if (state is not SiliconLawBuiState msg) if (state is not SiliconLawBuiState msg)
return; return;
_menu?.Update(msg); _menu?.Update(_owner, msg);
} }
} }

View File

@@ -1,9 +1,9 @@
<controls:FancyWindow xmlns="https://spacestation14.io" <controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
Title="{Loc 'laws-ui-menu-title'}" Title="{Loc 'laws-ui-menu-title'}"
MinSize="200 100" MinSize="200 100"
SetSize="450 385"> SetSize="450 515">
<BoxContainer Orientation="Vertical" <BoxContainer Orientation="Vertical"
HorizontalExpand="True" HorizontalExpand="True"
VerticalExpand="True"> VerticalExpand="True">

View File

@@ -14,16 +14,16 @@ public sealed partial class SiliconLawMenu : FancyWindow
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
} }
public void Update(SiliconLawBuiState state) public void Update(EntityUid uid, SiliconLawBuiState state)
{ {
state.Laws.Sort(); state.Laws.Sort();
LawDisplayContainer.Children.Clear(); LawDisplayContainer.Children.Clear();
foreach (var law in state.Laws) foreach (var law in state.Laws)
{ {
var control = new LawDisplay(law); var control = new LawDisplay(uid, law, state.RadioChannels);
LawDisplayContainer.AddChild(control); LawDisplayContainer.AddChild(control);
} }
} }
} }

View File

@@ -1,9 +1,10 @@
using System.Linq; using System.Linq;
using Content.Server.Administration; using Content.Server.Administration;
using Content.Server.Chat.Managers; using Content.Server.Chat.Managers;
using Content.Server.GameTicking; using Content.Server.GameTicking;
using Content.Server.Mind; using Content.Server.Mind;
using Content.Server.Mind.Components; using Content.Server.Mind.Components;
using Content.Server.Radio.Components;
using Content.Server.Roles; using Content.Server.Roles;
using Content.Server.Station.Systems; using Content.Server.Station.Systems;
using Content.Shared.Actions; using Content.Shared.Actions;
@@ -35,6 +36,7 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
[Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly UserInterfaceSystem _userInterface = default!; [Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
/// <inheritdoc/> /// <inheritdoc/>
public override void Initialize() public override void Initialize()
@@ -58,7 +60,7 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
private void OnComponentStartup(EntityUid uid, SiliconLawBoundComponent component, ComponentStartup args) private void OnComponentStartup(EntityUid uid, SiliconLawBoundComponent component, ComponentStartup args)
{ {
component.ProvidedAction = new (_prototype.Index<InstantActionPrototype>(component.ViewLawsAction)); component.ProvidedAction = new(_prototype.Index<InstantActionPrototype>(component.ViewLawsAction));
_actions.AddAction(uid, component.ProvidedAction, null); _actions.AddAction(uid, component.ProvidedAction, null);
} }
@@ -95,7 +97,10 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
private void OnBoundUIOpened(EntityUid uid, SiliconLawBoundComponent component, BoundUIOpenedEvent args) private void OnBoundUIOpened(EntityUid uid, SiliconLawBoundComponent component, BoundUIOpenedEvent args)
{ {
var state = new SiliconLawBuiState(GetLaws(uid)); _entityManager.TryGetComponent<IntrinsicRadioTransmitterComponent>(uid, out var intrinsicRadio);
HashSet<string>? radioChannels = intrinsicRadio?.Channels;
var state = new SiliconLawBuiState(GetLaws(uid), radioChannels);
_userInterface.TrySetUiState(args.Entity, SiliconLawsUiKey.Key, state, (IPlayerSession) args.Session); _userInterface.TrySetUiState(args.Entity, SiliconLawsUiKey.Key, state, (IPlayerSession) args.Session);
} }

View File

@@ -1,4 +1,4 @@
using Content.Shared.Actions; using Content.Shared.Actions;
using Content.Shared.Actions.ActionTypes; using Content.Shared.Actions.ActionTypes;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
@@ -63,9 +63,11 @@ public enum SiliconLawsUiKey : byte
public sealed class SiliconLawBuiState : BoundUserInterfaceState public sealed class SiliconLawBuiState : BoundUserInterfaceState
{ {
public List<SiliconLaw> Laws; public List<SiliconLaw> Laws;
public HashSet<string>? RadioChannels;
public SiliconLawBuiState(List<SiliconLaw> laws) public SiliconLawBuiState(List<SiliconLaw> laws, HashSet<string>? radioChannels)
{ {
Laws = laws; Laws = laws;
RadioChannels = radioChannels;
} }
} }

View File

@@ -26,8 +26,9 @@ law-emag-require-panel = The panel must be open to use the EMAG.
laws-ui-menu-title = Laws laws-ui-menu-title = Laws
laws-ui-law-header = Law {$id} laws-ui-law-header = Law {$id}
laws-ui-state-law = State law:
laws-notify = You are bound to silicon laws, which you can view via the sidebar action. You are required to always follow your laws. laws-notify = You are bound to silicon laws, which you can view via the sidebar action. You are required to always follow your laws.
laws-update-notify = Your laws have been updated. You can view the changes via the sidebar action. laws-update-notify = Your laws have been updated. You can view the changes via the sidebar action.
laws-compromised-examine = The [color=red]law-governing[/color] internals seem damaged... laws-compromised-examine = The [color=red]law-governing[/color] internals seem damaged...