/// <summary>Downgrades XWA missions to TIE95</summary> /// <remarks>G/PLT, SHPYD, REPYD and M/SC craft will have their indexes changed to reflect IDMR TIE95 Ships patch numbering. Triggers will update.<br/> /// FG.Radio is not converted, since TIE behaviour is different<br/> /// Maximum FG.Formation value of 12 allowed<br/> /// For Triggers, maximum Trigger index of 24, maximum VariableType of 9, Amounts will be adjusted as 66% to 75%, 33% to 50% and "each" to 100%<br/> /// Maximum Abort index of 5<br/> /// Maximum FG.Goal Amount index of 6, 75% converted to 100%, 25% to 50%. First three XvT Goals will be used as Primary, Secondary and Bonus goals. Bonus points will be scaled appropriately. Goals only used if set for Team[0] and Enabled<br/> /// First two Arrival triggers used, first Departure trigger used. First three Region 1 Orders used, max index of 38.<br/> /// Only Start and Hyp WPs converted, manual placement for WP1-8 required.<br/> /// For Messages, first two triggers used.<br/> /// For the Briefing, first 16 strings and text tags are copied, events are ignored (due to using icons instead of Craft)<br/> /// Primary Global goals used, XWA Secondary goals converted to Bonus goals. Prevent goals ignored<br/> /// Team[0] EndOfMissionMessages used, Teams[2-6] Name and Hostility towards Team[0] used for IFF<br/> /// BriefingQuestions generated using MissionSucc/Fail/Desc strings. Flight Officer has a single pre-mission entry for the Description, two post-mission entries for the Success and Fail. Line breaks must be entered manually<br/> /// Filename will end in "_TIE.tie"</remarks> /// <param name="miss">XWA mission to convert</param> /// <returns>Downgraded mission</returns> /// <exception cref="System.ArgumentException">Properties incompatable with TIE95 were detected in <i>miss</i></exception> public static Tie.Mission XwaToTie(Xwa.Mission miss) { Tie.Mission tie = new Tie.Mission(); if (miss.FlightGroups.Count > Tie.Mission.FlightGroupLimit) { throw maxException(true, true, Tie.Mission.FlightGroupLimit); } if (miss.Messages.Count > Tie.Mission.MessageLimit) { throw maxException(true, false, Tie.Mission.MessageLimit); } tie.FlightGroups = new Tie.FlightGroupCollection(miss.FlightGroups.Count); if (miss.Messages.Count > 0) { tie.Messages = new Tie.MessageCollection(miss.Messages.Count); } #region FGs for (int i = 0; i < tie.FlightGroups.Count; i++) { #region Craft // Radio is omitted intentionally tie.FlightGroups[i].Name = miss.FlightGroups[i].Name; tie.FlightGroups[i].Cargo = miss.FlightGroups[i].Cargo; tie.FlightGroups[i].SpecialCargo = miss.FlightGroups[i].SpecialCargo; tie.FlightGroups[i].SpecialCargoCraft = miss.FlightGroups[i].SpecialCargoCraft; tie.FlightGroups[i].RandSpecCargo = miss.FlightGroups[i].RandSpecCargo; tie.FlightGroups[i].CraftType = Tie.Mission.CraftCheck(miss.FlightGroups[i].CraftType); if (tie.FlightGroups[i].CraftType == 255) { throw flightException(4, i, Xwa.Strings.CraftType[miss.FlightGroups[i].CraftType]); } tie.FlightGroups[i].NumberOfCraft = miss.FlightGroups[i].NumberOfCraft; tie.FlightGroups[i].Status1 = miss.FlightGroups[i].Status1; if (tie.FlightGroups[i].Status1 > 19) { throw flightException(0, i, Xwa.Strings.Status[miss.FlightGroups[i].Status1]); } tie.FlightGroups[i].Missile = miss.FlightGroups[i].Missile; tie.FlightGroups[i].Beam = miss.FlightGroups[i].Beam; tie.FlightGroups[i].IFF = miss.FlightGroups[i].IFF; tie.FlightGroups[i].AI = miss.FlightGroups[i].AI; tie.FlightGroups[i].Markings = miss.FlightGroups[i].Markings; if (miss.FlightGroups[i].Formation > 12) { throw flightException(1, i, Xwa.Strings.Formation[miss.FlightGroups[i].Formation]); } else { tie.FlightGroups[i].Formation = miss.FlightGroups[i].Formation; } tie.FlightGroups[i].FormDistance = miss.FlightGroups[i].FormDistance; tie.FlightGroups[i].GlobalGroup = miss.FlightGroups[i].GlobalGroup; tie.FlightGroups[i].FormLeaderDist = miss.FlightGroups[i].FormLeaderDist; tie.FlightGroups[i].NumberOfWaves = miss.FlightGroups[i].NumberOfWaves; tie.FlightGroups[i].PlayerCraft = (byte)(miss.FlightGroups[i].PlayerCraft + (miss.FlightGroups[i].PlayerNumber == 1 ? 1 : 0)); tie.FlightGroups[i].Yaw = miss.FlightGroups[i].Yaw; tie.FlightGroups[i].Pitch = miss.FlightGroups[i].Pitch; tie.FlightGroups[i].Roll = miss.FlightGroups[i].Roll; #endregion Craft #region ArrDep tie.FlightGroups[i].Difficulty = miss.FlightGroups[i].Difficulty; for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].ArrDepTriggers[j] = (Tie.Mission.Trigger)miss.FlightGroups[i].ArrDepTriggers[(j == 2 ? 4 : j)]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] ArrDep[" + j + "]: " + x.Message, x); } } tie.FlightGroups[i].AT1AndOrAT2 = miss.FlightGroups[i].ArrDepAndOr[0]; tie.FlightGroups[i].ArrivalDelayMinutes = miss.FlightGroups[i].ArrivalDelayMinutes; tie.FlightGroups[i].ArrivalDelaySeconds = miss.FlightGroups[i].ArrivalDelaySeconds; tie.FlightGroups[i].DepartureTimerMinutes = miss.FlightGroups[i].DepartureTimerMinutes; tie.FlightGroups[i].DepartureTimerSeconds = miss.FlightGroups[i].DepartureTimerSeconds; if (miss.FlightGroups[i].AbortTrigger > 5) { throw flightException(2, i, Xwa.Strings.Abort[miss.FlightGroups[i].AbortTrigger]); } else { tie.FlightGroups[i].AbortTrigger = miss.FlightGroups[i].AbortTrigger; } tie.FlightGroups[i].ArrivalCraft1 = miss.FlightGroups[i].ArrivalCraft1; tie.FlightGroups[i].ArrivalMethod1 = miss.FlightGroups[i].ArrivalMethod1; tie.FlightGroups[i].ArrivalCraft2 = miss.FlightGroups[i].ArrivalCraft2; tie.FlightGroups[i].ArrivalMethod2 = miss.FlightGroups[i].ArrivalMethod2; tie.FlightGroups[i].DepartureCraft1 = miss.FlightGroups[i].DepartureCraft1; tie.FlightGroups[i].DepartureMethod1 = miss.FlightGroups[i].DepartureMethod1; tie.FlightGroups[i].DepartureCraft2 = miss.FlightGroups[i].DepartureCraft2; tie.FlightGroups[i].DepartureMethod2 = miss.FlightGroups[i].DepartureMethod2; #endregion ArrDep #region Goals if ((miss.FlightGroups[i].Goals[0].Enabled) && miss.FlightGroups[i].Goals[0].Team == 0) { tie.FlightGroups[i].Goals[0] = miss.FlightGroups[i].Goals[0][1]; tie.FlightGroups[i].Goals[1] = miss.FlightGroups[i].Goals[0][2]; } if ((miss.FlightGroups[i].Goals[1].Enabled) && miss.FlightGroups[i].Goals[1].Team == 0) { tie.FlightGroups[i].Goals[2] = miss.FlightGroups[i].Goals[1][1]; tie.FlightGroups[i].Goals[3] = miss.FlightGroups[i].Goals[1][2]; } if ((miss.FlightGroups[i].Goals[2].Enabled) && miss.FlightGroups[i].Goals[2].Team == 0) { tie.FlightGroups[i].Goals[6] = miss.FlightGroups[i].Goals[2][1]; tie.FlightGroups[i].Goals[7] = miss.FlightGroups[i].Goals[2][2]; tie.FlightGroups[i].Goals[8] = miss.FlightGroups[i].Goals[2][3]; } tieGoalsCheck("FlightGroup " + i, tie.FlightGroups[i].Goals); #endregion Goals for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].Orders[j] = (Tie.FlightGroup.Order)miss.FlightGroups[i].Orders[0, j]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] Order[" + j + "]: " + x.Message, x); } } for (int j = 0; j < 3; j++) { tie.FlightGroups[i].Waypoints[j] = (Tie.FlightGroup.Waypoint)miss.FlightGroups[i].Waypoints[j]; } tie.FlightGroups[i].Waypoints[13] = (Tie.FlightGroup.Waypoint)miss.FlightGroups[i].Waypoints[3]; } #endregion FGs #region Messages for (int i = 0; i < tie.Messages.Count; i++) { tie.Messages[i].MessageString = miss.Messages[i].MessageString; tie.Messages[i].Color = miss.Messages[i].Color; tie.Messages[i].Delay = (byte)((miss.Messages[i].DelaySeconds + miss.Messages[i].DelayMinutes * 60) / 5); // should throw if delay > 21:15 tie.Messages[i].Short = miss.Messages[i].Note; tie.Messages[i].Trig1AndOrTrig2 = miss.Messages[i].TrigAndOr[0]; for (int j = 0; j < 2; j++) { try { tie.Messages[i].Triggers[j] = (Tie.Mission.Trigger)miss.Messages[i].Triggers[j]; } catch (Exception x) { throw new ArgumentException("Mess[" + i + "] T[" + j + "]: " + x.Message, x); } } } #endregion Messages #region Briefing for (int i = 0; i < tie.Briefing.BriefingTag.Length; i++) { tie.Briefing.BriefingTag[i] = miss.Briefings[0].BriefingTag[i]; } for (int i = 0; i < tie.Briefing.BriefingString.Length; i++) { tie.Briefing.BriefingString[i] = miss.Briefings[0].BriefingString[i]; } tie.Briefing.Unknown1 = miss.Briefings[0].Unknown1; tie.Briefing.Length = (short)(miss.Briefings[0].Length * Tie.Briefing.TicksPerSecond / Xwa.Briefing.TicksPerSecond); #endregion Briefing #region Globals tie.GlobalGoals.Goals[0].T1AndOrT2 = miss.Globals[0].Goals[0].T1AndOrT2; // Primary tie.GlobalGoals.Goals[2].T1AndOrT2 = miss.Globals[0].Goals[2].T1AndOrT2; // Secondary to Bonus, Prevent will be ignored for (int j = 0; j < 4; j++) { try { tie.GlobalGoals.Goals[j / 2 * 2].Triggers[j % 2] = (Tie.Mission.Trigger)miss.Globals[0].Goals[j / 2 * 2].Triggers[j % 2]; } catch (Exception x) { throw new ArgumentException("Goal[" + (j / 2 * 2) + "] T[" + (j % 2) + "]: " + x.Message, x); } } #endregion Globals #region IFF/Team for (int i = 0; i < 6; i++) { tie.EndOfMissionMessages[i] = miss.Teams[0].EndOfMissionMessages[i]; } for (int i = 2; i < 6; i++) { tie.IFFs[i] = miss.Teams[i].Name; tie.IffHostile[i] = ((int)miss.Teams[0].Allies[i] == 0); } #endregion IFF/Team #region Questions if (miss.MissionDescription != "") { tie.BriefingQuestions.PreMissQuestions[0] = "What are the mission objectives?"; tie.BriefingQuestions.PreMissAnswers[0] = miss.MissionDescription; // line breaks will have to be manually placed } if (miss.MissionSuccessful != "") { tie.BriefingQuestions.PostMissQuestions[0] = "What have I accomplished?"; tie.BriefingQuestions.PostMissAnswers[0] = miss.MissionSuccessful; // again, line breaks tie.BriefingQuestions.PostTrigger[0] = 4; tie.BriefingQuestions.PostTrigType[0] = 1; } if (miss.MissionFailed != "") { tie.BriefingQuestions.PostMissQuestions[1] = "Any suggestions?"; tie.BriefingQuestions.PostMissAnswers[1] = miss.MissionFailed; // again, line breaks tie.BriefingQuestions.PostTrigger[1] = 5; tie.BriefingQuestions.PostTrigType[1] = 1; } #endregion Questions tie.MissionPath = miss.MissionPath.ToUpper().Replace(".TIE", "_TIE.tie"); return(tie); }
/// <summary>Downgrades XvT and BoP missions to TIE95</summary> /// <remarks>G/PLT, SHPYD, REPYD and M/SC craft will have their indexes changed to reflect IDMR TIE95 Ships patch numbering. Triggers and orders will update.<br/> /// FG.Radio is not converted, since TIE behaviour is different<br/> /// Maximum FG.Formation value of 12 allowed<br/> /// For Triggers, maximum Trigger index of 24, maximum VariableType of 9, Amounts will be adjusted as 66% to 75%, 33% to 50% and "each" to 100%<br/> /// Maximum Abort index of 5<br/> /// Maximum FG.Goal Amount index of 6, 75% converted to 100%, 25% to 50%. First three XvT Goals will be used as Primary, Secondary and Bonus goals. Bonus points will be scaled appropriately. Goals only used if set for Team[0] and Enabled<br/> /// First two Arrival triggers used, first Departure trigger used. First three Orders used. All standard WPs and first Briefing WP used.<br/> /// For Messages, first two triggers used.<br/> /// For the Briefing, entire thing should be able to be used unless the original actually uses close to 200 commands (yikes). There is a conversion on the Zoom factor, this is a legacy factor from my old Converter program, I don't remember why.<br/> /// Primary Global goals used, XvT Secondary goals converted to Bonus goals. Prevent goals ignored<br/> /// Team[0] EndOfMissionMessages used, Teams[2-6] Name and Hostility towards Team[0] used for IFF<br/> /// BriefingQuestions generated using MissionSucc/Fail/Desc strings. Flight Officer has a single pre-mission entry for the Description, two post-mission entries for the Success and Fail. Line breaks must be entered manually<br/> /// Filename will end in "_TIE.tie"</remarks> /// <param name="miss">XvT/BoP mission to convert</param> /// <returns>Downgraded mission</returns> /// <exception cref="System.ArgumentException">Properties incompatable with TIE95 were detected in <i>miss</i></exception> public static Tie.Mission XvtBopToTie(Xvt.Mission miss) { Tie.Mission tie = new Tie.Mission(); // FG limit is okay, since XvT < TIE for some reason if (miss.Messages.Count > Tie.Mission.MessageLimit) { throw maxException(true, false, Tie.Mission.MessageLimit); } tie.FlightGroups = new Tie.FlightGroupCollection(miss.FlightGroups.Count); if (miss.Messages.Count > 0) { tie.Messages = new Tie.MessageCollection(miss.Messages.Count); } #region FGs for (int i = 0; i < tie.FlightGroups.Count; i++) { #region Craft // Radio is omitted intentionally tie.FlightGroups[i].Name = miss.FlightGroups[i].Name; tie.FlightGroups[i].Cargo = miss.FlightGroups[i].Cargo; tie.FlightGroups[i].SpecialCargo = miss.FlightGroups[i].SpecialCargo; tie.FlightGroups[i].SpecialCargoCraft = miss.FlightGroups[i].SpecialCargoCraft; tie.FlightGroups[i].RandSpecCargo = miss.FlightGroups[i].RandSpecCargo; tie.FlightGroups[i].CraftType = Tie.Mission.CraftCheck(miss.FlightGroups[i].CraftType); if (tie.FlightGroups[i].CraftType == 255) { throw flightException(4, i, Xwa.Strings.CraftType[miss.FlightGroups[i].CraftType]); } tie.FlightGroups[i].NumberOfCraft = miss.FlightGroups[i].NumberOfCraft; tie.FlightGroups[i].Status1 = miss.FlightGroups[i].Status1; tie.FlightGroups[i].Missile = miss.FlightGroups[i].Missile; tie.FlightGroups[i].Beam = miss.FlightGroups[i].Beam; tie.FlightGroups[i].IFF = miss.FlightGroups[i].IFF; tie.FlightGroups[i].AI = miss.FlightGroups[i].AI; tie.FlightGroups[i].Markings = miss.FlightGroups[i].Markings; if (miss.FlightGroups[i].Formation > 12) { throw flightException(1, i, Xwa.Strings.Formation[miss.FlightGroups[i].Formation]); } else { tie.FlightGroups[i].Formation = miss.FlightGroups[i].Formation; } tie.FlightGroups[i].FormDistance = miss.FlightGroups[i].FormDistance; tie.FlightGroups[i].GlobalGroup = miss.FlightGroups[i].GlobalGroup; tie.FlightGroups[i].FormLeaderDist = miss.FlightGroups[i].FormLeaderDist; tie.FlightGroups[i].NumberOfWaves = miss.FlightGroups[i].NumberOfWaves; tie.FlightGroups[i].PlayerCraft = miss.FlightGroups[i].PlayerCraft; tie.FlightGroups[i].Yaw = miss.FlightGroups[i].Yaw; tie.FlightGroups[i].Pitch = miss.FlightGroups[i].Pitch; tie.FlightGroups[i].Roll = miss.FlightGroups[i].Roll; #endregion Craft #region ArrDep tie.FlightGroups[i].Difficulty = miss.FlightGroups[i].Difficulty; for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].ArrDepTriggers[j] = (Tie.Mission.Trigger)miss.FlightGroups[i].ArrDepTriggers[j]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] ArrDep[" + j + "]: " + x.Message, x); } } tie.FlightGroups[i].AT1AndOrAT2 = miss.FlightGroups[i].ArrDepAO[0]; tie.FlightGroups[i].ArrivalDelayMinutes = miss.FlightGroups[i].ArrivalDelayMinutes; tie.FlightGroups[i].ArrivalDelaySeconds = miss.FlightGroups[i].ArrivalDelaySeconds; tie.FlightGroups[i].DepartureTimerMinutes = miss.FlightGroups[i].DepartureTimerMinutes; tie.FlightGroups[i].DepartureTimerSeconds = miss.FlightGroups[i].DepartureTimerSeconds; if (miss.FlightGroups[i].AbortTrigger > 5) { throw flightException(2, i, Xwa.Strings.Abort[miss.FlightGroups[i].AbortTrigger]); } else { tie.FlightGroups[i].AbortTrigger = miss.FlightGroups[i].AbortTrigger; } tie.FlightGroups[i].ArrivalCraft1 = miss.FlightGroups[i].ArrivalCraft1; tie.FlightGroups[i].ArrivalMethod1 = miss.FlightGroups[i].ArrivalMethod1; tie.FlightGroups[i].ArrivalCraft2 = miss.FlightGroups[i].ArrivalCraft2; tie.FlightGroups[i].ArrivalMethod2 = miss.FlightGroups[i].ArrivalMethod2; tie.FlightGroups[i].DepartureCraft1 = miss.FlightGroups[i].DepartureCraft1; tie.FlightGroups[i].DepartureMethod1 = miss.FlightGroups[i].DepartureMethod1; tie.FlightGroups[i].DepartureCraft2 = miss.FlightGroups[i].DepartureCraft2; tie.FlightGroups[i].DepartureMethod2 = miss.FlightGroups[i].DepartureMethod2; #endregion ArrDep #region Goals if ((miss.FlightGroups[i].Goals[0].Enabled == true) && miss.FlightGroups[i].Goals[0].Team == 0) { tie.FlightGroups[i].Goals.PrimaryCondition = miss.FlightGroups[i].Goals[0].Condition; tie.FlightGroups[i].Goals.PrimaryAmount = miss.FlightGroups[i].Goals[0].Amount; } if ((miss.FlightGroups[i].Goals[1].Enabled == true) && miss.FlightGroups[i].Goals[1].Team == 0) { tie.FlightGroups[i].Goals.SecondaryCondition = miss.FlightGroups[i].Goals[1].Condition; tie.FlightGroups[i].Goals.SecondaryAmount = miss.FlightGroups[i].Goals[1].Amount; } if ((miss.FlightGroups[i].Goals[2].Enabled == true) && miss.FlightGroups[i].Goals[2].Team == 0) { tie.FlightGroups[i].Goals.BonusCondition = miss.FlightGroups[i].Goals[2].Condition; tie.FlightGroups[i].Goals.BonusAmount = miss.FlightGroups[i].Goals[2].Amount; tie.FlightGroups[i].Goals.RawBonusPoints = miss.FlightGroups[i].Goals[2].RawPoints; } tieGoalsCheck("FlightGroup " + i, tie.FlightGroups[i].Goals); #endregion Goals for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].Orders[j] = (Tie.FlightGroup.Order)miss.FlightGroups[i].Orders[j]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] Order[" + j + "]: " + x.Message, x); } } for (int j = 0; j < 15; j++) { tie.FlightGroups[i].Waypoints[j] = (Tie.FlightGroup.Waypoint)miss.FlightGroups[i].Waypoints[j]; } } #endregion FGs #region Messages for (int i = 0; i < tie.Messages.Count; i++) { tie.Messages[i].MessageString = miss.Messages[i].MessageString; tie.Messages[i].Color = miss.Messages[i].Color; tie.Messages[i].Delay = miss.Messages[i].Delay; tie.Messages[i].Short = miss.Messages[i].Note; tie.Messages[i].Trig1AndOrTrig2 = miss.Messages[i].T1AndOrT2; for (int j = 0; j < 2; j++) { try { tie.Messages[i].Triggers[j] = (Tie.Mission.Trigger)miss.Messages[i].Triggers[j]; } catch (Exception x) { throw new ArgumentException("Mess[" + i + "] T[" + j + "]: " + x.Message, x); } } } #endregion Messages #region Briefing for (int i = 0; i < tie.Briefing.BriefingTag.Length; i++) { tie.Briefing.BriefingTag[i] = miss.Briefings[0].BriefingTag[i]; } for (int i = 0; i < tie.Briefing.BriefingString.Length; i++) { tie.Briefing.BriefingString[i] = miss.Briefings[0].BriefingString[i]; } tie.Briefing.Unknown1 = miss.Briefings[0].Unknown1; tie.Briefing.Length = (short)(miss.Briefings[0].Length * Tie.Briefing.TicksPerSecond / Xvt.Briefing.TicksPerSecond); for (int i = 0; i < tie.Briefing.Events.Length; i += 2) { short time = miss.Briefings[0].Events[i]; short evnt = miss.Briefings[0].Events[i + 1]; tie.Briefing.Events[i + 1] = evnt; if (time == 9999 && evnt == 0x22) { tie.Briefing.Events[i] = time; break; } tie.Briefing.Events[i] = (short)(time * Tie.Briefing.TicksPerSecond / Xvt.Briefing.TicksPerSecond); i += 2; for (int j = 0; j < tie.Briefing.EventParameterCount[evnt]; j++, i++) { tie.Briefing.Events[i] = miss.Briefings[0].Events[i]; } } #endregion Briefing #region Globals tie.GlobalGoals.Goals[0].T1AndOrT2 = miss.Globals[0].Goals[0].T1AndOrT2; // Primary tie.GlobalGoals.Goals[2].T1AndOrT2 = miss.Globals[0].Goals[2].T1AndOrT2; // Secondary to Bonus, Prevent will be ignored for (int j = 0; j < 4; j++) { try { tie.GlobalGoals.Goals[j / 2 * 2].Triggers[j % 2] = (Tie.Mission.Trigger)miss.Globals[0].Goals[j / 2 * 2].Triggers[j % 2].GoalTrigger; } catch (Exception x) { throw new ArgumentException("Goal[" + (j / 2 * 2) + "] T[" + (j % 2) + "]: " + x.Message, x); } } #endregion Globals #region IFF/Team for (int i = 0; i < 6; i++) { tie.EndOfMissionMessages[i] = miss.Teams[0].EndOfMissionMessages[i]; } for (int i = 2; i < 6; i++) { tie.IFFs[i] = miss.Teams[i].Name; tie.IffHostile[i] = !miss.Teams[0].AlliedWithTeam[i]; } #endregion IFF/Team #region Questions if (miss.MissionDescription != "") { tie.BriefingQuestions.PreMissQuestions[0] = "What are the mission objectives?"; tie.BriefingQuestions.PreMissAnswers[0] = miss.MissionDescription; // line breaks will have to be manually placed } if (miss.MissionSuccessful != "") { tie.BriefingQuestions.PostMissQuestions[0] = "What have I accomplished?"; tie.BriefingQuestions.PostMissAnswers[0] = miss.MissionSuccessful; // again, line breaks tie.BriefingQuestions.PostTrigger[0] = 4; tie.BriefingQuestions.PostTrigType[0] = 1; } if (miss.MissionFailed != "") { tie.BriefingQuestions.PostMissQuestions[1] = "Any suggestions?"; tie.BriefingQuestions.PostMissAnswers[1] = miss.MissionFailed; // again, line breaks tie.BriefingQuestions.PostTrigger[1] = 5; tie.BriefingQuestions.PostTrigType[1] = 1; } #endregion Questions tie.MissionPath = miss.MissionPath.ToUpper().Replace(".TIE", "_TIE.tie"); return(tie); }
static void checkValues(Order o) { string error = ""; string msg; byte tempVar; if (o.Command > 39) { error += "Command (" + o.Command + ")"; } if (o.Target1Type == 10) { o.Target1Type = o.Target1 = 0; } if (o.Target2Type == 10) { o.Target2Type = o.Target2 = 0; } if (o.Target3Type == 10) { o.Target3Type = o.Target3 = 0; } if (o.Target4Type == 10) { o.Target4Type = o.Target4 = 0; } if (o.Target3Type == 3 && o.Target3 > 6) { o.Target3Type = 0; o.Target3 = 0; } ; //[JB] Hack to fix TIE DOS B2M3IW.TIE tempVar = o.Target1; Mission.CheckTarget(o.Target1Type, ref tempVar, out msg); o.Target1 = tempVar; if (msg != "") { error += (error != "" ? ", " : "") + "T1 " + msg; } tempVar = o.Target2; Mission.CheckTarget(o.Target2Type, ref tempVar, out msg); o.Target2 = tempVar; if (msg != "") { error += (error != "" ? ", " : "") + "T2 " + msg; } tempVar = o.Target3; Mission.CheckTarget(o.Target3Type, ref tempVar, out msg); o.Target3 = tempVar; if (msg != "") { error += (error != "" ? ", " : "") + "T3 " + msg; } tempVar = o.Target4; Mission.CheckTarget(o.Target4Type, ref tempVar, out msg); o.Target4 = tempVar; if (msg != "") { error += (error != "" ? ", " : "") + "T4 " + msg; } if (error != "") { throw new ArgumentException("Invalid values detected: " + error); } }
/// <summary>Initializes the indexer</summary> /// <param name="parent">The parent Mission</param> public IffNameIndexer(Mission parent) : base(parent._iff) { _owner = parent; }
/// <summary>Downgrades XvT and BoP missions to TIE95</summary> /// <remarks>G/PLT, SHPYD, REPYD and M/SC craft will have their indexes changed to reflect IDMR TIE95 Ships patch numbering. Triggers and orders will update.<br/> /// FG.Radio is not converted, since TIE behaviour is different<br/> /// Maximum FG.Formation value of 12 allowed<br/> /// For Triggers, maximum Trigger index of 24, maximum VariableType of 9, Amounts will be adjusted as 66% to 75%, 33% to 50% and "each" to 100%<br/> /// Maximum Abort index of 5<br/> /// Maximum FG.Goal Amount index of 6, 75% converted to 100%, 25% to 50%. First three XvT Goals will be used as Primary, Secondary and Bonus goals. Bonus points will be scaled appropriately. Goals only used if set for Team[0] and Enabled<br/> /// First two Arrival triggers used, first Departure trigger used. First three Orders used. All standard WPs and first Briefing WP used.<br/> /// For Messages, first two triggers used.<br/> /// For the Briefing, entire thing should be able to be used unless the original actually uses close to 200 commands (yikes). There is a conversion on the Zoom factor, this is a legacy factor from my old Converter program, I don't remember why.<br/> /// Primary Global goals used, XvT Secondary goals converted to Bonus goals. Prevent goals ignored<br/> /// Team[0] EndOfMissionMessages used, Teams[2-6] Name and Hostility towards Team[0] used for IFF<br/> /// BriefingQuestions generated using MissionSucc/Fail/Desc strings. Flight Officer has a single pre-mission entry for the Description, two post-mission entries for the Success and Fail. Line breaks must be entered manually<br/> /// Filename will end in "_TIE.tie"</remarks> /// <param name="miss">XvT/BoP mission to convert</param> /// <returns>Downgraded mission</returns> /// <exception cref="System.ArgumentException">Properties incompatable with TIE95 were detected in <i>miss</i></exception> public static Tie.Mission XvtBopToTie(Xvt.Mission miss) { Tie.Mission tie = new Tie.Mission(); // FG limit is okay, since XvT < TIE for some reason if (miss.Messages.Count > Tie.Mission.MessageLimit) throw maxException(true, false, Tie.Mission.MessageLimit); tie.FlightGroups = new Tie.FlightGroupCollection(miss.FlightGroups.Count); if (miss.Messages.Count > 0) tie.Messages = new Tie.MessageCollection(miss.Messages.Count); #region FGs for (int i = 0; i < tie.FlightGroups.Count; i++) { #region Craft // Radio is omitted intentionally tie.FlightGroups[i].Name = miss.FlightGroups[i].Name; tie.FlightGroups[i].Cargo = miss.FlightGroups[i].Cargo; tie.FlightGroups[i].SpecialCargo = miss.FlightGroups[i].SpecialCargo; tie.FlightGroups[i].SpecialCargoCraft = miss.FlightGroups[i].SpecialCargoCraft; tie.FlightGroups[i].RandSpecCargo = miss.FlightGroups[i].RandSpecCargo; tie.FlightGroups[i].CraftType = Tie.Mission.CraftCheck(miss.FlightGroups[i].CraftType); if (tie.FlightGroups[i].CraftType == 255) throw flightException(4, i, Xwa.Strings.CraftType[miss.FlightGroups[i].CraftType]); tie.FlightGroups[i].NumberOfCraft = miss.FlightGroups[i].NumberOfCraft; tie.FlightGroups[i].Status1 = miss.FlightGroups[i].Status1; tie.FlightGroups[i].Missile = miss.FlightGroups[i].Missile; tie.FlightGroups[i].Beam = miss.FlightGroups[i].Beam; tie.FlightGroups[i].IFF = miss.FlightGroups[i].IFF; tie.FlightGroups[i].AI = miss.FlightGroups[i].AI; tie.FlightGroups[i].Markings = miss.FlightGroups[i].Markings; if (miss.FlightGroups[i].Formation > 12) throw flightException(1, i, Xwa.Strings.Formation[miss.FlightGroups[i].Formation]); else tie.FlightGroups[i].Formation = miss.FlightGroups[i].Formation; tie.FlightGroups[i].FormDistance= miss.FlightGroups[i].FormDistance; tie.FlightGroups[i].GlobalGroup = miss.FlightGroups[i].GlobalGroup; tie.FlightGroups[i].FormLeaderDist = miss.FlightGroups[i].FormLeaderDist; tie.FlightGroups[i].NumberOfWaves = miss.FlightGroups[i].NumberOfWaves; tie.FlightGroups[i].PlayerCraft = miss.FlightGroups[i].PlayerCraft; tie.FlightGroups[i].Yaw = miss.FlightGroups[i].Yaw; tie.FlightGroups[i].Pitch = miss.FlightGroups[i].Pitch; tie.FlightGroups[i].Roll = miss.FlightGroups[i].Roll; #endregion Craft #region ArrDep tie.FlightGroups[i].Difficulty = miss.FlightGroups[i].Difficulty; for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].ArrDepTriggers[j] = (Tie.Mission.Trigger)miss.FlightGroups[i].ArrDepTriggers[j]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] ArrDep[" + j + "]: " + x.Message, x); } } tie.FlightGroups[i].AT1AndOrAT2 = miss.FlightGroups[i].ArrDepAO[0]; tie.FlightGroups[i].ArrivalDelayMinutes = miss.FlightGroups[i].ArrivalDelayMinutes; tie.FlightGroups[i].ArrivalDelaySeconds = miss.FlightGroups[i].ArrivalDelaySeconds; tie.FlightGroups[i].DepartureTimerMinutes = miss.FlightGroups[i].DepartureTimerMinutes; tie.FlightGroups[i].DepartureTimerSeconds = miss.FlightGroups[i].DepartureTimerSeconds; if (miss.FlightGroups[i].AbortTrigger > 5) throw flightException(2, i, Xwa.Strings.Abort[miss.FlightGroups[i].AbortTrigger]); else tie.FlightGroups[i].AbortTrigger = miss.FlightGroups[i].AbortTrigger; tie.FlightGroups[i].ArrivalCraft1 = miss.FlightGroups[i].ArrivalCraft1; tie.FlightGroups[i].ArrivalMethod1 = miss.FlightGroups[i].ArrivalMethod1; tie.FlightGroups[i].ArrivalCraft2 = miss.FlightGroups[i].ArrivalCraft2; tie.FlightGroups[i].ArrivalMethod2 = miss.FlightGroups[i].ArrivalMethod2; tie.FlightGroups[i].DepartureCraft1 = miss.FlightGroups[i].DepartureCraft1; tie.FlightGroups[i].DepartureMethod1 = miss.FlightGroups[i].DepartureMethod1; tie.FlightGroups[i].DepartureCraft2 = miss.FlightGroups[i].DepartureCraft2; tie.FlightGroups[i].DepartureMethod2 = miss.FlightGroups[i].DepartureMethod2; #endregion ArrDep #region Goals if ((miss.FlightGroups[i].Goals[0].Enabled == true) && miss.FlightGroups[i].Goals[0].Team == 0) { tie.FlightGroups[i].Goals.PrimaryCondition = miss.FlightGroups[i].Goals[0].Condition; tie.FlightGroups[i].Goals.PrimaryAmount = miss.FlightGroups[i].Goals[0].Amount; } if ((miss.FlightGroups[i].Goals[1].Enabled == true) && miss.FlightGroups[i].Goals[1].Team == 0) { tie.FlightGroups[i].Goals.SecondaryCondition = miss.FlightGroups[i].Goals[1].Condition; tie.FlightGroups[i].Goals.SecondaryAmount = miss.FlightGroups[i].Goals[1].Amount; } if ((miss.FlightGroups[i].Goals[2].Enabled == true) && miss.FlightGroups[i].Goals[2].Team == 0) { tie.FlightGroups[i].Goals.BonusCondition = miss.FlightGroups[i].Goals[2].Condition; tie.FlightGroups[i].Goals.BonusAmount = miss.FlightGroups[i].Goals[2].Amount; tie.FlightGroups[i].Goals.RawBonusPoints = miss.FlightGroups[i].Goals[2].RawPoints; } tieGoalsCheck("FlightGroup " + i, tie.FlightGroups[i].Goals); #endregion Goals for (int j = 0; j < 3; j++) { try { tie.FlightGroups[i].Orders[j] = (Tie.FlightGroup.Order)miss.FlightGroups[i].Orders[j]; } catch (Exception x) { throw new ArgumentException("FG[" + i + "] Order[" + j + "]: " + x.Message, x); } } for (int j = 0; j < 15; j++) tie.FlightGroups[i].Waypoints[j] = (Tie.FlightGroup.Waypoint)miss.FlightGroups[i].Waypoints[j]; } #endregion FGs #region Messages for (int i=0; i < tie.Messages.Count; i++) { tie.Messages[i].MessageString = miss.Messages[i].MessageString; tie.Messages[i].Color = miss.Messages[i].Color; tie.Messages[i].Delay = miss.Messages[i].Delay; tie.Messages[i].Short = miss.Messages[i].Note; tie.Messages[i].Trig1AndOrTrig2 = miss.Messages[i].T1AndOrT2; for (int j = 0; j < 2; j++) { try { tie.Messages[i].Triggers[j] = (Tie.Mission.Trigger)miss.Messages[i].Triggers[j]; } catch (Exception x) { throw new ArgumentException("Mess[" + i + "] T[" + j + "]: " + x.Message, x); } } } #endregion Messages #region Briefing for (int i = 0; i < tie.Briefing.BriefingTag.Length; i++) tie.Briefing.BriefingTag[i] = miss.Briefings[0].BriefingTag[i]; for (int i = 0; i < tie.Briefing.BriefingString.Length; i++) tie.Briefing.BriefingString[i] = miss.Briefings[0].BriefingString[i]; tie.Briefing.Unknown1 = miss.Briefings[0].Unknown1; tie.Briefing.Length = (short)(miss.Briefings[0].Length * Tie.Briefing.TicksPerSecond / Xvt.Briefing.TicksPerSecond); for (int i = 0; i < tie.Briefing.Events.Length; i += 2) { short time = miss.Briefings[0].Events[i]; short evnt = miss.Briefings[0].Events[i + 1]; tie.Briefing.Events[i + 1] = evnt; if (time == 9999 && evnt == 0x22) { tie.Briefing.Events[i] = time; break; } tie.Briefing.Events[i] = (short)(time * Tie.Briefing.TicksPerSecond / Xvt.Briefing.TicksPerSecond); i += 2; for (int j = 0; j < tie.Briefing.EventParameterCount[evnt]; j++, i++) tie.Briefing.Events[i] = miss.Briefings[0].Events[i]; } #endregion Briefing #region Globals tie.GlobalGoals.Goals[0].T1AndOrT2 = miss.Globals[0].Goals[0].T1AndOrT2; // Primary tie.GlobalGoals.Goals[2].T1AndOrT2 = miss.Globals[0].Goals[2].T1AndOrT2; // Secondary to Bonus, Prevent will be ignored for (int j = 0; j < 4; j++) { try { tie.GlobalGoals.Goals[j/2*2].Triggers[j%2] = (Tie.Mission.Trigger)miss.Globals[0].Goals[j/2*2].Triggers[j%2].GoalTrigger; } catch (Exception x) { throw new ArgumentException("Goal[" + (j/2*2) + "] T[" + (j%2) + "]: " + x.Message, x); } } #endregion Globals #region IFF/Team for (int i = 0; i < 6; i++) tie.EndOfMissionMessages[i] = miss.Teams[0].EndOfMissionMessages[i]; for (int i = 2; i < 6; i++) { tie.IFFs[i] = miss.Teams[i].Name; tie.IffHostile[i] = !miss.Teams[0].AlliedWithTeam[i]; } #endregion IFF/Team #region Questions if (miss.MissionDescription != "") { tie.BriefingQuestions.PreMissQuestions[0] = "What are the mission objectives?"; tie.BriefingQuestions.PreMissAnswers[0] = miss.MissionDescription; // line breaks will have to be manually placed } if (miss.MissionSuccessful != "") { tie.BriefingQuestions.PostMissQuestions[0] = "What have I accomplished?"; tie.BriefingQuestions.PostMissAnswers[0] = miss.MissionSuccessful; // again, line breaks tie.BriefingQuestions.PostTrigger[0] = 4; tie.BriefingQuestions.PostTrigType[0] = 1; } if (miss.MissionFailed != "") { tie.BriefingQuestions.PostMissQuestions[1] = "Any suggestions?"; tie.BriefingQuestions.PostMissAnswers[1] = miss.MissionFailed; // again, line breaks tie.BriefingQuestions.PostTrigger[1] = 5; tie.BriefingQuestions.PostTrigType[1] = 1; } #endregion Questions tie.MissionPath = miss.MissionPath.ToUpper().Replace(".TIE", "_TIE.tie"); return tie; }
void labelRefresh(Mission.Trigger trigger, Label lbl) { // lbl is the affected label string triggerText = trigger.ToString(); triggerText = replaceTargetText(triggerText); lbl.Text = triggerText; }
void initializeMission() { tabMain.Focus(); //[JB] Exit focus from any form controls. Fixes some crashes when Leave() events are processed after mission data has been cleared (notably from within the Messages tab). _mission = new Mission(); _config.LastMission = ""; _activeFG = 0; _activeMessage = 0; _mission.FlightGroups[0].CraftType = Convert.ToByte(_config.TieCraft); _mission.FlightGroups[0].IFF = Convert.ToByte(_config.TieIff); string[] fgList = _mission.FlightGroups.GetList(); comboReset(cboArrMS, fgList, 0); comboReset(cboArrMSAlt, fgList, 0); comboReset(cboDepMS, fgList, 0); comboReset(cboDepMSAlt, fgList, 0); lstFG.Items.Clear(); lstFG.Items.Add(_mission.FlightGroups[_activeFG].ToString(true)); tabMain.SelectedIndex = 0; tabFGMinor.SelectedIndex = 0; string[] t = new string[_mission.IFFs.Length]; for (int i = 0; i < t.Length; i++) t[i] = _mission.IFFs[i]; comboReset(cboIFF, t, 0); this.Text = "Ye Olde Galactic Empire Mission Editor - TIE - New Mission.tie"; }