Xenoarch Tweaks (#12429)

* Xenoarch feedback

print out reports, weight node traversal, dialog for destroy menu, slight effect tweaks

* make the popup not bad

* the popup, jimbo...
This commit is contained in:
Nemanja
2022-11-07 16:57:29 -05:00
committed by GitHub
parent 387d1163b4
commit 8ba3d127cc
13 changed files with 199 additions and 11 deletions

View File

@@ -31,6 +31,10 @@ public sealed class AnalysisConsoleBoundUserInterface : BoundUserInterface
{
SendMessage(new AnalysisConsoleScanButtonPressedMessage());
};
_consoleMenu.OnPrintButtonPressed += _ =>
{
SendMessage(new AnalysisConsolePrintButtonPressedMessage());
};
_consoleMenu.OnDestroyButtonPressed += _ =>
{
SendMessage(new AnalysisConsoleDestroyButtonPressedMessage());
@@ -44,8 +48,7 @@ public sealed class AnalysisConsoleBoundUserInterface : BoundUserInterface
switch (state)
{
case AnalysisConsoleScanUpdateState msg:
_consoleMenu?.SetDestroyButtonDisabled(msg);
_consoleMenu?.SetScanButtonDisabled(msg);
_consoleMenu?.SetButtonsDisabled(msg);
_consoleMenu?.UpdateInformationDisplay(msg);
_consoleMenu?.UpdateProgressBar(msg);
break;
@@ -58,6 +61,7 @@ public sealed class AnalysisConsoleBoundUserInterface : BoundUserInterface
if (!disposing)
return;
_consoleMenu?.AnalysisDestroyWindow?.Close();
_consoleMenu?.Dispose();
}
}

View File

@@ -15,6 +15,11 @@
Text="{Loc 'analysis-console-scan-button'}"
ToolTip="{Loc 'analysis-console-scan-tooltip-info'}">
</Button>
<BoxContainer MinHeight="5"></BoxContainer>
<Button Name="PrintButton"
Text="{Loc 'analysis-console-print-button'}"
ToolTip="{Loc 'analysis-console-print-tooltip-info'}">
</Button>
<BoxContainer MinHeight="10"></BoxContainer>
<Button Name="DestroyButton"
Text="{Loc 'analysis-console-destroy-button'}"

View File

@@ -17,8 +17,11 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow
[Dependency] private readonly IEntityManager _ent = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
public AnalysisDestroyWindow? AnalysisDestroyWindow;
public event Action<BaseButton.ButtonEventArgs>? OnServerSelectionButtonPressed;
public event Action<BaseButton.ButtonEventArgs>? OnScanButtonPressed;
public event Action<BaseButton.ButtonEventArgs>? OnPrintButtonPressed;
public event Action<BaseButton.ButtonEventArgs>? OnDestroyButtonPressed;
public AnalysisConsoleMenu()
@@ -28,18 +31,34 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow
ServerSelectionButton.OnPressed += a => OnServerSelectionButtonPressed?.Invoke(a);
ScanButton.OnPressed += a => OnScanButtonPressed?.Invoke(a);
DestroyButton.OnPressed += a => OnDestroyButtonPressed?.Invoke(a);
PrintButton.OnPressed += a => OnPrintButtonPressed?.Invoke(a);
DestroyButton.OnPressed += _ => OnDestroyButton();
}
public void SetScanButtonDisabled(AnalysisConsoleScanUpdateState state)
private void OnDestroyButton()
{
var disabled = !state.CanScan;
// check if window is already open
if (AnalysisDestroyWindow is { IsOpen: true })
{
AnalysisDestroyWindow.MoveToFront();
return;
}
ScanButton.Disabled = disabled;
// open a new one
AnalysisDestroyWindow = new ();
AnalysisDestroyWindow.OpenCentered();
AnalysisDestroyWindow.OnYesButton += a =>
{
OnDestroyButtonPressed?.Invoke(a);
};
}
public void SetDestroyButtonDisabled(AnalysisConsoleScanUpdateState state)
public void SetButtonsDisabled(AnalysisConsoleScanUpdateState state)
{
ScanButton.Disabled = !state.CanScan;
PrintButton.Disabled = !state.CanPrint;
var disabled = !state.ServerConnected || !state.CanScan;
DestroyButton.Disabled = disabled;
@@ -77,6 +96,7 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow
{
message.AddMarkup(Loc.GetString("analysis-console-info-scanner"));
Information.SetMessage(message);
UpdateArtifactIcon(null); //set it to blank
return;
}
@@ -153,5 +173,12 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow
("seconds", (int) state.TotalTime.TotalSeconds - (int) state.TimeRemaining.TotalSeconds));
ProgressBar.Value = (float) state.TimeRemaining.Divide(state.TotalTime);
}
public override void Close()
{
base.Close();
AnalysisDestroyWindow?.Close();
}
}

