예제 #1
0
 /// <summary>Load a mission from an open FileStream</summary>
 /// <param name="stream">Opened FileStream to mission file</param>
 /// <exception cref="InvalidDataException"><i>stream</i> is not a valid XvT or BoP mission file</exception>
 public void LoadFromStream(FileStream stream)
 {
     MissionFile.Platform p = MissionFile.GetPlatform(stream);
     if (p != MissionFile.Platform.XvT && p != MissionFile.Platform.BoP) throw new InvalidDataException(_invalidError);
     IsBop = (p == MissionFile.Platform.BoP);
     BinaryReader br = new BinaryReader(stream, System.Text.Encoding.Default); //[JB] Added encoding. BoP\Train\8xrcb06 fails otherwise
     int i, j;
     stream.Position = 2;
     short numFlightGroups = br.ReadInt16();
     short numMessages = br.ReadInt16();
     #region Platform
     Unknown1 = br.ReadByte();
     stream.Position++;
     Unknown2 = br.ReadByte();
     stream.Position = 0xB;
     Unknown3 = Convert.ToBoolean(br.ReadByte());
     stream.Position = 0x28;
     Unknown4 = new string(br.ReadChars(0x10)).Trim('\0');
     stream.Position = 0x50;
     Unknown5 = new string(br.ReadChars(0x10)).Trim('\0');
     stream.Position = 0x64;
     MissionType = (MissionTypeEnum)br.ReadByte();
     Unknown6 = Convert.ToBoolean(br.ReadByte());
     TimeLimitMin = br.ReadByte();
     TimeLimitSec = br.ReadByte();
     stream.Position = 0xA4;
     #endregion
     #region FlightGroups
     FlightGroups = new FlightGroupCollection(numFlightGroups);
     byte[] buffer = new byte[64];
     for (i=0;i<numFlightGroups;i++)
     {
         #region Craft
         FlightGroups[i].Name = new string(br.ReadChars(0x14));	// null-termed
         for (j=0;j<4;j++) FlightGroups[i].Roles[j] = new string(br.ReadChars(4));
         stream.Position += 4;
         FlightGroups[i].Cargo = new string(br.ReadChars(0x14));	// null-termed
         FlightGroups[i].SpecialCargo = new string(br.ReadChars(0x14));	// null-termed
         stream.Read(buffer, 0, 0x1A);
         FlightGroups[i].SpecialCargoCraft = buffer[0];
         FlightGroups[i].RandSpecCargo = Convert.ToBoolean(buffer[1]);
         FlightGroups[i].CraftType = buffer[2];
         FlightGroups[i].NumberOfCraft = buffer[3];
         if (!FlightGroups[i].RandSpecCargo)
         {
             if (FlightGroups[i].SpecialCargoCraft >= FlightGroups[i].NumberOfCraft) FlightGroups[i].SpecialCargoCraft = 0;
             else FlightGroups[i].SpecialCargoCraft++;
         }
         FlightGroups[i].Status1 = buffer[4];
         FlightGroups[i].Missile = buffer[5];
         FlightGroups[i].Beam = buffer[6];
         FlightGroups[i].IFF = buffer[7];
         FlightGroups[i].Team = buffer[8];
         FlightGroups[i].AI = buffer[9];
         FlightGroups[i].Markings = buffer[0xA];
         FlightGroups[i].Radio = buffer[0xB];
         FlightGroups[i].Formation = buffer[0xD];
         FlightGroups[i].FormDistance = buffer[0xE];
         FlightGroups[i].GlobalGroup = buffer[0xF];
         FlightGroups[i].FormLeaderDist = buffer[0x10];
         FlightGroups[i].NumberOfWaves = (byte)(buffer[0x11]+1);
         FlightGroups[i].Unknowns.Unknown1 = buffer[0x12];
         FlightGroups[i].Unknowns.Unknown2 = Convert.ToBoolean(buffer[0x13]);
         FlightGroups[i].PlayerNumber = buffer[0x14];
         FlightGroups[i].ArriveOnlyIfHuman = Convert.ToBoolean(buffer[0x15]);
         FlightGroups[i].PlayerCraft = buffer[0x16];
         FlightGroups[i].Yaw = (short)Math.Round((double)(sbyte)buffer[0x17] * 360 / 0x100);
         FlightGroups[i].Pitch = (short)Math.Round((double)(sbyte)buffer[0x18] * 360 / 0x100);
         FlightGroups[i].Pitch += (short)(FlightGroups[i].Pitch < -90 ? 270 : -90);
         FlightGroups[i].Roll = (short)Math.Round((double)(sbyte)buffer[0x19] * 360 / 0x100);
         stream.Position += 3;
         #endregion
         #region Arr/Dep
         stream.Read(buffer, 0, 0x35);
         FlightGroups[i].Difficulty = buffer[0];
         for (j=0;j<4;j++)
         {
             FlightGroups[i].ArrDepTriggers[0][j] = buffer[1+j];	// Arr1...
             FlightGroups[i].ArrDepTriggers[1][j] = buffer[5+j];
             FlightGroups[i].ArrDepTriggers[2][j] = buffer[0xC+j];
             FlightGroups[i].ArrDepTriggers[3][j] = buffer[0x10+j];
             FlightGroups[i].ArrDepTriggers[4][j] = buffer[0x1B+j];	// Dep1...
             FlightGroups[i].ArrDepTriggers[5][j] = buffer[0x1F+j];
         }
         FlightGroups[i].ArrDepAO[0] = Convert.ToBoolean(buffer[0xB]);
         FlightGroups[i].ArrDepAO[1] = Convert.ToBoolean(buffer[0x16]);
         FlightGroups[i].ArrDepAO[2] = Convert.ToBoolean(buffer[0x17]);
         FlightGroups[i].Unknowns.Unknown3 = buffer[0x18];
         FlightGroups[i].ArrivalDelayMinutes = buffer[0x19];
         FlightGroups[i].ArrivalDelaySeconds = buffer[0x1A];
         FlightGroups[i].ArrDepAO[3] = Convert.ToBoolean(buffer[0x25]);
         FlightGroups[i].DepartureTimerMinutes = buffer[0x26];
         FlightGroups[i].DepartureTimerSeconds = buffer[0x27];
         FlightGroups[i].AbortTrigger = buffer[0x28];
         FlightGroups[i].Unknowns.Unknown4 = buffer[0x29];
         FlightGroups[i].Unknowns.Unknown5 = buffer[0x2B];
         FlightGroups[i].ArrivalCraft1 = buffer[0x2D];
         FlightGroups[i].ArrivalMethod1 = Convert.ToBoolean(buffer[0x2E]);	// false = hyper, true = mothership
         FlightGroups[i].ArrivalCraft2 = buffer[0x2F];
         FlightGroups[i].ArrivalMethod2 = Convert.ToBoolean(buffer[0x30]);
         FlightGroups[i].DepartureCraft1 = buffer[0x31];
         FlightGroups[i].DepartureMethod1 = Convert.ToBoolean(buffer[0x32]);
         FlightGroups[i].DepartureCraft2 = buffer[0x33];
         FlightGroups[i].DepartureMethod2 = Convert.ToBoolean(buffer[0x34]);
         #endregion
         #region Orders
         for (j=0;j<4;j++)
         {
             stream.Read(buffer, 0, 0x13);
             for (int h=0;h<0x13;h++) FlightGroups[i].Orders[j][h] = buffer[h];
             FlightGroups[i].Orders[j].Designation = new string(br.ReadChars(16));	// null-termed
             stream.Position += 0x2F;
         }
         stream.Read(buffer, 0, 0xB);
         for (j=0;j<4;j++)
         {
             FlightGroups[i].SkipToOrder4Trigger[0][j] = buffer[j];
             FlightGroups[i].SkipToOrder4Trigger[1][j] = buffer[4+j];
         }
         FlightGroups[i].SkipToO4T1AndOrT2 = Convert.ToBoolean(buffer[0xA]);
         #endregion
         #region Goals
         for (j=0;j<8;j++)
         {
             FlightGroups[i].Goals[j] = new FlightGroup.Goal(br.ReadBytes(0xF));
             stream.Position += 0x3F;
         }
         stream.Position++;
         #endregion
         for (j = 0; j < 4; j++) for (int k = 0; k < 22; k++) FlightGroups[i].Waypoints[k][j] = (short)(br.ReadInt16() * (j == 1 ? -1 : 1));
         #region Options/Other
         FlightGroups[i].Unknowns.Unknown17 = br.ReadBoolean();
         stream.Position++;
         FlightGroups[i].Unknowns.Unknown18 = br.ReadBoolean();
         stream.Position += 7;
         stream.Read(buffer, 0, 0xF);
         FlightGroups[i].Unknowns.Unknown19 = Convert.ToBoolean(buffer[0]);
         FlightGroups[i].Unknowns.Unknown20 = buffer[1];
         FlightGroups[i].Unknowns.Unknown21 = buffer[2];
         FlightGroups[i].Countermeasures = buffer[3];
         FlightGroups[i].ExplosionTime = buffer[4];
         FlightGroups[i].Status2 = buffer[5];
         FlightGroups[i].GlobalUnit = buffer[6];
         FlightGroups[i].Unknowns.Unknown22 = Convert.ToBoolean(buffer[7]);
         FlightGroups[i].Unknowns.Unknown23 = Convert.ToBoolean(buffer[8]);
         FlightGroups[i].Unknowns.Unknown24 = Convert.ToBoolean(buffer[9]);
         FlightGroups[i].Unknowns.Unknown25 = Convert.ToBoolean(buffer[0xA]);
         FlightGroups[i].Unknowns.Unknown26 = Convert.ToBoolean(buffer[0xB]);
         FlightGroups[i].Unknowns.Unknown27 = Convert.ToBoolean(buffer[0xC]);
         FlightGroups[i].Unknowns.Unknown28 = Convert.ToBoolean(buffer[0xD]);
         FlightGroups[i].Unknowns.Unknown29 = Convert.ToBoolean(buffer[0xE]);
         stream.Position++;
         for (j=0;j<8;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 8) FlightGroups[i].OptLoadout[x] = true;
         }
         for (j=8;j<12;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 4) FlightGroups[i].OptLoadout[8 + x] = true;	//[JB] forgot the offset
         }
         stream.Position += 2;
         for (j=12;j<15;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 3) FlightGroups[i].OptLoadout[12 + x] = true; //[JB] forgot the offset
         }
         stream.Position++;
         FlightGroups[i].OptCraftCategory = (FlightGroup.OptionalCraftCategory)br.ReadByte();
         stream.Read(buffer, 0, 0x1E);
         for (int k=0;k<10;k++)
         {
             FlightGroups[i].OptCraft[k].CraftType = buffer[k];
             FlightGroups[i].OptCraft[k].NumberOfCraft = buffer[k+10];
             FlightGroups[i].OptCraft[k].NumberOfWaves = buffer[k+20];
         }
         stream.Position++;
         #endregion
     }
     #endregion
     #region Messages
     if (numMessages != 0)
     {
         Messages = new MessageCollection(numMessages);
         for (i=0;i<numMessages;i++)
         {
             stream.Position += 2;
             Messages[i].MessageString = new string(br.ReadChars(64)).Trim('\0');		// null-termed
             Messages[i].Color = 0;
             if (Messages[i].MessageString.Length > 0)  //[JB]
             {
                 char c = Messages[i].MessageString[0];
                 if (c >= '1' && c <= '3')
                 {
                     Messages[i].Color = (byte)(c - '0');
                     Messages[i].MessageString = Messages[i].MessageString.Substring(1);
                 }
             }
             stream.Read(buffer, 0, 0x20);
             for (j=0;j<10;j++) Messages[i].SentToTeam[j] = Convert.ToBoolean(buffer[j]);
             for (j=0;j<4;j++)
             {
                 Messages[i].Triggers[0][j] = buffer[0xA+j];
                 Messages[i].Triggers[1][j] = buffer[0xE+j];
                 Messages[i].Triggers[2][j] = buffer[0x15+j];
                 Messages[i].Triggers[3][j] = buffer[0x19+j];
             }
             Messages[i].T1AndOrT2 = Convert.ToBoolean(buffer[0x14]);
             Messages[i].T3AndOrT4 = Convert.ToBoolean(buffer[0x1F]);
             Messages[i].Note = new string(br.ReadChars(16)).Trim('\0');	// null-termed
             Messages[i].Delay = br.ReadByte();
             Messages[i].T12AndOrT34 = Convert.ToBoolean(br.ReadByte());
         }
     }
     else Messages.Clear();
     #endregion
     #region Globals
     Globals.ClearAll();
     for (i=0;i<10;i++)
     {
         stream.Position += 2;
         for (int k=0;k<3;k++)
         {
             stream.Read(buffer, 0, 8);
             for (j=0;j<4;j++)
             {
                 Globals[i].Goals[k].Triggers[0][j] = buffer[j];
                 Globals[i].Goals[k].Triggers[1][j] = buffer[j+4];
             }
             stream.Position += 2;
             Globals[i].Goals[k].T1AndOrT2 = br.ReadBoolean();
             stream.Read(buffer, 0, 8);
             for (j=0;j<4;j++)
             {
                 Globals[i].Goals[k].Triggers[2][j] = buffer[j];
                 Globals[i].Goals[k].Triggers[3][j] = buffer[j+4];
             }
             stream.Position += 2;
             Globals[i].Goals[k].T3AndOrT4 = br.ReadBoolean();
             stream.Position += 0x11;
             Globals[i].Goals[k].T12AndOrT34 = br.ReadBoolean();
             stream.Position++;
             Globals[i].Goals[k].RawPoints = br.ReadSByte();
         }
     }
     #endregion
     #region Teams
     Teams.ClearAll();
     for (i=0;i<10;i++)
     {
         stream.Position += 2;
         Teams[i].Name = new string(br.ReadChars(0x10));	// null-termed
         stream.Position += 8;
         for (j=0;j<10;j++) Teams[i].AlliedWithTeam[j] = br.ReadBoolean();
         for (j=0;j<6;j++)
         {
             Teams[i].EndOfMissionMessages[j] = new string(br.ReadChars(0x40));
             if (Teams[i].EndOfMissionMessages[j] != "")
             {
                 char c = Teams[i].EndOfMissionMessages[j][0];
                 if (c == '1' || c == '2' || c == '3')
                 {
                     Teams[i].EndOfMissionMessageColor[j] = Byte.Parse(c.ToString());
                     Teams[i].EndOfMissionMessages[j] = Teams[i].EndOfMissionMessages[j].Substring(1);
                 }
             }
         }
         stream.Position += 0x43;
     }
     #endregion
     #region Briefing
     Briefings.ClearAll();
     for (i=0;i<8;i++)
     {
         Briefings[i].Length = br.ReadInt16();
         Briefings[i].Unknown1 = br.ReadInt16();
         stream.Position += 4;	// StartLength, EventsLength
         Briefings[i].Unknown3 = br.ReadInt16();
         for (j=0;j<12;j++)
         {
             stream.Read(buffer, 0, 0x40);
             Buffer.BlockCopy(buffer, 0, Briefings[i].Events, 0x40 * j, 0x40);
         }
         stream.Read(buffer, 0, 0x20);
         Buffer.BlockCopy(buffer, 0, Briefings[i].Events, 0x300, 0x20);
         stream.Read(buffer, 0, 0xA);
         Buffer.BlockCopy(buffer, 0, Briefings[i].Team, 0, 0xA);
         for (j=0;j<32;j++)
         {
             int k = br.ReadInt16();
             Briefings[i].BriefingTag[j] = "";
             if (k > 0) Briefings[i].BriefingTag[j] = new string(br.ReadChars(k)).Trim('\0');	// shouldn't need the trim
         }
         for (j=0;j<32;j++)
         {
             int k = br.ReadInt16();
             Briefings[i].BriefingString[j] = "";
             if (k > 0) Briefings[i].BriefingString[j] = new string(br.ReadChars(k)).Trim('\0');
         }
     }
     #endregion
     #region FG goal strings
     for (i=0;i<FlightGroups.Count;i++)
         for (j=0;j<8;j++)
         {
             FlightGroups[i].Goals[j].IncompleteText = new string(br.ReadChars(0x40));
             FlightGroups[i].Goals[j].CompleteText = new string(br.ReadChars(0x40));
             FlightGroups[i].Goals[j].FailedText = new string(br.ReadChars(0x40));
         }
     #endregion
     #region Globals strings
     for (i = 0; i < 10; i++)	// Team
     {
         for (j = 0; j < 12; j++)	// Goal * Trigger
         {
             for (int k = 0; k < 3; k++)	// State
             {
                     if (j >= 8 && k == 0) { stream.Position += 0x40; continue; }	// skip Sec Inc
                     if (j >= 4 && k == 2) { stream.Position += 0x40; continue; }	// skip Prev & Sec Fail
                     Globals[i].Goals[j / 4].Triggers[j % 4].GoalStrings[k] = new string(br.ReadChars(0x40));
             }
         }
         stream.Position += 0xC00;
     }
     #endregion
     #region Debriefs
     if (IsBop)
     {
         _missionSuccessful = new string(br.ReadChars(0x1000)).Trim('\0');
         _missionFailed = new string(br.ReadChars(0x1000)).Trim('\0');
         _missionDescription = new string(br.ReadChars(0x1000)).Trim('\0');
     }
     else _missionDescription = new string(br.ReadChars(0x400)).Trim('\0');
     #endregion
     MissionPath = stream.Name;
 }
