/// <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; }
void _initialize() { _invalidError = _invalidError.Replace("{0}", "XvT or BoP"); FlightGroups = new FlightGroupCollection(); Messages = new MessageCollection(); Globals = new GlobalsCollection(); Teams = new TeamCollection(); Briefings = new BriefingCollection(); }
/// <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; }
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(); }
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(); }
/// <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; }