− class PerfectInformation_Observer extends UIPanel implements (X2VisualizationMgrObserverInterface);
−
− var array<PerfectInformation_Notification> PendingNotifications;
− var array<PerfectInformation_Notification> NotificationsToAssociate;
−
− function InitObs()
− {
− local Object ThisObj;
− `log("Initializing PERFECT INFORMATION",, 'EUAimRollsVis');
−
− ThisObj = self;
−
− `XCOMVISUALIZATIONMGR.RegisterObserver(self);
− //`XEVENTMGR.RegisterForEvent(ThisObj, 'AbilityActivated', ListenForAbilityGameState, ELD_Immediate);
− `XEVENTMGR.RegisterForEvent(ThisObj, 'RequestNotifyOnVisualization', OnNotificationRequested, ELD_Immediate);
− `XEVENTMGR.RegisterForEvent(ThisObj, 'PlayerTurnEnded', ClearAllNotifications, ELD_OnStateSubmitted); // Clean up extra rolls on turn end
− /* if (class'Override_X2AbilityToHitCalc_StandardAim'.default.DIRTY_CINEMATIC)
− {
− `XEVENTMGR.RegisterForEvent(ThisObj, 'AbilityActivated', OnNotifyBeforeVis, ELD_OnVisualizationBlockStarted);
− `PRES.m_kEventNotices.bShowDuringCinematic = true;
− }
− */ `log("Finshed initializing PERFECT INFORMATION",, 'EUAimRollsVis');
− }
−
− function EventListenerReturn ListenForAbilityGameState(Object EventData, Object EventSource, XComGameState NewGameState, Name EventID)
− {
− local PerfectInformation_Notification Notif;
− local Object NotifyObj;
− local int i;
− local XComGameState_Ability AbilityState;
− AbilityState = XComGameState_Ability(EventData);
− //`log("Event: AbilityActivated ID=" $ AbilityState.ObjectID,, 'EUAimRollsVis');
− if (XComGameStateContext_Ability(NewGameState.GetContext()) != none && NewGameState.GetNumGameStateObjects() > 0)
− {
− //`log("AbilityActivated is a XComGameStateContext_Ability:" @ XComGameStateContext_Ability(NewGameState.GetContext()).SummaryString(),, 'EUAimRollsVis');
− //`log("Context:" @ NewGameState.GetContext().ToString(),, 'EUAimRollsVis');
− for (i = 0; i < NotificationsToAssociate.Length; i++)
− {
− Notif = NotificationsToAssociate[i];
− if (Notif.StateRef == AbilityState.ObjectID)
− {
− //`log("Notif transferred for HACK event listener",, 'EUAimRollsVis');
− Notif.GameState = NewGameState;
− PendingNotifications.AddItem(Notif);
− NotifyObj = Notif;
− // `XEVENTMGR.RegisterForEvent(NotifyObj, 'HACK_VisualizeNotify', Notif.DisplayThisEvent, class'Override_X2AbilityToHitCalc_StandardAim'.default.DIRTY_CINEMATIC ? ELD_OnVisualizationBlockStarted : ELD_OnVisualizationBlockCompleted);
− `XEVENTMGR.RegisterForEvent(NotifyObj, 'HACK_VisualizeNotify', Notif.DisplayThisEvent, false ? ELD_OnVisualizationBlockStarted : ELD_OnVisualizationBlockCompleted);
− `XEVENTMGR.TriggerEvent('HACK_VisualizeNotify', self, Notif, NewGameState);
− //`log("Notif HACK completed",, 'EUAimRollsVis');
− NotificationsToAssociate.Remove(i, 1);
− i--;
− }
− }
−
− //if (j == 0)
− //{
− //`log("Generating empty HACK event listener",, 'EUAimRollsVis');
− //Notif = new class'PerfectInformation_Notification';
− //Notif.StateRef = AbilityState.ObjectID;
− //Notif.Message = "[No Notify]" @ NewGameState.GetContext().ToString();
− //Notif.IsAlly = true;
− //Notif.RollTarget = XComGameStateContext_Ability(NewGameState.GetContext()).InputContext.PrimaryTarget.ObjectID;
− //NotifyObj = Notif;
− //`XEVENTMGR.RegisterForEvent(NotifyObj, 'HACK_VisualizeNotify', Notif.DisplayThisEvent, class'Override_X2AbilityToHitCalc_StandardAim'.default.DIRTY_CINEMATIC ? ELD_OnVisualizationBlockStarted : ELD_OnVisualizationBlockCompleted);
− //`XEVENTMGR.RegisterForEvent(NotifyObj, 'HACK_VisualizeNotify2', Notif.DebugEvent, ELD_Immediate);
− //`XEVENTMGR.RegisterForEvent(NotifyObj, 'HACK_VisualizeNotify3', Notif.DebugEventSS, ELD_OnStateSubmitted);
− //`XEVENTMGR.TriggerEvent('HACK_VisualizeNotify', self, Notif, NewGameState);
− //`XEVENTMGR.TriggerEvent('HACK_VisualizeNotify2', self, Notif, NewGameState);
− //`XEVENTMGR.TriggerEvent('HACK_VisualizeNotify3', self, Notif, NewGameState);
− //`log("Notif HACK completed",, 'EUAimRollsVis');
− //}
− }
−
− return ELR_NoInterrupt;
− }
−
− function EventListenerReturn ClearAllNotifications(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
− {
− PendingNotifications.Length = 0;
− NotificationsToAssociate.Length = 0;
−
− return ELR_NoInterrupt;
− }
−
− function EventListenerReturn OnNotifyBeforeVis(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
− {
− local XComGameStateContext_Ability Context;
− local array<PerfectInformation_Notification> MatchedNotifications;
− local PerfectInformation_Notification NotifyEntry;
−
− if (GameState == none)
− return ELR_NoInterrupt;
−
− Context = XComGameStateContext_Ability(GameState.GetContext());
−
− `log("Pre block notified",, 'EUAimRollsVis');
−
− if (Context == none)
− return ELR_NoInterrupt;
−
− // if (class'Override_X2AbilityToHitCalc_StandardAim'.default.OVERWATCH_ABILITIES.Find(Context.InputContext.AbilityTemplateName) != INDEX_NONE)
− // return ELR_NoInterrupt;
−
− `log("Pre block got context",, 'EUAimRollsVis');
−
− foreach PendingNotifications(NotifyEntry)
− {
− if (NotifyEntry.StateRef == Context.InputContext.AbilityRef.ObjectID)
− {
− if (Context.InputContext.PrimaryTarget.ObjectID != NotifyEntry.RollTarget && Context.InputContext.MultiTargets.Find('ObjectID', NotifyEntry.RollTarget) == INDEX_NONE)
− {
− // This ability was used multiple times before the first visualization block, suppress irreleavant messages until its turn
− continue;
− }
− MatchedNotifications.AddItem(NotifyEntry);
− }
− }
−
− foreach MatchedNotifications(NotifyEntry)
− {
− PendingNotifications.RemoveItem(NotifyEntry);
− if (!class'Override_X2AbilityToHitCalc_StandardAim'.default.ShowOnlyForAllies || NotifyEntry.IsAlly)
− NotifyEntry.Notify();
− }
−
− return ELR_NoInterrupt;
− }
−
− function EventListenerReturn OnNotificationRequested(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
− {
− local PerfectInformation_Notification Notification;
− Notification = PerfectInformation_Notification(EventData);
− `log("Notif event requested",, 'EUAimRollsVis');
−
− if (Notification != none)
− {
− //NotificationsToAssociate.AddItem(Notification);
− PendingNotifications.AddItem(Notification);
− }
−
− return ELR_NoInterrupt;
− }
−
− //function AddNotification(XComGameState_Ability GameState, String Message)
− //{
− //local PerfectInformation_Notification Notification;
− //Notification = new class'PerfectInformation_Notification';
− //Notification.StateRef = GameState.ObjectID;
− //Notification.Message = Message;
− //PendingNotifications.AddItem(Notification);
− //}
−
− event OnVisualizationBlockComplete(XComGameState AssociatedGameState)
− {
− local XComGameStateContext_Ability Context;
− local array<PerfectInformation_Notification> MatchedNotifications;
− local PerfectInformation_Notification NotifyEntry;
−
− Context = XComGameStateContext_Ability(AssociatedGameState.GetContext());
−
− // if (Context == none || class'Override_X2AbilityToHitCalc_StandardAim'.default.DIRTY_CINEMATIC)
− if (Context == none || false )
− return;
−
− foreach PendingNotifications(NotifyEntry)
− {
− if (NotifyEntry.StateRef == Context.InputContext.AbilityRef.ObjectID)
− {
− if (Context.InputContext.PrimaryTarget.ObjectID != NotifyEntry.RollTarget && Context.InputContext.MultiTargets.Find('ObjectID', NotifyEntry.RollTarget) == INDEX_NONE)
− {
− // This ability was used multiple times before the first visualization block, suppress irreleavant messages until its turn
− continue;
− }
− MatchedNotifications.AddItem(NotifyEntry);
− }
− }
−
− foreach MatchedNotifications(NotifyEntry)
− {
− PendingNotifications.RemoveItem(NotifyEntry);
− if (!class'Override_X2AbilityToHitCalc_StandardAim'.default.ShowOnlyForAllies || NotifyEntry.IsAlly)
− NotifyEntry.Notify();
− }
− }
−
−
− /// <summary>
− /// Called when the visualizer runs out of active and pending blocks, and becomes idle
− /// </summary>
− event OnVisualizationIdle();
−
− /// <summary>
− /// Called when the active unit selection changes
− /// </summary>
− event OnActiveUnitChanged(XComGameState_Unit NewActiveUnit);