예제 #2
0
 void _initialize()
 {
     _invalidError = _invalidError.Replace("{0}", "XvT or BoP");
     FlightGroups = new FlightGroupCollection();
     Messages = new MessageCollection();
     Globals = new GlobalsCollection();
     Teams = new TeamCollection();
     Briefings = new BriefingCollection();
 }
예제 #3
0
 /// <summary>Load a mission from an open FileStream</summary>
 /// <param name="stream">Opened FileStream to mission file</param>
 /// <exception cref="InvalidDataException"><i>stream</i> is not a valid XWA mission file</exception>
 public void LoadFromStream(FileStream stream)
 {
     if (MissionFile.GetPlatform(stream) != MissionFile.Platform.XWA) throw new InvalidDataException(_invalidError);
     BinaryReader br = new BinaryReader(stream, System.Text.Encoding.Default);
     int i, j;
     long p;
     stream.Position = 2;
     short numFlightGroups = br.ReadInt16();
     short numMessages = br.ReadInt16();
     #region Platform
     stream.Position = 8;
     Unknown1 = br.ReadBoolean();
     stream.Position = 0xB;
     Unknown2 = br.ReadBoolean();
     stream.Position = 0x14;
     for (i=2;i<6;i++) _iff[i] = new string(br.ReadChars(0x14)).Trim('\0');
     for (i=0;i<4;i++) _region[i] = new string(br.ReadChars(0x84)).Trim('\0');
     for (i=0;i<16;i++)
     {
         p = stream.Position;
         GlobalCargo[i].Cargo = new string(br.ReadChars(0x40)).Trim('\0');
         stream.Position += 4;
         GlobalCargo[i].Unknown1 = br.ReadBoolean();
         stream.Position += 3;
         GlobalCargo[i].Unknown2 = br.ReadByte();
         GlobalCargo[i].Unknown3 = br.ReadByte();
         GlobalCargo[i].Unknown4 = br.ReadByte();
         GlobalCargo[i].Unknown5 = br.ReadByte();
         stream.Position = p + 0x8C;
     }
     for (i=0;i<16;i++) _globalGroup[i] = new string(br.ReadChars(0x57)).Trim('\0');
     stream.Position = 0x23AC;
     MissionType = (HangarEnum)br.ReadByte();
     stream.Position++;
     TimeLimitMin = br.ReadByte();
     EndWhenComplete = br.ReadBoolean();
     Officer = br.ReadByte();
     Logo = (LogoEnum)br.ReadByte();
     stream.Position++;
     Unknown3 = br.ReadByte();
     Unknown4 = br.ReadByte();
     Unknown5 = br.ReadByte();
     stream.Position = 0x23F0;
     #endregion
     #region FlightGroups
     FlightGroups = new FlightGroupCollection(numFlightGroups);
     byte[] buffer = new byte[64];
     for(i=0;i<numFlightGroups;i++)
     {
         #region Craft
         FlightGroups[i].Name = new string(br.ReadChars(0x14)).Trim('\0');
         stream.Read(buffer, 0, 7);
         FlightGroups[i].EnableDesignation1 = !Convert.ToBoolean(buffer[0]);		// 0=yes, 255=true
         FlightGroups[i].EnableDesignation2 = !Convert.ToBoolean(buffer[1]);
         FlightGroups[i].Designation1 = buffer[2];
         FlightGroups[i].Designation2 = buffer[3];
         FlightGroups[i].Unknowns.Unknown1 = buffer[4];
         try { FlightGroups[i].GlobalCargo = (byte)(buffer[5]+1); }
         catch { FlightGroups[i].GlobalCargo = 0; }
         try { FlightGroups[i].GlobalSpecialCargo = (byte)(buffer[6]+1); }
         catch { FlightGroups[i].GlobalSpecialCargo = 0; }
         stream.Position += 0xD;
         FlightGroups[i].Cargo = new string(br.ReadChars(0x14)).Trim('\0');
         FlightGroups[i].SpecialCargo = new string(br.ReadChars(0x14)).Trim('\0');
         FlightGroups[i].Role = new string(br.ReadChars(0x14)).Trim('\0');
         stream.Position += 5;
         stream.Read(buffer, 0, 0x1D);
         FlightGroups[i].SpecialCargoCraft = buffer[0];
         FlightGroups[i].RandSpecCargo = Convert.ToBoolean(buffer[1]);
         FlightGroups[i].CraftType = buffer[2];
         FlightGroups[i].NumberOfCraft = buffer[3];
         if (!FlightGroups[i].RandSpecCargo)
         {
             if (FlightGroups[i].SpecialCargoCraft >= FlightGroups[i].NumberOfCraft) FlightGroups[i].SpecialCargoCraft = 0;
             else FlightGroups[i].SpecialCargoCraft++;
         }
         FlightGroups[i].Status1 = buffer[4];
         FlightGroups[i].Missile = buffer[5];
         FlightGroups[i].Beam = buffer[6];
         FlightGroups[i].IFF = buffer[7];
         FlightGroups[i].Team = buffer[8];
         FlightGroups[i].AI = buffer[9];
         FlightGroups[i].Markings = buffer[0xA];
         FlightGroups[i].Radio = buffer[0xB];
         FlightGroups[i].Formation = buffer[0xD];
         FlightGroups[i].FormDistance = buffer[0xE];
         FlightGroups[i].GlobalGroup = buffer[0xF];
         FlightGroups[i].FormLeaderDist = buffer[0x10];
         FlightGroups[i].NumberOfWaves = (byte)(buffer[0x11]+1);
         FlightGroups[i].Unknowns.Unknown3 = buffer[0x12];
         FlightGroups[i].PlayerNumber = buffer[0x14];
         FlightGroups[i].ArriveOnlyIfHuman = Convert.ToBoolean(buffer[0x15]);
         FlightGroups[i].PlayerCraft = buffer[0x16];
         FlightGroups[i].Yaw = (short)Math.Round((double)(sbyte)buffer[0x17] * 360 / 0x100);
         FlightGroups[i].Pitch = (short)Math.Round((double)(sbyte)buffer[0x18] * 360 / 0x100);
         FlightGroups[i].Pitch += (short)(FlightGroups[i].Pitch < -90 ? 270 : -90);
         FlightGroups[i].Roll = (short)Math.Round((double)(sbyte)buffer[0x19] * 360 / 0x100);
         FlightGroups[i].Unknowns.Unknown4 = buffer[0x1B];
         #endregion
         #region Arr/Dep
         stream.Read(buffer, 0, 0x3C);
         FlightGroups[i].Difficulty = buffer[0];
         FlightGroups[i].Unknowns.Unknown5 = buffer[1];
         for (j=0;j<6;j++)
         {
             FlightGroups[i].ArrDepTriggers[0][j] = buffer[2+j];	// Arr1...
             FlightGroups[i].ArrDepTriggers[1][j] = buffer[8+j];
             FlightGroups[i].ArrDepTriggers[2][j] = buffer[0x12+j];
             FlightGroups[i].ArrDepTriggers[3][j] = buffer[0x18+j];
             FlightGroups[i].ArrDepTriggers[4][j] = buffer[0x26+j];	// Dep1...
             FlightGroups[i].ArrDepTriggers[5][j] = buffer[0x2C+j];
         }
         FlightGroups[i].ArrDepAndOr[0] = Convert.ToBoolean(buffer[0x10]);
         FlightGroups[i].Unknowns.Unknown6 = Convert.ToBoolean(buffer[0x11]);
         FlightGroups[i].ArrDepAndOr[1] = Convert.ToBoolean(buffer[0x20]);
         FlightGroups[i].ArrDepAndOr[2] = Convert.ToBoolean(buffer[0x22]);
         FlightGroups[i].ArrivalDelayMinutes = buffer[0x24];
         FlightGroups[i].ArrivalDelaySeconds = buffer[0x25];
         FlightGroups[i].ArrDepAndOr[3] = Convert.ToBoolean(buffer[0x34]);
         FlightGroups[i].DepartureTimerMinutes = buffer[0x36];
         FlightGroups[i].DepartureTimerSeconds = buffer[0x37];
         FlightGroups[i].AbortTrigger = buffer[0x38];
         FlightGroups[i].Unknowns.Unknown7 = buffer[0x39];
         FlightGroups[i].Unknowns.Unknown8 = buffer[0x3A];
         stream.Read(buffer, 0, 8);
         FlightGroups[i].ArrivalCraft1 = buffer[0];
         FlightGroups[i].ArrivalMethod1 = Convert.ToBoolean(buffer[1]);
         FlightGroups[i].ArrivalCraft2 = buffer[2];
         FlightGroups[i].ArrivalMethod2 = Convert.ToBoolean(buffer[3]);
         FlightGroups[i].DepartureCraft1 = buffer[4];
         FlightGroups[i].DepartureMethod1 = Convert.ToBoolean(buffer[5]);
         FlightGroups[i].DepartureCraft2 = buffer[6];
         FlightGroups[i].DepartureMethod2 = Convert.ToBoolean(buffer[7]);
         #endregion
         #region Orders
         for (j=0;j<16;j++)
         {
             FlightGroups[i].Orders[j/4, j%4] = new FlightGroup.Order();
             stream.Read(buffer, 0, 0x14);
             for (int h=0;h<0x13;h++) FlightGroups[i].Orders[j/4, j%4][h] = buffer[h];
             for (int h=0;h<8;h++)
                 for (int k=0;k<4;k++) FlightGroups[i].Orders[j/4, j%4].Waypoints[h][k] = br.ReadInt16();
             stream.Position += 0x1E;
             FlightGroups[i].Orders[j/4, j%4].Unknown10 = br.ReadByte();
             FlightGroups[i].Orders[j/4, j%4].Unknown11 = br.ReadBoolean();
             FlightGroups[i].Orders[j/4, j%4].Unknown12 = br.ReadBoolean();
             stream.Position += 6;
             FlightGroups[i].Orders[j/4, j%4].Unknown13 = br.ReadBoolean();
             stream.Position += 5;
             FlightGroups[i].Orders[j/4, j%4].Unknown14 = br.ReadBoolean();
             stream.Position += 0x12;
         }
         for (j=0;j<16;j++)
         {
             stream.Read(buffer, 0, 0x10);
             for (int h=0;h<6;h++)
             {
                 FlightGroups[i].Orders[j/4, j%4].SkipTriggers[0][h] = buffer[h];
                 FlightGroups[i].Orders[j/4, j%4].SkipTriggers[1][h] = buffer[h+6];
             }
             FlightGroups[i].Orders[j/4, j%4].SkipT1AndOrT2 = Convert.ToBoolean(buffer[0xE]);
         }
         #endregion
         #region Goals
         for (j=0;j<8;j++)
         {
             byte[] temp = new byte[0x10];
             stream.Read(temp, 0, 0x10);
             FlightGroups[i].Goals[j] = new FlightGroup.Goal(temp);
             stream.Position += 0x3F;
             FlightGroups[i].Goals[j].Unknown15 = br.ReadBoolean();
         }
         #endregion
         for (j = 0; j < 4; j++) for (int k = 0; k < 4; k++) FlightGroups[i].Waypoints[j][k] = (short)(br.ReadInt16() * (k == 1 ? -1 : 1));
         for (j=0;j<4;j++) FlightGroups[i].Waypoints[j].Region = br.ReadByte();
         #region Options/other
         stream.Read(buffer, 0, 0x1E);
         FlightGroups[i].Unknowns.Unknown16 = buffer[0];
         FlightGroups[i].Unknowns.Unknown17 = buffer[1];
         FlightGroups[i].Unknowns.Unknown18 = buffer[2];
         FlightGroups[i].Unknowns.Unknown19 = buffer[3];
         FlightGroups[i].Unknowns.Unknown20 = buffer[4];
         FlightGroups[i].Unknowns.Unknown21 = buffer[5];
         FlightGroups[i].Unknowns.Unknown22 = Convert.ToBoolean(buffer[6]);
         FlightGroups[i].Unknowns.Unknown23 = buffer[8];
         FlightGroups[i].Unknowns.Unknown24 = buffer[9];
         FlightGroups[i].Unknowns.Unknown25 = buffer[0xA];
         FlightGroups[i].Unknowns.Unknown26 = buffer[0xB];
         FlightGroups[i].Unknowns.Unknown27 = buffer[0xC];
         FlightGroups[i].Unknowns.Unknown28 = buffer[0xD];
         FlightGroups[i].Unknowns.Unknown29 = Convert.ToBoolean(buffer[0xE]);
         FlightGroups[i].Unknowns.Unknown30 = Convert.ToBoolean(buffer[0x12]);
         FlightGroups[i].Unknowns.Unknown31 = Convert.ToBoolean(buffer[0x13]);
         FlightGroups[i].GlobalNumbering = Convert.ToBoolean(buffer[0x16]);
         FlightGroups[i].Unknowns.Unknown32 = buffer[0x17];
         FlightGroups[i].Unknowns.Unknown33 = buffer[0x18];
         FlightGroups[i].Countermeasures = buffer[0x19];
         FlightGroups[i].ExplosionTime = buffer[0x1A];
         FlightGroups[i].Status2 = buffer[0x1B];
         FlightGroups[i].GlobalUnit = buffer[0x1C];
         for (j=0;j<8;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 9) { FlightGroups[i].OptLoadout[x] = true; FlightGroups[i].OptLoadout[0] = false; }
         }
         for (j=9;j<13;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 4) { FlightGroups[i].OptLoadout[9 + x] = true; FlightGroups[i].OptLoadout[9] = false; }
         }
         stream.Position += 2;
         for (j=13;j<16;j++)
         {
             byte x = br.ReadByte();
             if (x != 0 && x < 3) { FlightGroups[i].OptLoadout[13 + x] = true; FlightGroups[i].OptLoadout[13] = false; }
         }
         stream.Position++;
         FlightGroups[i].OptCraftCategory = (FlightGroup.OptionalCraftCategory)br.ReadByte();
         stream.Read(buffer, 0, 0x1E);
         for (int k = 0; k < 10; k++)
         {
             FlightGroups[i].OptCraft[k].CraftType = buffer[k];
             FlightGroups[i].OptCraft[k].NumberOfCraft = buffer[k + 10];
             FlightGroups[i].OptCraft[k].NumberOfWaves = buffer[k + 20];
         }
         FlightGroups[i].PilotID = new string(br.ReadChars(0x10)).Trim('\0');
         stream.Position += 5;
         FlightGroups[i].Backdrop = br.ReadByte();
         stream.Position += 0x16;
         stream.Read(buffer, 0, 0x15);
         FlightGroups[i].Unknowns.Unknown34 = Convert.ToBoolean(buffer[0]);
         FlightGroups[i].Unknowns.Unknown35 = Convert.ToBoolean(buffer[2]);
         FlightGroups[i].Unknowns.Unknown36 = Convert.ToBoolean(buffer[4]);
         FlightGroups[i].Unknowns.Unknown37 = Convert.ToBoolean(buffer[6]);
         FlightGroups[i].Unknowns.Unknown38 = Convert.ToBoolean(buffer[8]);
         FlightGroups[i].Unknowns.Unknown39 = Convert.ToBoolean(buffer[0xA]);
         FlightGroups[i].Unknowns.Unknown40 = Convert.ToBoolean(buffer[0xC]);
         FlightGroups[i].Unknowns.Unknown41 = Convert.ToBoolean(buffer[0xE]);
         #endregion
     }
     #endregion
     #region Messages
     if (numMessages != 0)
     {
         Messages = new MessageCollection(numMessages);
         for (i=0;i<numMessages;i++)
         {
             stream.Position += 2;
             Messages[i].MessageString = new string(br.ReadChars(0x40)).Trim('\0');
             stream.Position += 0x10;
             stream.Read(buffer, 0, 0xA);
             for (j=0;j<10;j++) Messages[i].SentTo[j] = Convert.ToBoolean(buffer[j]);
             stream.Read(buffer, 0, 0x20);
             for (j=0;j<6;j++)
             {
                 Messages[i].Triggers[0][j] = buffer[j];	// T1...
                 Messages[i].Triggers[1][j] = buffer[6+j];
                 Messages[i].Triggers[2][j] = buffer[0x10+j];
                 Messages[i].Triggers[3][j] = buffer[0x16+j];
             }
             Messages[i].Unknown1 = buffer[0xC];
             Messages[i].TrigAndOr[0] = Convert.ToBoolean(buffer[0xE]);
             Messages[i].TrigAndOr[1] = Convert.ToBoolean(buffer[0x1E]);
             Messages[i].VoiceID = new string(br.ReadChars(8)).Trim('\0');
             Messages[i].OriginatingFG = br.ReadByte();
             stream.Position += 7;
             stream.Read(buffer, 0, 0x16);
             Messages[i].DelaySeconds = buffer[0];
             Messages[i].DelayMinutes = buffer[1];
             Messages[i].Color = buffer[2];
             Messages[i].TrigAndOr[2] = Convert.ToBoolean(buffer[3]);
             for (j=0;j<6;j++)
             {
                 Messages[i].Triggers[4][j] = buffer[4+j];	// CancelT1...
                 Messages[i].Triggers[5][j] = buffer[0xA+j];
             }
             Messages[i].TrigAndOr[3] = Convert.ToBoolean(buffer[0x12]);
             Messages[i].Unknown2 = Convert.ToBoolean(buffer[0x14]);
         }
     }
     else Messages.Clear();
     #endregion
     #region Globals
     Globals.ClearAll();
     for(i=0;i<Globals.Count;i++)
     {
         stream.Position += 2;
         for (int k=0;k<3;k++)
         {
             stream.Read(buffer, 0, 0xE);
             for (j=0;j<6;j++)
             {
                 Globals[i].Goals[k].Triggers[0][j] = buffer[j];
                 Globals[i].Goals[k].Triggers[1][j] = buffer[j+6];
             }
             Globals[i].Goals[k].T1AndOrT2 = br.ReadBoolean();
             Globals[i].Goals[k].Unknown1 = br.ReadBoolean();
             stream.Read(buffer, 0, 0xE);
             for (j=0;j<6;j++)
             {
                 Globals[i].Goals[k].Triggers[2][j] = buffer[j];
                 Globals[i].Goals[k].Triggers[3][j] = buffer[j+6];
             }
             Globals[i].Goals[k].T3AndOrT4 = br.ReadBoolean();
             stream.Position += 8;
             Globals[i].Goals[k].Unknown2 = br.ReadBoolean();
             stream.Position += 9;
             Globals[i].Goals[k].T12AndOrT34 = br.ReadBoolean();
             stream.Read(buffer, 0, 7);
             Globals[i].Goals[k].Unknown3 = buffer[0];
             Globals[i].Goals[k].RawPoints=(sbyte)buffer[1];
             Globals[i].Goals[k].Unknown4 = buffer[2];
             Globals[i].Goals[k].Unknown5 = buffer[3];
             Globals[i].Goals[k].Unknown6 = buffer[4];
             Globals[i].Goals[k].ActiveSequence = buffer[6];
             stream.Position += 0x41;
         }
     }
     #endregion
     #region Teams
     Teams.ClearAll();
     for(i=0;i<Teams.Count;i++)
     {
         stream.Position += 2;
         Teams[i].Name = new string(br.ReadChars(0x12)).Trim('\0');	// null-termed
         stream.Position += 6;
         for (j=0;j<10;j++) Teams[i].Allies[j] = (Team.Allegeance)br.ReadByte();
         for (j=0;j<6;j++) Teams[i].EndOfMissionMessages[j] = new string(br.ReadChars(0x40)).Trim('\0');
         stream.Read(Teams[i].Unknowns, 0, 6);
         for (j=0;j<3;j++) Teams[i].VoiceIDs[j] = new string(br.ReadChars(0x14)).Trim('\0');
         stream.Position++;
     }
     #endregion
     #region Briefing
     Briefings.ClearAll();
     for (i=0;i<2;i++)
     {
         Briefings[i].Length = br.ReadInt16();
         Briefings[i].Unknown1 = br.ReadInt16();
         stream.Position += 6;	// StartLength, EventsLength, Res(0)
         byte[] briefBuffer = new byte[0x100];
         for (j=0;j<0x44;j++)
         {
             stream.Read(briefBuffer, 0, 0x100);
             Buffer.BlockCopy(briefBuffer, 0, Briefings[i].Events, 0x100 * j, 0x100);
         }
         stream.Read(buffer, 0, 0xA);
         for (j=0;j<10;j++) Briefings[i].Team[j] = Convert.ToBoolean(buffer[j]);
         for (j=0;j<128;j++)
         {
             int k = br.ReadInt16();
             Briefings[i].BriefingTag[j] = "";
             if (k > 0) Briefings[i].BriefingTag[j] = new string(br.ReadChars(k)).Trim('\0');	// shouldn't need the trim
         }
         for (j=0;j<128;j++)
         {
             int k = br.ReadInt16();
             Briefings[i].BriefingString[j] = "";
             if (k > 0) Briefings[i].BriefingString[j] = new string(br.ReadChars(k)).Trim('\0');
         }
     }
     #endregion
     #region notes
     _missionNote = new string(br.ReadChars(0x187C)).Trim('\0');
     for (i = 0; i < 128; i++) Briefings[0].BriefingStringsNotes[i] = new string(br.ReadChars(0x64)).Trim('\0');
     for (i = 0; i < 64; i++)
     {
         if (i < Messages.Count) Messages[i].Note = new string(br.ReadChars(0x64)).Trim('\0');
         else stream.Position += 0x64;
     }
     for (i = 0; i < 10; i++) for (j = 0; j < 3; j++) Teams[i].EomNotes[j] = new string(br.ReadChars(0x64)).Trim('\0');
     stream.Position += 0xFA0;	// unknown space, possibly message notes
     _descriptionNote = new string(br.ReadChars(0x64)).Trim('\0');
     _successfulNote = new string(br.ReadChars(0x64)).Trim('\0');
     _failedNote = new string(br.ReadChars(0x64)).Trim('\0');
     #endregion
     #region FG goal strings
     for (i=0;i<FlightGroups.Count;i++)
         for (j=0;j<8;j++)	// per goal
             for (int k=0;k<3;k++)	// per string
                 if (br.ReadByte() != 0)
                 {
                     stream.Position--;
                     if (k == 0) FlightGroups[i].Goals[j].IncompleteText = new string(br.ReadChars(0x40)).Trim('\0');
                     else if (k == 1) FlightGroups[i].Goals[j].CompleteText = new string(br.ReadChars(0x40)).Trim('\0');
                     else FlightGroups[i].Goals[j].FailedText = new string(br.ReadChars(0x40)).Trim('\0');
                 }
     #endregion
     #region Globals strings
     for (i = 0; i < 10; i++)	// Team
         for (j = 0; j < 12; j++)	// Goal * Trigger
             for (int k = 0; k < 3; k++)	// State
                 if (br.ReadByte() != 0)
                 {
                     if (j >= 8 && k == 0) { stream.Position += 0x3F; continue; }	// skip Sec Inc
                     if (j >= 4 && k == 2) { stream.Position += 0x3F; continue; }	// skip Prev & Sec Fail
                     stream.Position--;
                     Globals[i].Goals[j / 4].GoalStrings[j % 4, k] = new string(br.ReadChars(0x40));
                 }
     #endregion
     stream.Position += 0x1E0;	// unknown space
     #region Order strings
     for (i=0;i<192;i++) // per FG (and then some)
         for (j=0;j<16;j++) // per order
             if (br.ReadByte() != 0)
             {
                 if (i >= FlightGroups.Count) { stream.Position += 0x3F; continue; }	// skip if FG doesn't exist
                 stream.Position--;
                 FlightGroups[i].Orders[j/4, j%4].CustomText = new string(br.ReadChars(0x40)).Trim('\0');
             }
     #endregion
     _missionSuccessful = new string(br.ReadChars(0x1000)).Trim('\0');
     _missionFailed = new string(br.ReadChars(0x1000)).Trim('\0');
     _missionDescription = new string(br.ReadChars(0x1000)).Trim('\0');
     MissionPath = stream.Name;
 }
