Ejemplo n.º 1
0
        protected override IList <TF.Core.TranslationEntities.Subtitle> GetSubtitles()
        {
            var result = new List <TF.Core.TranslationEntities.Subtitle>();

            using (var fs = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fs, FileEncoding, Endianness.BigEndian))
                {
                    input.Skip(3);
                    var count = input.ReadByte();
                    input.Skip(4);
                    var pointer1      = input.ReadInt32();
                    var countPointer1 = input.ReadInt16();

                    var numTalkers       = input.ReadInt16();
                    var pointerTalkers   = input.ReadInt32();
                    var pointerRemainder = input.ReadInt32();

                    for (var i = 0; i < count; i++)
                    {
                        input.Skip(4);
                        var groupOffset = input.ReadInt32();
                        input.Skip(1);
                        var stringCount = input.ReadByte();
                        input.Skip(6);

                        var subs = ReadSubtitles(input, groupOffset, stringCount);

                        if (subs.Count > 0)
                        {
                            result.AddRange(subs);
                        }
                    }

                    if (pointerTalkers > 0 && result.Count > 0)
                    {
                        input.Seek(pointerTalkers, SeekOrigin.Begin);
                        for (var i = 0; i < numTalkers; i++)
                        {
                            var offset   = input.ReadInt32();
                            var subtitle = ReadSubtitle(input, offset, true);
                            if (subtitle != null)
                            {
                                subtitle.PropertyChanged += SubtitlePropertyChanged;
                                result.Add(subtitle);
                            }
                        }
                    }
                }

            LoadChanges(result);

            return(result);
        }
Ejemplo n.º 2
0
        public static void Extract(string inputPath, string outputFolder)
        {
            Directory.CreateDirectory(outputFolder);
            var logFile = System.IO.Path.Combine(outputFolder, "Extract_Data.tf");

            using (var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read))
                using (var input = new ExtendedBinaryReader(fs, Encoding.UTF8, Endianness.BigEndian))
                    using (var log = new ExtendedBinaryWriter(new FileStream(logFile, FileMode.Create), Encoding.UTF8, Endianness.BigEndian))
                    {
                        var numFiles = input.ReadInt16();
                        log.Write((int)numFiles);

                        log.Write(input.ReadBytes(6));

                        for (var i = 0; i < numFiles; i++)
                        {
                            input.Seek(8 + i * 16, SeekOrigin.Begin);

                            var unknown = input.ReadInt32();
                            log.Write(unknown);

                            var offsetMsg       = input.ReadInt32();
                            var offsetRemainder = input.ReadInt32();

                            log.Write(offsetMsg == 0 ? 0 : 1);
                            log.Write(offsetRemainder == 0 ? 0 : 1);

                            var sizeMsg       = input.ReadInt16();
                            var sizeRemainder = input.ReadInt16();

                            if (offsetMsg > 0)
                            {
                                input.Seek(offsetMsg, SeekOrigin.Begin);
                                var msg = input.ReadBytes(sizeMsg);

                                var msgFile = Path.Combine(outputFolder, $"{i:0000}.msg");
                                File.WriteAllBytes(msgFile, msg);
                            }

                            if (offsetRemainder > 0)
                            {
                                log.Write((int)sizeRemainder);

                                input.Seek(offsetRemainder, SeekOrigin.Begin);
                                var remainder = input.ReadBytes(sizeRemainder);

                                log.Write(remainder);
                            }
                        }
                    }
        }
Ejemplo n.º 3
0
        // Methods
        public override void Read(ExtendedBinaryReader reader)
        {
            // PACx Header
            string sig = reader.ReadSignature(4);

            if (sig != PACxSignature)
            {
                throw new InvalidSignatureException(PACxSignature, sig);
            }

            // Version String
            string verString = reader.ReadSignature(3);

            if (!ushort.TryParse(verString, out Version))
            {
                throw new InvalidSignatureException(PACxSignature + Version, sig + verString);
            }

            reader.IsBigEndian = IsBigEndian =
                (reader.ReadChar() == BigEndianFlag);

            ID       = reader.ReadUInt32();
            FileSize = reader.ReadUInt32();

            RootOffset           = reader.ReadUInt32();
            RootCompressedLength = reader.ReadUInt32();
            RootLength           = reader.ReadUInt32();

            var flags = reader.ReadInt16();

            HasDependencies     = (flags & 0x2) != 0;
            HasCompressedBlocks = (flags & 0x1) != 0;

            ushort uk1 = reader.ReadUInt16();

            if (!HasCompressedBlocks && uk1 != UnknownConstant)
            {
                Console.WriteLine($"WARNING: Unknown1 != 0x108! ({uk1})");
            }
            else if (HasCompressedBlocks && uk1 != UnknownConstant1)
            {
                Console.WriteLine($"WARNING: Unknown1 != 0x208! ({uk1})");
            }

            if ((flags & 0x80) != 0)
            {
                DependencyEntriesLength = reader.ReadUInt32();
                CompressedChunksLength  = reader.ReadUInt32();
                StringTableLength       = reader.ReadUInt32();
                FinalTableLength        = reader.ReadUInt32();

                Length = LengthWithFlags;
            }
            else
            {
                Length = LengthWithoutFlags;
            }

            reader.Offset = Length;
        }
Ejemplo n.º 4
0
        protected override IList <Subtitle> GetSubtitles()
        {
            var result = new List <Subtitle>();

            using (var fs = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fs, FileEncoding))
                {
                    while (input.Position < input.Length)
                    {
                        var nextOffset  = input.ReadInt16();
                        var sectionName = input.ReadString(Encoding.UTF8);

                        var aux = input.PeekInt16();

                        while (aux != -1)
                        {
                            input.Skip(2);

                            var subtitle = ReadSubtitle(input);
                            subtitle.PropertyChanged += SubtitlePropertyChanged;
                            result.Add(subtitle);

                            aux = input.PeekInt16();
                        }

                        input.Skip(2);
                    }
                }

            LoadChanges(result);

            return(result);
        }
