/// <summary>
        /// Loads a database entry from an .ini file.
        /// </summary>
        /// <param name="iniFilePath">Path to the .ini file where entry inforation is stored</param>
        /// <returns>True is successful, false if an error happened</returns>
        protected override bool OnLoad(string iniFilePath)
        {
            using (INIFile ini = new INIFile(iniFilePath))
            {
                BriefingDescription             = ini.GetValue <string>("Briefing", "Description");
                BriefingDescriptionByUnitFamily = new string[Toolbox.EnumCount <UnitFamily>()];
                foreach (UnitFamily family in Toolbox.GetEnumValues <UnitFamily>())
                {
                    BriefingDescriptionByUnitFamily[(int)family] = ini.GetValue <string>("Briefing", $"Description.{family}");
                }

                BriefingRemarks         = ini.GetValueArray <string>("Briefing", "Remarks", ';');
                BriefingTask            = ini.GetValue <string>("Briefing", "Task");
                BriefingTaskFlightGroup = ini.GetValue <string>("Briefing", "Task.FlightGroup");

                Flags           = ini.GetValueArrayAsEnumFlags <DBEntryObjectiveFlags>("Objective", "Flags");
                MissionFeatures = GetValidDBEntryIDs <DBEntryMissionFeature>(
                    ini.GetValueArray <string>("Objective", "MissionFeatures"), out string[] invalidFeatures);
                foreach (string f in invalidFeatures)
                {
                    DebugLog.Instance.WriteLine($"Mission feature \"{f}\" not found in objective \"{ID}\"", DebugLogMessageErrorLevel.Warning);
                }

                Payload = ini.GetValue <UnitTaskPayload>("Objective", "Payload");

                UnitGroup     = new DBUnitGroup(ini, "UnitGroup");
                AllyUnitGroup = new DBUnitGroup(ini, "AllyUnitGroup");

                WaypointInaccuracy = ini.GetValue <MinMaxI>("Waypoint", "Inaccuracy");
                WaypointOnGround   = ini.GetValue <bool>("Waypoint", "OnGround");
            }

            return(true);
        }
