using System; using UnityEngine; namespace IdleSpectator; /// /// Typed camera/interrupt gate for events important enough to leave the MC orbit. /// A large numeric score is deliberately insufficient: grief, duels, and other personal /// outcomes can be intense without becoming a world-scale cutaway. /// public static class WorldCriticalPolicy { public static bool IsWorldCritical(InterestCandidate candidate) { if (candidate == null) { return false; } if (candidate.Completion == InterestCompletionKind.EarthquakeActive || candidate.Completion == InterestCompletionKind.StatusOutbreak) { return true; } if (candidate.Completion == InterestCompletionKind.WarFront) { int sideA = Mathf.Max(0, candidate.CombatSideACount); int sideB = Mathf.Max(0, candidate.CombatSideBCount); int participants = Mathf.Max( candidate.ParticipantCount, sideA + sideB); int minimum = Mathf.Max(2, InterestScoringConfig.Story.crisisWarParticipantMin); return sideA > 0 && sideB > 0 && participants >= minimum; } if (!IsTypedDisaster(candidate)) { return false; } float minimumStrength = Mathf.Max( 1f, InterestScoringConfig.Story.crisisDisasterStrengthMin); return candidate.EventStrength >= minimumStrength; } public static bool IsTypedDisaster(InterestCandidate candidate) { if (candidate == null) { return false; } if (string.Equals( candidate.Category, "Disaster", StringComparison.OrdinalIgnoreCase)) { return true; } string asset = (candidate.AssetId ?? "").Trim(); return !string.IsNullOrEmpty(asset) && (EventCatalog.Disaster.IsLiveOrAuthored(asset) || EventCatalog.WorldLog.IsDisasterCategory(asset)); } }