/// <summary> /// Extracts the subtitles from a movie.dat. /// </summary> /// <param name="Movie">The movie.dat file path</param> /// <param name="Output">The output folder</param> /// <param name="Game">The game being tampered (MGS3 or MGS4)</param> private static void Extract(string Movie, string Output, MGSGame Game) { Directory.CreateDirectory(Output); MGSText.Initialize(); using (FileStream Input = new FileStream(Movie, FileMode.Open)) { MovieSubtitle Out = new MovieSubtitle(); EndianBinaryReader Reader = null; switch (Game) { case MGSGame.MGSTS: Reader = new EndianBinaryReader(Input, Endian.Big); Game = MGSGame.MGS3; break; case MGSGame.MGS3: Reader = new EndianBinaryReader(Input, Endian.Little); break; case MGSGame.MGS4: Reader = new EndianBinaryReader(Input, Endian.Big); break; } int Index = 0; while (Input.Position < Input.Length) { StreamPacket Packet = StreamPacket.FromStream(Reader, Game); switch (Packet.Type) { case PacketType.Subtitle: Out.Subtitles.Add((SubtitlePacket)Packet); break; case PacketType.EndOfStream: string XmlName = string.Format("Subtitle_{0:D5}.xml", Index++); string FileName = Path.Combine(Output, XmlName); XmlSerializerNamespaces NameSpaces = new XmlSerializerNamespaces(); NameSpaces.Add(string.Empty, string.Empty); XmlWriterSettings Settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }; XmlSerializer Serializer = new XmlSerializer(typeof(MovieSubtitle)); using (FileStream OutputStream = new FileStream(FileName, FileMode.Create)) { XmlWriter Writer = XmlWriter.Create(OutputStream, Settings); Serializer.Serialize(Writer, Out, NameSpaces); } Out.Subtitles.Clear(); break; } ReportProgress((float)Input.Position / Input.Length); } } }
/// <summary> /// Inserts extracted subtitles into a movie.dat. /// </summary> /// <param name="Movie">The movie.dat file path</param> /// <param name="Input">The input folder with subtitles in XML</param> /// <param name="Game">The game being tampered (MGS3 or MGS4)</param> private static void Insert(string Movie, string Input, MGSGame Game) { string[] Files = Directory.GetFiles(Input); MGSText.Initialize(); string NewFile = Path.GetTempFileName(); FileStream In = new FileStream(Movie, FileMode.Open); FileStream Out = new FileStream(NewFile, FileMode.Create); Endian Endian = Endian.Default; switch (Game) { case MGSGame.MGSTS: Endian = Endian.Big; Game = MGSGame.MGS3; break; case MGSGame.MGS3: Endian = Endian.Little; break; case MGSGame.MGS4: Endian = Endian.Big; break; } EndianBinaryReader Reader = new EndianBinaryReader(In, Endian); EndianBinaryWriter Writer = new EndianBinaryWriter(Out, Endian); int Index = 0; int SubIndex = 0; MovieSubtitle Subtitle = GetSubtitle(Files[0]); while (In.Position < In.Length) { StreamPacket Packet = StreamPacket.FromStream(Reader, Game); switch (Packet.Type) { case PacketType.Subtitle: SubtitlePacket.ToStream(Writer, Subtitle.Subtitles[SubIndex++], Game); break; case PacketType.EndOfStream: if (++Index < Files.Length) { Subtitle = GetSubtitle(Files[Index]); } SubIndex = 0; break; } if (Packet.Type != PacketType.Subtitle) { StreamPacket.ToStream(Writer, Packet, Game); } ReportProgress((float)In.Position / In.Length); } In.Close(); Out.Close(); File.Delete(Movie); File.Move(NewFile, Movie); File.Delete(NewFile); }