From 2a83a9bc17bc781c9d68d138c02d2e9577ba40c5 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:57:21 -0400 Subject: [PATCH] [Sci] Non-destructive XenoArch Research (#15398) * Non-destructive XenoArch research * nerf the price * Points -> Extract --- .../Ui/AnalysisConsoleBoundUserInterface.cs | 9 ++- .../Ui/AnalysisConsoleMenu.xaml.cs | 48 +++------------ .../Ui/AnalysisDestroyWindow.xaml | 22 ------- .../Ui/AnalysisDestroyWindow.xaml.cs | 26 -------- .../Systems/ArtifactAnalyzerSystem.cs | 44 ++++++-------- .../SuppressArtifactContainerSystem.cs | 10 ++-- .../XenoArtifacts/ArtifactComponent.cs | 19 ++++-- .../XenoArtifacts/ArtifactSystem.cs | 59 ++++++++++--------- .../Equipment/SharedArtifactAnalyzer.cs | 6 +- .../xenoarchaeology/artifact-analyzer.ftl | 11 +--- .../Guidebook/Science/Xenoarchaeology.xml | 2 +- 11 files changed, 89 insertions(+), 167 deletions(-) delete mode 100644 Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml delete mode 100644 Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml.cs diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs index de3efbc485..3b10a8b97b 100644 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs +++ b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs @@ -23,19 +23,19 @@ public sealed class AnalysisConsoleBoundUserInterface : BoundUserInterface _consoleMenu.OnClose += Close; _consoleMenu.OpenCentered(); - _consoleMenu.OnServerSelectionButtonPressed += _ => + _consoleMenu.OnServerSelectionButtonPressed += () => { SendMessage(new AnalysisConsoleServerSelectionMessage()); }; - _consoleMenu.OnScanButtonPressed += _ => + _consoleMenu.OnScanButtonPressed += () => { SendMessage(new AnalysisConsoleScanButtonPressedMessage()); }; - _consoleMenu.OnPrintButtonPressed += _ => + _consoleMenu.OnPrintButtonPressed += () => { SendMessage(new AnalysisConsolePrintButtonPressedMessage()); }; - _consoleMenu.OnDestroyButtonPressed += _ => + _consoleMenu.OnDestroyButtonPressed += () => { SendMessage(new AnalysisConsoleDestroyButtonPressedMessage()); }; @@ -61,7 +61,6 @@ public sealed class AnalysisConsoleBoundUserInterface : BoundUserInterface if (!disposing) return; - _consoleMenu?.AnalysisDestroyWindow?.Close(); _consoleMenu?.Dispose(); } } diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs index beced7b603..9f0a424b3e 100644 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs +++ b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs @@ -3,7 +3,6 @@ using Content.Client.UserInterface.Controls; using Content.Shared.Xenoarchaeology.Equipment; using Robust.Client.AutoGenerated; using Robust.Client.GameObjects; -using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Utility; @@ -13,42 +12,20 @@ namespace Content.Client.Xenoarchaeology.Ui; public sealed partial class AnalysisConsoleMenu : FancyWindow { [Dependency] private readonly IEntityManager _ent = default!; - - public AnalysisDestroyWindow? AnalysisDestroyWindow; - - public event Action? OnServerSelectionButtonPressed; - public event Action? OnScanButtonPressed; - public event Action? OnPrintButtonPressed; - public event Action? OnDestroyButtonPressed; + public event Action? OnServerSelectionButtonPressed; + public event Action? OnScanButtonPressed; + public event Action? OnPrintButtonPressed; + public event Action? OnDestroyButtonPressed; public AnalysisConsoleMenu() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - ServerSelectionButton.OnPressed += a => OnServerSelectionButtonPressed?.Invoke(a); - ScanButton.OnPressed += a => OnScanButtonPressed?.Invoke(a); - PrintButton.OnPressed += a => OnPrintButtonPressed?.Invoke(a); - DestroyButton.OnPressed += _ => OnDestroyButton(); - } - - private void OnDestroyButton() - { - // check if window is already open - if (AnalysisDestroyWindow is { IsOpen: true }) - { - AnalysisDestroyWindow.MoveToFront(); - return; - } - - // open a new one - AnalysisDestroyWindow = new (); - AnalysisDestroyWindow.OpenCentered(); - - AnalysisDestroyWindow.OnYesButton += a => - { - OnDestroyButtonPressed?.Invoke(a); - }; + ServerSelectionButton.OnPressed += _ => OnServerSelectionButtonPressed?.Invoke(); + ScanButton.OnPressed += _ => OnScanButtonPressed?.Invoke(); + PrintButton.OnPressed += _ => OnPrintButtonPressed?.Invoke(); + DestroyButton.OnPressed += _ => OnDestroyButtonPressed?.Invoke(); } public void SetButtonsDisabled(AnalysisConsoleScanUpdateState state) @@ -56,7 +33,7 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow ScanButton.Disabled = !state.CanScan; PrintButton.Disabled = !state.CanPrint; - var disabled = !state.ServerConnected || !state.CanScan; + var disabled = !state.ServerConnected || !state.CanScan || state.PointAmount <= 0; DestroyButton.Disabled = disabled; @@ -128,12 +105,5 @@ 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(); - } } diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml b/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml deleted file mode 100644 index c200362095..0000000000 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml.cs b/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml.cs deleted file mode 100644 index 0c8a60460e..0000000000 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisDestroyWindow.xaml.cs +++ /dev/null @@ -1,26 +0,0 @@ -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? OnYesButton; - - public AnalysisDestroyWindow() - { - RobustXamlLoader.Load(this); - - YesButton.AddStyleClass(StyleBase.ButtonCaution); - YesButton.OnPressed += a => - { - OnYesButton?.Invoke(a); - Close(); - }; - NoButton.OnPressed += _ => Close(); - } -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 6c1bb31833..5bced250e2 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -35,7 +35,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedAmbientSoundSystem _ambienntSound = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly ArtifactSystem _artifact = default!; @@ -199,6 +199,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem var totalTime = TimeSpan.Zero; var canScan = false; var canPrint = false; + var points = 0; if (component.AnalyzerEntity != null && TryComp(component.AnalyzerEntity, out var analyzer)) { artifact = analyzer.LastAnalyzedArtifact; @@ -206,6 +207,10 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem totalTime = analyzer.AnalysisDuration * analyzer.AnalysisDurationMulitplier; canScan = analyzer.Contacts.Any(); canPrint = analyzer.ReadyToPrint; + + // the artifact that's actually on the scanner right now. + if (GetArtifactForAnalysis(component.AnalyzerEntity, analyzer) is { } current) + points = _artifact.GetResearchPointValue(current); } var analyzerConnected = component.AnalyzerEntity != null; var serverConnected = TryComp(uid, out var client) && client.ConnectedToServer; @@ -214,7 +219,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem var remaining = active != null ? _timing.CurTime - active.StartTime : TimeSpan.Zero; var state = new AnalysisConsoleScanUpdateState(artifact, analyzerConnected, serverConnected, - canScan, canPrint, msg, scanning, remaining, totalTime); + canScan, canPrint, msg, scanning, remaining, totalTime, points); var bui = _ui.GetUi(uid, ArtifactAnalzyerUiKey.Key); _ui.SetUiState(bui, state); @@ -347,22 +352,21 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem if (!_research.TryGetClientServer(uid, out var server, out var serverComponent)) return; - var entToDestroy = GetArtifactForAnalysis(component.AnalyzerEntity); - if (entToDestroy == null) + var artifact = GetArtifactForAnalysis(component.AnalyzerEntity); + if (artifact == null) return; - if (TryComp(component.AnalyzerEntity.Value, out var analyzer) && - analyzer.LastAnalyzedArtifact == entToDestroy) - { - ResetAnalyzer(component.AnalyzerEntity.Value); - } + var pointValue = _artifact.GetResearchPointValue(artifact.Value); - _research.AddPointsToServer(server.Value, _artifact.GetResearchPointValue(entToDestroy.Value), serverComponent); - EntityManager.DeleteEntity(entToDestroy.Value); + if (pointValue == 0) + return; + + _research.AddPointsToServer(server.Value, pointValue, serverComponent); + _artifact.AdjustConsumedPoints(artifact.Value, pointValue); _audio.PlayPvs(component.DestroySound, component.AnalyzerEntity.Value, AudioParams.Default.WithVolume(2f)); - _popup.PopupEntity(Loc.GetString("analyzer-artifact-destroy-popup"), + _popup.PopupEntity(Loc.GetString("analyzer-artifact-extract-popup"), component.AnalyzerEntity.Value, PopupType.Large); UpdateUserInterface(uid, component); @@ -371,9 +375,6 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// /// Cancels scans if the artifact changes nodes (is activated) during the scan. /// - /// - /// - /// private void OnArtifactActivated(EntityUid uid, ActiveScannedArtifactComponent component, ArtifactActivatedEvent args) { CancelScan(uid); @@ -382,9 +383,6 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// /// Checks to make sure that the currently scanned artifact isn't moved off of the scanner /// - /// - /// - /// private void OnScannedMoved(EntityUid uid, ActiveScannedArtifactComponent component, ref MoveEvent args) { if (!TryComp(component.Scanner, out var analyzer)) @@ -399,9 +397,6 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// /// Stops the current scan /// - /// The artifact being scanned - /// - /// The artifact analyzer component [PublicAPI] public void CancelScan(EntityUid artifact, ActiveScannedArtifactComponent? component = null, ArtifactAnalyzerComponent? analyzer = null) { @@ -423,9 +418,6 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// /// Finishes the current scan. /// - /// The analyzer that is scanning - /// - /// [PublicAPI] public void FinishScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null) { @@ -485,7 +477,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem if (TryComp(uid, out var powa)) powa.NeedsPower = true; - _ambienntSound.SetAmbience(uid, true); + _ambientSound.SetAmbience(uid, true); } private void OnAnalyzeEnd(EntityUid uid, ActiveArtifactAnalyzerComponent component, ComponentShutdown args) @@ -493,7 +485,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem if (TryComp(uid, out var powa)) powa.NeedsPower = false; - _ambienntSound.SetAmbience(uid, false); + _ambientSound.SetAmbience(uid, false); } private void OnPowerChanged(EntityUid uid, ActiveArtifactAnalyzerComponent component, ref PowerChangedEvent args) diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs index 16aea2a3b3..4278af409a 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs @@ -6,6 +6,8 @@ namespace Content.Server.Xenoarchaeology.Equipment.Systems; public sealed class SuppressArtifactContainerSystem : EntitySystem { + [Dependency] private readonly ArtifactSystem _artifact = default!; + public override void Initialize() { base.Initialize(); @@ -15,17 +17,17 @@ public sealed class SuppressArtifactContainerSystem : EntitySystem private void OnInserted(EntityUid uid, SuppressArtifactContainerComponent component, EntInsertedIntoContainerMessage args) { - if (!TryComp(args.Entity, out ArtifactComponent? artifact)) + if (!TryComp(args.Entity, out var artifact)) return; - artifact.IsSuppressed = true; + _artifact.SetIsSuppressed(args.Entity, true, artifact); } private void OnRemoved(EntityUid uid, SuppressArtifactContainerComponent component, EntRemovedFromContainerMessage args) { - if (!TryComp(args.Entity, out ArtifactComponent? artifact)) + if (!TryComp(args.Entity, out var artifact)) return; - artifact.IsSuppressed = false; + _artifact.SetIsSuppressed(args.Entity, false, artifact); } } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs index 21dfb084e9..efac03685f 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs @@ -4,7 +4,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Server.Xenoarchaeology.XenoArtifacts; -[RegisterComponent] +[RegisterComponent, Access(typeof(ArtifactSystem))] public sealed class ArtifactComponent : Component { /// @@ -53,22 +53,29 @@ public sealed class ArtifactComponent : Component public TimeSpan LastActivationTime; /// - /// The base price of each node for an artifact + /// A multiplier applied to the calculated point value + /// to determine the monetary value of the artifact /// - [DataField("pricePerNode")] - public int PricePerNode = 500; + [DataField("priceMultiplier"), ViewVariables(VVAccess.ReadWrite)] + public float PriceMultiplier = 0.05f; /// /// The base amount of research points for each artifact node. /// - [DataField("pointsPerNode")] + [DataField("pointsPerNode"), ViewVariables(VVAccess.ReadWrite)] public int PointsPerNode = 5000; + /// + /// Research points which have been "consumed" from the theoretical max value of the artifact. + /// + [DataField("consumedPoints"), ViewVariables(VVAccess.ReadWrite)] + public int ConsumedPoints; + /// /// A multiplier that is raised to the power of the average depth of a node. /// Used for calculating the research point value of an artifact node. /// - [DataField("pointDangerMultiplier")] + [DataField("pointDangerMultiplier"), ViewVariables(VVAccess.ReadWrite)] public float PointDangerMultiplier = 1.35f; } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs index 039cc3423c..74ba6d6d5b 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs @@ -51,29 +51,7 @@ public sealed partial class ArtifactSystem : EntitySystem /// private void GetPrice(EntityUid uid, ArtifactComponent component, ref PriceCalculationEvent args) { - var price = component.NodeTree.Sum(x => GetNodePrice(x, component)); - - // 25% bonus for fully exploring every node. - var fullyExploredBonus = component.NodeTree.Any(x => !x.Triggered) ? 1 : 1.25f; - - args.Price =+ price * fullyExploredBonus; - } - - private float GetNodePrice(ArtifactNode node, ArtifactComponent component) - { - if (!node.Discovered) //no money for undiscovered nodes. - return 0; - - var triggerProto = _prototype.Index(node.Trigger); - var effectProto = _prototype.Index(node.Effect); - - //quarter price if not triggered - var priceMultiplier = node.Triggered ? 1f : 0.25f; - //the danger is the average of node depth, effect danger, and trigger danger. - var nodeDanger = (node.Depth + effectProto.TargetDepth + triggerProto.TargetDepth) / 3; - - var price = MathF.Pow(2f, nodeDanger) * component.PricePerNode * priceMultiplier; - return price; + args.Price =+ GetResearchPointValue(uid, component) * component.PriceMultiplier; } /// @@ -96,9 +74,32 @@ public sealed partial class ArtifactSystem : EntitySystem var sumValue = component.NodeTree.Sum(n => GetNodePointValue(n, component, getMaxPrice)); var fullyExploredBonus = component.NodeTree.All(x => x.Triggered) || getMaxPrice ? 1.25f : 1; + sumValue -= component.ConsumedPoints; + + return (int) (sumValue * fullyExploredBonus); + } + + /// + /// Adjusts how many points on the artifact have been consumed + /// + public void AdjustConsumedPoints(EntityUid uid, int amount, ArtifactComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + component.ConsumedPoints += amount; + } + + /// + /// Sets whether or not the artifact is suppressed, + /// preventing it from activating + /// + public void SetIsSuppressed(EntityUid uid, bool suppressed, ArtifactComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; - var pointValue = (int) (sumValue * fullyExploredBonus); - return pointValue; + component.IsSuppressed = suppressed; } /// @@ -201,8 +202,8 @@ public sealed partial class ArtifactSystem : EntitySystem var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); var allNodes = currentNode.Edges; - _sawmill.Debug("artifact", $"our node: {currentNode.Id}"); - _sawmill.Debug("artifact", $"other nodes: {string.Join(", ", allNodes)}"); + _sawmill.Debug($"our node: {currentNode.Id}"); + _sawmill.Debug($"other nodes: {string.Join(", ", allNodes)}"); if (TryComp(uid, out var bias) && TryComp(bias.Provider, out var trav) && @@ -225,14 +226,14 @@ public sealed partial class ArtifactSystem : EntitySystem } var undiscoveredNodes = allNodes.Where(x => !GetNodeFromId(x, component).Discovered).ToList(); - _sawmill.Debug("artifact", $"Undiscovered nodes: {string.Join(", ", undiscoveredNodes)}"); + _sawmill.Debug($"Undiscovered nodes: {string.Join(", ", undiscoveredNodes)}"); var newNode = _random.Pick(allNodes); if (undiscoveredNodes.Any() && _random.Prob(0.75f)) { newNode = _random.Pick(undiscoveredNodes); } - _sawmill.Debug("artifact", $"Going to node {newNode}"); + _sawmill.Debug($"Going to node {newNode}"); return GetNodeFromId(newNode, component); } diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs index 2d6a3950b6..0215c84992 100644 --- a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs +++ b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs @@ -50,8 +50,10 @@ public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState public TimeSpan TotalTime; + public int PointAmount; + public AnalysisConsoleScanUpdateState(EntityUid? artifact, bool analyzerConnected, bool serverConnected, bool canScan, bool canPrint, - FormattedMessage? scanReport, bool scanning, TimeSpan timeRemaining, TimeSpan totalTime) + FormattedMessage? scanReport, bool scanning, TimeSpan timeRemaining, TimeSpan totalTime, int pointAmount) { Artifact = artifact; AnalyzerConnected = analyzerConnected; @@ -64,5 +66,7 @@ public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState Scanning = scanning; TimeRemaining = timeRemaining; TotalTime = totalTime; + + PointAmount = pointAmount; } } diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl index 72fabc127c..87c96ffc48 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl @@ -4,8 +4,8 @@ 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. +analysis-console-destroy-button = Extract +analysis-console-destroy-button-info = Extract points from an artifact based on the explored nodes. analysis-console-info-no-scanner = No analyzer connected! Please connect one using a multitool. analysis-console-info-no-artifact = No artifact present! Place one on the pad then scan for information. @@ -26,14 +26,9 @@ 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! +analyzer-artifact-extract-popup = Energy shimmers on the artifact's surface! analysis-report-title = Artifact Report: Node {$id} \ No newline at end of file diff --git a/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml b/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml index a397c7a2ff..47018d37b3 100644 --- a/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml +++ b/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml @@ -24,6 +24,6 @@ The main equipment that you'll be using for Xenoarchaeology is the [color=#a4885 To set them up, simply link them with a multitool, set an artifact on top of the analyzer, and press the [color=#a4885c]Scan[/color] button. -Using the console, you can permanently destroy an artifact in exchange for points. This is irreversible, so be sure to confirm with your department that all research on it has concluded. +Using the console, you can extract points from the artifact using the [color=#a4885c]Extract[/color] button. The amount of points you extract is based on how many of the nodes of the artifact have been activated. -- 2.51.2