using System; using ai.behaviours; namespace IdleSpectator; /// /// Shared outcome checks for Layer A/B event confirmation. /// Patches observe; this layer answers "did the semantic event actually happen?" /// before any feed Emit. Do not treat as success. /// public static class EventOutcome { /// Cheap before-snapshot for Prefix → Postfix confirmation. public struct ActorFlags { public bool Valid; public bool Alive; public bool HasFamily; public bool HasLover; } public static ActorFlags Snapshot(Actor actor) { var flags = new ActorFlags(); if (actor == null) { return flags; } flags.Valid = true; try { flags.Alive = actor.isAlive(); if (!flags.Alive) { return flags; } flags.HasFamily = actor.hasFamily(); flags.HasLover = actor.hasLover(); } catch { flags.Valid = false; } return flags; } public static bool IsLiving(Actor actor) { try { return actor != null && actor.isAlive(); } catch { return false; } } /// Behaviour node finished without Stop. Never implies semantic success. public static bool BehaviourRan(BehResult result) { return result != BehResult.Stop; } public static bool GainedFamily(ActorFlags before, Actor actor) { if (!before.Valid || !before.Alive || !IsLiving(actor)) { return false; } try { return !before.HasFamily && actor.hasFamily(); } catch { return false; } } public static bool LostFamily(ActorFlags before, Actor actor) { if (!before.Valid || !before.Alive || !IsLiving(actor)) { return false; } try { return before.HasFamily && !actor.hasFamily(); } catch { return false; } } public static bool GainedLover(ActorFlags before, Actor actor) { if (!before.Valid || !before.Alive || !IsLiving(actor)) { return false; } try { return !before.HasLover && actor.hasLover(); } catch { return false; } } public static bool LostLover(ActorFlags before, Actor actor) { if (!before.Valid || !before.Alive || !IsLiving(actor)) { return false; } try { return before.HasLover && !actor.hasLover(); } catch { return false; } } /// /// Still seeking: behaviour continued and the unit did not acquire a lover /// (success path is set_lover / love status). /// public static bool StillSeekingLover(Actor actor, BehResult result) { if (!BehaviourRan(result) || !IsLiving(actor)) { return false; } try { return !actor.hasLover(); } catch { return false; } } }