/// <summary>
        /// Generates the content of the Lua file.
        /// </summary>
        /// <param name="mission">The mission from which to generate the .Miz file.</param>
        /// <param name="resourceOggString">An string containing the Lua declaring all embedded .ogg files.</param>
        /// <returns>The contents of the Lua file.</returns>
        public string MakeLua(DCSMission mission, string resourceOggString)
        {
            string lua = LuaTools.ReadIncludeLuaFile("MapResource.lua");

            LuaTools.ReplaceKey(ref lua, "OggFiles", resourceOggString);
            LuaTools.ReplaceKey(ref lua, "MissionID", mission.UniqueID);

            return(lua);
        }
        /// <summary>
        /// Generates the content of the Lua file.
        /// </summary>
        /// <param name="mission">An HQ4DCS mission.</param>
        /// <returns>The contents of the Lua file.</returns>
        public string MakeLua(DCSMission mission)
        {
            DebugLog.Instance.WriteLine("Concatenating source Lua files...");
            string lua = LuaTools.ReadIncludeLuaFile("Script.lua");

            DebugLog.Instance.WriteLine("Making replacements in the Lua files...");
            LuaTools.ReplaceKey(ref lua, "CoreLua", mission.CoreLuaScript.Trim('\r', '\n', ' '));
            LuaTools.ReplaceKey(ref lua, "RadioSounds", mission.RadioSounds);
            LuaTools.ReplaceKey(ref lua, "LuaSettings", mission.LuaSettings);
            LuaTools.ReplaceKey(ref lua, "IncludedLua", GetIncludedMissionFeaturesLua(mission.IncludedLuaScripts));

            LuaTools.ReplaceKey(ref lua, "EnemyCoalition", $"coalition.side.{mission.CoalitionEnemy.ToString().ToUpperInvariant()}");
            LuaTools.ReplaceKey(ref lua, "PlayerCoalition", $"coalition.side.{mission.CoalitionPlayer.ToString().ToUpperInvariant()}");
            LuaTools.ReplaceKey(ref lua, "StaticObjective", mission.ObjectiveIsStatic);
            LuaTools.ReplaceKey(ref lua, "EndMode", (int)mission.EndMode);

            return(lua);
        }
Пример #3
0
        /// <summary>
        /// Generates the content of the Lua file.
        /// </summary>
        /// <param name="missHQ">An HQ4DCS mission.</param>
        /// <returns>The contents of the Lua file.</returns>
        public string MakeLua(DCSMission missHQ)
        {
            string airportsLua = "";

            foreach (int id in missHQ.AirbasesCoalition.Keys)
            {
                string apLua = WarehouseAirportLua;
                LuaTools.ReplaceKey(ref apLua, "Index", id);
                LuaTools.ReplaceKey(ref apLua, "Coalition", missHQ.AirbasesCoalition[id].ToString().ToUpperInvariant());
                airportsLua += apLua + "\n";
            }

            string lua = WarehouseLua;

            LuaTools.ReplaceKey(ref lua, "Airports", airportsLua);

            return(lua);
        }
        private void CreatePlayerWaypoints(ref string groupLua, DCSMission mission, DBEntryUnit unitBP)
        {
            string waypointLua     = LuaTools.ReadIncludeLuaFile("Mission\\WaypointPlayer.lua");
            string allWaypointsLua = "";

            for (int i = 0; i < mission.Waypoints.Count; i++)
            {
                string waypoint = waypointLua;
                LuaTools.ReplaceKey(ref waypoint, "Index", i + 2);
                LuaTools.ReplaceKey(ref waypoint, "Name", mission.Waypoints[i].Name);
                LuaTools.ReplaceKey(ref waypoint, "X", mission.Waypoints[i].Coordinates.X);
                LuaTools.ReplaceKey(ref waypoint, "Y", mission.Waypoints[i].Coordinates.Y);

                double waypointAltitude, waypointSpeed;
                if (unitBP == null) // Unit not found in the database, use default values for the unit category
                {
                    waypointAltitude = ((unitBP.Category == UnitCategory.Helicopter) ? 1500 : 20000) * Toolbox.FEET_TO_METERS;
                    waypointSpeed    = ((unitBP.Category == UnitCategory.Helicopter) ? 90 : 300) * Toolbox.KNOTS_TO_METERS_PER_SECOND;
                }
                else
                {
                    waypointAltitude = unitBP.AircraftData.CruiseAltitude;
                    waypointSpeed    = unitBP.AircraftData.CruiseAltitude;
                }

                waypointAltitude *= mission.Waypoints[i].AltitudeMultiplier;
                waypointSpeed    *= mission.Waypoints[i].SpeedMultiplier;

                LuaTools.ReplaceKey(ref waypoint, "Altitude", waypointAltitude);
                LuaTools.ReplaceKey(ref waypoint, "Speed", waypointSpeed);

                allWaypointsLua += waypoint + "\n";
            }

            LuaTools.ReplaceKey(ref groupLua, "PlayerWaypoints", allWaypointsLua);
            LuaTools.ReplaceKey(ref groupLua, "LastPlayerWaypointIndex", mission.Waypoints.Count + 2);
        }