예제 #4
0
 void _initialize()
 {
     _invalidError = _invalidError.Replace("{0}", "XWA");
     _globalGroupNameIndexer = new Indexer<string>(_globalGroup, 56);
     _regionNameIndexer = new Indexer<string>(_region, 0x83);
     _iffNameIndexer = new Indexer<string>(_iff, 19, new bool[]{true, true, false, false, false, false});
     FlightGroups = new FlightGroupCollection();
     Messages = new MessageCollection();
     Globals = new GlobalsCollection();
     Teams = new TeamCollection();
     Briefings = new BriefingCollection();
 }
예제 #5
0
 void _initialize()
 {
     OfficersPresent = BriefingOfficers.FlightOfficer;
     _invalidError = _invalidError.Replace("{0}", "TIE");
     _iffHostile[0] = true;
     _iffNameIndexer = new IffNameIndexer(this);
     _iffHostileIndexer = new Indexer<bool>(_iffHostile, new bool[]{true, true, false, false, false, false});
     _endOfMissionIndexer = new Indexer<string>(_endOfMissionMessages, 63);
     FlightGroups = new FlightGroupCollection();
     Messages = new MessageCollection();
     GlobalGoals = new Globals();
     Briefing = new Briefing();
     BriefingQuestions = new Questions();
 }
