Add command for getting artifact point value (#13987)

This commit is contained in:
Nemanja
2023-02-12 07:35:10 -05:00
committed by GitHub
parent 0fcd50b65b
commit e7b18b33aa
2 changed files with 30 additions and 9 deletions

View File

@@ -1,9 +1,7 @@
using System.Linq; using System.Linq;
using Content.Server.Administration; using Content.Server.Administration;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.Xenoarchaeology.XenoArtifacts;
using Robust.Shared.Console; using Robust.Shared.Console;
using Robust.Shared.Utility;
namespace Content.Server.Xenoarchaeology.XenoArtifacts; namespace Content.Server.Xenoarchaeology.XenoArtifacts;
@@ -16,6 +14,9 @@ public partial class ArtifactSystem
_conHost.RegisterCommand("forceartifactnode", "Forces an artifact to traverse to a given node", "forceartifacteffect <uid> <node ID>", _conHost.RegisterCommand("forceartifactnode", "Forces an artifact to traverse to a given node", "forceartifacteffect <uid> <node ID>",
ForceArtifactNode, ForceArtifactNode,
ForceArtifactNodeCompletions); ForceArtifactNodeCompletions);
_conHost.RegisterCommand("getartifactmaxvalue", "Reports the maximum research point value for a given artifact", "forceartifacteffect <uid>",
GetArtifactMaxValue);
} }
[AdminCommand(AdminFlags.Fun)] [AdminCommand(AdminFlags.Fun)]
@@ -48,4 +49,20 @@ public partial class ArtifactSystem
return CompletionResult.Empty; return CompletionResult.Empty;
} }
[AdminCommand(AdminFlags.Debug)]
private void GetArtifactMaxValue(IConsoleShell shell, string argstr, string[] args)
{
if (args.Length != 1)
shell.WriteError("Argument length must be 1");
if (!EntityUid.TryParse(args[0], out var uid))
return;
if (!TryComp<ArtifactComponent>(uid, out var artifact) || artifact.NodeTree == null)
return;
var pointSum = GetResearchPointValue(uid, artifact, true);
shell.WriteLine($"Max point value for {ToPrettyString(uid)} with {artifact.NodeTree.AllNodes.Count} nodes: {pointSum}");
}
} }

View File

@@ -84,13 +84,13 @@ public sealed partial class ArtifactSystem : EntitySystem
/// Medium should get you partway through a tree. /// Medium should get you partway through a tree.
/// Complex should get you through a full tree and then some. /// Complex should get you through a full tree and then some.
/// </remarks> /// </remarks>
public int GetResearchPointValue(EntityUid uid, ArtifactComponent? component = null) public int GetResearchPointValue(EntityUid uid, ArtifactComponent? component = null, bool getMaxPrice = false)
{ {
if (!Resolve(uid, ref component) || component.NodeTree == null) if (!Resolve(uid, ref component) || component.NodeTree == null)
return 0; return 0;
var sumValue = component.NodeTree.AllNodes.Sum(n => GetNodePointValue(n, component)); var sumValue = component.NodeTree.AllNodes.Sum(n => GetNodePointValue(n, component, getMaxPrice));
var fullyExploredBonus = component.NodeTree.AllNodes.Any(x => !x.Triggered) ? 1 : 1.25f; var fullyExploredBonus = component.NodeTree.AllNodes.All(x => x.Triggered) || getMaxPrice ? 1.25f : 1;
var pointValue = (int) (sumValue * fullyExploredBonus); var pointValue = (int) (sumValue * fullyExploredBonus);
return pointValue; return pointValue;
@@ -99,12 +99,16 @@ public sealed partial class ArtifactSystem : EntitySystem
/// <summary> /// <summary>
/// Gets the point value for an individual node /// Gets the point value for an individual node
/// </summary> /// </summary>
private float GetNodePointValue(ArtifactNode node, ArtifactComponent component) private float GetNodePointValue(ArtifactNode node, ArtifactComponent component, bool getMaxPrice = false)
{ {
if (!node.Discovered) var valueDeduction = 1f;
return 0; if (!getMaxPrice)
{
if (!node.Discovered)
return 0;
var valueDeduction = !node.Triggered ? 0.25f : 1; valueDeduction = !node.Triggered ? 0.25f : 1;
}
var nodeDanger = (node.Depth + node.Effect.TargetDepth + node.Trigger.TargetDepth) / 3; var nodeDanger = (node.Depth + node.Effect.TargetDepth + node.Trigger.TargetDepth) / 3;
return component.PointsPerNode * MathF.Pow(component.PointDangerMultiplier, nodeDanger) * valueDeduction; return component.PointsPerNode * MathF.Pow(component.PointDangerMultiplier, nodeDanger) * valueDeduction;
} }