using System.Linq;
using Content.Server.Administration;
using Content.Shared.Administration;
-using Content.Shared.Xenoarchaeology.XenoArtifacts;
using Robust.Shared.Console;
-using Robust.Shared.Utility;
namespace Content.Server.Xenoarchaeology.XenoArtifacts;
_conHost.RegisterCommand("forceartifactnode", "Forces an artifact to traverse to a given node", "forceartifacteffect <uid> <node ID>",
ForceArtifactNode,
ForceArtifactNodeCompletions);
+
+ _conHost.RegisterCommand("getartifactmaxvalue", "Reports the maximum research point value for a given artifact", "forceartifacteffect <uid>",
+ GetArtifactMaxValue);
}
[AdminCommand(AdminFlags.Fun)]
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}");
+ }
}
/// Medium should get you partway through a tree.
/// Complex should get you through a full tree and then some.
/// </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)
return 0;
- var sumValue = component.NodeTree.AllNodes.Sum(n => GetNodePointValue(n, component));
- var fullyExploredBonus = component.NodeTree.AllNodes.Any(x => !x.Triggered) ? 1 : 1.25f;
+ var sumValue = component.NodeTree.AllNodes.Sum(n => GetNodePointValue(n, component, getMaxPrice));
+ var fullyExploredBonus = component.NodeTree.AllNodes.All(x => x.Triggered) || getMaxPrice ? 1.25f : 1;
var pointValue = (int) (sumValue * fullyExploredBonus);
return pointValue;
/// <summary>
/// Gets the point value for an individual node
/// </summary>
- private float GetNodePointValue(ArtifactNode node, ArtifactComponent component)
+ private float GetNodePointValue(ArtifactNode node, ArtifactComponent component, bool getMaxPrice = false)
{
- if (!node.Discovered)
- return 0;
+ var valueDeduction = 1f;
+ 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;
return component.PointsPerNode * MathF.Pow(component.PointDangerMultiplier, nodeDanger) * valueDeduction;
}