public void CalculateAndExecuteBehaviors() { Move mover; if (movers.Count >= MinGroupSize) { averageCollisionSize = 0; groupPosition = Vector2d.zero; for (int i = 0; i < movers.Count; i++) { mover = movers [i]; groupPosition += mover.Position; averageCollisionSize += mover.CollisionSize; } groupPosition /= movers.Count; averageCollisionSize /= movers.Count; long biggestSqrDistance = 0; for (int i = 0; i < movers.Count; i++) { long currentSqrDistance = movers [i].Position.SqrDistance(groupPosition.x, groupPosition.y); if (currentSqrDistance > biggestSqrDistance) { long currentDistance = FixedMath.Sqrt(currentSqrDistance); /* * DistDif = currentDistance - Radius; * if (DistDif > MaximumDistDif * MoversCount / 128) { * ExecuteGroupIndividualMove (); * return; * }*/ biggestSqrDistance = currentSqrDistance; radius = currentDistance; } } if (radius == 0) { ExecuteGroupIndividualMove(); return; } long expectedSize = averageCollisionSize.Mul(averageCollisionSize).Mul(FixedMath.One * 2).Mul(movers.Count); long groupSize = radius.Mul(radius); if (groupSize > expectedSize || groupPosition.FastDistance(Destination.x, Destination.y) < (radius * radius)) { ExecuteGroupIndividualMove(); return; } ExecuteGroupMove(); } else { ExecuteIndividualMove(); } }