perfect information is outdated - remove

rohan
Sep 10, 2022, 10:51 AM
T4JXARMCDKJEDOPQOHJ3HTZVUJABABD3GMQA3IODHFLQ2O3Z7Y3AC

Dependencies

  • [2] WWMGBP4L merge with Highlander 1.24.0
  • [3] 7GQHYDUF XCom are always at red alert
  • [4] JSCVVDFD remove commented code and excess tabs
  • [5] 6GNTEDE4 use real LOS functions to determine Far Cover (automatically accounts for roof edge protection)
  • [6] X4IR7ZAH baseline from krumiro's [WotC] RW Realistic Aiming Angles

Change contents

  • file deletion: PerfectInformation_X2Action_Fire.uc (---r------)
    [4.1208][4.9534:9593](),[4.9593][4.8242:8242]()
    class PerfectInformation_X2Action_Fire extends X2Action_Fire;
    var PerfectInformation_Observer CurrentVO;
    simulated state Executing
    {
    simulated function RaiseRollEvent()
    {
    local PerfectInformation_Notification NotifyEntry;
    local int TargetID;
    if (AbilityContext == none)
    return;
    `log("Pre block got context",, 'EUAimRollsVis');
    TargetID = -1;
    if (XGUnit(PrimaryTarget) != none)
    {
    TargetID = XGUnit(PrimaryTarget).ObjectID;
    }
    foreach CurrentVO.PendingNotifications(NotifyEntry)
    {
    if (NotifyEntry.StateRef == AbilityContext.InputContext.AbilityRef.ObjectID)
    {
    if (TargetID == NotifyEntry.RollTarget)
    {
    CurrentVO.PendingNotifications.RemoveItem(NotifyEntry);
    if (!class'Override_X2AbilityToHitCalc_StandardAim'.default.ShowOnlyForAllies || NotifyEntry.IsAlly)
    NotifyEntry.Notify();
    break;
    }
    }
    }
    }
    function HideFOW()
    {
    `log("Hide FOW Called",, 'EUAimRollsVis');
    super.HideFOW();
    CurrentVO = class'PerfectInformation_TacticalVisualizationManager'.static.GetCurrentVisObs();
    // if (CurrentVO != none && class'Override_X2AbilityToHitCalc_StandardAim'.default.DIRTY_CINEMATIC)
    if (CurrentVO != none && false )
    {
    RaiseRollEvent();
    }
    }
    }
  • file deletion: PerfectInformation_TacticalVisualizationManager.uc (---r------)
    [4.1208][4.11062:11136](),[4.11136][4.9595:9595]()
    class PerfectInformation_TacticalVisualizationManager extends UIScreenListener;
    function UninitializeVisObs(PerfectInformation_Observer VOPanel)
    {
    if (VOPanel != none)
    {
    VOPanel.PendingNotifications.Length = 0;
    `XEVENTMGR.UnRegisterFromAllEvents(VOPanel);
    `XCOMVISUALIZATIONMGR.RemoveObserver(VOPanel);
    VOPanel.Remove();
    }
    }
    event OnInit(UIScreen Screen)
    {
    local PerfectInformation_Observer VisObs;
    VisObs = PerfectInformation_Observer(Screen.GetChildByName('EUAimRollPIListener', false));
    UninitializeVisObs(VisObs);
    VisObs = Screen.Spawn(class'PerfectInformation_Observer', Screen);
    VisObs.InitPanel('EUAimRollPIListener');
    VisObs.Hide();
    VisObs.InitObs();
    }
    static function PerfectInformation_Observer GetCurrentVisObs()
    {
    local UITacticalHUD tacHUD;
    local PerfectInformation_Observer VisObsR;
    if (`PRES == none)
    return none;
    tacHUD = UITacticalHUD(`PRES.ScreenStack.GetFirstInstanceOf(class'UITacticalHUD'));
    if (tacHUD == none)
    return none;
    VisObsR = PerfectInformation_Observer(tacHUD.GetChildByName('EUAimRollPIListener', false));
    `log("Found our VisObs", VisObsR != none, 'EUAimRollsVis');
    return VisObsR;
    }
    event OnRemoved(UIScreen Screen)
    {
    local PerfectInformation_Observer VisObs;
    VisObs = PerfectInformation_Observer(Screen.GetChildByName('EUAimRollPIListener'));
    UninitializeVisObs(VisObs);
    }
    defaultproperties
    {
    ScreenClass = class'UITacticalHUD';
    }
  • file deletion: PerfectInformation_Observer.uc (---r------)
    [4.1208][4.19385:19439](),[4.19439][4.11138:11138]()
    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);
  • file deletion: PerfectInformation_Notification.uc (---r------)
    [4.1208][4.20164:20222](),[4.20222][4.19441:19441]()
    class PerfectInformation_Notification extends Object;
    var array<String> Message;
    var int StateRef;
    var bool IsAlly;
    var int RollTarget;
    var XComGameState GameState;
    var bool Used;
    function EventListenerReturn DisplayThisEvent(Object EventData, Object EventSource, XComGameState NewGameState, Name EventID, Object CallbackData)
    {
    //`log("Notif received visualization event",, 'EUAimRollsVis');
    if ((!class'Override_X2AbilityToHitCalc_StandardAim'.default.ShowOnlyForAllies || IsAlly) && !Used)
    {
    Used = true;
    Notify();
    }
    `XEVENTMGR.UnRegisterFromAllEvents(EventSource);
    return ELR_NoInterrupt;
    }
    function Notify()
    {
    local string s;
    foreach Message(s)
    {
    `PRES.Notify(s);
    }
    }
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 63
    [4.917][4.917:944](),[4.944][4.944:966](),[4.966][4.24136:24168](),[4.24136][4.24136:24168]()
    local String TargetName;
    local bool IsAlien;
    local array<string> PINotify;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 115
    [4.26377][4.26377:26425]()
    IsAlien = UnitState.GetTeam() != eTeam_XCom;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 331
    [4.36129][4.36129:36172]()
    TargetName = TargetState.GetFullName();
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 340
    [4.36531][4.36531:36788]()
    PINotify.AddItem(UnitState.GetFullName()@"uses"@AbilityName@"against"@TargetName@"for"@RealHitChance$"%."
    @ default.ShowCriticalAndDodgeChances ? "Crit:" @ m_ShotBreakdown.ResultTable[eHit_Crit] $ "%, Dodge:"
    @ Round(DodgeChance) $ "%" : "");
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 341
    [4.36793][4.36793:37430](),[4.37430][4.37430:37435]()
    else
    {
    PINotify.AddItem(UnitState.GetFullName()@"uses"@AbilityName@"against"@TargetName@"for"
    @ RealHitChance$"%." $ (RealHitChance != TotalHitChance ? "(" $ TotalHitChance $ "%)" : "")
    @ default.ShowCriticalAndDodgeChances ? "Crit:" @ m_ShotBreakdown.ResultTable[eHit_Crit] $ "%, Dodge:"
    @ m_ShotBreakdown.ResultTable[eHit_Graze] $ "% Roll thresold:"
    @ m_ShotBreakdown.ResultTable[eHit_Success] $ "/"
    $ m_ShotBreakdown.ResultTable[eHit_Success] + m_ShotBreakdown.ResultTable[eHit_Crit] $ "/"
    $ TotalHitChance : "");
    }
    if (default.ShowDiceRolls)
    {
    PINotify.AddItem(DebugRollOutput);
    }
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 364
    [4.39414][3.0:71]()
    `log("CurrentPlayerTeam:"@CurrentPlayerTeam, true, 'XCom_HitRolls');
    [4.39414]
    [4.39414]
    `log("CurrentPlayerTeam:"@CurrentPlayerTeam, true, 'XCom_HitRolls');
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 369
    [4.39589][4.39589:39900]()
    //ADDED THIS PARAGRAPH!!!
    if (default.ShowChances && ModifiedHitChance != HitChance && !bIndirectFire && !bGuaranteedHit && TargetState != none)
    {
    PINotify.AddItem("Aim assist modified hit chance to"@ModifiedHitChance$"%, using previous hit roll.");
    }
    //END OF ADDED PARAGRAPH!!!
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 401
    [4.40902][4.40902:41177](),[4.41177][4.41177:41211]()
    if (default.ShowChances && ModifiedHitChance != HitChance && !bIndirectFire && !bGuaranteedHit && TargetState != none)
    {
    PINotify.AddItem("Aim assist modified hit chance to"@ModifiedHitChance$"%, using previous hit roll.");
    }
    //END OF ADDED PARAGRAPH!!!
    //ADDED THIS PARAGRAPH!!!
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 427
    [4.41931][4.1055:1141](),[4.1141][4.42095:42097](),[4.42095][4.42095:42097]()
    NotifyEventList(kAbility, kTarget, PINotify, !IsAlien); //ADDED THIS LINE!!!
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 443
    [2.1275][2.1275:1462]()
    //ADDED THIS LINE!!!
    if (default.ShowChances && default.ShowDiceRolls) PINotify.AddItem(UnitState.GetFullName()@"used an effect to change hit result to"@ ChangeResult);
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 455
    [2.2014][4.42231:42233](),[4.42231][4.42231:42233](),[4.42233][2.2015:2200]()
    //ADDED THIS LINE!!!
    if (default.ShowChances && default.ShowDiceRolls) PINotify.AddItem(UnitState.GetFullName()@"used an effect to change hit result to"@ ChangeResult);
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 489
    [4.43466][4.43466:43997](),[4.43997][4.43997:44000](),[4.44000][4.44000:44031](),[4.44031][4.44031:44035](),[4.44035][4.44035:44037]()
    //ADDED THIS PARAGRAPH!!!
    static function NotifyEventList(XComGameState_Ability kAbility, AvailableTarget kTarget, array<String> message, optional bool IsXCOM=true)
    {
    local PerfectInformation_Notification Notification;
    Notification = new class'PerfectInformation_Notification';
    Notification.StateRef = kAbility.ObjectID;
    Notification.Message = message;
    Notification.IsAlly = IsXCOM;
    Notification.RollTarget = kTarget.PrimaryTarget.ObjectID;
    `XEVENTMGR.TriggerEvent('RequestNotifyOnVisualization', Notification);
    }
    //END OF ADDED PARAGRAPH!!!