internal DBCommonAirDefenseLevel(INIFile ini, AmountNR airDefenseLevel) { int i; GroupsInArea = new MinMaxI[Toolbox.EnumCount <AirDefenseRange>()]; if ((airDefenseLevel == AmountNR.None) || (airDefenseLevel == AmountNR.Random)) { EmbeddedChance = 0; EmbeddedUnitCount = new MinMaxI(0, 0); for (i = 0; i < Toolbox.EnumCount <AirDefenseRange>(); i++) { GroupsInArea[i] = new MinMaxI(0, 0); } SkillLevel = new DCSSkillLevel[] { DCSSkillLevel.Average }; return; } EmbeddedChance = Toolbox.Clamp(ini.GetValue <int>("AirDefense", $"{airDefenseLevel}.Embedded.Chance"), 0, 100) / 100.0; EmbeddedUnitCount = ini.GetValue <MinMaxI>("AirDefense", $"{airDefenseLevel}.Embedded.UnitCount"); for (i = 0; i < Toolbox.EnumCount <AirDefenseRange>(); i++) { GroupsInArea[i] = ini.GetValue <MinMaxI>("AirDefense", $"{airDefenseLevel}.GroupsInArea.{(AirDefenseRange)i}"); } SkillLevel = ini.GetValueArray <DCSSkillLevel>("AirDefense", $"{airDefenseLevel}.SkillLevel").Distinct().ToArray(); if (SkillLevel.Length == 0) { SkillLevel = new DCSSkillLevel[] { DCSSkillLevel.Average, DCSSkillLevel.Good, DCSSkillLevel.High, DCSSkillLevel.Excellent } } ; } }
internal static bool RollChance(this AmountNR amountN) { int chance; switch (amountN.Get()) { case AmountNR.None: return(false); case AmountNR.VeryLow: chance = 90; break; case AmountNR.Low: chance = 75; break; case AmountNR.High: chance = 25; break; case AmountNR.VeryHigh: chance = 10; break; default: chance = 50; break; } return(RandomMinMax(1, 100) > chance); }
/// <summary> /// If an AmountNR is set to "Random", returns a random value, else return the original AmountNR value. /// </summary> /// <param name="amount">The AmountNR to check for random values.</param> /// <returns>A non-random AmountNR</returns> public static AmountNR ResolveRandomAmount(AmountNR amount) { if (amount != AmountNR.Random) { return(amount); } return((AmountNR)RandomInt(EnumCount <AmountNR>() - 1)); }
private bool Load(INIFile ini) { BriefingMissionName = ini.GetValue("Briefing", "MissionName", BriefingMissionName); BriefingMissionDescription = ini.GetValue("Briefing", "MissionDescription", BriefingMissionDescription); ContextCoalitionBlue = ini.GetValue("Context", "CoalitionBlue", ContextCoalitionBlue); ContextCoalitionRed = ini.GetValue("Context", "CoalitionRed", ContextCoalitionRed); ContextDecade = ini.GetValue("Context", "Decade", ContextDecade); ContextPlayerCoalition = ini.GetValue("Context", "PlayerCoalition", ContextPlayerCoalition); ContextTheater = ini.GetValue("Context", "Theater", ContextTheater); ContextSituation = ini.GetValue("Context", "Situation", ContextSituation); EnvironmentSeason = ini.GetValue("Environment", "Season", EnvironmentSeason); EnvironmentTimeOfDay = ini.GetValue("Environment", "TimeOfDay", EnvironmentTimeOfDay); EnvironmentWeatherPreset = ini.GetValue("Environment", "WeatherPreset", EnvironmentWeatherPreset); EnvironmentWind = ini.GetValue("Environment", "Wind", EnvironmentWind); FlightPlanObjectiveDistance = ini.GetValue("FlightPlan", "ObjectiveDistance", FlightPlanObjectiveDistance); FlightPlanObjectiveSeperation = ini.GetValue("FlightPlan", "ObjectiveSeperation", FlightPlanObjectiveSeperation); FlightPlanTheaterStartingAirbase = ini.GetValue("FlightPlan", "TheaterStartingAirbase", FlightPlanTheaterStartingAirbase); MissionFeatures = ini.GetValueDistinctList <string>("MissionFeatures", "MissionFeatures"); Mods = ini.GetValueArray <string>("Mods", "Mods").ToList(); Objectives.Clear(); foreach (string key in ini.GetTopLevelKeysInSection("Objectives")) { Objectives.Add(new MissionTemplateObjective(ini, "Objectives", key)); } OptionsFogOfWar = ini.GetValue("Options", "FogOfWar", OptionsFogOfWar); OptionsMission = ini.GetValueDistinctList <string>("Options", "Mission"); OptionsRealism = ini.GetValueDistinctList <RealismOption>("Options", "Realism"); PlayerFlightGroups.Clear(); foreach (string key in ini.GetTopLevelKeysInSection("PlayerFlightGroups")) { PlayerFlightGroups.Add(new MissionTemplateFlightGroup(ini, "PlayerFlightGroups", key)); } AircraftPackages.Clear(); foreach (string key in ini.GetTopLevelKeysInSection("AircraftPackages")) { AircraftPackages.Add(new MissionTemplatePackage(ini, "AircraftPackages", key)); } SituationEnemySkill = ini.GetValue("Situation", "EnemySkill", SituationEnemySkill); SituationEnemyAirDefense = ini.GetValue("Situation", "EnemyAirDefense", SituationEnemyAirDefense); SituationEnemyAirForce = ini.GetValue("Situation", "EnemyAirForce", SituationEnemyAirForce); SituationFriendlySkill = ini.GetValue("Situation", "FriendlySkill", SituationFriendlySkill); SituationFriendlyAirDefense = ini.GetValue("Situation", "FriendlyAirDefense", SituationFriendlyAirDefense); SituationFriendlyAirForce = ini.GetValue("Situation", "FriendlyAirForce", SituationFriendlyAirForce); AssignAliases(); return(true); }
public void Clear() { // If the default template is found, load it. if (File.Exists(DEFAULT_TEMPLATE_FILEPATH)) { LoadFromFile(DEFAULT_TEMPLATE_FILEPATH); return; } BriefingMissionName = ""; BriefingMissionDescription = ""; ContextCoalitionBlue = "USA"; ContextCoalitionRed = "Russia"; ContextDecade = Decade.Decade2000; ContextPlayerCoalition = Coalition.Blue; ContextTheater = "Caucasus"; ContextSituation = ""; EnvironmentSeason = Season.Random; EnvironmentTimeOfDay = TimeOfDay.RandomDaytime; EnvironmentWeatherPreset = ""; EnvironmentWind = Wind.Random; FlightPlanObjectiveDistance = 80; FlightPlanObjectiveSeperation = 30; FlightPlanTheaterStartingAirbase = ""; MissionFeatures = new List <string> { "FriendlyAWACS", "FriendlyTankerBasket", "FriendlyTankerBoom" }; Mods = new List <string>(); Objectives = new MissionTemplateObjective[] { new MissionTemplateObjective() }.ToList(); OptionsFogOfWar = FogOfWar.All; OptionsMission = new List <string> { "ImperialUnitsForBriefing", "MarkWaypoints" }; OptionsRealism = new RealismOption[] { RealismOption.DisableDCSRadioAssists, RealismOption.NoBDA }.ToList(); PlayerFlightGroups = new MissionTemplateFlightGroup[] { new MissionTemplateFlightGroup() }.ToList(); AircraftPackages = new(); SituationEnemySkill = AmountNR.Random; SituationEnemyAirDefense = AmountNR.Random; SituationEnemyAirForce = AmountNR.Random; SituationFriendlySkill = AmountNR.Random; SituationFriendlyAirDefense = AmountNR.Random; SituationFriendlyAirForce = AmountNR.Random; AssignAliases(); }
public bool LoadFromFile(string filePath) { if (!File.Exists(filePath)) { return(false); } var ini = new INIFile(filePath); BriefingCampaignName = ini.GetValue("Briefing", "CampaignName", BriefingCampaignName); ContextCoalitionBlue = ini.GetValue("Context", "Coalitions.Blue", ContextCoalitionBlue); ContextPlayerCoalition = ini.GetValue("Context", "Coalitions.Player", ContextPlayerCoalition); ContextCoalitionRed = ini.GetValue("Context", "Coalitions.Red", ContextCoalitionRed); ContextDecade = ini.GetValue("Context", "Decade", ContextDecade); ContextTheater = ini.GetValue("Context", "Theater", ContextTheater); ContextSituation = ini.GetValue("Context", "Situation", ContextSituation); EnvironmentBadWeatherChance = ini.GetValue("Environment", "BadWeatherChance", EnvironmentBadWeatherChance); EnvironmentNightMissionChance = ini.GetValue("Environment", "NightMissionChance", EnvironmentBadWeatherChance); MissionsCount = ini.GetValue("Missions", "Count", MissionsCount); MissionsDifficultyVariation = ini.GetValue("Missions", "DifficultyVariation", MissionsDifficultyVariation); MissionsFeatures = ini.GetValueDistinctList <string>("Missions", "Features"); MissionsObjectives = ini.GetValueList <string>("Missions", "Objectives"); MissionsObjectiveCount = ini.GetValue("Missions", "ObjectiveCount", MissionsObjectiveCount); MissionsObjectiveDistance = ini.GetValue("Missions", "ObjectiveDistance", MissionsObjectiveDistance); OptionsFogOfWar = ini.GetValue("Options", "FogOfWar", OptionsFogOfWar); OptionsMods = ini.GetValueDistinctList <string>("Options", "Mods"); OptionsMission = ini.GetValueDistinctList <string>("Options", "Mission"); OptionsRealism = ini.GetValueDistinctList <RealismOption>("Options", "Realism"); Player = new MissionTemplateFlightGroup(ini, "PlayerFlightGroups", "Player"); PlayerStartingAirbase = ini.GetValue("Player", "StartingAirbase", PlayerStartingAirbase); SituationEnemySkill = ini.GetValue("Situation", "EnemySkill", SituationEnemySkill); SituationEnemyAirDefense = ini.GetValue("Situation", "EnemyAirDefense", SituationEnemyAirDefense); SituationEnemyAirForce = ini.GetValue("Situation", "EnemyAirForce", SituationEnemyAirForce); SituationFriendlySkill = ini.GetValue("Situation", "FriendlySkill", SituationFriendlySkill); SituationFriendlyAirDefense = ini.GetValue("Situation", "FriendlyAirDefense", SituationFriendlyAirDefense); SituationFriendlyAirForce = ini.GetValue("Situation", "FriendlyAirForce", SituationFriendlyAirForce); return(true); }
public void Clear() { // If the default template is found, load it. if (File.Exists(DEFAULT_TEMPLATE_FILEPATH)) { LoadFromFile(DEFAULT_TEMPLATE_FILEPATH); return; } BriefingCampaignName = ""; ContextCoalitionBlue = "USA"; ContextPlayerCoalition = Coalition.Blue; ContextCoalitionRed = "Russia"; ContextDecade = Decade.Decade2000; ContextTheater = "Caucasus"; ContextSituation = ""; EnvironmentBadWeatherChance = Amount.VeryLow; EnvironmentNightMissionChance = Amount.VeryLow; MissionsCount = 5; MissionsDifficultyVariation = CampaignDifficultyVariation.Random; MissionsFeatures = new List <string>(); MissionsObjectives = BriefingRoom.GetDatabaseEntriesIDs(DatabaseEntryType.ObjectivePreset).ToList(); MissionsObjectiveCount = Amount.Average; MissionsObjectiveDistance = Amount.Average; OptionsFogOfWar = FogOfWar.All; OptionsMods = new List <string>(); OptionsMission = new List <string> { "ImperialUnitsForBriefing" }; OptionsRealism = new RealismOption[] { RealismOption.DisableDCSRadioAssists, RealismOption.NoBDA }.ToList(); Player = new MissionTemplateFlightGroup(); PlayerStartingAirbase = ""; SituationEnemySkill = AmountNR.Random; SituationEnemyAirDefense = AmountNR.Random; SituationEnemyAirForce = AmountNR.Random; SituationFriendlySkill = AmountNR.Random; SituationFriendlyAirDefense = AmountNR.Random; SituationFriendlyAirForce = AmountNR.Random; }
internal static void GenerateAirDefense(MissionTemplateRecord template, UnitMaker unitMaker, Coordinates averageInitialPosition, Coordinates objectivesCenter) { foreach (Coalition coalition in Toolbox.GetEnumValues <Coalition>()) { bool ally = coalition == template.ContextPlayerCoalition; Side side = ally ? Side.Ally : Side.Enemy; AmountNR airDefenseAmount = ally ? template.SituationFriendlyAirDefense.Get() : template.SituationEnemyAirDefense.Get(); Coordinates centerPoint = ally ? averageInitialPosition : objectivesCenter; Coordinates opposingPoint = ally ? objectivesCenter : averageInitialPosition; foreach (AirDefenseRange airDefenseRange in Toolbox.GetEnumValues <AirDefenseRange>()) { CreateAirDefenseGroups(template, unitMaker, side, coalition, airDefenseAmount, airDefenseRange, centerPoint, opposingPoint); } } }
internal DBCommonCAPLevel(INIFile ini, AmountNR capLevel) { if ((capLevel == AmountNR.None) || (capLevel == AmountNR.Random)) { SkillLevel = new DCSSkillLevel[] { DCSSkillLevel.Average }; UnitCount = new MinMaxI(0, 0); return; } SkillLevel = ini.GetValueArray <DCSSkillLevel>("CAPLevels", $"{capLevel}.SkillLevel").Distinct().ToArray(); if (SkillLevel.Length == 0) { SkillLevel = new DCSSkillLevel[] { DCSSkillLevel.Average, DCSSkillLevel.Good, DCSSkillLevel.High, DCSSkillLevel.Excellent } } ; UnitCount = ini.GetValue <MinMaxI>("CAPLevels", $"{capLevel}.UnitCount"); } }
internal static int[] GenerateCAP(UnitMaker unitMaker, MissionTemplateRecord template, Coordinates averageInitialPosition, Coordinates objectivesCenter) { List <int> capAircraftGroupIDs = new List <int>(); var commonCAPDB = Database.Instance.Common.CAP; foreach (Coalition coalition in Toolbox.GetEnumValues <Coalition>()) { if (coalition == Coalition.Neutural) // Skip Neutural { continue; } bool ally = coalition == template.ContextPlayerCoalition; Side side = ally ? Side.Ally : Side.Enemy; AmountNR capAmount = ally ? template.SituationFriendlyAirForce.Get() : template.SituationEnemyAirForce.Get(); Coordinates flyPathtoObjectives = (objectivesCenter - averageInitialPosition).Normalize() * Toolbox.NM_TO_METERS * commonCAPDB.MinDistanceFromOpposingPoint; // TODO: distance according to decade Coordinates centerPoint = objectivesCenter; if (ally) { centerPoint -= flyPathtoObjectives; } else { centerPoint += flyPathtoObjectives; } Coordinates opposingPoint = objectivesCenter; CreateCAPGroups( unitMaker, template, side, coalition, capAmount, centerPoint, opposingPoint, objectivesCenter, ref capAircraftGroupIDs); } return(capAircraftGroupIDs.ToArray()); }
private static AmountNR GetPowerLevel(AmountNR amount, CampaignDifficultyVariation variation, int missionIndex, int missionsCount, bool reverseVariation = false) { if (amount == AmountNR.Random) { return(AmountNR.Random); } if (variation == CampaignDifficultyVariation.Steady) { return(amount); } double campaignProgress = missionIndex / (double)(Math.Max(2, missionsCount) - 1.0); double amountOffset = 0; switch (variation) { case CampaignDifficultyVariation.ConsiderablyEasier: amountOffset = -3.5; break; case CampaignDifficultyVariation.MuchEasier: amountOffset = -2.25; break; case CampaignDifficultyVariation.SomewhatEasier: amountOffset = -1.5; break; case CampaignDifficultyVariation.SomewhatHarder: amountOffset = 1.5; break; case CampaignDifficultyVariation.MuchHarder: amountOffset = 2.25; break; case CampaignDifficultyVariation.ConsiderablyHarder: amountOffset = 3.5; break; } double amountDouble = (double)amount + amountOffset * campaignProgress; if (reverseVariation) { amountDouble = -amountDouble; } return((AmountNR)Toolbox.Clamp((int)amountDouble, (int)AmountNR.VeryLow, (int)AmountNR.VeryHigh)); }
private static void CreateCAPGroups( UnitMaker unitMaker, MissionTemplateRecord template, Side side, Coalition coalition, AmountNR capAmount, Coordinates centerPoint, Coordinates opposingPoint, Coordinates destination, ref List <int> capAircraftGroupIDs) { var commonCAPDB = Database.Instance.Common.CAP; DBCommonCAPLevel capLevelDB = commonCAPDB.CAPLevels[(int)capAmount]; int unitsLeftToSpawn = capLevelDB.UnitCount.GetValue(); if (unitsLeftToSpawn < 1) { return; // No groups to add, no need to go any further } do { int groupSize = Toolbox.RandomFrom(commonCAPDB.GroupSize); groupSize = Math.Min(unitsLeftToSpawn, groupSize); unitsLeftToSpawn -= groupSize; // Find spawn point at the proper distance from the objective(s), but not to close from starting airbase Coordinates?spawnPoint = unitMaker.SpawnPointSelector.GetRandomSpawnPoint( new SpawnPointType[] { SpawnPointType.Air }, centerPoint, commonCAPDB.DistanceFromCenter, opposingPoint, new MinMaxD(commonCAPDB.MinDistanceFromOpposingPoint, 99999), GeneratorTools.GetSpawnPointCoalition(template, side)); // No spawn point found, stop here. if (!spawnPoint.HasValue) { BriefingRoom.PrintToLog($"No spawn point found for {coalition} combat air patrols.", LogMessageErrorLevel.Warning); return; } Coordinates groupDestination = destination + Coordinates.CreateRandom(10, 20) * Toolbox.NM_TO_METERS; var extraSettings = new Dictionary <string, object> { { "Payload", "Air-To-Air" }, { "GroupX2", groupDestination.X }, { "GroupY2", groupDestination.Y } }; var luaUnit = commonCAPDB.LuaUnit; var luaGroup = commonCAPDB.LuaGroup; var spawnpointCoordinates = spawnPoint.Value; var unitFamilies = commonCAPDB.UnitFamilies.ToList(); if (template.MissionFeatures.Contains("ContextGroundStartAircraft")) { luaGroup += "Parked"; luaUnit += "Parked"; var(airbase, parkingSpotIDsList, parkingSpotCoordinatesList) = unitMaker.SpawnPointSelector.GetAirbaseAndParking(template, spawnPoint.Value, groupSize, coalition, unitFamilies.First()); spawnpointCoordinates = airbase.Coordinates; extraSettings.AddIfKeyUnused("ParkingID", parkingSpotIDsList.ToArray()); extraSettings.AddIfKeyUnused("GroupAirbaseID", airbase.DCSID); extraSettings.AddIfKeyUnused("UnitX", (from Coordinates coordinates in parkingSpotCoordinatesList select coordinates.X).ToArray()); extraSettings.AddIfKeyUnused("UnitY", (from Coordinates coordinates in parkingSpotCoordinatesList select coordinates.Y).ToArray()); } UnitMakerGroupInfo?groupInfo = unitMaker.AddUnitGroup( unitFamilies, groupSize, side, luaGroup, luaUnit, spawnpointCoordinates, 0, extraSettings.ToArray()); if (!groupInfo.HasValue) // Failed to generate a group { BriefingRoom.PrintToLog($"Failed to find units for {coalition} air defense unit group.", LogMessageErrorLevel.Warning); } capAircraftGroupIDs.Add(groupInfo.Value.GroupID); } while (unitsLeftToSpawn > 0); }
private static void CreateAirDefenseGroups( MissionTemplateRecord template, UnitMaker unitMaker, Side side, Coalition coalition, AmountNR airDefenseAmount, AirDefenseRange airDefenseRange, Coordinates centerPoint, Coordinates opposingPoint) { var commonAirDefenseDB = Database.Instance.Common.AirDefense; DBCommonAirDefenseLevel airDefenseLevelDB = commonAirDefenseDB.AirDefenseLevels[(int)airDefenseAmount]; int groupCount = airDefenseLevelDB.GroupsInArea[(int)airDefenseRange].GetValue(); if (groupCount < 1) { return; // No groups to add, no need to go any further } List <UnitFamily> unitFamilies; SpawnPointType[] validSpawnPoints; switch (airDefenseRange) { case AirDefenseRange.MediumRange: unitFamilies = new List <UnitFamily> { UnitFamily.VehicleSAMMedium }; validSpawnPoints = new SpawnPointType[] { SpawnPointType.LandLarge }; break; case AirDefenseRange.LongRange: unitFamilies = new List <UnitFamily> { UnitFamily.VehicleSAMLong }; validSpawnPoints = new SpawnPointType[] { SpawnPointType.LandLarge }; break; default: // case AirDefenseRange.ShortRange: unitFamilies = new List <UnitFamily> { UnitFamily.VehicleAAA, UnitFamily.VehicleAAAStatic, UnitFamily.VehicleInfantryMANPADS, UnitFamily.VehicleSAMShort, UnitFamily.VehicleSAMShort, UnitFamily.VehicleSAMShortIR, UnitFamily.VehicleSAMShortIR }; validSpawnPoints = new SpawnPointType[] { SpawnPointType.LandSmall, SpawnPointType.LandMedium, SpawnPointType.LandLarge }; break; } for (int i = 0; i < groupCount; i++) { // Find spawn point at the proper distance Coordinates?spawnPoint = unitMaker.SpawnPointSelector.GetRandomSpawnPoint( validSpawnPoints, centerPoint, commonAirDefenseDB.DistanceFromCenter[(int)side, (int)airDefenseRange], opposingPoint, new MinMaxD(commonAirDefenseDB.MinDistanceFromOpposingPoint[(int)side, (int)airDefenseRange], 99999), GeneratorTools.GetSpawnPointCoalition(template, side)); // No spawn point found, stop here. if (!spawnPoint.HasValue) { BriefingRoom.PrintToLog($"No spawn point found for {airDefenseRange} air defense unit groups", LogMessageErrorLevel.Warning); return; } var groupInfo = unitMaker.AddUnitGroup( unitFamilies, 1, side, "GroupVehicle", "UnitVehicle", spawnPoint.Value); if (!groupInfo.HasValue) // Failed to generate a group { BriefingRoom.PrintToLog( $"Failed to add {airDefenseRange} air defense unit group for {coalition} coalition.", LogMessageErrorLevel.Warning); } } }
internal static AmountNR Get(this AmountNR amountNR) { return(AmountNR.Random == amountNR ? (AmountNR)(RandomInt((int)AmountNR.VeryHigh) + 1) : amountNR); }