Пример #5
0
        private void CreatePlayerWaypoints(ref string groupLua, DCSMission mission, DBEntryUnit unitBP)
        {
            string waypointLua     = LuaTools.ReadIncludeLuaFile("Mission\\WaypointPlayer.lua");
            string allWaypointsLua = "";

            for (int i = 0; i < mission.Waypoints.Count; i++)
            {
                string waypoint = waypointLua;
                LuaTools.ReplaceKey(ref waypoint, "Index", i + 2);
                LuaTools.ReplaceKey(ref waypoint, "Name", mission.Waypoints[i].Name);
                LuaTools.ReplaceKey(ref waypoint, "X", mission.Waypoints[i].Coordinates.X);
                LuaTools.ReplaceKey(ref waypoint, "Y", mission.Waypoints[i].Coordinates.Y);

                double waypointAltitude, waypointSpeed;
                if (unitBP == null) // Unit not found in the database, use default values for the unit category
                {
                    waypointAltitude = GetAircraftCruiseAltitude(unitBP.Category, Amount.Average);
                    waypointSpeed    = GetAircraftCruiseSpeed(unitBP.Category, Amount.Average);
                }
                else
                {
                    waypointAltitude = GetAircraftCruiseAltitude(unitBP.Category, unitBP.AircraftData.CruiseAltitude);
                    waypointSpeed    = GetAircraftCruiseSpeed(unitBP.Category, unitBP.AircraftData.CruiseAltitude);
                }

                waypointAltitude *= mission.Waypoints[i].AltitudeMultiplier;
                waypointSpeed    *= mission.Waypoints[i].SpeedMultiplier;

                LuaTools.ReplaceKey(ref waypoint, "Altitude", waypointAltitude);
                LuaTools.ReplaceKey(ref waypoint, "Speed", waypointSpeed);

                allWaypointsLua += waypoint + "\n";
            }

            LuaTools.ReplaceKey(ref groupLua, "PlayerWaypoints", allWaypointsLua);
            LuaTools.ReplaceKey(ref groupLua, "LastPlayerWaypointIndex", mission.Waypoints.Count + 2);
        }
