示例#1
0
 private bool CheckNotInNoSpawnCoords(Coordinates coordinates)
 {
     if (SituationDB.NoSpawnCoordinates is null)
     {
         return(true);
     }
     return(!ShapeManager.IsPosValid(coordinates, SituationDB.NoSpawnCoordinates));
 }
示例#2
0
        private static Tuple <Coordinates, Coordinates> GetSpawnAndDestination(
            UnitMaker unitMaker, MissionTemplateRecord template, DBEntryTheater theaterDB,
            List <Coordinates> usedCoordinates, Coordinates landbaseCoordinates, Coordinates objectivesCenter,
            double carrierPathDeg)
        {
            var         travelMinMax            = new MinMaxD(Database.Instance.Common.CarrierGroup.CourseLength, Database.Instance.Common.CarrierGroup.CourseLength * 2);
            Coordinates?carrierGroupCoordinates = null;
            Coordinates?destinationPath         = null;
            var         iteration   = 0;
            var         maxDistance = 25;

            while (iteration < 100)
            {
                carrierGroupCoordinates = unitMaker.SpawnPointSelector.GetRandomSpawnPoint(
                    new SpawnPointType[] { SpawnPointType.Sea },
                    landbaseCoordinates,
                    new MinMaxD(10, maxDistance),
                    objectivesCenter,
                    new MinMaxD(10, 99999),
                    GeneratorTools.GetSpawnPointCoalition(template, Side.Ally));
                if (!carrierGroupCoordinates.HasValue)
                {
                    maxDistance += 25;
                    continue;
                }
                var minDist = usedCoordinates.Aggregate(99999999.0, (acc, x) => x.GetDistanceFrom(carrierGroupCoordinates.Value) < acc ? x.GetDistanceFrom(carrierGroupCoordinates.Value) : acc);
                if (minDist < Database.Instance.Common.CarrierGroup.ShipSpacing)
                {
                    continue;
                }

                destinationPath = Coordinates.FromAngleAndDistance(carrierGroupCoordinates.Value, travelMinMax, carrierPathDeg);
                if (ShapeManager.IsPosValid(destinationPath.Value, theaterDB.WaterCoordinates, theaterDB.WaterExclusionCoordinates))
                {
                    break;
                }
                iteration++;
                if (iteration > 10)
                {
                    maxDistance += 1;
                }
            }

            if (!carrierGroupCoordinates.HasValue)
            {
                throw new BriefingRoomException($"Carrier spawnpoint could not be found.");
            }
            if (!destinationPath.HasValue)
            {
                throw new BriefingRoomException($"Carrier destination could not be found.");
            }
            if (!ShapeManager.IsPosValid(destinationPath.Value, theaterDB.WaterCoordinates, theaterDB.WaterExclusionCoordinates))
            {
                throw new BriefingRoomException($"Carrier waypoint is on shore");
            }

            return(new(carrierGroupCoordinates.Value, destinationPath.Value));
        }
示例#3
0
        private Coordinates?GetAirOrSeaCoordinates(
            SpawnPointType[] validTypes,
            Coordinates distanceOrigin1, MinMaxD distanceFrom1,
            Coordinates?distanceOrigin2 = null, MinMaxD?distanceFrom2 = null,
            Coalition?coalition         = null)
        {
            var searchRange = distanceFrom1 * Toolbox.NM_TO_METERS;

            MinMaxD?secondSearchRange = null;

            if (distanceOrigin2.HasValue && distanceFrom2.HasValue)
            {
                secondSearchRange = distanceFrom2.Value * Toolbox.NM_TO_METERS;
            }

            var iterations = 0;

            do
            {
                var coordOptionsLinq = Enumerable.Range(0, 50)
                                       .Select(x => Coordinates.CreateRandom(distanceOrigin1, searchRange))
                                       .Where(x => CheckNotInHostileCoords(x, coalition) && CheckNotInNoSpawnCoords(x));

                if (secondSearchRange.HasValue)
                {
                    coordOptionsLinq = coordOptionsLinq.Where(x => secondSearchRange.Value.Contains(distanceOrigin2.Value.GetDistanceFrom(x)));
                }

                if (validTypes.First() == SpawnPointType.Sea) //sea position
                {
                    coordOptionsLinq = coordOptionsLinq.Where(x => ShapeManager.IsPosValid(x, TheaterDB.WaterCoordinates, TheaterDB.WaterExclusionCoordinates));
                }

                var coordOptions = coordOptionsLinq.ToList();
                if (coordOptions.Count > 0)
                {
                    return(Toolbox.RandomFrom(coordOptions));
                }

                searchRange = new MinMaxD(searchRange.Min * 0.9, searchRange.Max * 1.1);

                if (secondSearchRange.HasValue)
                {
                    secondSearchRange = new MinMaxD(secondSearchRange.Value.Min * 0.9, secondSearchRange.Value.Max * 1.1);
                }

                iterations++;
            } while (iterations < MAX_RADIUS_SEARCH_ITERATIONS);

            return(null);
        }
示例#4
0
        private bool CheckNotInHostileCoords(Coordinates coordinates, Coalition?coalition = null)
        {
            if (!coalition.HasValue)
            {
                return(true);
            }

            var red  = SituationDB.GetRedZone(InvertCoalition);
            var blue = SituationDB.GetBlueZone(InvertCoalition);

            if (coalition.Value == Coalition.Blue)
            {
                return(!ShapeManager.IsPosValid(coordinates, red));
            }
            return(!ShapeManager.IsPosValid(coordinates, blue));
        }
示例#5
0
        internal DBEntryAirbase[] GetAirbases(bool invertCoalition)
        {
            var airbases = (from DBEntryAirbase airbase in Database.Instance.GetAllEntries <DBEntryAirbase>()
                            where Toolbox.StringICompare(airbase.Theater, Theater)
                            select airbase).ToArray();

            foreach (var airbase in airbases)
            {
                if (ShapeManager.IsPosValid(airbase.Coordinates, GetBlueZone(invertCoalition)))
                {
                    airbase.Coalition = Coalition.Blue;
                }
                if (ShapeManager.IsPosValid(airbase.Coordinates, GetRedZone(invertCoalition)))
                {
                    airbase.Coalition = Coalition.Red;
                }
            }
            return(airbases);
        }