private bool CheckNotInNoSpawnCoords(Coordinates coordinates) { if (SituationDB.NoSpawnCoordinates is null) { return(true); } return(!ShapeManager.IsPosValid(coordinates, SituationDB.NoSpawnCoordinates)); }
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)); }
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); }
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)); }
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); }