Пример #6
0
        private void CreateUnitGroups(ref string lua, DCSMission mission)
        {
            int i, j;

            for (i = 0; i < 2; i++)
            {
                string coalitionLua = "";
                var    k            = 1;
                foreach (var country in (Coalition)i == Coalition.Blue? mission.CountryBlues: mission.CountryReds)
                {
                    string countryLua = LuaTools.ReadIncludeLuaFile($"Country");
                    LuaTools.ReplaceKey(ref countryLua, "Index", k);
                    LuaTools.ReplaceKey(ref countryLua, "DCSID", (int)country);
                    LuaTools.ReplaceKey(ref countryLua, "Name", Enum.GetName(typeof(Country), country));
                    for (j = 0; j < Toolbox.EnumCount <UnitCategory>(); j++)
                    {
                        CreateUnitGroups(ref countryLua, mission, (Coalition)i, (UnitCategory)j, country);
                    }
                    coalitionLua += countryLua;
                    k++;
                }
                LuaTools.ReplaceKey(ref lua, $"COUNTRYS{(Coalition)i}", coalitionLua);
            }
        }
        /// <summary>
        /// Generates the content of the Lua file.
        /// </summary>
        /// <param name="mission">An HQ4DCS mission.</param>
        /// <returns>The contents of the Lua file.</returns>
        public string MakeLua(DCSMission mission)
        {
            int i;

            string lua = LuaTools.ReadIncludeLuaFile("Mission.lua");

            LuaTools.ReplaceKey(ref lua, "TheaterID", Database.Instance.GetEntry <DBEntryTheater>(mission.Theater).DCSID);
            LuaTools.ReplaceKey(ref lua, "PlayerCoalition", mission.CoalitionPlayer.ToString().ToLowerInvariant());

            LuaTools.ReplaceKey(ref lua, "DateDay", mission.DateTime.Day);
            LuaTools.ReplaceKey(ref lua, "DateMonth", (int)mission.DateTime.Month + 1);
            LuaTools.ReplaceKey(ref lua, "DateYear", mission.DateTime.Year);
            LuaTools.ReplaceKey(ref lua, "StartTime", mission.DateTimeTotalSeconds);

            LuaTools.ReplaceKey(ref lua, "WeatherCloudsBase", mission.Weather.CloudBase);
            LuaTools.ReplaceKey(ref lua, "WeatherCloudsDensity", mission.Weather.CloudsDensity);
            LuaTools.ReplaceKey(ref lua, "WeatherCloudsPrecipitation", (int)mission.Weather.CloudsPrecipitation);
            LuaTools.ReplaceKey(ref lua, "WeatherCloudsThickness", mission.Weather.CloudsThickness);
            LuaTools.ReplaceKey(ref lua, "WeatherDustDensity", mission.Weather.DustDensity);
            LuaTools.ReplaceKey(ref lua, "WeatherDustEnabled", mission.Weather.DustEnabled);
            LuaTools.ReplaceKey(ref lua, "WeatherFogEnabled", mission.Weather.Turbulence);
            LuaTools.ReplaceKey(ref lua, "WeatherFogThickness", mission.Weather.FogThickness);
            LuaTools.ReplaceKey(ref lua, "WeatherFogVisibility", mission.Weather.FogVisibility);
            LuaTools.ReplaceKey(ref lua, "WeatherGroundTurbulence", mission.Weather.Turbulence);
            LuaTools.ReplaceKey(ref lua, "WeatherQNH", mission.Weather.QNH);
            LuaTools.ReplaceKey(ref lua, "WeatherTemperature", mission.Weather.Temperature);
            LuaTools.ReplaceKey(ref lua, "WeatherVisibilityDistance", mission.Weather.Visibility);
            for (i = 0; i < 3; i++)
            {
                LuaTools.ReplaceKey(ref lua, $"WeatherWind{i + 1}", mission.Weather.WindSpeed[i]);
                LuaTools.ReplaceKey(ref lua, $"WeatherWind{i + 1}Dir", mission.Weather.WindDirection[i]);
            }

            LuaTools.ReplaceKey(ref lua, "BullseyeBlueX", mission.Bullseye[(int)Coalition.Blue].X);
            LuaTools.ReplaceKey(ref lua, "BullseyeBlueY", mission.Bullseye[(int)Coalition.Blue].Y);
            LuaTools.ReplaceKey(ref lua, "BullseyeRedX", mission.Bullseye[(int)Coalition.Red].X);
            LuaTools.ReplaceKey(ref lua, "BullseyeRedY", mission.Bullseye[(int)Coalition.Red].Y);


            LuaTools.ReplaceKey(ref lua, "MissionName", mission.MissionName);
            LuaTools.ReplaceKey(ref lua, "BriefingDescription", mission.BriefingTXT, true);

            CreateUnitGroups(ref lua, mission); // Create unit groups

            Debug.DebugLog.Instance.WriteLine("Building Airbase");
            DBEntryTheaterAirbase airbase =
                (from DBEntryTheaterAirbase ab in Database.Instance.GetEntry <DBEntryTheater>(mission.Theater).Airbases
                 where ab.DCSID == mission.InitialAirbaseID select ab).FirstOrDefault();

            LuaTools.ReplaceKey(ref lua, "MissionAirbaseID", mission.InitialAirbaseID);
            LuaTools.ReplaceKey(ref lua, "MissionAirbaseX", airbase.Coordinates.X);
            LuaTools.ReplaceKey(ref lua, "MissionAirbaseY", airbase.Coordinates.Y);

            // The following replacements must be performed after unit groups and player waypoints have been added
            LuaTools.ReplaceKey(ref lua, "PlayerGroupID", mission.PlayerGroupID);
            LuaTools.ReplaceKey(ref lua, "InitialWPName", Database.Instance.Common.WPNameInitial);
            LuaTools.ReplaceKey(ref lua, "FinalWPName", Database.Instance.Common.WPNameFinal);
            LuaTools.ReplaceKey(ref lua, "FinalWPName", Database.Instance.Common.WPNameFinal); //Duplicate

            switch (mission.PlayerStartLocation)
            {
            default:     // case PlayerStartLocation.ParkingCold
                LuaTools.ReplaceKey(ref lua, "PlayerStartingAction", "From Parking Area");
                LuaTools.ReplaceKey(ref lua, "PlayerStartingType", "TakeOffParking");

                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAction", "From Parking Area");     // Player starts cold, AI escorts start cold too
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingType", "TakeOffParking");
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAltitude", 13);
                break;

            case PlayerStartLocation.ParkingHot:
                LuaTools.ReplaceKey(ref lua, "PlayerStartingAction", "From Parking Area Hot");
                LuaTools.ReplaceKey(ref lua, "PlayerStartingType", "TakeOffParkingHot");

                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAction", "From Parking Area Hot");     // Player starts hot, AI escorts start hot too
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingType", "TakeOffParkingHot");
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAltitude", 13);
                break;

            case PlayerStartLocation.Runway:
                LuaTools.ReplaceKey(ref lua, "PlayerStartingAction", "From Runway");
                LuaTools.ReplaceKey(ref lua, "PlayerStartingType", "TakeOff");

                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAction", "Turning Point");     // Player starts on runway, AI escorts start in air above him
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingType", "Turning Point");
                LuaTools.ReplaceKey(ref lua, "PlayerEscortStartingAltitude", 10000 * Toolbox.FEET_TO_METERS);
                break;
            }

            LuaTools.ReplaceKey(ref lua, "MissionID", mission.UniqueID);
            LuaTools.ReplaceKey(ref lua, "ForcedOptions", GetForcedOptionsLua(mission));

            return(lua);
        }
        private void CreateUnitGroups(ref string lua, DCSMission mission, Coalition coalition, UnitCategory unitCategory)
        {
            int    i, j;
            int    groupIndex   = 1;
            string allGroupsLua = "";

            foreach (DCSMissionUnitGroup group in mission.UnitGroups)
            {
                if ((group.Coalition != coalition) ||   // Group does not belong to this coalition
                    (group.Category != unitCategory) || // Group does not belong to this unit category
                    (group.Units.Length == 0))          // Group doesn't contain any units
                {
                    continue;                           // Ignore it
                }
                string groupLua = LuaTools.ReadIncludeLuaFile($"Units\\{group.LuaGroup}");
                LuaTools.ReplaceKey(ref groupLua, "Index", groupIndex);
                LuaTools.ReplaceKey(ref groupLua, "X", group.Coordinates.X);
                LuaTools.ReplaceKey(ref groupLua, "Y", group.Coordinates.Y);
                LuaTools.ReplaceKey(ref groupLua, "X2", group.Coordinates2.X);
                LuaTools.ReplaceKey(ref groupLua, "Y2", group.Coordinates2.Y);
                LuaTools.ReplaceKey(ref groupLua, "Hidden", group.Flags.HasFlag(DCSMissionUnitGroupFlags.Hidden));
                LuaTools.ReplaceKey(ref groupLua, "ID", group.GroupID);
                LuaTools.ReplaceKey(ref groupLua, "FirstUnitID", group.Units[0].ID);
                LuaTools.ReplaceKey(ref groupLua, "Name", group.Name);
                LuaTools.ReplaceKey(ref groupLua, "ObjectiveAirbaseID", group.AirbaseID);

                if (group.CarrierId > 0)
                {
                    LuaTools.ReplaceKey(ref groupLua, "LinkUnit", group.CarrierId);
                }

                if (group.TACAN != null)
                {
                    LuaTools.ReplaceKey(ref groupLua, "TacanFrequency", group.TACAN.freqency);
                    LuaTools.ReplaceKey(ref groupLua, "TacanCallSign", group.TACAN.callsign);
                    LuaTools.ReplaceKey(ref groupLua, "TacanChannel", group.TACAN.channel);
                    LuaTools.ReplaceKey(ref groupLua, "UnitID", group.Units[0].ID);
                }
                if (group.ILS > 0)
                {
                    LuaTools.ReplaceKey(ref groupLua, "ILS", group.ILS);
                }


                DBEntryUnit unitBP = Database.Instance.GetEntry <DBEntryUnit>(group.UnitID);
                if (unitBP == null)
                {
                    continue;                 // TODO: error message?
                }
                // Group is a client group, requires player waypoints
                if (group.IsAPlayerGroup())
                {
                    CreatePlayerWaypoints(ref groupLua, mission, unitBP);
                }

                string allUnitsLua = "";
                for (i = 0; i < group.Units.Length; i++)
                {
                    string      unitLua         = LuaTools.ReadIncludeLuaFile($"Units\\{group.LuaUnit}");
                    Coordinates unitCoordinates = new Coordinates(group.Coordinates);
                    double      unitHeading     = 0;

                    if ((group.Category == UnitCategory.Static) || (group.Category == UnitCategory.Vehicle))
                    {
                        double randomSpreadAngle = Toolbox.RandomDouble(Math.PI * 2);
                        unitCoordinates += new Coordinates(Math.Cos(randomSpreadAngle) * 35, Math.Sin(randomSpreadAngle) * 35);
                        unitHeading      = Toolbox.RandomDouble(Math.PI * 2);
                    }
                    else
                    {
                        unitCoordinates += new Coordinates(50 * i, 50 * i);
                    }

                    if ((group.Category == UnitCategory.Helicopter) || (group.Category == UnitCategory.Plane)) // Unit is an aircraft
                    {
                        if (unitBP == null)
                        {
                            LuaTools.ReplaceKey(ref groupLua, "Altitude", ((group.Category == UnitCategory.Helicopter) ? 1500 : 4572) * Toolbox.RandomDouble(.8, 1.2));
                            LuaTools.ReplaceKey(ref unitLua, "Altitude", ((group.Category == UnitCategory.Helicopter) ? 1500 : 4572) * Toolbox.RandomDouble(.8, 1.2));
                            LuaTools.ReplaceKey(ref groupLua, "EPLRS", false);
                            LuaTools.ReplaceKey(ref unitLua, "PayloadCommon", "");
                            LuaTools.ReplaceKey(ref unitLua, "PayloadPylons", "");
                            LuaTools.ReplaceKey(ref unitLua, "RadioPresetsLua", "");
                            LuaTools.ReplaceKey(ref unitLua, "PropsLua", "");
                            LuaTools.ReplaceKey(ref groupLua, "RadioBand", 0);
                            LuaTools.ReplaceKey(ref groupLua, "RadioFrequency", 124.0f);
                            LuaTools.ReplaceKey(ref groupLua, "Speed", ((group.Category == UnitCategory.Helicopter) ? 51 : 125) * Toolbox.RandomDouble(.9, 1.1));
                        }
                        else
                        {
                            LuaTools.ReplaceKey(ref groupLua, "Altitude", unitBP.AircraftData.CruiseAltitude);
                            LuaTools.ReplaceKey(ref unitLua, "Altitude", unitBP.AircraftData.CruiseAltitude);
                            LuaTools.ReplaceKey(ref groupLua, "EPLRS", unitBP.Flags.HasFlag(DBEntryUnitFlags.EPLRS));
                            LuaTools.ReplaceKey(ref unitLua, "PayloadCommon", unitBP.AircraftData.PayloadCommon);
                            if (group.IsAPlayerGroup())
                            {
                                LuaTools.ReplaceKey(ref unitLua, "RadioPresetsLua", string.Join("", unitBP.AircraftData.RadioPresets.Select((x, index) => $"[{index + 1}] = {x.ToLuaString()}")));
                                LuaTools.ReplaceKey(ref unitLua, "PropsLua", unitBP.AircraftData.PropsLua);
                            }
                            else
                            {
                                LuaTools.ReplaceKey(ref unitLua, "RadioPresetsLua", "");
                                LuaTools.ReplaceKey(ref unitLua, "PropsLua", "");
                            }
                            LuaTools.ReplaceKey(ref groupLua, "RadioBand", (int)unitBP.AircraftData.RadioModulation);
                            LuaTools.ReplaceKey(ref groupLua, "RadioFrequency", unitBP.AircraftData.RadioFrequency);
                            LuaTools.ReplaceKey(ref groupLua, "Speed", unitBP.AircraftData.CruiseSpeed);

                            string   pylonLua = "";
                            string[] payload  = unitBP.AircraftData.GetPayload(group.Payload, mission.DateTime.Decade);
                            for (j = 0; j < DBEntryUnitAircraftData.MAX_PYLONS; j++)
                            {
                                string pylonCode = payload[j];
                                if (!string.IsNullOrEmpty(pylonCode))
                                {
                                    pylonLua += $"[{j + 1}] = {{[\"CLSID\"] = \"{pylonCode}\" }},\r\n";
                                }
                            }

                            LuaTools.ReplaceKey(ref unitLua, "PayloadPylons", pylonLua);
                        }
                    }
                    else if ((group.Category == UnitCategory.Ship))
                    {
                        if (group.RadioFrequency > 0)
                        {
                            LuaTools.ReplaceKey(ref unitLua, "RadioBand", (int)group.RadioModulation);
                            LuaTools.ReplaceKey(ref unitLua, "RadioFrequency", group.RadioFrequency * 1000000);
                        }
                        else
                        {
                            LuaTools.ReplaceKey(ref unitLua, "RadioBand", 0);
                            LuaTools.ReplaceKey(ref unitLua, "RadioFrequency", 127.0f * 1000000);
                        }
                        LuaTools.ReplaceKey(ref groupLua, "Speed", group.Speed);
                    }

                    if (unitBP == null)
                    {
                        LuaTools.ReplaceKey(ref unitLua, "ExtraLua", "");
                    }
                    else
                    {
                        LuaTools.ReplaceKey(ref unitLua, "ExtraLua", unitBP.ExtraLua);
                    }

                    LuaTools.ReplaceKey(ref unitLua, "Callsign", group.CallsignLua); // Must be before "index" replacement, as is it is integrated in the callsign
                    LuaTools.ReplaceKey(ref unitLua, "Index", i + 1);
                    LuaTools.ReplaceKey(ref unitLua, "ID", group.Units[i].ID);
                    LuaTools.ReplaceKey(ref unitLua, "Type", group.Units[i].Type);
                    LuaTools.ReplaceKey(ref unitLua, "Name", $"{group.Name} {i + 1}");
                    if (group.Flags.HasFlag(DCSMissionUnitGroupFlags.FirstUnitIsPlayer))
                    {
                        LuaTools.ReplaceKey(ref unitLua, "Skill", (i == 0) ? DCSSkillLevel.Player : group.Skill, false);
                    }
                    else
                    {
                        LuaTools.ReplaceKey(ref unitLua, "Skill", group.Skill, false);
                    }
                    LuaTools.ReplaceKey(ref unitLua, "X", group.Units[i].Coordinates.X);
                    LuaTools.ReplaceKey(ref unitLua, "Y", group.Units[i].Coordinates.Y);
                    LuaTools.ReplaceKey(ref unitLua, "Heading", group.Units[i].Heading);
                    LuaTools.ReplaceKey(ref unitLua, "OnboardNumber", Toolbox.RandomInt(1, 1000).ToString("000"));
                    LuaTools.ReplaceKey(ref unitLua, "ParkingID", group.Units[i].ParkingSpot);

                    allUnitsLua += unitLua + "\n";
                }
                LuaTools.ReplaceKey(ref groupLua, "units", allUnitsLua);

                allGroupsLua += groupLua + "\n";

                groupIndex++;
            }

            LuaTools.ReplaceKey(ref lua, $"Groups{unitCategory}{coalition}", allGroupsLua);
        }