Use Segments for RandomMetadata (#11190)

* use segments for randomized names now

* separator datafields

* public api
This commit is contained in:
Nemanja
2022-09-14 03:13:22 -04:00
committed by GitHub
parent f14f3d4999
commit cff6fe267c
7 changed files with 43 additions and 38 deletions

View File

@@ -1,17 +1,20 @@
using Content.Shared.Dataset;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.RandomMetadata;
namespace Content.Server.RandomMetadata;
/// <summary>
/// Randomizes the description and/or the name for an entity by pulling from a dataset prototype.
/// Randomizes the description and/or the name for an entity by creating it from list of dataset prototypes or strings.
/// </summary>
[RegisterComponent]
public sealed class RandomMetadataComponent : Component
{
[DataField("descriptionSet", customTypeSerializer:typeof(PrototypeIdSerializer<DatasetPrototype>))]
public string? DescriptionSet;
[DataField("descriptionSegments")]
public List<string>? DescriptionSegments;
[DataField("nameSet", customTypeSerializer:typeof(PrototypeIdSerializer<DatasetPrototype>))]
public string? NameSet;
[DataField("nameSegments")]
public List<string>? NameSegments;
[DataField("nameSeparator")]
public string NameSeparator = " ";
[DataField("descriptionSeparator")]
public string DescriptionSeparator = " ";
}

View File

@@ -1,4 +1,5 @@
using Content.Shared.Dataset;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
@@ -21,16 +22,33 @@ public sealed class RandomMetadataSystem : EntitySystem
{
var meta = MetaData(uid);
if (component.NameSet != null)
if (component.NameSegments != null)
{
var nameProto = _prototype.Index<DatasetPrototype>(component.NameSet);
meta.EntityName = _random.Pick(nameProto.Values);
meta.EntityName = GetRandomFromSegments(component.NameSegments, component.NameSeparator);
}
if (component.DescriptionSet != null)
if (component.DescriptionSegments != null)
{
var descProto = _prototype.Index<DatasetPrototype>(component.DescriptionSet);
meta.EntityDescription = _random.Pick(descProto.Values);
meta.EntityDescription = GetRandomFromSegments(component.DescriptionSegments, component.DescriptionSeparator);
}
}
/// <summary>
/// Generates a random string from segments and a separator.
/// </summary>
/// <param name="segments">The segments that it will be generated from</param>
/// <param name="separator">The separator that will be inbetween each segment</param>
/// <returns>The newly generated string</returns>
[PublicAPI]
public string GetRandomFromSegments(List<string> segments, string? separator)
{
var outputSegments = new List<string>();
foreach (var segment in segments)
{
outputSegments.Add(_prototype.TryIndex<DatasetPrototype>(segment, out var proto)
? _random.Pick(proto.Values)
: segment);
}
return string.Join(separator, outputSegments);
}
}