Пример #1
0
        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 }
            }
            ;
        }
    }
Пример #2
0
        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);
        }
Пример #3
0
 /// <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));
 }
Пример #4
0
        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);
        }
Пример #5
0
        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();
        }
Пример #6
0
        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);
        }
Пример #7
0
        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;
        }
Пример #8
0
        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);
                }
            }
        }
Пример #9
0
        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");
        }
    }
Пример #10
0
        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());
        }
Пример #11
0
        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));
        }
Пример #12
0
        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);
        }
Пример #13
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);
                }
            }
        }
Пример #14
0
 internal static AmountNR Get(this AmountNR amountNR)
 {
     return(AmountNR.Random == amountNR ? (AmountNR)(RandomInt((int)AmountNR.VeryHigh) + 1) : amountNR);
 }