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