Ejemplo n.º 5
0
        private static object ReadValueType(Type valueType, ExtendedBinaryReader br, bool noAlign = false)
        {
            if (!noAlign)
            {
                br.AlignStream();
            }

            if (valueType == typeof(string))
            {
                return(br.ReadAlignedString());
            }
            else if (valueType == typeof(Int32))
            {
                return(br.ReadInt32());
            }
            else if (valueType == typeof(UInt32))
            {
                return(br.ReadUInt32());
            }
            else if (valueType == typeof(Int64))
            {
                return(br.ReadInt64());
            }
            else if (valueType == typeof(UInt64))
            {
                return(br.ReadUInt64());
            }
            else if (valueType == typeof(Int16))
            {
                return(br.ReadInt16());
            }
            else if (valueType == typeof(UInt16))
            {
                return(br.ReadUInt16());
            }
            else if (valueType == typeof(Byte))
            {
                return(br.ReadByte());
            }
            else if (valueType == typeof(SByte))
            {
                return(br.ReadSByte());
            }
            else if (valueType == typeof(Boolean))
            {
                return(br.ReadBoolean());
            }
            else if (valueType == typeof(Double))
            {
                return(br.ReadDouble());
            }
            else if (valueType == typeof(Single))
            {
                return(br.ReadSingle());
            }
            else
            {
                throw new ArgumentException($"{valueType} is not a value type");
            }
        }
Ejemplo n.º 6
0
        public override void Rebuild(string outputFolder)
        {
            var outputPath = System.IO.Path.Combine(outputFolder, RelativePath);

            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));

            var subtitles = GetSubtitles();

            using (var fsInput = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fsInput, FileEncoding, Endianness.BigEndian))
                    using (var fsOutput = new FileStream(outputPath, FileMode.Create))
                        using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding, Endianness.BigEndian))
                        {
                            output.Write(input.ReadBytes(6));
                            var groupCount = input.ReadInt16();
                            output.Write(groupCount);
                            output.Write(input.ReadBytes(4));
                            var groupsOffset = input.ReadInt32();
                            output.Write(groupsOffset);

                            long outputOffset      = input.PeekInt32();
                            var  firstStringOffset = outputOffset;

                            while (input.Position < groupsOffset)
                            {
                                var offset = input.ReadInt32();
                                if (offset > 0 && offset < input.Length)
                                {
                                    outputOffset = WriteSubtitle(output, subtitles, offset, outputOffset);
                                }
                                else
                                {
                                    output.Write(offset);
                                }
                            }

                            output.Write(input.ReadBytes((int)(groupsOffset - (int)input.Position)));

                            for (var i = 0; i < groupCount; i++)
                            {
                                var offsets = new int[_groupSize];
                                for (var j = 0; j < _groupSize; j++)
                                {
                                    offsets[j] = input.ReadInt32();
                                }

                                for (var j = 0; j < 6; j++)
                                {
                                    output.Write(offsets[j]);
                                }

                                outputOffset = WriteSubtitle(output, subtitles, offsets[6], outputOffset);

                                output.Write(offsets[7]);
                            }

                            output.Write(input.ReadBytes((int)(firstStringOffset - input.Position)));
                        }
        }
Ejemplo n.º 7
0
        protected override IList <Subtitle> GetSubtitles()
        {
            var result = new List <Subtitle>();

            using (var fs = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fs, FileEncoding, Endianness.BigEndian))
                {
                    input.Skip(6);
                    var groupCount = input.ReadInt16();
                    input.Skip(8);

                    Subtitle subtitle;
                    for (var i = 0; i < 43; i++)
                    {
                        subtitle = ReadSubtitle(input);
                        subtitle.PropertyChanged += SubtitlePropertyChanged;
                        result.Add(subtitle);
                    }

                    // barkeeper
                    input.Seek(0x108, SeekOrigin.Begin);
                    subtitle = ReadSubtitle(input);
                    subtitle.PropertyChanged += SubtitlePropertyChanged;
                    result.Add(subtitle);

                    input.Seek(0x110, SeekOrigin.Begin);
                    for (var i = 0; i < groupCount; i++)
                    {
                        var offsets = new int[22];
                        for (var j = 0; j < 22; j++)
                        {
                            offsets[j] = input.ReadInt32();
                        }

                        var returnPos = input.Position;

                        subtitle = ReadSubtitle(input, offsets[8], false);
                        subtitle.PropertyChanged += SubtitlePropertyChanged;
                        result.Add(subtitle);

                        for (var j = 14; j < 22; j++)
                        {
                            subtitle = ReadSubtitle(input, offsets[j], false);
                            subtitle.PropertyChanged += SubtitlePropertyChanged;
                            result.Add(subtitle);
                        }

                        input.Seek(returnPos, SeekOrigin.Begin);
                    }
                }

            LoadChanges(result);

            return(result);
        }
Ejemplo n.º 8
0
        private void Load_Xex(string filename)
        {
            Xex_Name = Path.GetFileName(filename);
            Xex_File = File.ReadAllBytes(filename);
            RenderingRes_X_TextBox.Enabled = true;
            RenderingRes_Y_TextBox.Enabled = true;
            GammaColor_R_TextBox.Enabled   = true;
            GammaColor_G_TextBox.Enabled   = true;
            GammaColor_B_TextBox.Enabled   = true;

            SaveXex.Enabled = true;
            RestoreOriginalResBtn.Enabled     = true;
            RestoreOriginalGammaBtn.Enabled   = true;
            DisableGammaCorrectionBtn.Enabled = true;

            using (MemoryStream file = new MemoryStream(Xex_File))
                using (ExtendedBinaryReader read = new ExtendedBinaryReader(file, true))
                {
                    // Get Rendering Res -- In Order Of Xex File
                    file.Seek(0xBA5026, SeekOrigin.Begin);
                    RenderingRes_Y = read.ReadInt16();

                    file.Seek(0xBA502A, SeekOrigin.Begin);
                    RenderingRes_X = read.ReadInt16();

                    //Get Gamma Color -- In Order Of Xex File
                    file.Seek(0x1277450, SeekOrigin.Begin);
                    GammaColor_R = read.ReadSingle();

                    file.Seek(0x1277454, SeekOrigin.Begin);
                    GammaColor_G = read.ReadSingle();

                    file.Seek(0x1277458, SeekOrigin.Begin);
                    GammaColor_B = read.ReadSingle();
                }
            RenderingRes_X_TextBox.Text = RenderingRes_X.ToString();
            RenderingRes_Y_TextBox.Text = RenderingRes_Y.ToString();

            GammaColor_R_TextBox.Text = GammaColor_R.ToString();
            GammaColor_G_TextBox.Text = GammaColor_G.ToString();
            GammaColor_B_TextBox.Text = GammaColor_B.ToString();
        }
