using System; using System.Collections.Generic; namespace IdleSpectator; public sealed class WorldLogEventEntry { public string Id = ""; public float EventStrength = 40f; public string Category = "WorldLog"; public bool CreatesInterest = true; public bool ChronicleEligible; public float MinWatch = 6f; public float MaxWatch = 28f; public string LabelTemplate = "{id}"; public bool IsFallback; public string MakeLabel(string special1, string special2) { string a = special1 ?? ""; string b = special2 ?? ""; string template = string.IsNullOrEmpty(LabelTemplate) ? "{id}" : LabelTemplate; return template .Replace("{id}", Id ?? "") .Replace("{a}", a) .Replace("{b}", b) .Replace("{special1}", a) .Replace("{special2}", b); } public string MakeLabel(WorldLogMessage message) { if (message == null) { return MakeLabel("", ""); } return MakeLabel(message.special1, message.special2); } } /// WorldLog dials from event-catalog.json worldLog. public static partial class EventCatalog { public static class WorldLog { private static readonly Dictionary Entries = new Dictionary(StringComparer.OrdinalIgnoreCase); private static int _appliedGeneration = -1; public static void InvalidateOverlays() { Entries.Clear(); _appliedGeneration = -1; } private static void Ensure() { if (_appliedGeneration == EventCatalogConfig.Generation) { return; } _appliedGeneration = EventCatalogConfig.Generation; EventCatalogConfig.FillWorldLog(Entries); } public static IEnumerable AuthoredIds { get { Ensure(); return Entries.Keys; } } public static bool HasAuthored(string assetId) { Ensure(); return !string.IsNullOrEmpty(assetId) && Entries.ContainsKey(assetId.Trim()); } public static bool TryGet(string assetId, out WorldLogEventEntry entry) { Ensure(); entry = null; if (string.IsNullOrEmpty(assetId)) { return false; } return Entries.TryGetValue(assetId.Trim(), out entry); } public static WorldLogEventEntry GetOrFallback(string assetId) { if (TryGet(assetId, out WorldLogEventEntry entry)) { return entry; } string id = string.IsNullOrEmpty(assetId) ? "unknown" : assetId.Trim(); float strength = 40f; string category = "WorldLog"; if (id.IndexOf("disaster", StringComparison.OrdinalIgnoreCase) >= 0) { strength = 95f; category = "Disaster"; } return new WorldLogEventEntry { Id = id, EventStrength = strength, Category = category, CreatesInterest = true, ChronicleEligible = strength >= 65f, LabelTemplate = "{id}: {a}", MinWatch = strength >= 90f ? 8f : 6f, MaxWatch = strength >= 90f ? 35f : 28f, IsFallback = true }; } public static bool TryGetEventStrength(string assetId, out float eventStrength) { WorldLogEventEntry entry = GetOrFallback(assetId); eventStrength = entry.EventStrength; return !string.IsNullOrEmpty(assetId); } public static string MakeLabel(WorldLogMessage message) { if (message == null) { return "event"; } return GetOrFallback(message.asset_id).MakeLabel(message); } } }