Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }