namespace IdleSpectator; /// /// Short-lived apply-site context for happiness hooks that do not retain related units in history. /// internal static class HappinessContextBag { private static Actor _deceased; private static Actor _relatedA; private static Actor _relatedB; private static HappinessRelationRole _role; private static string _effectHint; public static void BeginDeathEvent(Actor deceased) { _deceased = deceased; _relatedA = deceased; _relatedB = null; _role = HappinessRelationRole.None; _effectHint = "death"; } public static void EndDeathEvent() { _deceased = null; _relatedA = null; _relatedB = null; _role = HappinessRelationRole.None; _effectHint = null; } public static void SetRelated(Actor related, HappinessRelationRole role, string effectHint = null) { _relatedA = related; _relatedB = null; _role = role; if (!string.IsNullOrEmpty(effectHint)) { _effectHint = effectHint; } } public static void SetPair(Actor a, Actor b, HappinessRelationRole role, string effectHint = null) { _relatedA = a; _relatedB = b; _role = role; if (!string.IsNullOrEmpty(effectHint)) { _effectHint = effectHint; } } public static void ClearRelated() { _relatedA = null; _relatedB = null; _role = HappinessRelationRole.None; _effectHint = null; } public static Actor CurrentDeceased => _deceased; public static bool TryGetRelated(Actor subject, out Actor related, out HappinessRelationRole role) { related = null; role = _role; if (subject == null) { related = _relatedA ?? _deceased; return related != null; } if (_deceased != null) { related = _deceased; role = role != HappinessRelationRole.None ? role : HappinessRelationRole.None; return related != null && related != subject; } if (_relatedA != null && _relatedB != null) { if (subject == _relatedA) { related = _relatedB; return true; } if (subject == _relatedB) { related = _relatedA; return true; } } if (_relatedA != null && _relatedA != subject) { related = _relatedA; return true; } return false; } public static HappinessRelationRole RoleForDeathEffect(string effectId) { if (string.IsNullOrEmpty(effectId)) { return HappinessRelationRole.None; } switch (effectId) { case "death_child": return HappinessRelationRole.DeceasedChild; case "death_lover": return HappinessRelationRole.DeceasedLover; case "death_best_friend": return HappinessRelationRole.DeceasedBestFriend; case "death_family_member": return HappinessRelationRole.DeceasedFamily; default: return HappinessRelationRole.None; } } }