Ejemplo n.º 9
0
        public override void Rebuild(string outputFolder)
        {
            var outputPath = System.IO.Path.Combine(outputFolder, RelativePath);

            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));

            var subtitles = GetSubtitles();

            using (var fsInput = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fsInput, FileEncoding, Endianness.LittleEndian))
                    using (var fsOutput = new FileStream(outputPath, FileMode.Create))
                        using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding, Endianness.LittleEndian))
                        {
                            var outputOffset = 0;

                            while (input.Position < input.Length)
                            {
                                var inputNextOffset = input.ReadInt16();
                                var sectionName     = input.ReadString(Encoding.UTF8);

                                using (var tempMemoryStream = new MemoryStream())
                                    using (var temp = new ExtendedBinaryWriter(tempMemoryStream, FileEncoding, Endianness.LittleEndian))
                                    {
                                        temp.WriteString(sectionName);

                                        var aux = input.PeekInt16();
                                        while (aux != -1)
                                        {
                                            var index = input.ReadByte();
                                            temp.Write(index);

                                            var size = input.ReadByte();

                                            var offset = (int)input.Position;
                                            WriteSubtitle(temp, subtitles, offset);

                                            input.ReadString();
                                            aux = input.PeekInt16();
                                        }

                                        input.Skip(2);
                                        temp.Write((short)-1);

                                        var bytes = tempMemoryStream.ToArray();
                                        output.Write((short)(outputOffset + 2 + bytes.Length));
                                        output.Write(bytes);

                                        outputOffset = outputOffset + 2 + bytes.Length;
                                    }
                            }
                        }
        }
Ejemplo n.º 10
0
        protected override IList <Subtitle> GetSubtitles()
        {
            var result = new List <Subtitle>();

            using (var fs = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fs, FileEncoding, Endianness.BigEndian))
                {
                    input.Skip(6);
                    var groupCount = input.ReadInt16();
                    input.Skip(4);
                    var groupsOffset = input.ReadInt32();

                    Subtitle subtitle;

                    while (input.Position < groupsOffset)
                    {
                        var subtitleOffset = input.ReadInt32();

                        if (subtitleOffset > 0 && subtitleOffset < input.Length)
                        {
                            input.Seek(-4, SeekOrigin.Current);
                            subtitle = ReadSubtitle(input);
                            subtitle.PropertyChanged += SubtitlePropertyChanged;
                            result.Add(subtitle);
                        }
                    }

                    input.Seek(groupsOffset, SeekOrigin.Begin);

                    for (var i = 0; i < groupCount; i++)
                    {
                        var offsets = new int[_groupSize];
                        for (var j = 0; j < _groupSize; j++)
                        {
                            offsets[j] = input.ReadInt32();
                        }

                        var returnPos = input.Position;

                        subtitle = ReadSubtitle(input, offsets[6], false);
                        subtitle.PropertyChanged += SubtitlePropertyChanged;
                        result.Add(subtitle);

                        input.Seek(returnPos, SeekOrigin.Begin);
                    }
                }

            LoadChanges(result);

            return(result);
        }
Ejemplo n.º 11
0
        // Methods
        public override void Load(Stream fileStream)
        {
            // Header
            var    reader = new ExtendedBinaryReader(fileStream, Encoding.ASCII, false);
            string sig    = reader.ReadSignature();

            if (sig != Signature)
            {
                throw new InvalidSignatureException(Signature, sig);
            }

            // Textures
            uint totalFrameCount = reader.ReadUInt32();
            byte textureCount    = reader.ReadByte();

            for (int i = 0; i < textureCount; ++i)
            {
                Textures.Add(new Texture()
                {
                    FilePath = reader.ReadString(),
                    Unknown1 = reader.ReadByte()
                });
            }

            // Animations
            ushort animCount = reader.ReadUInt16();

            for (int i2 = 0; i2 < animCount; ++i2)
            {
                var anim = new Animation()
                {
                    Name = reader.ReadString()
                };

                ushort frameCount = reader.ReadUInt16();
                anim.Unknown1 = reader.ReadInt16();
                anim.Unknown2 = reader.ReadInt16();

                // Animation Frames
                for (int i3 = 0; i3 < frameCount; ++i3)
                {
                    anim.Frames.Add(new Frame()
                    {
                        TextureIndex = reader.ReadByte(),
                        Unknown1     = reader.ReadInt16(),
                        Unknown2     = reader.ReadInt16(),
                        X            = reader.ReadUInt16(),
                        Y            = reader.ReadUInt16(),
                        Width        = reader.ReadUInt16(),
                        Height       = reader.ReadUInt16(),
                        OriginX      = reader.ReadInt16(),
                        OriginY      = reader.ReadInt16()
                    });
                }

                Animations.Add(anim);
            }
        }
Ejemplo n.º 12
0
            public override Instruction Read(ExtendedBinaryReader reader)
            {
                var   instruction = new InstructionIf();
                short amount      = reader.ReadInt16();

                instruction.Arguments.Add(reader.ReadInt32());
                for (int i = 0; i < amount; ++i)
                {
                    uint left      = reader.ReadUInt32();
                    uint right     = reader.ReadUInt32();
                    var  compareOp = (Comparison.ComparisonOperators)reader.ReadByte();
                    instruction.Comparisons.Add(new Comparison(left, compareOp, right));
                }
                return(instruction);
            }