View File

@@ -0,0 +1,22 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'analysis-destroy-window-title'}"
MinSize="256 100">
<BoxContainer
Margin="10 10"
HorizontalExpand="True"
Orientation="Vertical"
VerticalExpand="True">
<Label Text="{Loc 'analysis-destroy-window-text'}" />
<BoxContainer
Margin="10 10 10 10"
VerticalAlignment="Bottom"
Orientation="Horizontal"
HorizontalExpand="True">
<Button Name="YesButton" Text="{Loc 'analysis-destroy-window-yes'}" HorizontalExpand="True"></Button>
<BoxContainer SetSize="10 10"></BoxContainer>
<Button Name="NoButton" Text="{Loc 'analysis-destroy-window-no'}" HorizontalExpand="True"></Button>
</BoxContainer>
</BoxContainer>
</controls:FancyWindow>

View File

@@ -0,0 +1,26 @@
using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Xenoarchaeology.Ui;
[GenerateTypedNameReferences]
public sealed partial class AnalysisDestroyWindow : FancyWindow
{
public event Action<BaseButton.ButtonEventArgs>? OnYesButton;
public AnalysisDestroyWindow()
{
RobustXamlLoader.Load(this);
YesButton.AddStyleClass(StyleBase.ButtonCaution);
YesButton.OnPressed += a =>
{
OnYesButton?.Invoke(a);
Close();
};
NoButton.OnPressed += _ => Close();
}
}

View File

