/// <summary> /// Resets all settings to their default values. /// </summary> private void Clear() { AircraftType = TemplateTools.CheckValuePlayerAircraft(Database.Instance.Common.DefaultPlayerAircraft); Carrier = ""; Count = 2; Task = MissionTemplateMPFlightGroupTask.Objectives; }
/// <summary> /// Constructor. /// </summary> /// <param name="ini">The .ini file to load from</param> /// <param name="section">The ini section to load from</param> /// <param name="key">The ini key to load from</param> public MissionTemplateMPFlightGroup(INIFile ini, string section, string key) { Clear(); AircraftType = TemplateTools.CheckValuePlayerAircraft(ini.GetValue(section, $"{key}.AircraftType", AircraftType)); Carrier = ini.GetValue(section, $"{key}.Carrier", Carrier); Count = ini.GetValue(section, $"{key}.Count", Count); Task = ini.GetValue(section, $"{key}.Task", Task); }
/// <summary> /// Returns the proper payload type for a given task. /// </summary> /// <param name="task">Task assigned to this flight group in the mission package</param> /// <param name="objectiveDB">(optional) Mission objective database entry</param> /// <returns>A payload</returns> private UnitTaskPayload GetPayloadByTask(MissionTemplateMPFlightGroupTask task, DBEntryObjective objectiveDB = null) { switch (task) { default: // case MissionTemplateMPFlightGroupTask.Objectives if (objectiveDB == null) { return(UnitTaskPayload.Default); } return(objectiveDB.Payload); case MissionTemplateMPFlightGroupTask.SupportCAP: return(UnitTaskPayload.AirToAir); case MissionTemplateMPFlightGroupTask.SupportSEAD: return(UnitTaskPayload.SEAD); } }
/// <summary> /// Return a string describing the task of a player flight group, to display in the flight group table part of the briefing. /// </summary> /// <param name="task">Task assigned to this flight group in the mission package</param> /// <param name="objectiveDB">(optional) Mission objective database entry</param> /// <returns>Name of task as it will appear in the flight group table</returns> private string GetTaskingDescription(MissionTemplateMPFlightGroupTask task, DBEntryObjective objectiveDB) { switch (task) { default: // case MissionTemplateMPFlightGroupTask.Objectives if (objectiveDB == null) { return("Mission objectives"); } return(objectiveDB.BriefingTaskFlightGroup); case MissionTemplateMPFlightGroupTask.SupportCAP: return("CAP escort"); case MissionTemplateMPFlightGroupTask.SupportSEAD: return("SEAD escort"); } }
/// <summary> /// Creates an AI escort flight group in a single-player mission. /// </summary> /// <param name="mission">Mission to which generated units should be added</param> /// <param name="template">Mission template to use</param> /// <param name="count">Number of aircraft in the flight group</param> /// <param name="task">Escort task the flight group will be assigned with</param> /// <param name="playerCoalitionDB">Player coalition database entry</param> /// <returns>A <see cref="UnitFlightGroupBriefingDescription"/> describing the flight group, to be used in the briefing</returns> private UnitFlightGroupBriefingDescription?GenerateAIEscort(DCSMission mission, MissionTemplate template, int count, MissionTemplateMPFlightGroupTask task, DBEntryCoalition playerCoalitionDB) { if (count < 1) { return(null); // No aircraft, nothing to generate. } // Select proper payload for the flight group according to its tasking UnitTaskPayload payload = GetPayloadByTask(task, null); string groupLua; string[] aircraft; switch (task) { default: return(null); // Should never happen case MissionTemplateMPFlightGroupTask.SupportCAP: //groupLua = (template.GetMissionType() == MissionType.SinglePlayer) ? "GroupAircraftPlayerEscortCAP" : "GroupAircraftCAP"; groupLua = "GroupAircraftCAP"; aircraft = playerCoalitionDB.GetRandomUnits(UnitFamily.PlaneFighter, mission.DateTime.Decade, count, template.OptionsUnitMods); break; case MissionTemplateMPFlightGroupTask.SupportSEAD: //groupLua = (template.GetMissionType() == MissionType.SinglePlayer) ? "GroupAircraftPlayerEscortSEAD" : "GroupAircraftSEAD"; groupLua = "GroupAircraftSEAD"; aircraft = playerCoalitionDB.GetRandomUnits(UnitFamily.PlaneSEAD, mission.DateTime.Decade, count, template.OptionsUnitMods); break; } Coordinates position = mission.InitialPosition; // Player starts on runway, so escort starts in the air above the airfield (so player doesn't have to wait for them to take off) // OR mission is MP, so escorts start in air (but won't be spawned until at least one player takes off) // Add a random distance so they don't crash into each other. if ((template.PlayerStartLocation == PlayerStartLocation.Runway) || (template.GetMissionType() != MissionType.SinglePlayer)) { position += Coordinates.CreateRandom(2, 4) * Toolbox.NM_TO_METERS; } DCSMissionUnitGroup group; //if (template.GetMissionType() == MissionType.SinglePlayer) // group = UnitMaker.AddUnitGroup( // mission, aircraft, // Side.Ally, position, // groupLua, "UnitAircraft", // Toolbox.BRSkillLevelToDCSSkillLevel(template.PlayerAISkillLevel), 0, // payload, null, mission.InitialAirbaseID, true); //else group = UnitMaker.AddUnitGroup( mission, aircraft, Side.Ally, position, groupLua, "UnitAircraft", Toolbox.BRSkillLevelToDCSSkillLevel(template.PlayerAISkillLevel), 0, payload, mission.ObjectivesCenter); if (group == null) { DebugLog.Instance.WriteLine($"Failed to create AI escort flight group tasked with {task} with aircraft of type \"{aircraft[0]}\".", 1, DebugLogMessageErrorLevel.Warning); return(null); } switch (task) { default: return(null); // Should never happen case MissionTemplateMPFlightGroupTask.SupportCAP: mission.EscortCAPGroupId = group.GroupID; break; case MissionTemplateMPFlightGroupTask.SupportSEAD: mission.EscortSEADGroupId = group.GroupID; break; } return (new UnitFlightGroupBriefingDescription( group.Name, group.Units.Length, aircraft[0], GetTaskingDescription(task, null), Database.Instance.GetEntry <DBEntryUnit>(aircraft[0]).AircraftData.GetRadioAsString())); }