internal ArrangementOrder(ArrangementOrder.ArrangementOrderEnum orderEnum) { this.OrderEnum = orderEnum; this._walkRestriction = new float?(); switch (this.OrderEnum) { case ArrangementOrder.ArrangementOrderEnum.Circle: this._runRestriction = new float?(0.5f); break; case ArrangementOrder.ArrangementOrderEnum.Line: this._runRestriction = new float?(0.8f); break; case ArrangementOrder.ArrangementOrderEnum.Loose: case ArrangementOrder.ArrangementOrderEnum.Scatter: case ArrangementOrder.ArrangementOrderEnum.Skein: this._runRestriction = new float?(0.9f); break; case ArrangementOrder.ArrangementOrderEnum.ShieldWall: case ArrangementOrder.ArrangementOrderEnum.Square: this._runRestriction = new float?(0.3f); break; default: this._runRestriction = new float?(1f); break; } this._unitSpacing = ArrangementOrder.GetUnitSpacingOf(this.OrderEnum); this.tickTimer = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f); }
internal void OnApply(Formation formation) { formation.SetPositioning(unitSpacing: new int?(this.GetUnitSpacing())); this.Rearrange(formation); if (this.OrderEnum == ArrangementOrder.ArrangementOrderEnum.Scatter) { this.TickOccasionally(formation); } ArrangementOrder.ArrangementOrderEnum orderEnum = this.OrderEnum; formation.ApplyActionOnEachUnit((Action <Agent>)(agent => { if (agent.IsAIControlled) { Agent.UsageDirection shieldDirectionOfUnit = ArrangementOrder.GetShieldDirectionOfUnit(formation, agent, orderEnum); agent.EnforceShieldUsage(shieldDirectionOfUnit); } agent.UpdateAgentProperties(); })); if (formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.Charge && formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.ChargeToTarget) { if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Circle && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.ShieldWall && (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Square && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column)) { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefaultMoveBehaviorValues)); } else if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column) { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefensiveArrangementMoveBehaviorValues)); } else { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetFollowBehaviorValues)); } } this.tickTimer = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f); }
protected internal override void TickOccasionally() { if (this.formation.IsInfantry()) { bool flag = this.formation.QuerySystem.ClosestEnemyFormation != null && (this.formation.QuerySystem.IsUnderRangedAttack || (double)this.formation.QuerySystem.AveragePosition.DistanceSquared(this.CurrentOrder.GetPosition(this.formation).AsVec2) < 25.0 + (this._isInShieldWallDistance ? 75.0 : 0.0)) && (double)this.formation.QuerySystem.AveragePosition.DistanceSquared(this.formation.QuerySystem.ClosestEnemyFormation.MedianPosition.AsVec2) > 100.0 - (this._isInShieldWallDistance ? 75.0 : 0.0); if (flag != this._isInShieldWallDistance) { this._isInShieldWallDistance = flag; if (this._isInShieldWallDistance) { ArrangementOrder arrangementOrder = this.formation.QuerySystem.HasShield ? ArrangementOrder.ArrangementOrderShieldWall : ArrangementOrder.ArrangementOrderLoose; if (this.formation.ArrangementOrder != arrangementOrder) { this.formation.ArrangementOrder = arrangementOrder; this._switchedToShieldWallRecently = true; this._switchedToShieldWallTimer.Reset(Mission.Current.Time, 5f); } } else if (!(this.formation.ArrangementOrder == ArrangementOrder.ArrangementOrderLine)) { this.formation.ArrangementOrder = ArrangementOrder.ArrangementOrderLine; } } } this.CalculateCurrentOrder(); this.formation.MovementOrder = this.CurrentOrder; this.formation.FacingOrder = this.CurrentFacingOrder; }
protected override void CalculateCurrentOrder() { switch (this._behaviourState) { case BehaviorAssaultWalls.BehaviorState.Deciding: this.CurrentOrder = this._stopOrder; break; case BehaviorAssaultWalls.BehaviorState.ClimbWall: this.CurrentOrder = this._wallSegmentMoveOrder; this.CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(-this._wallSegment.MiddleFrame.Rotation.f.AsVec2.Normalized()); this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine; break; case BehaviorAssaultWalls.BehaviorState.AttackEntity: if (!this._teamAISiegeComponent.OuterGate.IsGateOpen) { this.CurrentOrder = this._attackEntityOrderOuterGate; } else { this.CurrentOrder = this._attackEntityOrderInnerGate; } this.CurrentFacingOrder = FacingOrder.FacingOrderLookAtEnemy; this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine; break; case BehaviorAssaultWalls.BehaviorState.TakeControl: if (this.formation.QuerySystem.ClosestEnemyFormation != null) { this.CurrentOrder = MovementOrder.MovementOrderChargeToTarget(this.formation.QuerySystem.ClosestEnemyFormation.Formation); } else { this.CurrentOrder = MovementOrder.MovementOrderCharge; } this.CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(-this._wallSegment.MiddleFrame.Rotation.f.AsVec2.Normalized()); this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine; break; case BehaviorAssaultWalls.BehaviorState.MoveToGate: this.CurrentOrder = this._castleGateMoveOrder; this.CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(-this._innerGate.MiddleFrame.Rotation.f.AsVec2.Normalized()); this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine; break; case BehaviorAssaultWalls.BehaviorState.Charging: this.CurrentOrder = this._chargeOrder; this.CurrentFacingOrder = FacingOrder.FacingOrderLookAtEnemy; this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLoose; break; case BehaviorAssaultWalls.BehaviorState.Stop: this.CurrentOrder = this._stopOrder; break; } }
internal void RearrangeAux(Formation formation, bool isDirectly) { float num = Math.Max(1f, Math.Max(formation.Depth, formation.Width) * 0.8f); float lengthSquared = (formation.CurrentPosition - formation.OrderPosition.AsVec2).LengthSquared; if (!isDirectly && (double)lengthSquared < (double)num * (double)num) { ArrangementOrder.TransposeLineFormation(formation); formation.OnTick += new Action <Formation>(formation.TickForColumnArrangementInitialPositioning); } else { formation.OnTick -= new Action <Formation>(formation.TickForColumnArrangementInitialPositioning); formation.ReferencePosition = new Vec2?(); formation.Rearrange(this.GetArrangement(formation)); } }
private static IEnumerable <StrategicArea> CreateStrategicAreas( Mission mission, int count, WorldPosition center, float distance, WorldPosition target, float width, int capacity, BattleSideEnum side) { Scene scene = mission.Scene; float distanceMultiplied = distance * 0.7f; Func <WorldPosition> func1 = (Func <WorldPosition>)(() => { WorldPosition worldPosition = center; float rotation = (float)((double)MBRandom.RandomFloat * 3.14159274101257 * 2.0); worldPosition.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation) * distanceMultiplied); return(worldPosition); }); WorldPosition[] worldPositionArray = ((Func <WorldPosition[]>)(() => { float rotation = (float)((double)MBRandom.RandomFloat * 3.14159274101257 * 2.0); switch (count) { case 2: WorldPosition worldPosition1 = center; worldPosition1.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation) * distanceMultiplied); WorldPosition worldPosition2 = center; worldPosition2.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 3.141593f) * distanceMultiplied); return(new WorldPosition[2] { worldPosition1, worldPosition2 }); case 3: WorldPosition worldPosition3 = center; worldPosition3.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 0.0f) * distanceMultiplied); WorldPosition worldPosition4 = center; worldPosition4.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 2.094395f) * distanceMultiplied); WorldPosition worldPosition5 = center; worldPosition5.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 4.18879f) * distanceMultiplied); return(new WorldPosition[3] { worldPosition3, worldPosition4, worldPosition5 }); case 4: WorldPosition worldPosition6 = center; worldPosition6.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 0.0f) * distanceMultiplied); WorldPosition worldPosition7 = center; worldPosition7.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 1.570796f) * distanceMultiplied); WorldPosition worldPosition8 = center; worldPosition8.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 3.141593f) * distanceMultiplied); WorldPosition worldPosition9 = center; worldPosition9.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 4.712389f) * distanceMultiplied); return(new WorldPosition[4] { worldPosition6, worldPosition7, worldPosition8, worldPosition9 }); default: return(new WorldPosition[0]); } }))(); List <WorldPosition> positions = new List <WorldPosition>(); foreach (WorldPosition worldPosition in worldPositionArray) { WorldPosition center1 = worldPosition; WorldPosition position = mission.FindPositionWithBiggestSlopeTowardsDirectionInSquare(ref center1, distance * 0.25f, ref target); Func <WorldPosition, bool> func2 = (Func <WorldPosition, bool>)(p => { float pathDistance; if (positions.Any <WorldPosition>((Func <WorldPosition, bool>)(wp => (double)wp.AsVec2.DistanceSquared(p.AsVec2) < 1.0)) || (!scene.GetPathDistanceBetweenPositions(ref center, ref p, 0.0f, out pathDistance) ? 0 : ((double)pathDistance < (double)center.AsVec2.Distance(p.AsVec2) * 2.0 ? 1 : 0)) == 0) { return(false); } positions.Add(position); return(true); }); if (!func2(position) && !func2(worldPosition)) { int num = 0; do { ; }while (num++ < 10 && !func2(func1())); if (num >= 10) { positions.Add(center); } } } Vec2 direction = (target.AsVec2 - center.AsVec2).Normalized(); foreach (WorldPosition position in positions) { yield return(ArrangementOrder.CreateStrategicArea(scene, position, direction, width, capacity, side)); } }