/// <summary>
        /// Resets all properties to their default values.
        /// </summary>
        public void Clear()
        {
            BriefingDate        = new MissionTemplateDate();
            BriefingDescription = "";
            BriefingName        = "";
            BriefingUnitSystem  = UnitSystem.Imperial;

            ContextCoalitionBlue   = TemplateTools.CheckValue <DBEntryCoalition>(Database.Instance.Common.DefaultCoalitionBlue);
            ContextCoalitionPlayer = Coalition.Blue;
            ContextCoalitionRed    = TemplateTools.CheckValue <DBEntryCoalition>(Database.Instance.Common.DefaultCoalitionRed);
            ContextDecade          = Decade.Decade2000;

            EnvironmentSeason    = Season.Random;
            EnvironmentTimeOfDay = TimeOfDay.RandomDaytime;
            EnvironmentWeather   = Weather.Random;
            EnvironmentWind      = Wind.Auto;

            ObjectiveCount      = Database.Instance.Common.DefaultObjectiveCount;
            ObjectiveDistanceNM = 0;
            ObjectiveType       = TemplateTools.CheckValue <DBEntryObjective>(Database.Instance.Common.DefaultObjective);

            OppositionAirDefense       = AmountN.Random;
            OppositionAirForce         = AmountN.Random;
            OppositionOnStationChance  = AmountN.Random;
            OppositionSkillLevelAir    = BRSkillLevel.Random;
            OppositionSkillLevelGround = BRSkillLevel.Random;
            OppositionUnitsLocation    = SpawnPointPreferredCoalition.Any;

            OptionsCivilianTraffic  = CivilianTraffic.Low;
            OptionsEndMode          = MissionEndMode.NoEnd;
            OptionsPreferences      = new MissionTemplatePreferences[0];
            OptionsRealism          = new RealismOption[] { RealismOption.NoBDA };
            OptionsScriptExtensions = new string[0];
            OptionsUnitMods         = new string[0];

            PlayerAISkillLevel       = BRSkillLevel.Random;
            PlayerEscortCAP          = 0;
            PlayerEscortSEAD         = 0;
            PlayerFriendlyAirDefense = AmountN.Random;
            PlayerStartLocation      = PlayerStartLocation.Runway;

            PlayerMPFlightGroups = new MissionTemplateMPFlightGroup[0];
            PlayerSPAircraft     = TemplateTools.CheckValuePlayerAircraft(Database.Instance.Common.DefaultPlayerAircraft);
            PlayerSPWingmen      = 1;
            PlayerSPCarrier      = "";

            TheaterID = TemplateTools.CheckValue <DBEntryTheater>(Database.Instance.Common.DefaultTheater);
            TheaterRegionsCoalitions = CountryCoalition.Default;
            TheaterStartingAirbase   = "";
        }
        /// <summary>
        /// Loads a mission template from an .ini file.
        /// </summary>
        /// <param name="filePath">Path to the .ini file</param>
        /// <returns></returns>
        public bool LoadFromFile(string filePath)
        {
            Clear();
            if (!File.Exists(filePath))
            {
                return(false);
            }

            using (INIFile ini = new INIFile(filePath))
            {
                BriefingDate.LoadFromFile(ini);
                BriefingDescription = ini.GetValue("Briefing", "Description", BriefingDescription);
                BriefingName        = ini.GetValue("Briefing", "Name", BriefingName);
                BriefingUnitSystem  = ini.GetValue("Briefing", "UnitSystem", BriefingUnitSystem);

                ContextCoalitionBlue   = ini.GetValue("Context", "Coalition.Blue", ContextCoalitionBlue);
                ContextCoalitionPlayer = ini.GetValue("Context", "Coalition.Player", ContextCoalitionPlayer);
                ContextCoalitionRed    = ini.GetValue("Context", "Coalition.Red", ContextCoalitionRed);
                ContextDecade          = ini.GetValue("Context", "Decade", ContextDecade);

                EnvironmentSeason    = ini.GetValue("Environment", "Season", EnvironmentSeason);
                EnvironmentTimeOfDay = ini.GetValue("Environment", "TimeOfDay", EnvironmentTimeOfDay);
                EnvironmentWeather   = ini.GetValue("Environment", "Weather", EnvironmentWeather);
                EnvironmentWind      = ini.GetValue("Environment", "Wind", EnvironmentWind);

                ObjectiveCount      = ini.GetValue("Objective", "Count", ObjectiveCount);
                ObjectiveDistanceNM = ini.GetValue("Objective", "Distance", ObjectiveDistanceNM);
                ObjectiveType       = ini.GetValue("Objective", "Type", ObjectiveType);

                OppositionAirDefense       = ini.GetValue("Opposition", "AirDefense", OppositionAirDefense);
                OppositionAirForce         = ini.GetValue("Opposition", "AirForce", OppositionAirForce);
                OppositionOnStationChance  = ini.GetValue("Opposition", "OnStationChance", OppositionOnStationChance);
                OppositionSkillLevelAir    = ini.GetValue("Opposition", "SkillLevel.Air", OppositionSkillLevelAir);
                OppositionSkillLevelGround = ini.GetValue("Opposition", "SkillLevel.Ground", OppositionSkillLevelGround);
                OppositionUnitsLocation    = ini.GetValue("Opposition", "UnitsLocation", OppositionUnitsLocation);

                OptionsCivilianTraffic  = ini.GetValue("Options", "CivilianTraffic", OptionsCivilianTraffic);
                OptionsEndMode          = ini.GetValue("Options", "EndMode", OptionsEndMode);
                OptionsPreferences      = ini.GetValueArray <MissionTemplatePreferences>("Options", "Preferences");
                OptionsRealism          = ini.GetValueArray <RealismOption>("Options", "Realism");
                OptionsScriptExtensions = ini.GetValueArray <string>("Options", "ScriptExtensions");
                OptionsUnitMods         = ini.GetValueArray <string>("Options", "UnitMods");

                PlayerAISkillLevel       = ini.GetValue("Player", "AISkillLevel", PlayerAISkillLevel);
                PlayerEscortCAP          = ini.GetValue("Player", "EscortCAP", PlayerEscortCAP);
                PlayerEscortSEAD         = ini.GetValue("Player", "EscortSEAD", PlayerEscortSEAD);
                PlayerFriendlyAirDefense = ini.GetValue("Player", "FriendlyAirDefense", PlayerFriendlyAirDefense);
                PlayerStartLocation      = ini.GetValue("Player", "StartLocation", PlayerStartLocation);

                int fgFlightGroupCount = Math.Max(0, ini.GetValue <int>("PlayerMP", "FGCount"));
                PlayerMPFlightGroups = new MissionTemplateMPFlightGroup[fgFlightGroupCount];
                for (int i = 0; i < fgFlightGroupCount; i++)
                {
                    PlayerMPFlightGroups[i] = new MissionTemplateMPFlightGroup(ini, "PlayerMP", $"FG{i:000}");
                }

                PlayerSPAircraft = ini.GetValue("PlayerSP", "Aircraft", PlayerSPAircraft);
                PlayerSPWingmen  = ini.GetValue("PlayerSP", "Wingmen", PlayerSPWingmen);
                PlayerSPCarrier  = ini.GetValue("PlayerSP", "Carrier", PlayerSPCarrier);

                TheaterID = ini.GetValue("Theater", "ID", TheaterID);
                TheaterRegionsCoalitions = ini.GetValue("Theater", "RegionsCoalitions", TheaterRegionsCoalitions);
                TheaterStartingAirbase   = ini.GetValue("Theater", "StartingAirbase", TheaterStartingAirbase);
            }

            return(true);
        }