Ejemplo n.º 1
0
    private bool ExecuteBattleAction(float battleActionContextRandomNumber, BattleAction battleAction, BattleEffects battleEffects, BattleSimulationUnit initiator, BattleSimulationUnit activator, BattleSimulationTarget[] currentTargets, bool immediate)
    {
        if (battleAction == null)
        {
            throw new ArgumentNullException("battleAction");
        }
        if (battleEffects == null)
        {
            throw new ArgumentNullException("battleEffects");
        }
        if (!battleAction.CanBeAppliedByDeadUnit && activator.GetPropertyValue(SimulationProperties.Health) <= 0f)
        {
            return(false);
        }
        Diagnostics.Assert(this.Simulation != null && this.Simulation.BattleSimulationRandom != null);
        double num  = this.Simulation.BattleSimulationRandom.NextDouble();
        double num2 = (double)battleEffects.GetProbability(initiator);

        if (num >= num2)
        {
            return(false);
        }
        BattleSimulationTarget[] array             = this.Simulation.FilterTargets(battleEffects.TargetsFilter, initiator, currentTargets);
        BattleEffectsArea        battleEffectsArea = battleEffects as BattleEffectsArea;

        if (battleEffectsArea == null)
        {
            BattleActionContext battleActionContext = new BattleActionContext(this, battleAction, battleEffects, initiator, activator, array, battleActionContextRandomNumber);
            this.ExecuteBattleAction(battleActionContext, immediate);
        }
        else
        {
            this.ExecuteAOEBattleAction(battleActionContextRandomNumber, battleAction, battleEffectsArea, initiator, activator, array, immediate);
        }
        return(true);
    }
Ejemplo n.º 2
0
    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;
                }
            }
        }
    }