Ejemplo n.º 13
0
        private void LoadHeader()
        {
            var identifier = _reader.ReadString();

            if (identifier != PhylopCommon.Header)
            {
                throw new InvalidDataException("Unrecognized file header: " + identifier);
            }

            var schemaVersion = _reader.ReadInt16();

            if (schemaVersion != PhylopCommon.SchemaVersion)
            {
                throw new InvalidDataException("Expected phylop schema version:" + PhylopCommon.SchemaVersion + " observed schema version: " + schemaVersion);
            }

            var dataVersion = _reader.ReadInt16();

            if (dataVersion != PhylopCommon.DataVersion)
            {
                Console.WriteLine("WARNING: Expected phylop data version:" + PhylopCommon.DataVersion + " observed data version: " + dataVersion);
            }

            _genomeAssembly = (GenomeAssembly)_reader.ReadByte();
            _version        = DataSourceVersion.Read(_reader);

            // skip the reference name
            _reader.ReadString();

            _intervalListPosition = _reader.ReadInt64();

            CheckGuard();

            LoadChromosomeIntervals();
            IsInitialized = true;
        }
Ejemplo n.º 14
0
        public override void ReadData(ExtendedBinaryReader input)
        {
            var startPos = input.Position;

            for (var i = 0; i < DataCount; i++)
            {
                var from = input.ReadInt16();
                var str  = input.ReadString();
                var info = new Info {
                    From = @from, Value = str, TranslatedValue = str, LoadedValue = str
                };
                _data.Add(info);
            }

            _remainder = input.ReadBytes((int)(startPos + Size - input.Position));
        }
Ejemplo n.º 15
0
            public static object ReadByType(ExtendedBinaryReader reader, ArgumentType type)
            {
                switch (type)
                {
                case AT_Bool:
                    return(reader.ReadBoolean());

                case AT_Byte:
                    return(reader.ReadByte());

                case AT_Int16:
                    return(reader.ReadInt16());

                case AT_Int32:
                    return(reader.ReadInt32());

                case AT_Float:
                    return(reader.ReadSingle());

                case AT_String:
                    return(reader.ReadStringElsewhere());

                case AT_StringPtr:
                    return(reader.ReadNullTerminatedStringPointer());

                case AT_CodePointer:
                    return(reader.ReadInt32());

                case AT_DataReference:
                    return(reader.ReadUInt32());

                case AT_DataBlock:
                    long position = reader.ReadUInt32();
                    long length   = reader.ReadUInt32();
                    if (reader.Offset > position)
                    {
                        reader.Offset = (uint)position;
                    }
                    return(new StreamBlock(position, length));

                default:
                    return(null);
                }
            }
Ejemplo n.º 16
0
        private IList <Subtitle> ReadSubtitles(ExtendedBinaryReader input, long groupOffset, int count)
        {
            var result = new List <Subtitle>();

            var returnPos = input.Position;

            input.Seek(groupOffset, SeekOrigin.Begin);

            for (var i = 0; i < count; i++)
            {
                var strLength  = input.ReadInt16();
                var propCount  = input.ReadByte();
                var zero       = input.ReadByte();
                var strOffset  = input.ReadInt32();
                var propOffset = input.ReadInt32();

                var sub = ReadSubtitle(input, strOffset, true);
                if (sub != null)
                {
                    var subtitle = new Subtitle(sub);
                    subtitle.PropertyChanged += SubtitlePropertyChanged;

                    var stringCharCount = subtitle.CleanText().Length;
                    subtitle.Properties = ReadProperties(input, propOffset, propCount);
                    foreach (var property in subtitle.Properties)
                    {
                        if (property.Position == stringCharCount)
                        {
                            property.IsEndProperty = true;
                        }
                    }

                    result.Add(subtitle);
                }
            }

            input.Seek(returnPos, SeekOrigin.Begin);

            return(result);
        }
