/// <summary>
        /// Save the mission template to an .ini file.
        /// </summary>
        /// <param name="filePath">Path to the .ini file.</param>
        public void SaveToFile(string filePath)
        {
            using (INIFile ini = new INIFile())
            {
                BriefingDate.SaveToFile(ini);
                ini.SetValue("Briefing", "Description", BriefingDescription);
                ini.SetValue("Briefing", "Name", BriefingName);
                ini.SetValue("Briefing", "UnitSystem", BriefingUnitSystem);

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

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

                ini.SetValue("Objective", "Count", ObjectiveCount);
                ini.SetValue("Objective", "Distance", ObjectiveDistance);
                ini.SetValue("Objective", "Type", ObjectiveType);

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

                ini.SetValue("Options", "EndMode", OptionsEndMode);
                ini.SetValueArray("Options", "Preferences", OptionsPreferences);
                ini.SetValueArray("Options", "ScriptExtensions", OptionsScriptExtensions);
                ini.SetValueArray("Options", "UnitMods", OptionsUnitMods);

                ini.SetValue("Player", "AISkillLevel", PlayerAISkillLevel);
                ini.SetValue("Player", "Carrier", PlayerCarrier);
                ini.SetValue("Player", "EscortCAP", PlayerEscortCAP);
                ini.SetValue("Player", "EscortSEAD", PlayerEscortSEAD);
                ini.SetValue("Player", "FriendlyAirDefense", PlayerFriendlyAirDefense);
                ini.SetValue("Player", "StartLocation", PlayerStartLocation);

                ini.SetValue("PlayerSP", "Aircraft", PlayerSPAircraft);
                ini.SetValue("PlayerSP", "Wingmen", PlayerSPWingmen);
                ini.SetValue("PlayerSP", "Wingmen.SkillLevel", PlayerAISkillLevel);

                ini.SetValue("PlayerMP", "FGCount", PlayerMPFlightGroups.Length);
                for (int i = 0; i < PlayerMPFlightGroups.Length; i++)
                {
                    PlayerMPFlightGroups[i].SaveToFile(ini, "PlayerMP", $"FG{i:000}");
                }

                ini.SetValue("Theater", "ID", TheaterID);
                ini.SetValue("Theater", "RegionsCoalitions", TheaterRegionsCoalitions);
                ini.SetValue("Theater", "StartingAirbase", TheaterStartingAirbase);

                ini.SaveToFile(filePath);
            }
        }
        /// <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);
        }