@@ -1,6 +1,8 @@
using Content.Shared.MachineLinking;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Utility;
namespace Content.Server.Xenoarchaeology.Equipment.Components;
@@ -28,4 +30,10 @@ public sealed class AnalysisConsoleComponent : Component
/// </summary>
[DataField("destroySound")]
public SoundSpecifier DestroySound = new SoundPathSpecifier("/Audio/Effects/radpulse11.ogg");
/// <summary>
/// The entity spawned by a report.
/// </summary>
[DataField("reportEntityId", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string ReportEntityId = "Paper";
}

View File

@@ -51,6 +51,9 @@ public sealed class ArtifactAnalyzerComponent : Component
[ViewVariables]
public HashSet<EntityUid> Contacts = new();
[ViewVariables(VVAccess.ReadWrite)]
public bool ReadyToPrint = false;
[DataField("scanFinishedSound")]
public readonly SoundSpecifier ScanFinishedSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg");

View File

@@ -1,6 +1,7 @@
using System.Linq;
using Content.Server.Construction;
using Content.Server.MachineLinking.Events;
using Content.Server.Paper;
using Content.Server.Power.Components;
using Content.Server.Research;
using Content.Server.Research.Components;
@@ -35,6 +36,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly ArtifactSystem _artifact = default!;
[Dependency] private readonly PaperSystem _paper = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -56,6 +58,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
SubscribeLocalEvent<AnalysisConsoleComponent, AnalysisConsoleServerSelectionMessage>(OnServerSelectionMessage);
SubscribeLocalEvent<AnalysisConsoleComponent, AnalysisConsoleScanButtonPressedMessage>(OnScanButton);
SubscribeLocalEvent<AnalysisConsoleComponent, AnalysisConsolePrintButtonPressedMessage>(OnPrintButton);
SubscribeLocalEvent<AnalysisConsoleComponent, AnalysisConsoleDestroyButtonPressedMessage>(OnDestroyButton);
SubscribeLocalEvent<AnalysisConsoleComponent, ResearchClientServerSelectedMessage>((e,c,_) => UpdateUserInterface(e,c),
@@ -93,6 +96,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
return;
component.LastAnalyzedArtifact = null;
component.ReadyToPrint = false;
UpdateAnalyzerInformation(uid, component);
}
@@ -177,6 +181,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
float? completion = null;
var totalTime = TimeSpan.Zero;
var canScan = false;
var canPrint = false;
if (component.AnalyzerEntity != null && TryComp<ArtifactAnalyzerComponent>(component.AnalyzerEntity, out var analyzer))
{
artifact = analyzer.LastAnalyzedArtifact;
@@ -184,6 +189,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
completion = analyzer.LastAnalyzedCompletion;
totalTime = analyzer.AnalysisDuration * analyzer.AnalysisDurationMulitplier;
canScan = analyzer.Contacts.Any();
canPrint = analyzer.ReadyToPrint;
}
var analyzerConnected = component.AnalyzerEntity != null;
@@ -192,7 +198,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
var scanning = TryComp<ActiveArtifactAnalyzerComponent>(component.AnalyzerEntity, out var active);
var remaining = active != null ? _timing.CurTime - active.StartTime : TimeSpan.Zero;
var state = new AnalysisConsoleScanUpdateState(artifact, analyzerConnected, serverConnected, canScan,
var state = new AnalysisConsoleScanUpdateState(artifact, analyzerConnected, serverConnected, canScan, canPrint,
node?.Id, node?.Depth, node?.Edges.Count, node?.Triggered, node?.Effect.ID, node?.Trigger.ID, completion,
scanning, remaining, totalTime);
@@ -237,6 +243,68 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
activeArtifact.Scanner = component.AnalyzerEntity.Value;
}
private void OnPrintButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsolePrintButtonPressedMessage args)
{
if (component.AnalyzerEntity == null)
return;
if (!TryComp<ArtifactAnalyzerComponent>(component.AnalyzerEntity, out var analyzer) ||
analyzer.LastAnalyzedNode == null ||
analyzer.LastAnalyzedCompletion == null ||
!analyzer.ReadyToPrint)
{
return;
}
analyzer.ReadyToPrint = false;
var n = analyzer.LastAnalyzedNode;
var report = Spawn(component.ReportEntityId, Transform(uid).Coordinates);
MetaData(report).EntityName = Loc.GetString("analysis-report-title", ("id", n.Id));
var msg = new FormattedMessage();
msg.AddMarkup(Loc.GetString("analysis-console-info-id", ("id", n.Id)));
msg.PushNewline();
msg.AddMarkup(Loc.GetString("analysis-console-info-depth", ("depth", n.Depth)));
msg.PushNewline();
var activated = n.Triggered
? "analysis-console-info-triggered-true"
: "analysis-console-info-triggered-false";
msg.AddMarkup(Loc.GetString(activated));
msg.PushNewline();
msg.PushNewline();
var needSecondNewline = false;
if (n.Trigger.TriggerHint != null)
{
msg.AddMarkup(Loc.GetString("analysis-console-info-trigger",
("trigger", Loc.GetString(n.Trigger.TriggerHint))) + "\n");
needSecondNewline = true;
}
if (n.Effect.EffectHint != null)
{
msg.AddMarkup(Loc.GetString("analysis-console-info-effect",
("effect", Loc.GetString(n.Effect.EffectHint))) + "\n");
needSecondNewline = true;
}
if (needSecondNewline)
msg.PushNewline();
msg.AddMarkup(Loc.GetString("analysis-console-info-edges", ("edges", n.Edges.Count)));
msg.PushNewline();
msg.AddMarkup(Loc.GetString("analysis-console-info-completion",
("percentage", Math.Round(analyzer.LastAnalyzedCompletion.Value * 100))));
_popup.PopupEntity(Loc.GetString("analysis-console-print-popup"), uid, Filter.Pvs(uid));
_paper.SetContent(report, msg.ToMarkup());
UpdateUserInterface(uid, component);
}
/// <summary>
/// destroys the artifact and updates the server points
/// </summary>
@@ -333,6 +401,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
if (!Resolve(uid, ref component, ref active))
return;
component.ReadyToPrint = true;
_audio.PlayPvs(component.ScanFinishedSound, uid);
component.LastAnalyzedArtifact = active.Artifact;
UpdateAnalyzerInformation(uid, component);

