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); }
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; } } } }