Ejemplo n.º 17
0
        /*
         * public TypeTree(TypeTree parent, uint format, int version, bool isArray, int size, int index, int flags, string type, string name)
         * {
         *  this.parent = parent;
         *  this.format = format;
         *
         *  this.version = version;
         *  this.isArray = isArray;
         *  this.size = size;
         *  this.index = index;
         *  this.flags = flags;
         *  this.type = type;
         *  this.name = name;
         * }
         */

        public static TypeTreeNode ReadTypeTree(uint format, ExtendedBinaryReader buf)
        {
            TypeTreeNode root = new TypeTreeNode();

            if (format == 10 || format >= 12)
            {
                int nodesCount        = buf.ReadInt32();
                int stringBufferBytes = buf.ReadInt32();

                int nodesize = format >= 19 ? 32 : 24;

                buf.BaseStream.Seek(nodesize * nodesCount, SeekOrigin.Current);
                byte[] stringData = buf.ReadBytes(stringBufferBytes);
                buf.BaseStream.Seek(-(nodesize * nodesCount + stringBufferBytes), SeekOrigin.Current);

                Stack <TypeTreeNode> stack = new Stack <TypeTreeNode>();

                stack.Push(root);

                using (var stringReader = new ExtendedBinaryReader(new MemoryStream(stringData)))
                {
                    for (int i = 0; i < nodesCount; i++)
                    {
                        short version = buf.ReadInt16();
                        byte  depth   = buf.ReadByte();

                        bool isArray = buf.ReadBoolean();

                        ushort typeIndex = buf.ReadUInt16();
                        string typeStr;
                        if (buf.ReadUInt16() == 0)
                        {
                            stringReader.BaseStream.Position = typeIndex;
                            typeStr = stringReader.ReadNullTerminatedString();
                        }
                        else
                        {
                            typeStr = baseStrings.ContainsKey(typeIndex) ? baseStrings[typeIndex] : typeIndex.ToString();
                        }

                        ushort nameIndex = buf.ReadUInt16();
                        string nameStr;
                        if (buf.ReadUInt16() == 0)
                        {
                            stringReader.BaseStream.Position = nameIndex;
                            nameStr = stringReader.ReadNullTerminatedString();
                        }
                        else
                        {
                            nameStr = baseStrings.ContainsKey(nameIndex) ? baseStrings[nameIndex] : nameIndex.ToString();
                        }

                        int   size        = buf.ReadInt32();
                        int   index       = buf.ReadInt32();
                        int   flags       = buf.ReadInt32();
                        ulong refTypeHash = 0;

                        if (format >= 19)
                        {
                            refTypeHash = buf.ReadUInt64();
                        }

                        TypeTreeNode t;
                        if (depth == 0)
                        {
                            t = root;
                        }
                        else
                        {
                            while (stack.Count > depth)
                            {
                                stack.Pop();
                            }
                            t = new TypeTreeNode();
                            stack.Peek().children.Add(t);
                            stack.Push(t);
                        }

                        t.version     = version;
                        t.isArray     = isArray;
                        t.type        = typeStr;
                        t.name        = nameStr;
                        t.size        = size;
                        t.index       = index;
                        t.flags       = flags;
                        t.refTypeHash = refTypeHash;
                    }
                }

                buf.BaseStream.Seek(stringBufferBytes, SeekOrigin.Current);
            }
            else
            {
                root.type    = buf.ReadNullTerminatedString();
                root.name    = buf.ReadNullTerminatedString();
                root.size    = buf.ReadInt32();
                root.index   = buf.ReadInt32();
                root.isArray = buf.ReadBoolean();
                root.version = buf.ReadInt32();
                root.flags   = buf.ReadInt32();

                int childCount = buf.ReadInt32();
                for (int i = 0; i < childCount; i++)
                {
                    root.children.Add(TypeTreeNode.ReadTypeTree(format, buf));
                }
            }

            return(root);
        }
Ejemplo n.º 18
0
 public override object Read(ExtendedBinaryReader reader) => Lookup(reader.ReadInt16());
Ejemplo n.º 19
0
        public override void Rebuild(string outputFolder)
        {
            var outputPath = System.IO.Path.Combine(outputFolder, RelativePath);

            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));

            var subtitles = GetSubtitles();

            using (var fsInput = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fsInput, FileEncoding, Endianness.BigEndian))
                    using (var fsOutput = new FileStream(outputPath, FileMode.Create))
                        using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding, Endianness.BigEndian))
                        {
                            output.Write(input.ReadBytes(6));
                            var groupCount = input.ReadInt16();
                            output.Write(groupCount);
                            output.Write(input.ReadBytes(8));

                            long outputOffset      = input.PeekInt32();
                            var  firstStringOffset = outputOffset;

                            for (var i = 0; i < 43; i++)
                            {
                                var offset = input.ReadInt32();
                                outputOffset = WriteSubtitle(output, subtitles, offset, outputOffset);
                            }

                            output.Write(input.ReadBytes(0x108 - (int)input.Position));

                            // barkeeper
                            var barKeeperOffset = input.ReadInt32();
                            outputOffset = WriteSubtitle(output, subtitles, barKeeperOffset, outputOffset);

                            output.Write(input.ReadBytes(0x110 - (int)input.Position));
                            for (var i = 0; i < groupCount; i++)
                            {
                                var offsets = new int[22];
                                for (var j = 0; j < 22; j++)
                                {
                                    offsets[j] = input.ReadInt32();
                                }

                                for (var j = 0; j < 8; j++)
                                {
                                    output.Write(offsets[j]);
                                }

                                outputOffset = WriteSubtitle(output, subtitles, offsets[8], outputOffset);

                                for (var j = 9; j < 14; j++)
                                {
                                    output.Write(offsets[j]);
                                }

                                for (var j = 14; j < 22; j++)
                                {
                                    outputOffset = WriteSubtitle(output, subtitles, offsets[j], outputOffset);
                                }
                            }

                            output.Write(input.ReadBytes((int)(firstStringOffset - input.Position)));
                        }
        }
