using System; using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Text.Json.Serialization; using Server.Json; namespace Server { public class NameList { private static readonly Dictionary m_Table = new(StringComparer.OrdinalIgnoreCase); [JsonPropertyName("type")] public string Type { get; set; } [JsonPropertyName("names")] public string[] List { get; set; } public bool ContainsName(string name) { for (var i = 0; i < List.Length; i++) { if (name == List[i]) { return true; } } return false; } public string GetRandomName() => List.RandomElement() ?? ""; public static NameList GetNameList(string type) { m_Table.TryGetValue(type, out var n); return n; } public static string RandomName(string type) => GetNameList(type)?.GetRandomName() ?? ""; public static void Configure() { // TODO: Turn this into a command so it can be updated in-game var filePath = Path.Combine(Core.BaseDirectory, "Data/names.json"); var nameLists = JsonConfig.Deserialize>(filePath); if (nameLists == null) { throw new JsonException($"Failed to deserialize {filePath}."); } foreach (var nameList in nameLists) { nameList.FixNames(); m_Table.Add(nameList.Type, nameList); } } private void FixNames() { for (var i = 0; i < List.Length; i++) { List[i] = List[i].Trim().Intern(); } } } }