private void ChangeSwarmBots(SwarmFormation formation) { ChangeSwarmBotsSprtRemoveAll(); if (formation == SwarmFormation.None) { _swarmbotFormation = SwarmFormation.None; return; } double startAngle, stepAngle; // 0 is straight in front of the ship int numBots; double distanceMult; switch (formation) { case SwarmFormation.AllFront: #region AllFront startAngle = 0d; stepAngle = 360d; //numBots = 20; numBots = _numSwarmbots; distanceMult = 8d; #endregion break; case SwarmFormation.AllRear: #region AllRear startAngle = 180d; stepAngle = 360d; //numBots = 20; numBots = _numSwarmbots; distanceMult = 8d; #endregion break; case SwarmFormation.Triangle: #region Triangle startAngle = 0d; stepAngle = 120d; //numBots = 10; numBots = _numSwarmbots / 3; if (numBots % 3 != 0 || numBots == 0) { numBots++; } distanceMult = 9d; #endregion break; case SwarmFormation.ReverseTriangle: #region ReverseTriangle startAngle = 180d; stepAngle = 120d; //numBots = 10; numBots = _numSwarmbots / 3; if (numBots % 3 != 0 || numBots == 0) { numBots++; } distanceMult = 9d; #endregion break; case SwarmFormation.Pentagon: #region Pentagon startAngle = 0d; stepAngle = 72d; //numBots = 7; numBots = _numSwarmbots / 5; if (numBots % 5 != 0 || numBots == 0) { numBots++; } distanceMult = 9d; #endregion break; case SwarmFormation.ReversePentagon: #region ReversePentagon startAngle = 180d; stepAngle = 72d; //numBots = 7; numBots = _numSwarmbots / 5; if (numBots % 5 != 0 || numBots == 0) { numBots++; } distanceMult = 9d; #endregion break; case SwarmFormation.SurroundShip: #region SurroundShip startAngle = 0d; stepAngle = 360d; //numBots = 30; numBots = _numSwarmbots; distanceMult = 0d; #endregion break; default: throw new ApplicationException("Unknown SwarmFormation: " + formation.ToString()); } // Figure out how far away from the ship the bots should be double chaseOffsetDistance = (_radiusX + _radiusY) / 2d; chaseOffsetDistance *= distanceMult; // Build the swarms double angle = startAngle; while (angle < startAngle + 360d) { Vector3D chasePoint = new Vector3D(0, chaseOffsetDistance, 0); chasePoint = chasePoint.GetRotatedVector(new Vector3D(0, 0, 1), angle); _swarmBots.Add(ChangeSwarmBotsSprtSwarm(numBots, chasePoint)); _swarmbotChasePoints.Add(chasePoint.ToPoint()); PointVisualizer chasePointSprite = new PointVisualizer(_map.Viewport, _sharedVisuals); chasePointSprite.PositionRadius = .1d; chasePointSprite.VelocityAccelerationLengthMultiplier = .05d; chasePointSprite.ShowPosition = _showDebugVisuals; chasePointSprite.ShowVelocity = _showDebugVisuals; chasePointSprite.ShowAcceleration = _showDebugVisuals && DEBUGSHOWSACCELERATION; _swarmbotChasePointSprites.Add(chasePointSprite); angle += stepAngle; } _swarmbotFormation = formation; }