Ejemplo n.º 20
0
        public override void Rebuild(string outputFolder)
        {
            var outputPath = System.IO.Path.Combine(outputFolder, RelativePath);

            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));

            var subtitles = GetSubtitles();

            using (var fsInput = new FileStream(Path, FileMode.Open))
                using (var input = new ExtendedBinaryReader(fsInput, FileEncoding, Endianness.BigEndian))
                    using (var fsOutput = new FileStream(outputPath, FileMode.Create))
                        using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding, Endianness.BigEndian))
                        {
                            output.Write(input.ReadBytes(3));
                            var count = input.ReadByte();
                            output.Write(count);
                            output.Write(input.ReadBytes(4));
                            var inputPointer1      = input.ReadInt32();
                            var inputCountPointer1 = input.ReadInt16();

                            var dataPointer1 = new byte[inputCountPointer1 * 16];
                            if (inputCountPointer1 > 0)
                            {
                                input.Seek(inputPointer1, SeekOrigin.Begin);
                                dataPointer1 = input.ReadBytes(inputCountPointer1 * 16);
                                input.Seek(14, SeekOrigin.Begin);
                            }

                            output.Write(0); // Si no es 0, ya lo rellenaré luego
                            output.Write(inputCountPointer1);

                            var numTalkers = input.ReadInt16();
                            output.Write(numTalkers);

                            var inputPointerTalkers = input.ReadInt32();
                            output.Write(0); // Si no es 0, ya lo rellenaré luego

                            var inputPointerRemainder = input.ReadInt32();
                            output.Write(0); // Si no es 0, ya lo rellenaré luego

                            using (var unknownMemoryStream = new MemoryStream())
                                using (var outputUnknown = new ExtendedBinaryWriter(unknownMemoryStream, FileEncoding, Endianness.BigEndian))
                                    using (var propertiesMemoryStream = new MemoryStream())
                                        using (var outputProperties = new ExtendedBinaryWriter(propertiesMemoryStream, FileEncoding, Endianness.BigEndian))
                                            using (var stringsMemoryStream = new MemoryStream())
                                                using (var outputStrings = new ExtendedBinaryWriter(stringsMemoryStream, FileEncoding, Endianness.BigEndian))
                                                {
                                                    var stringLengths     = new List <short>();
                                                    var stringOffsets     = new List <int>();
                                                    var propertiesCount   = new List <byte>();
                                                    var propertiesOffsets = new List <int>();
                                                    var unknownOffsets    = new List <int>();

                                                    var unknownSectionOffset = 0;
                                                    var strOffset            = 0;
                                                    var propOffset           = 0;
                                                    var totalStrCount        = 0;
                                                    for (var i = 0; i < count; i++)
                                                    {
                                                        input.Seek(0x18 + i * 0x10, SeekOrigin.Begin);

                                                        var unknownOffset = input.ReadInt32();
                                                        output.Write(0); // Si no es 0, ya lo rellenaré luego

                                                        var groupOffset = input.ReadInt32();
                                                        output.Write(groupOffset);
                                                        var unknownCount = input.ReadByte();
                                                        output.Write(unknownCount);

                                                        var stringCount = input.ReadByte();
                                                        output.Write(stringCount);
                                                        totalStrCount += stringCount;
                                                        output.Write(input.ReadBytes(6));

                                                        if (unknownOffset != 0)
                                                        {
                                                            var returnPos = input.Position;
                                                            input.Seek(unknownOffset, SeekOrigin.Begin);
                                                            outputUnknown.Write(input.ReadBytes(unknownCount * 12));
                                                            unknownOffsets.Add(unknownSectionOffset);
                                                            unknownSectionOffset = (int)outputUnknown.Position;
                                                            input.Seek(returnPos, SeekOrigin.Begin);
                                                        }
                                                        else
                                                        {
                                                            unknownOffsets.Add(-1);
                                                        }

                                                        input.Seek(groupOffset, SeekOrigin.Begin);

                                                        for (var j = 0; j < stringCount; j++)
                                                        {
                                                            var inputStringLength    = input.ReadInt16();
                                                            var inputPropertiesCount = input.ReadByte();
                                                            var zero = input.ReadByte();
                                                            var inputStringOffset     = input.ReadInt32();
                                                            var inputPropertiesOffset = input.ReadInt32();

                                                            if (inputStringLength == 0)
                                                            {
                                                                stringLengths.Add(0);
                                                                propertiesCount.Add(inputPropertiesCount);
                                                                stringOffsets.Add(strOffset);
                                                                propertiesOffsets.Add(propOffset);

                                                                outputStrings.WriteString(string.Empty);
                                                                strOffset = (int)outputStrings.Position;

                                                                var ret = input.Position;
                                                                input.Seek(inputPropertiesOffset, SeekOrigin.Begin);
                                                                var prop = input.ReadBytes(inputPropertiesCount * 16);
                                                                input.Seek(ret, SeekOrigin.Begin);

                                                                outputProperties.Write(prop);
                                                                propOffset = (int)outputProperties.Position;
                                                            }
                                                            else
                                                            {
                                                                var sub = (Subtitle)subtitles.First(x => x.Offset == inputStringOffset);

                                                                stringLengths.Add((short)FileEncoding.GetByteCount(sub.Translation));
                                                                propertiesCount.Add((byte)sub.TranslationProperties.Count);
                                                                stringOffsets.Add(strOffset);
                                                                propertiesOffsets.Add(propOffset);

                                                                outputStrings.WriteString(sub.Translation);
                                                                strOffset = (int)outputStrings.Position;
                                                                outputProperties.Write(sub.TranslationProperties.ToByteArray());
                                                                propOffset = (int)outputProperties.Position;
                                                            }
                                                        }
                                                    }

                                                    var unknownBytes    = unknownMemoryStream.ToArray();
                                                    var propertiesBytes = propertiesMemoryStream.ToArray();
                                                    var stringsBytes    = stringsMemoryStream.ToArray();

                                                    var propBase    = (int)output.Position + totalStrCount * 12;
                                                    var unknownBase = propBase + propertiesBytes.Length;
                                                    var strBase     = unknownBase + unknownBytes.Length;

                                                    var outputReturnPos = output.Position;
                                                    for (var i = 0; i < count; i++)
                                                    {
                                                        output.Seek(0x18 + i * 0x10, SeekOrigin.Begin);
                                                        if (unknownOffsets[i] >= 0)
                                                        {
                                                            output.Write(unknownOffsets[i] + unknownBase);
                                                        }
                                                    }

                                                    output.Seek(outputReturnPos, SeekOrigin.Begin);

                                                    for (var i = 0; i < totalStrCount; i++)
                                                    {
                                                        output.Write(stringLengths[i]);
                                                        output.Write(propertiesCount[i]);
                                                        output.Write((byte)0);
                                                        output.Write(stringOffsets[i] + strBase);
                                                        output.Write(propertiesOffsets[i] + propBase);
                                                    }

                                                    output.Write(propertiesBytes);
                                                    if (unknownBytes.Length > 0)
                                                    {
                                                        output.Write(unknownBytes);
                                                    }
                                                    output.Write(stringsBytes);
                                                    output.WritePadding(4);
                                                }

                            if (inputPointer1 > 0)
                            {
                                var outputPointer1 = (int)output.Position;
                                output.Seek(8, SeekOrigin.Begin);
                                output.Write(outputPointer1);
                                output.Seek(outputPointer1, SeekOrigin.Begin);
                                output.Write(dataPointer1);
                            }

                            if (inputPointerTalkers > 0)
                            {
                                var outputPointerTalkers = (int)output.Position;
                                output.Seek(16, SeekOrigin.Begin);
                                output.Write(outputPointerTalkers);
                                output.Seek(outputPointerTalkers, SeekOrigin.Begin);

                                input.Seek(inputPointerTalkers, SeekOrigin.Begin);

                                using (var stringsMemoryStream = new MemoryStream())
                                    using (var outputStrings =
                                               new ExtendedBinaryWriter(stringsMemoryStream, FileEncoding, Endianness.BigEndian))
                                    {
                                        var baseOffset = (int)output.Position + numTalkers * 4;
                                        var strOffset  = baseOffset;
                                        for (var i = 0; i < numTalkers; i++)
                                        {
                                            var offset = input.ReadInt32();
                                            var sub    = subtitles.FirstOrDefault(x => x.Offset == offset);
                                            output.Write(strOffset);
                                            if (sub != null)
                                            {
                                                outputStrings.WriteString(sub.Translation);
                                            }
                                            else
                                            {
                                                outputStrings.WriteString(string.Empty);
                                            }


                                            strOffset = baseOffset + (int)outputStrings.Position;
                                        }

                                        output.Write(stringsMemoryStream.ToArray());
                                    }
                            }

                            if (inputPointerRemainder > 0)
                            {
                                var outputPointerRemainder = (int)output.Position;
                                output.Seek(20, SeekOrigin.Begin);
                                output.Write(outputPointerRemainder);
                                output.Seek(outputPointerRemainder, SeekOrigin.Begin);

                                input.Seek(inputPointerRemainder, SeekOrigin.Begin);
                                var data = input.ReadBytes((int)(input.Length - inputPointerRemainder));
                                output.Write(data);
                            }
                        }
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Reads a SEAnim from a stream
        /// </summary>
        /// <param name="Stream">The stream to read from</param>
        /// <returns>A SEAnim if successful, otherwise throws an error and returns null</returns>
        public static SEModel Read(Stream Stream)
        {
            // Create a new model
            var model = new SEModel();

            // Setup a new reader
            using (ExtendedBinaryReader readFile = new ExtendedBinaryReader(Stream))
            {
                // Magic
                var Magic = readFile.ReadChars(7);
                // Version
                var Version = readFile.ReadInt16();
                // Header size
                var HeaderSize = readFile.ReadInt16();
                // Check magic
                if (!Magic.SequenceEqual(new char[] { 'S', 'E', 'M', 'o', 'd', 'e', 'l' }))
                {
                    // Bad file
                    throw new Exception("Bad SEModel file, magic was invalid");
                }
                // Data present flags
                var DataPresentFlags = readFile.ReadByte();
                // Bone data present flags
                var BoneDataPresentFlags = readFile.ReadByte();
                // Mesh data present flags
                var MeshDataPresentFlags = readFile.ReadByte();

                // Read counts
                var BoneCount = readFile.ReadInt32();
                var MeshCount = readFile.ReadInt32();
                var MatCount  = readFile.ReadInt32();

                // Skip 3 reserved bytes
                readFile.BaseStream.Position += 3;

                // Read bone tag names
                List <string> BoneNames = new List <string>();
                // Loop
                for (int i = 0; i < BoneCount; i++)
                {
                    BoneNames.Add(readFile.ReadNullTermString());
                }

                // Loop and read bones
                for (int i = 0; i < BoneCount; i++)
                {
                    // Read bone flags (unused)
                    var BoneFlags = readFile.ReadByte();

                    // Read bone index
                    var ParentIndex = readFile.ReadInt32();

                    // Check for global matricies
                    Vector3    GlobalPosition = Vector3.Zero;
                    Quaternion GlobalRotation = Quaternion.Identity;
                    // Check
                    if (Convert.ToBoolean(BoneDataPresentFlags & (byte)SEModel_BoneDataPresenceFlags.SEMODEL_PRESENCE_GLOBAL_MATRIX))
                    {
                        GlobalPosition = new Vector3(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                        GlobalRotation = new Quaternion(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                    }

                    // Check for local matricies
                    Vector3    LocalPosition = Vector3.Zero;
                    Quaternion LocalRotation = Quaternion.Identity;
                    // Check
                    if (Convert.ToBoolean(BoneDataPresentFlags & (byte)SEModel_BoneDataPresenceFlags.SEMODEL_PRESENCE_LOCAL_MATRIX))
                    {
                        LocalPosition = new Vector3(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                        LocalRotation = new Quaternion(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                    }

                    // Check for scales
                    Vector3 Scale = Vector3.One;
                    // Check
                    if (Convert.ToBoolean(BoneDataPresentFlags & (byte)SEModel_BoneDataPresenceFlags.SEMODEL_PRESENCE_SCALES))
                    {
                        Scale = new Vector3(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                    }

                    // Add the bone
                    model.AddBone(BoneNames[i], ParentIndex, GlobalPosition, GlobalRotation, LocalPosition, LocalRotation, Scale);
                }

                // Loop and read meshes
                for (int i = 0; i < MeshCount; i++)
                {
                    // Make a new submesh
                    var mesh = new SEModelMesh();

                    // Read mesh flags (unused)
                    var MeshFlags = readFile.ReadByte();

                    // Read counts
                    var MatIndiciesCount      = readFile.ReadByte();
                    var MaxSkinInfluenceCount = readFile.ReadByte();
                    var VertexCount           = readFile.ReadInt32();
                    var FaceCount             = readFile.ReadInt32();

                    // Loop and read positions
                    for (int v = 0; v < VertexCount; v++)
                    {
                        mesh.AddVertex(new SEModelVertex()
                        {
                            Position = new Vector3(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle())
                        });
                    }

                    // Read uvlayers
                    if (Convert.ToBoolean(MeshDataPresentFlags & (byte)SEModel_MeshDataPresenceFlags.SEMODEL_PRESENCE_UVSET))
                    {
                        for (int v = 0; v < VertexCount; v++)
                        {
                            for (int l = 0; l < MatIndiciesCount; l++)
                            {
                                mesh.Verticies[v].UVSets.Add(new Vector2(readFile.ReadSingle(), readFile.ReadSingle()));
                            }
                        }
                    }

                    // Read normals
                    if (Convert.ToBoolean(MeshDataPresentFlags & (byte)SEModel_MeshDataPresenceFlags.SEMODEL_PRESENCE_NORMALS))
                    {
                        // Loop and read vertex normals
                        for (int v = 0; v < VertexCount; v++)
                        {
                            mesh.Verticies[v].VertexNormal = new Vector3(readFile.ReadSingle(), readFile.ReadSingle(), readFile.ReadSingle());
                        }
                    }

                    // Read colors
                    if (Convert.ToBoolean(MeshDataPresentFlags & (byte)SEModel_MeshDataPresenceFlags.SEMODEL_PRESENCE_COLOR))
                    {
                        // Loop and read colors
                        for (int v = 0; v < VertexCount; v++)
                        {
                            mesh.Verticies[v].VertexColor = new Color(readFile.ReadByte(), readFile.ReadByte(), readFile.ReadByte(), readFile.ReadByte());
                        }
                    }

                    // Read weights
                    if (Convert.ToBoolean(MeshDataPresentFlags & (byte)SEModel_MeshDataPresenceFlags.SEMODEL_PRESENCE_WEIGHTS))
                    {
                        for (int v = 0; v < VertexCount; v++)
                        {
                            // Read IDs and Values
                            for (int l = 0; l < MaxSkinInfluenceCount; l++)
                            {
                                if (BoneCount <= 0xFF)
                                {
                                    mesh.Verticies[v].Weights.Add(new SEModelWeight()
                                    {
                                        BoneIndex = readFile.ReadByte(), BoneWeight = readFile.ReadSingle()
                                    });
                                }
                                else if (BoneCount <= 0xFFFF)
                                {
                                    mesh.Verticies[v].Weights.Add(new SEModelWeight()
                                    {
                                        BoneIndex = readFile.ReadUInt16(), BoneWeight = readFile.ReadSingle()
                                    });
                                }
                                else
                                {
                                    mesh.Verticies[v].Weights.Add(new SEModelWeight()
                                    {
                                        BoneIndex = readFile.ReadUInt32(), BoneWeight = readFile.ReadSingle()
                                    });
                                }
                            }
                        }
                    }

                    // Loop and read faces
                    for (int f = 0; f < FaceCount; f++)
                    {
                        if (VertexCount <= 0xFF)
                        {
                            mesh.AddFace(readFile.ReadByte(), readFile.ReadByte(), readFile.ReadByte());
                        }
                        else if (VertexCount <= 0xFFFF)
                        {
                            mesh.AddFace(readFile.ReadUInt16(), readFile.ReadUInt16(), readFile.ReadUInt16());
                        }
                        else
                        {
                            mesh.AddFace(readFile.ReadUInt32(), readFile.ReadUInt32(), readFile.ReadUInt32());
                        }
                    }

                    // Read material reference indicies
                    for (int f = 0; f < MatIndiciesCount; f++)
                    {
                        mesh.AddMaterialIndex(readFile.ReadInt32());
                    }

                    // Add the mesh
                    model.AddMesh(mesh);
                }

                // Loop and read materials
                for (int m = 0; m < MatCount; m++)
                {
                    var mat = new SEModelMaterial();

                    // Read the name
                    mat.Name = readFile.ReadNullTermString();
                    // Read IsSimpleMaterial
                    var IsSimpleMaterial = readFile.ReadBoolean();

                    // Read the material
                    if (IsSimpleMaterial)
                    {
                        mat.MaterialData = new SEModelSimpleMaterial()
                        {
                            DiffuseMap  = readFile.ReadNullTermString(),
                            NormalMap   = readFile.ReadNullTermString(),
                            SpecularMap = readFile.ReadNullTermString()
                        };
                    }

                    // Add the material
                    model.AddMaterial(mat);
                }
            }
            // Return result
            return(model);
        }
Ejemplo n.º 22
0
 public override void Read(ExtendedBinaryReader reader, Action <short> synchronizationCallback)
 {
     synchronizationCallback(reader.ReadInt16());
 }
Ejemplo n.º 23
0
 public override void Deserialize(ExtendedBinaryReader reader, Action <short> valueFixup)
 {
     valueFixup(reader.ReadInt16());
 }
Ejemplo n.º 24
0
        public TypeMetaData(uint format, ExtendedBinaryReader buf)
        {
            if (format >= 13)
            {
                hasTypeTrees = buf.ReadBoolean();

                int types_count = buf.ReadInt32();

                for (int i = 0; i < types_count; i++)
                {
                    int classID = buf.ReadInt32();
                    int scriptID;

                    if (format >= 17)
                    {
                        byte unk0 = buf.ReadByte();
                        scriptID = -1 - buf.ReadInt16();
                    }
                    else
                    {
                        scriptID = classID;
                    }

                    ClassIDs.Add(new ClassInfo {
                        scriptID = scriptID, classID = classID
                    });

                    byte[] hash;
                    if ((format < 16 && classID < 0) || (format >= 16 && classID == 114))
                    {
                        hash = buf.ReadBytes(0x20);
                    }
                    else
                    {
                        hash = buf.ReadBytes(0x10);
                    }

                    Hashes[classID] = hash;

                    if (hasTypeTrees)
                    {
                        TypeTrees.Add(classID, TypeTreeNode.ReadTypeTree(format, buf));

                        if (format >= 21)
                        {
                            int dependenciesCount = buf.ReadInt32();
                            var TypeDependencies  = (int[])buf.ReadValueArray <int>(dependenciesCount);
                        }
                    }
                }
            }
            else
            {
                int fieldsCount = buf.ReadInt32();
                for (int i = 0; i < fieldsCount; i++)
                {
                    int classID = buf.ReadInt32();
                    TypeTrees.Add(classID, TypeTreeNode.ReadTypeTree(format, buf));
                }
            }
        }