worldbox-observer-mod/IdleSpectator/HappinessContextBag.cs

128 lines
3.3 KiB
C#

namespace IdleSpectator;
/// <summary>
/// Short-lived apply-site context for happiness hooks that do not retain related units in history.
/// </summary>
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;
}
}
}