Ejemplo n.º 1
0
        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));
            }
        }