예제 #6
0
 /// <summary>Loads a mission from an open FileStream</summary>
 /// <param name="stream">Opened FileStream to mission file</param>
 /// <exception cref="System.IO.InvalidDataException"><i>stream</i> is not a valid TIE mission file</exception>
 public void LoadFromStream(FileStream stream)
 {
     if (MissionFile.GetPlatform(stream) != MissionFile.Platform.TIE) throw new InvalidDataException(_invalidError);
     BinaryReader br = new BinaryReader(stream, System.Text.Encoding.Default);   //[JB] Added encoding
     int i;
     stream.Position = 2;
     short numFlightGroups = br.ReadInt16();
     short numMessages = br.ReadInt16();
     stream.Position = 0xA;
     try { OfficersPresent = (Mission.BriefingOfficers)br.ReadByte(); }
     catch { OfficersPresent = Mission.BriefingOfficers.Both; }
     stream.Position = 0xD;
     CapturedOnEjection = br.ReadBoolean();
     stream.Position = 0x18;
     for (i=0;i<6;i++) EndOfMissionMessages[i] = new string(br.ReadChars(64));
     stream.Position += 2;
     byte[] buffer = new byte[64];
     for (i=2;i<6;i++) IFFs[i] = new string(br.ReadChars(12));
     #region FlightGroups
     FlightGroups = new FlightGroupCollection(numFlightGroups);
     for (i=0;i<FlightGroups.Count;i++)
     {
         #region Craft
         int j;
         FlightGroups[i].Name = new string(br.ReadChars(12));
         FlightGroups[i].Pilot = new string(br.ReadChars(12));	//not used by TIE
         FlightGroups[i].Cargo = new string(br.ReadChars(12));
         FlightGroups[i].SpecialCargo = new string(br.ReadChars(12));
         stream.Read(buffer, 0, 0x38);
         FlightGroups[i].SpecialCargoCraft = buffer[0];
         FlightGroups[i].RandSpecCargo = Convert.ToBoolean(buffer[1]);
         FlightGroups[i].CraftType = buffer[2];
         FlightGroups[i].NumberOfCraft = buffer[3];
         // the Rand part of the check below is because if true, don't need to mess with it
         if (!FlightGroups[i].RandSpecCargo)
         {
             if (FlightGroups[i].SpecialCargoCraft >= FlightGroups[i].NumberOfCraft) FlightGroups[i].SpecialCargoCraft = 0;
             else FlightGroups[i].SpecialCargoCraft++;
         }
         FlightGroups[i].Status1 = buffer[4];
         FlightGroups[i].Missile = buffer[5];
         FlightGroups[i].Beam = buffer[6];
         FlightGroups[i].IFF = buffer[7];
         FlightGroups[i].AI = buffer[8];
         FlightGroups[i].Markings = buffer[9];
         FlightGroups[i].FollowsOrders = Convert.ToBoolean(buffer[0xA]);
         FlightGroups[i].Unknowns.Unknown1 = buffer[0xB];
         FlightGroups[i].Formation = buffer[0xC];
         FlightGroups[i].FormDistance = buffer[0xD];
         FlightGroups[i].GlobalGroup = buffer[0xE];
         FlightGroups[i].FormLeaderDist = buffer[0xF];
         FlightGroups[i].NumberOfWaves = (byte)(buffer[0x10]+1);
         FlightGroups[i].Unknowns.Unknown5 = buffer[0x11];
         FlightGroups[i].PlayerCraft = buffer[0x12];
         FlightGroups[i].Yaw = (short)Math.Round((double)(sbyte)buffer[0x13] * 360 / 0x100);
         FlightGroups[i].Pitch = (short)Math.Round((double)(sbyte)buffer[0x14] * 360 / 0x100);
         FlightGroups[i].Pitch += (short)(FlightGroups[i].Pitch < -90 ? 270 : -90);
         FlightGroups[i].Roll = (short)Math.Round((double)(sbyte)buffer[0x15] * 360 / 0x100);
         FlightGroups[i].Unknowns.Unknown9 = Convert.ToBoolean(buffer[0x16]);
         FlightGroups[i].Unknowns.Unknown10 = buffer[0x17];
         FlightGroups[i].Unknowns.Unknown11 = buffer[0x18];
         #endregion
         #region Arr/Dep
         FlightGroups[i].Difficulty = buffer[0x19];
         FlightGroups[i].ArrDepTriggers[0] = new Trigger(buffer, 0x1A);
         FlightGroups[i].ArrDepTriggers[1] = new Trigger(buffer, 0x1E);
         FlightGroups[i].AT1AndOrAT2 = Convert.ToBoolean(buffer[0x22]);
         FlightGroups[i].Unknowns.Unknown12 = buffer[0x23];
         FlightGroups[i].ArrivalDelayMinutes = buffer[0x24];
         FlightGroups[i].ArrivalDelaySeconds = buffer[0x25];
         FlightGroups[i].ArrDepTriggers[2] = new Trigger(buffer, 0x26);
         FlightGroups[i].DepartureTimerMinutes = buffer[0x2A];
         FlightGroups[i].DepartureTimerSeconds = buffer[0x2B];
         FlightGroups[i].AbortTrigger = buffer[0x2C];
         FlightGroups[i].Unknowns.Unknown15 = buffer[0x2D];
         FlightGroups[i].Unknowns.Unknown16 = buffer[0x2E];
         FlightGroups[i].Unknowns.Unknown17 = buffer[0x2F];
         FlightGroups[i].ArrivalCraft1 = buffer[0x30];
         FlightGroups[i].ArrivalMethod1 = Convert.ToBoolean(buffer[0x31]);
         FlightGroups[i].DepartureCraft1 = buffer[0x32];
         FlightGroups[i].DepartureMethod1 = Convert.ToBoolean(buffer[0x33]);
         FlightGroups[i].ArrivalCraft2 = buffer[0x34];
         FlightGroups[i].ArrivalMethod2 = Convert.ToBoolean(buffer[0x35]);
         FlightGroups[i].DepartureCraft2 = buffer[0x36];
         FlightGroups[i].DepartureMethod2 = Convert.ToBoolean(buffer[0x37]);
         #endregion
         stream.Read(buffer, 0, 0x36);
         for (j = 0; j < 3; j++) FlightGroups[i].Orders[j] = new FlightGroup.Order(buffer, j * 18);
         stream.Read(buffer, 0, 0xA);
         FlightGroups[i].Goals = new FlightGroup.FGGoals(buffer, 0);
         for (j = 0; j < 4; j++) for (int k = 0; k < 15; k++) FlightGroups[i].Waypoints[k][j] = (short)(br.ReadInt16() * (j == 1 ? -1 : 1));
         FlightGroups[i].Unknowns.Unknown19 = br.ReadBoolean();
         stream.Position++;
         FlightGroups[i].Unknowns.Unknown20 = br.ReadByte();
         FlightGroups[i].Unknowns.Unknown21 = br.ReadBoolean();
     }
     #endregion
     #region Messages
     if (numMessages != 0)
     {
         Messages = new MessageCollection(numMessages);
         for (i=0;i<Messages.Count;i++)
         {
             Messages[i].MessageString = new string(br.ReadChars(64)).Trim('\0');
             if (Messages[i].MessageString.IndexOf('\0') != -1) Messages[i].MessageString = Messages[i].MessageString.Substring(0, Messages[i].MessageString.IndexOf('\0'));
             Messages[i].Color = 0;
             if (Messages[i].MessageString.Length > 0)  //[JB] Added length check, otherwise empty strings would crash the load process and make the mission unrecoverable to anything but hex editing.
             {
                 char c = Messages[i].MessageString[0];
                 if (c >= '1' && c <= '3')
                 {
                     Messages[i].Color = (byte)(c - '0');
                     Messages[i].MessageString = Messages[i].MessageString.Substring(1);
                 }
             }
             stream.Read(buffer, 0, 8);
             Messages[i].Triggers[0] = new Trigger(buffer, 0);
             Messages[i].Triggers[1] = new Trigger(buffer, 4);
             Messages[i].Short = new string(br.ReadChars(12));
             stream.Position += 4;
             Messages[i].Delay = br.ReadByte();
             Messages[i].Trig1AndOrTrig2 = br.ReadBoolean();
         }
     }
     else { Messages.Clear(); }
     #endregion
     #region Globals
     for (i=0;i<3;i++)
     {
         stream.Read(buffer, 0, 8);
         GlobalGoals.Goals[i].Triggers[0] = new Trigger(buffer, 0);
         GlobalGoals.Goals[i].Triggers[1] = new Trigger(buffer, 4);
         stream.Position += 0x11;
         //for some reason, there's triggers with Var set with no Type
         if (GlobalGoals.Goals[i].Triggers[0].VariableType == 0) GlobalGoals.Goals[i].Triggers[0].Variable = 0;
         if (GlobalGoals.Goals[i].Triggers[1].VariableType == 0) GlobalGoals.Goals[i].Triggers[1].Variable = 0;
         GlobalGoals.Goals[i].T1AndOrT2 = br.ReadBoolean();
         stream.Position += 2;
     }
     #endregion
     #region Briefing
     Briefing.Length = br.ReadInt16();
     Briefing.Unknown1 = br.ReadInt16();
     stream.Position += 6;	// StartLength, EventsLength, Res(0)
     for (i=0;i<12;i++)
     {
         stream.Read(buffer, 0, 0x40);
         Buffer.BlockCopy(buffer, 0, Briefing.Events, 0x40 * i, 0x40);
     }
     stream.Read(buffer, 0, 0x20);
     Buffer.BlockCopy(buffer, 0, Briefing.Events, 0x300, 0x20);
     for (i=0;i<32;i++)
     {
         int j = br.ReadInt16();
         if (j > 0) Briefing.BriefingTag[i] = new string(br.ReadChars(j));
     }
     for (i=0;i<32;i++)
     {
         int j = br.ReadInt16();
         if (j > 0) Briefing.BriefingString[i] = new string(br.ReadChars(j));
     }
     #endregion
     #region Questions
     for (i=0;i<10;i++)
     {
         int j, k, l = 0;
         j = br.ReadInt16();	//read the question length, we're just not going to save it
         if (j == 1)
         {
             stream.Position++;	//if it's just the return, get rid of it
             continue;
         }
         if (j == 0) continue;
         for (k=0;k<j;k++)
         {
             BriefingQuestions.PreMissQuestions[i] += br.ReadChar().ToString();
             l++;
             if (stream.ReadByte() == 10) break;
             else stream.Position--;
         }
         l++;
         for (k=l;k<j;k++)
         {
             int b = stream.ReadByte();
             switch (b)	//TIE uses char(2) and char(1) for bolding in this section
             {
                 case 1:
                     BriefingQuestions.PreMissAnswers[i] += "]";
                     break;
                 case 2:
                     BriefingQuestions.PreMissAnswers[i] += "[";
                     break;
                 case 10:
                     BriefingQuestions.PreMissAnswers[i] += "\r\n";	//because txt doesn't like \n by itself
                     break;
                 default:
                     BriefingQuestions.PreMissAnswers[i] += Convert.ToChar(b).ToString();
                     break;
             }
         }
     }
     for (i=0;i<10;i++)
     {
         int j, k, l = 2;
         j = br.ReadInt16();	//also got rid of saving here, calc'ing on the fly
         if (j == 3)
         {
             stream.Position += 3;	// goddamn TFW-isms
             continue;
         }
         if (j == 0) continue;
         BriefingQuestions.PostTrigger[i] = br.ReadByte();
         BriefingQuestions.PostTrigType[i] = br.ReadByte();
         for (k=0;k<j;k++)
         {
             BriefingQuestions.PostMissQuestions[i] += br.ReadChar().ToString();
             l++;
             if (stream.ReadByte() == 10) break;
             else stream.Position--;
         }
         l++;
         for (k=l;k<j;k++)
         {
             int b = stream.ReadByte();
             switch (b)
             {
                 case 0:
                     k = j;
                     break;
                 case 1:
                     BriefingQuestions.PostMissAnswers[i] += "]";
                     break;
                 case 2:
                     BriefingQuestions.PostMissAnswers[i] += "[";
                     break;
                 case 10:
                     BriefingQuestions.PostMissAnswers[i] += "\r\n";
                     break;
                 case 255:
                     k = j;
                     break;
                 default:
                     BriefingQuestions.PostMissAnswers[i] += Convert.ToChar(b).ToString();
                     break;
             }
         }
     }
     #endregion
     MissionPath = stream.Name;
 }