public void ExecuteWaitingActions(BattleSimulation battleSimulation, RoundReport roundReport)
    {
        BattleSimulationUnit battleSimulationUnit = this.Units.FirstOrDefault((BattleSimulationUnit match) => match.Position.IsValid);

        if (battleSimulationUnit == null)
        {
            return;
        }
        List <IUnitReportInstruction> list = new List <IUnitReportInstruction>();

        for (int i = 0; i < this.WaitingArmyActions.Count; i++)
        {
            int num = BattleSimulation.UnitStateNextID++;
            BattleArmyAction           battleArmyAction           = this.WaitingArmyActions[i];
            ContenderActionInstruction contenderActionInstruction = battleArmyAction.BuildContenderActionInstruction(this.ContenderGUID, num, battleSimulationUnit.UnitGUID);
            WorldOrientation           orientation = this.Contender.WorldOrientation;
            if (contenderActionInstruction is ContenderActionSpellInstruction)
            {
                orientation = this.Contender.Deployment.DeploymentArea.Forward;
            }
            if (contenderActionInstruction != null)
            {
                contenderActionInstruction.AddEffectPosition(battleArmyAction.TargetPosition);
                BattleSimulationTarget[] currentTargets = new BattleSimulationTarget[]
                {
                    new BattleSimulationTarget(battleArmyAction.TargetPosition)
                };
                for (int j = 0; j < battleArmyAction.BattleActions.Count; j++)
                {
                    BattleAction battleAction = battleArmyAction.BattleActions[j];
                    for (int k = 0; k < battleAction.BattleEffects.Length; k++)
                    {
                        BattleEffects battleEffects = battleAction.BattleEffects[k];
                        if (battleEffects is BattleEffectsArea)
                        {
                            IPathfindingArea area = (battleEffects as BattleEffectsArea).GetArea(battleArmyAction.TargetPosition, orientation, null, battleSimulation.WorldParameters, battleSimulation.BattleZone, battleSimulationUnit);
                            if (area != null)
                            {
                                WorldPosition[] worldPositions = area.GetWorldPositions(battleSimulation.WorldParameters);
                                if (worldPositions != null)
                                {
                                    contenderActionInstruction.AddEffectArea(worldPositions);
                                }
                            }
                        }
                    }
                    WorldOrientation orientation2 = battleSimulationUnit.Orientation;
                    battleSimulationUnit.Orientation = orientation;
                    battleSimulation.BattleActionController.ExecuteBattleAction(battleAction, battleAction.BattleEffects, battleSimulationUnit, currentTargets, true, list);
                    battleSimulationUnit.Orientation = orientation2;
                    battleSimulation.CheckUnitsDeath(num);
                }
                for (int l = 0; l < list.Count; l++)
                {
                    contenderActionInstruction.AddReportInstruction(list[l]);
                }
                roundReport.ReportInstruction(this.ContenderGUID, contenderActionInstruction);
            }
        }
        this.ClearWaitingActions();
    }
    private void ExecuteAOEBattleAction(float battleActionContextRandomNumber, BattleAction battleAction, BattleEffectsArea battleEffectsArea, BattleSimulationUnit initiator, BattleSimulationUnit activator, BattleSimulationTarget[] aoeCenterTargets, bool immediate)
    {
        if (battleAction == null)
        {
            throw new ArgumentNullException("battleAction");
        }
        if (battleEffectsArea == null)
        {
            throw new ArgumentNullException("battleEffectsArea");
        }
        if (aoeCenterTargets == null || aoeCenterTargets.Length == 0)
        {
            return;
        }
        List <BattleSimulationTarget> list = new List <BattleSimulationTarget>();

        foreach (BattleSimulationTarget battleSimulationTarget3 in aoeCenterTargets)
        {
            WorldOrientation worldOrientation = (battleSimulationTarget3.Unit == null) ? WorldOrientation.Undefined : battleSimulationTarget3.Unit.Orientation;
            if (battleEffectsArea.InitiatorAsCenter || worldOrientation == WorldOrientation.Undefined)
            {
                worldOrientation = ((initiator == null) ? worldOrientation : initiator.Orientation);
            }
            List <WorldPosition> list2 = null;
            if (battleEffectsArea.Type == BattleEffectsArea.AreaType.Chain)
            {
                Diagnostics.Assert(this.Simulation != null);
                BattleSimulationTarget[] array = null;
                if (battleSimulationTarget3.Unit != null)
                {
                    array = this.Simulation.FilterTargets(BattleEffects.TargetFlags.SameGroup, battleSimulationTarget3.Unit, null);
                }
                if (array != null && array.Length != 0)
                {
                    list2 = new List <WorldPosition>(array.Length);
                    list2.AddRange(from battleSimulationTarget in array
                                   select battleSimulationTarget.DynamicPosition);
                }
            }
            SimulationObject context = null;
            if (initiator != null)
            {
                context = initiator.SimulationObject;
            }
            Diagnostics.Assert(this.Simulation != null);
            WorldPosition dynamicPosition = battleSimulationTarget3.DynamicPosition;
            if (battleEffectsArea.InitiatorAsCenter)
            {
                dynamicPosition = new BattleSimulationTarget(initiator).DynamicPosition;
            }
            IPathfindingArea area = battleEffectsArea.GetArea(dynamicPosition, worldOrientation, list2, this.Simulation.WorldParameters, this.Simulation.BattleZone, context);
            if (area == null)
            {
                Diagnostics.LogError("Unknown area of effect {0}, the effect will be applied on the filtered unit.", new object[]
                {
                    battleEffectsArea.Type
                });
            }
            else
            {
                WorldPosition[] worldPositions = area.GetWorldPositions(this.Simulation.WorldParameters);
                if (worldPositions == null)
                {
                    Diagnostics.LogError("Can't get area of effect positions.");
                }
                else
                {
                    list.Clear();
                    for (int j = 0; j < worldPositions.Length; j++)
                    {
                        BattleSimulationUnit unitFromPosition = this.Simulation.GetUnitFromPosition(worldPositions[j], false);
                        if (unitFromPosition != null)
                        {
                            BattleSimulationTarget battleSimulationTarget2 = new BattleSimulationTarget(unitFromPosition);
                            if (battleEffectsArea.AvoidCastingUnit)
                            {
                                bool flag = false;
                                for (int k = 0; k < aoeCenterTargets.Length; k++)
                                {
                                    if (aoeCenterTargets[k].DynamicPosition == battleSimulationTarget2.DynamicPosition)
                                    {
                                        if (battleEffectsArea.Type != BattleEffectsArea.AreaType.Chain)
                                        {
                                            flag = true;
                                            break;
                                        }
                                        battleSimulationTarget2.Ignore = true;
                                    }
                                }
                                if (flag)
                                {
                                    goto IL_225;
                                }
                            }
                            list.Add(battleSimulationTarget2);
                        }
                        IL_225 :;
                    }
                    BattleActionAOEInstruction battleActionAOEInstruction = new BattleActionAOEInstruction(initiator.UnitGUID, battleEffectsArea.RealizationVisualEffectName);
                    battleActionAOEInstruction.RealizationApplicationMethod = battleEffectsArea.RealizationApplicationMethod;
                    battleActionAOEInstruction.RealizationApplicationData   = battleEffectsArea.RealizationApplicationData;
                    this.ReportInstruction(battleActionAOEInstruction);
                    List <IUnitReportInstruction> list3 = this.reportCopy;
                    this.reportCopy = battleActionAOEInstruction.ReportInstructions;
                    Diagnostics.Assert(battleEffectsArea.BattleEffects != null);
                    for (int l = 0; l < battleEffectsArea.BattleEffects.Length; l++)
                    {
                        BattleEffects battleEffects = battleEffectsArea.BattleEffects[l];
                        this.ExecuteBattleAction(battleActionContextRandomNumber, battleAction, battleEffects, initiator, activator, list.ToArray(), immediate);
                    }
                    this.reportCopy = list3;
                }
            }
        }
    }
    public IPathfindingArea GetArea(WorldPosition center, WorldOrientation orientation, IEnumerable <WorldPosition> interactivePositions, WorldParameters worldParameters, IPathfindingArea battleArea, SimulationObject context)
    {
        switch (this.Type)
        {
        case BattleEffectsArea.AreaType.Circle:
        {
            int distance = this.GetDistance(context);
            return(new WorldCircle(center, distance));
        }

        case BattleEffectsArea.AreaType.Cone:
        {
            int distance2 = this.GetDistance(context);
            return(new WorldCone(center, distance2, orientation));
        }

        case BattleEffectsArea.AreaType.Chain:
        {
            int distance3 = this.GetDistance(context);
            return(new BattleAreaChain(center, interactivePositions, distance3, worldParameters));
        }

        case BattleEffectsArea.AreaType.Line:
        {
            int distance4 = this.GetDistance(context);
            return(new WorldLine(center, distance4, orientation));
        }

        case BattleEffectsArea.AreaType.BattleGround:
            return(battleArea);

        default:
            throw new NotImplementedException();
        }
    }