View File

@@ -158,7 +158,13 @@ public sealed partial class ArtifactSystem : EntitySystem
component.CurrentNode.Triggered = true;
if (component.CurrentNode.Edges.Any())
{
var undiscoveredNodes = component.CurrentNode.Edges.Where(x => !x.Discovered).ToList();
var newNode = _random.Pick(component.CurrentNode.Edges);
if (undiscoveredNodes.Any() && _random.Prob(0.75f))
{
newNode = _random.Pick(undiscoveredNodes);
}
EnterNode(uid, ref newNode, component);
}
}

View File

@@ -18,6 +18,11 @@ public sealed class AnalysisConsoleScanButtonPressedMessage : BoundUserInterface
{
}
[Serializable, NetSerializable]
public sealed class AnalysisConsolePrintButtonPressedMessage : BoundUserInterfaceMessage
{
}
[Serializable, NetSerializable]
public sealed class AnalysisConsoleDestroyButtonPressedMessage : BoundUserInterfaceMessage
{
@@ -34,6 +39,8 @@ public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState
public bool CanScan;
public bool CanPrint;
public int? Id;
public int? Depth;
@@ -54,7 +61,7 @@ public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState
public TimeSpan TotalTime;
public AnalysisConsoleScanUpdateState(EntityUid? artifact, bool analyzerConnected, bool serverConnected, bool canScan,
public AnalysisConsoleScanUpdateState(EntityUid? artifact, bool analyzerConnected, bool serverConnected, bool canScan, bool canPrint,
int? id, int? depth, int? edges, bool? triggered, string? effectProto, string? triggerProto, float? completion,
bool scanning, TimeSpan timeRemaining, TimeSpan totalTime)
{
@@ -62,6 +69,7 @@ public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState
AnalyzerConnected = analyzerConnected;
ServerConnected = serverConnected;
CanScan = canScan;
CanPrint = canPrint;
Id = id;
Depth = depth;

View File

@@ -2,6 +2,8 @@ analysis-console-menu-title = analysis console
analysis-console-server-list-button = Server List
analysis-console-scan-button = Scan
analysis-console-scan-tooltip-info = Scan artifacts to learn information about their structure.
analysis-console-print-button = Print
analysis-console-print-tooltip-info = Print out the current information about the artifact.
analysis-console-destroy-button = Destroy
analysis-console-destroy-button-info = Destroy artifacts to generate points based on how much has been unlocked.
@@ -24,6 +26,14 @@ analysis-console-progress-text = {$seconds ->
*[other] T-{$seconds} seconds
}
analysis-destroy-window-title = Confirm Destruction
analysis-destroy-window-text = Destroy the artifact, converting it into research points?
analysis-destroy-window-yes = Yes
analysis-destroy-window-no = No
analyzer-artifact-component-upgrade-analysis = analysis duration
analysis-console-print-popup = The console printed out a report.
analyzer-artifact-destroy-popup = The artifact disintegrated into energy!
analysis-report-title = Artifact Report: Node {$id}

View File

@@ -262,7 +262,7 @@
effectHint: artifact-effect-hint-creation
components:
- type: SpawnArtifact
maxSpawns: 5
maxSpawns: 15
consistentSpawn: false
possiblePrototypes:
- SilverOre1

View File

@@ -122,7 +122,7 @@
- type: ArtifactDamageTrigger
damageTypes:
- Radiation
damageThreshold: 100
damageThreshold: 50
- type: RadiationReceiver
- type: artifactTrigger