Exemplo n.º 2
0
        protected override bool OnLoad(string iniFilePath)
        {
            var ini = new INIFile(iniFilePath);

            ATC            = ini.GetValue <string>("Airbase", "ATC");
            Coordinates    = ini.GetValue <Coordinates>("Airbase", "Coordinates");
            DCSID          = ini.GetValue <int>("Airbase", "DCSID");
            Elevation      = ini.GetValue <double>("Airbase", "Elevation");
            Flags          = ini.GetValueArrayAsEnumFlags <AirbaseFlag>("Airbase", "Flags");
            ILS            = ini.GetValue <string>("Airbase", "ILS");
            Name           = ini.GetValue <string>("Airbase", "Name");
            UIDisplayName  = ini.GetValue <string>("Airbase", "Name");
            Runways        = ini.GetValue <string>("Airbase", "Runways");
            RunwayLengthFt = ini.GetValue <int>("Airbase", "RunwayLengthFt", -1);
            TACAN          = ini.GetValue <string>("Airbase", "TACAN");
            Theater        = ini.GetValue <string>("Airbase", "Theater").ToLowerInvariant();

            if (!Database.Instance.EntryExists <DBEntryTheater>(Theater))
            {
                throw new Exception($"Airbase \"{ID}\" located on non-existing theater \"{Theater}\".");
            }

            ParkingSpots = LoadParkingSpots(ini, "Parking");
            if (ParkingSpots.Length == 0)
            {
                throw new Exception($"No parking spots for airbase \"{ID}\".");
            }

            return(true);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="ini">The .ini file to load airbase data from.</param>
        /// <param name="airbaseKey">The top-level key (airbase unique ID)</param>
        public DBEntryTheaterAirbase(INIFile ini, string airbaseKey)
        {
            int i;

            ATC          = ini.GetValue <string>("Airbases", $"{airbaseKey}.ATC");
            Coalition    = ini.GetValue <Coalition>("Airbases", $"{airbaseKey}.Coalition");
            Coordinates  = ini.GetValue <Coordinates>("Airbases", $"{airbaseKey}.Coordinates");
            DCSID        = ini.GetValue <int>("Airbases", $"{airbaseKey}.DCSID");
            Elevation    = ini.GetValue <double>("Airbases", $"{airbaseKey}.Elevation");
            Flags        = ini.GetValueArrayAsEnumFlags <DBEntryTheaterAirbaseFlag>("Airbases", $"{airbaseKey}.Flags");
            ILS          = ini.GetValue <string>("Airbases", $"{airbaseKey}.ILS");
            Name         = ini.GetValue <string>("Airbases", $"{airbaseKey}.Name");
            ParkingSpots = new DBEntryTheaterAirbaseParkingSpot[Math.Max(0, ini.GetValue <int>("Airbases", $"{airbaseKey}.Parking.Count"))];
            for (i = 0; i < ParkingSpots.Length; i++)
            {
                ParkingSpots[i] = new DBEntryTheaterAirbaseParkingSpot(ini, $"{airbaseKey}.Parking.Spot{i + 1}", false);
            }
            Runways      = ini.GetValue <string>("Airbases", $"{airbaseKey}.Runways");
            RunwaySpawns = new DBEntryTheaterAirbaseParkingSpot[Math.Max(0, ini.GetValue <int>("Airbases", $"{airbaseKey}.RunwaySpawns.Count"))];
            for (i = 0; i < RunwaySpawns.Length; i++)
            {
                RunwaySpawns[i] = new DBEntryTheaterAirbaseParkingSpot(ini, $"{airbaseKey}.RunwaySpawns.Spot{i + 1}", true);
            }
            TACAN = ini.GetValue <string>("Airbases", $"{airbaseKey}.TACAN");

            if (ParkingSpots.Length == 0)
            {
                throw new Exception($"No parking spots for airbase \"{airbaseKey}\".");
            }

            if (RunwaySpawns.Length == 0)
            {
                throw new Exception($"No runway spawns for airbase \"{airbaseKey}\".");
            }
        }
Exemplo n.º 4
0
        protected override bool OnLoad(string iniFilePath)
        {
            var ini = new INIFile(iniFilePath);

            // Unit info
            DCSIDs = (from string u in ini.GetValueArray <string>("Unit", "DCSID") select u.Trim()).ToArray();
            if (DCSIDs.Length < 1)
            {
                BriefingRoom.PrintToLog($"Unit {ID} contains no DCS unit ID, unit was ignored.", LogMessageErrorLevel.Warning);
                return(false);
            }
            Families = ini.GetValueArray <UnitFamily>("Unit", "Families");
            if (Families.Length == 0)
            {
                BriefingRoom.PrintToLog($"Unit {ID} has no family, unit was ignored.", LogMessageErrorLevel.Warning);
                return(false);
            }
            // Make sure all unit families belong to same category (unit cannot be a helicopter and a ground vehicle at the same time, for instance)
            Families = (from UnitFamily f in Families where f.GetUnitCategory() == Category select f).Distinct().ToArray();
            ExtraLua = ini.GetValue <string>("Unit", "ExtraLua").Trim();
            if (!string.IsNullOrEmpty(ExtraLua) && !ExtraLua.EndsWith(","))
            {
                ExtraLua += ",";
            }
            Flags             = ini.GetValueArrayAsEnumFlags <DBEntryUnitFlags>("Unit", "Flags");
            OffsetCoordinates = (from string s in ini.GetValueArray <string>("Unit", "Offset.Coordinates", ';') select new Coordinates(s)).ToArray();
            OffsetHeading     = ini.GetValueArray <double>("Unit", "Offset.Heading");
            Shape             = ini.GetValueArray <string>("Unit", "Shape");
            RequiredMod       = ini.GetValue <string>("Unit", "RequiredMod");

            AircraftData = new DBEntryUnitAircraftData();

            // Load the list of operators
            Operators = new Dictionary <Country, Decade[]>();
            foreach (string k in ini.GetKeysInSection("Operators"))
            {
                if (!Enum.TryParse(k, true, out Country country))
                {
                    BriefingRoom.PrintToLog($"Country {k} in unit {ID} doesn't exist.", LogMessageErrorLevel.Warning);
                    continue;
                }

                if (Operators.ContainsKey(country))
                {
                    continue;
                }
                Operators.Add(country, ini.GetValueArrayAsMinMaxEnum <Decade>("Operators", k));
            }

            if (IsAircraft)                                // Load aircraft-specific data, if required
            {
                DCSIDs       = new string[] { DCSIDs[0] }; // Aircraft can not have multiple unit types in their group
                AircraftData = new DBEntryUnitAircraftData(ini, iniFilePath.Contains(BRPaths.CUSTOMDATABASE));
            }

            return(true);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="ini">Objective database entry ini file</param>
        /// <param name="section">Ini section to load from</param>
        public DBUnitGroup(INIFile ini, string section)
        {
            Count             = ini.GetValue <MinMaxI>(section, "Count");
            DistanceFromPoint = ini.GetValue <MinMaxD>(section, "DistanceFromPoint");

            Families = ini.GetValueArray <UnitFamily>(section, "Families");
            if (Families.Length > 0) // If the group has at least one unit family (no families mean the group is disabled)...
            {
                // ...make sure all families belong to the same category
                UnitFamily family0 = Families[0];
                // Families don't have to be Distinct() because one may want to mention the same familiy several times
                // so it appears more often
                Families = (from UnitFamily family in Families where Toolbox.GetUnitCategoryFromUnitFamily(family) == Toolbox.GetUnitCategoryFromUnitFamily(family0) select family).ToArray();
            }

            Flags    = ini.GetValueArrayAsEnumFlags <DBUnitGroupFlags>(section, "Flags");
            LuaGroup = ini.GetValueArray <string>(section, "Lua.Group");
            LuaUnit  = ini.GetValue <string>(section, "Lua.Unit");
            // TODO: check LuaGroup and LuaUnit Lua files exist in Include/Lua

            List <TheaterLocationSpawnPointType> spList = new List <TheaterLocationSpawnPointType>(ini.GetValueArray <TheaterLocationSpawnPointType>(section, "SpawnPoints"));

            if (spList.Count == 0)
            {
                spList.AddRange(Toolbox.GetEnumValues <TheaterLocationSpawnPointType>());                   // No spawn point type means all spawn point types
            }
            // LandSmall implies LandLarge and LandMedium, LandMedium implies LandLarge (larger spots can handle smaller units)
            if (spList.Contains(TheaterLocationSpawnPointType.LandSmall))
            {
                spList.AddRange(new TheaterLocationSpawnPointType[] { TheaterLocationSpawnPointType.LandMedium, TheaterLocationSpawnPointType.LandLarge });
            }
            if (spList.Contains(TheaterLocationSpawnPointType.LandMedium))
            {
                spList.Add(TheaterLocationSpawnPointType.LandLarge);
            }
            SpawnPoints = spList.Distinct().ToArray();

            if (Families.Length > 0)
            {
                foreach (string lGroup in LuaGroup)
                {
                    if (!File.Exists($"{BRPaths.INCLUDE_LUA_UNITS}{lGroup}.lua"))
                    {
                        DebugLog.Instance.WriteLine($"File \"Include\\Lua\\Units\\{lGroup}.lua\" doesn't exist.", 1, DebugLogMessageErrorLevel.Warning);
                    }
                }

                if (!File.Exists($"{BRPaths.INCLUDE_LUA_UNITS}{LuaUnit}.lua"))
                {
                    DebugLog.Instance.WriteLine($"File \"Include\\Lua\\Units\\{LuaUnit}.lua\" doesn't exist.", 1, DebugLogMessageErrorLevel.Warning);
                }
            }
        }
        /// <summary>
        /// Loads a database entry from an .ini file.
        /// </summary>
        /// <param name="iniFilePath">Path to the .ini file where entry inforation is stored</param>
        /// <returns>True is successful, false if an error happened</returns>

        protected override bool OnLoad(string iniFilePath)
        {
            using (INIFile ini = new INIFile(iniFilePath))
            {
                // Unit info
                DCSIDs = (from string u in ini.GetValueArray <string>("Unit", "DCSID") select u.Trim()).ToArray();
                if (DCSIDs.Length < 1)
                {
                    DebugLog.Instance.WriteLine($"Unit {ID} contains no DCS unit ID, unit was ignored.", DebugLogMessageErrorLevel.Warning);
                    return(false);
                }
                Families = ini.GetValueArray <UnitFamily>("Unit", "Families");
                if (Families.Length == 0)
                {
                    DebugLog.Instance.WriteLine($"Unit {ID} has no family, unit was ignored.", DebugLogMessageErrorLevel.Warning);
                    return(false);
                }
                // Make sure all unit families belong to same category (unit cannot be a helicopter and a ground vehicle at the same time, for instance)
                Families = (from UnitFamily f in Families where Toolbox.GetUnitCategoryFromUnitFamily(f) == Category select f).Distinct().ToArray();
                ExtraLua = ini.GetValue <string>("Unit", "ExtraLua").Trim();
                if (!string.IsNullOrEmpty(ExtraLua) && !ExtraLua.EndsWith(","))
                {
                    ExtraLua += ",";
                }
                Flags             = ini.GetValueArrayAsEnumFlags <DBEntryUnitFlags>("Unit", "Flags");
                OffsetCoordinates = (from string s in ini.GetValueArray <string>("Unit", "Offset.Coordinates", ';') select new Coordinates(s)).ToArray();
                OffsetHeading     = ini.GetValueArray <double>("Unit", "Offset.Heading");
                RequiredMod       = ini.GetValue <string>("Unit", "RequiredMod");

                AircraftData = new DBEntryUnitAircraftData();

                // Load the list of operators
                Operators = new Dictionary <string, Decade[]>(StringComparer.InvariantCultureIgnoreCase);
                foreach (string k in ini.GetKeysInSection("Operators"))
                {
                    if (Operators.ContainsKey(k))
                    {
                        continue;
                    }
                    Operators.Add(k, ini.GetValueArrayAsMinMaxEnum <Decade>("Operators", k));
                }

                if (IsAircraft)                                // Load aircraft-specific data, if required
                {
                    DCSIDs       = new string[] { DCSIDs[0] }; // Aircraft can not have multiple unit types in their group
                    AircraftData = new DBEntryUnitAircraftData(ini);
                }
            }

            return(true);
        }
Exemplo n.º 7
0
        protected override bool OnLoad(string iniFilePath)
        {
            var ini = new INIFile(iniFilePath);

            BriefingRemarks = new string[2][];
            BriefingRemarks[(int)Side.Ally]  = ini.GetValueArray <string>("Briefing", "Remarks", ';');
            BriefingRemarks[(int)Side.Enemy] = ini.GetValueArray <string>("Briefing", "Remarks.Enemy", ';');

            // Included files
            IncludeLua         = Toolbox.AddMissingFileExtensions(ini.GetValueArray <string>("Include", "Lua"), ".lua");
            IncludeLuaSettings = ini.GetValue <string>("Lua", "LuaSettings");
            IncludeOgg         = Toolbox.AddMissingFileExtensions(ini.GetValueArray <string>("Include", "Ogg"), ".ogg");

            foreach (string f in IncludeLua)
            {
                if (!File.Exists($"{SourceLuaDirectory}{f}"))
                {
                    BriefingRoom.PrintToLog($"File \"{SourceLuaDirectory}{f}\", required by feature \"{ID}\", doesn't exist.", LogMessageErrorLevel.Warning);
                }
            }

            foreach (string f in IncludeOgg)
            {
                if (!File.Exists($"{BRPaths.INCLUDE_OGG}{f}"))
                {
                    BriefingRoom.PrintToLog($"File \"{BRPaths.INCLUDE_OGG}{f}\", required by feature \"{ID}\", doesn't exist.", LogMessageErrorLevel.Warning);
                }
            }

            // Unit group
            UnitGroupFamilies         = ini.GetValueArray <UnitFamily>("UnitGroup", "Families");
            UnitGroupFlags            = ini.GetValueArrayAsEnumFlags <FeatureUnitGroupFlags>("UnitGroup", "Flags");
            UnitGroupLuaGroup         = ini.GetValue <string>("UnitGroup", "Lua.Group");
            UnitGroupLuaUnit          = ini.GetValue <string>("UnitGroup", "Lua.Unit");
            UnitGroupSize             = ini.GetValue <MinMaxI>("UnitGroup", "Size");
            ExtraGroups               = ini.GetValue <MinMaxI>("UnitGroup", "ExtraGroups");
            UnitGroupSpawnDistance    = ini.GetValue <double>("UnitGroup", "SpawnDistance");
            UnitGroupPayload          = ini.GetValue <string>("UnitGroup", "Payload", "default");
            UnitGroupValidSpawnPoints = DatabaseTools.CheckSpawnPoints(ini.GetValueArray <SpawnPointType>("UnitGroup", "ValidSpawnPoints"));

            return(true);
        }