public void ReportInstruction(IUnitReportInstruction reportInstruction)
    {
        if (reportInstruction == null)
        {
            throw new ArgumentNullException("reportInstruction");
        }
        Diagnostics.Assert(this.reportInstructions != null);
        BattleActionUpdateInstruction battleActionUpdateInstruction = reportInstruction as BattleActionUpdateInstruction;

        if (battleActionUpdateInstruction != null)
        {
            if (this.reportCopy != null)
            {
                this.reportCopy.RemoveAll((IUnitReportInstruction instruction) => instruction.UnitGUID == reportInstruction.UnitGUID && instruction is BattleActionUpdateInstruction && (instruction as BattleActionUpdateInstruction).BattleActionName == battleActionUpdateInstruction.BattleActionName);
            }
            this.reportInstructions.RemoveAll((IUnitReportInstruction instruction) => instruction.UnitGUID == reportInstruction.UnitGUID && instruction is BattleActionUpdateInstruction && (instruction as BattleActionUpdateInstruction).BattleActionName == battleActionUpdateInstruction.BattleActionName);
        }
        BattleEffectUpdateInstruction battleEffectUpdateInstruction = reportInstruction as BattleEffectUpdateInstruction;

        if (battleEffectUpdateInstruction != null && !battleEffectUpdateInstruction.IsCumulable)
        {
            if (this.reportCopy != null)
            {
                this.reportCopy.RemoveAll((IUnitReportInstruction instruction) => instruction.UnitGUID == reportInstruction.UnitGUID && instruction is BattleEffectUpdateInstruction && (instruction as BattleEffectUpdateInstruction).BattleEffectName == battleEffectUpdateInstruction.BattleEffectName && (instruction as BattleEffectUpdateInstruction).TargetGUID == battleEffectUpdateInstruction.TargetGUID && (instruction as BattleEffectUpdateInstruction).TargetWorldPosition == battleEffectUpdateInstruction.TargetWorldPosition);
            }
            this.reportInstructions.RemoveAll((IUnitReportInstruction instruction) => instruction.UnitGUID == reportInstruction.UnitGUID && instruction is BattleEffectUpdateInstruction && (instruction as BattleEffectUpdateInstruction).BattleEffectName == battleEffectUpdateInstruction.BattleEffectName && (instruction as BattleEffectUpdateInstruction).TargetGUID == battleEffectUpdateInstruction.TargetGUID && (instruction as BattleEffectUpdateInstruction).TargetWorldPosition == battleEffectUpdateInstruction.TargetWorldPosition);
        }
        if (this.reportCopy != null)
        {
            this.reportCopy.Add(reportInstruction);
        }
        this.reportInstructions.Add(reportInstruction);
    }
 public void DoReportInstructions(RoundReport currentReport, bool postRound = false)
 {
     if (currentReport == null)
     {
         throw new ArgumentNullException("currentReport");
     }
     Diagnostics.Assert(this.reportInstructions != null);
     Diagnostics.Assert(this.Simulation != null);
     for (int i = 0; i < this.reportInstructions.Count; i++)
     {
         IUnitReportInstruction unitReportInstruction = this.reportInstructions[i];
         Diagnostics.Assert(unitReportInstruction != null);
         BattleSimulationUnit battleUnit = this.Simulation.GetBattleUnit(unitReportInstruction.UnitGUID);
         currentReport.DoReportInstruction(battleUnit, unitReportInstruction, postRound);
     }
     this.reportInstructions.Clear();
 }
 public override Alteration.Response HandleEvent(StaticString eventName, params object[] parameters)
 {
     if (eventName == Alteration.Events.BattleEnd)
     {
         this.HideHealthStatus();
     }
     else if (eventName == Alteration.Events.RoundStart || eventName == Alteration.Events.TargetingPhaseEnd || eventName == Alteration.Events.DeploymentEnd)
     {
         if (!this.WorldBattleUnit.EncounterUnit.IsOnBattlefield)
         {
             return(Alteration.Response.Pass);
         }
         if (this.isHealthStatusDisplayed)
         {
             return(Alteration.Response.Pass);
         }
         this.battleHealthStatus.SetMaxHealth(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.MaximumHealth));
         this.battleHealthStatus.SetCurrentHealth(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.Health));
         this.battleHealthStatus.SetCurrentAttackingHitInfo(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.AttackingHitInfo));
         this.battleHealthStatus.SetCurrentMoral(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.BattleMorale));
         this.battleHealthStatus.SetMaxArmor(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.MaximumArmor));
         this.battleHealthStatus.SetCurrentArmor(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.Armor));
         if (this.WorldBattleUnit.Unit.Garrison.Empire != null)
         {
             Color factionColor = this.WorldBattleUnit.Unit.Garrison.Empire.Color;
             IPlayerControllerRepositoryService service = Services.GetService <IGameService>().Game.Services.GetService <IPlayerControllerRepositoryService>();
             if (service.ActivePlayerController != null && service.ActivePlayerController.Empire != null)
             {
                 if (service.ActivePlayerController.Empire.Index != this.WorldBattleUnit.Unit.Garrison.Empire.Index)
                 {
                     Army army = this.WorldBattleUnit.Unit.Garrison as Army;
                     if (army != null && army.IsPrivateers)
                     {
                         factionColor = global::Game.PrivateersColor;
                     }
                 }
                 else
                 {
                     this.battleHealthStatus.AddRemoveAlteration(this.WorldBattleUnit.EncounterUnit.Strategy, true, -1f, true);
                     this.isStrategyDisplayed = true;
                 }
             }
             this.battleHealthStatus.SetFactionColor(factionColor);
         }
         if (!this.WorldBattleUnit.Dead)
         {
             this.ShowHealthStatus();
         }
     }
     else if (eventName == Alteration.Events.UnitDead)
     {
         this.HideHealthStatus();
     }
     else if (eventName == Alteration.Events.UnitRevived)
     {
         this.ShowHealthStatus();
     }
     else if (eventName == Alteration.Events.AlterationUnitStatChange)
     {
         if (parameters == null || parameters.Length < 4)
         {
             return(Alteration.Response.Pass);
         }
         StaticString x   = (StaticString)parameters[0];
         float        num = (float)parameters[1];
         Mathf.Abs(num);
         bool critical = (bool)parameters[3];
         if (x == SimulationProperties.Health)
         {
             this.battleHealthStatus.ChangeHealth(num, critical);
         }
         else if (x == SimulationProperties.Armor)
         {
             if (num > 0f)
             {
                 this.battleHealthStatus.SetMaxArmor(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.MaximumArmor));
                 this.battleHealthStatus.SetCurrentArmor(this.WorldBattleUnit.EncounterUnit.GetPropertyValue(SimulationProperties.Armor));
             }
             this.battleHealthStatus.ChangeArmor(num, critical);
         }
         else if (x == SimulationProperties.AttackingHitInfo)
         {
             this.battleHealthStatus.ChangeAttackingHitInfo(num);
         }
         else if (x == SimulationProperties.BattleMorale)
         {
             this.battleHealthStatus.ChangeMoral(num, critical);
         }
     }
     else if (eventName == Alteration_UnitStatChange.EventAltitude)
     {
         if (parameters == null || parameters.Length < 1)
         {
             return(Alteration.Response.Pass);
         }
         if (!this.unit.SimulationObject.Tags.Contains(DownloadableContent16.SeafaringUnit))
         {
             bool  flag = (bool)parameters[0];
             float altitudeDifference = 0f;
             if (flag)
             {
                 altitudeDifference = (float)parameters[1];
             }
             this.DisplayAltitudeBonus(flag, altitudeDifference);
         }
     }
     else if (eventName == Alteration.Events.AlterationStatusFeedback)
     {
         if (parameters.Length < 1)
         {
             return(Alteration.Response.Pass);
         }
         bool  add      = true;
         float duration = -1f;
         IUnitReportInstruction unitReportInstruction = null;
         string alterationName = (string)parameters[0];
         if (parameters.Length >= 2)
         {
             if (parameters[1] is bool)
             {
                 add = (bool)parameters[1];
                 if (parameters.Length >= 3)
                 {
                     if (parameters[2] is float)
                     {
                         duration = (float)parameters[2];
                         if (parameters.Length >= 4 && parameters[3] is IUnitReportInstruction)
                         {
                             unitReportInstruction = (IUnitReportInstruction)parameters[3];
                         }
                     }
                     else if (parameters[2] is IUnitReportInstruction)
                     {
                         unitReportInstruction = (IUnitReportInstruction)parameters[2];
                     }
                 }
             }
             else if (parameters[1] is float)
             {
                 duration = (float)parameters[1];
                 if (parameters.Length >= 3 && parameters[2] is IUnitReportInstruction)
                 {
                     unitReportInstruction = (IUnitReportInstruction)parameters[2];
                 }
             }
             else if (parameters[1] is IUnitReportInstruction)
             {
                 unitReportInstruction = (IUnitReportInstruction)parameters[1];
             }
         }
         bool isCumulable = true;
         if (unitReportInstruction != null && unitReportInstruction is BattleEffectUpdateInstruction)
         {
             isCumulable = (unitReportInstruction as BattleEffectUpdateInstruction).IsCumulable;
         }
         this.battleHealthStatus.AddRemoveAlteration(alterationName, add, duration, isCumulable);
     }
     else if (eventName == Alteration.Events.AlterationUnitMove)
     {
         if (parameters.Length < 1)
         {
             return(Alteration.Response.Pass);
         }
         if ((int)parameters[0] == 0)
         {
         }
     }
     else if (eventName == Alteration.Events.UnitStrategyChanged)
     {
         if (!this.isStrategyDisplayed)
         {
             return(Alteration.Response.Pass);
         }
         if (parameters.Length < 2)
         {
             return(Alteration.Response.Pass);
         }
         StaticString x2           = (StaticString)parameters[0];
         StaticString staticString = (StaticString)parameters[1];
         if (x2 == staticString)
         {
             return(Alteration.Response.Pass);
         }
         if (x2 != null)
         {
             this.battleHealthStatus.AddRemoveAlteration(x2, false, -1f, true);
         }
         if (staticString != null)
         {
             this.battleHealthStatus.AddRemoveAlteration(staticString, true, -1f, true);
         }
     }
     else if (eventName == Alteration.Events.UnitPotentialTarget)
     {
         if (parameters.Length < 3)
         {
             return(Alteration.Response.Pass);
         }
         bool add2 = (bool)parameters[0];
         UnitAvailableTarget.TargetAccessibilityType targetAccessibilityType = (UnitAvailableTarget.TargetAccessibilityType)((int)parameters[1]);
         bool   flag2           = (bool)parameters[2];
         string alterationName2 = "AvailableTarget" + targetAccessibilityType.ToString() + ((!flag2) ? string.Empty : "Ally");
         this.battleHealthStatus.AddRemoveAlteration(alterationName2, add2, -1f, true);
     }
     else if (eventName == Alteration.Events.UnitPotentialOpportunityTarget)
     {
         if (parameters.Length < 2)
         {
             return(Alteration.Response.Pass);
         }
         bool   add3            = (bool)parameters[0];
         bool   flag3           = (bool)parameters[1];
         string alterationName3 = "AvailableOpportunityTarget" + ((!flag3) ? string.Empty : "Ally");
         this.battleHealthStatus.AddRemoveAlteration(alterationName3, add3, -1f, true);
     }
     return(Alteration.Response.Pass);
 }