Ejemplo n.º 1
0
        public T2B(string filename)
        {
            using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename)))
            {
                //Get Encoding
                br.BaseStream.Position = br.BaseStream.Length - 0xa;
                encoding = (EncodingType)br.ReadByte();
                br.BaseStream.Position = 0;

                //Header
                header = br.ReadStruct <Header>();

                //Entries
                for (int i = 0; i < header.entryCount; i++)
                {
                    br.ReadInt32();
                    var entryLength = br.ReadByte();
                    br.BaseStream.Position -= 0x5;
                    var entry = new StringEntry
                    {
                        entryTypeID = br.ReadUInt32(),
                        entryLength = br.ReadByte(),
                        typeMask    = br.ReadBytes(GetEntryLength(entryLength))
                    };

                    //cultivate data
                    var mask = entry.typeMask.Reverse().ToList();
                    for (int j = 0; j < mask.Count; j++)
                    {
                        for (int count = 0; count < 8; count += 2)
                        {
                            var type = (byte)((mask[j] & (0x3 << count)) >> count);
                            if (type != 0x3)
                            {
                                entry.data.Add(new StringEntry.TypeEntry
                                {
                                    type  = type,
                                    value = br.ReadUInt32()
                                });
                            }

                            if (entry.data.Count == entry.entryLength)
                            {
                                break;
                            }
                        }

                        if (entry.data.Count == entry.entryLength)
                        {
                            break;
                        }
                    }

                    entries.Add(entry);
                }

                //Text
                var id = 0;
                for (var ctry = 0; ctry < entries.Count; ctry++)
                {
                    for (var ctrx = 0; ctrx < entries[ctry].data.Count; ctrx++)
                    {
                        var d = entries[ctry].data[ctrx];

                        if (d.type == 0)
                        {
                            if (d.value != 0xffffffff && d.value < header.stringSecSize)
                            {
                                int index = -1;
                                for (var i = 0; i < Labels.Count; i++)
                                {
                                    if (Labels[i].relOffset == d.value)
                                    {
                                        index = i;
                                    }
                                }

                                if (index == -1)
                                {
                                    br.BaseStream.Position = header.stringSecOffset + d.value;
                                    Labels.Add(new Label
                                    {
                                        Text      = GetDecodedText(GetStringBytes(br.BaseStream), encoding).Replace("\\n", "\n"),
                                        TextID    = id,
                                        Name      = $"text{id++:0000}",
                                        relOffset = d.value
                                    });

                                    Labels[Labels.Count - 1].Points.Add(new Point
                                    {
                                        X = ctrx,
                                        Y = ctry
                                    });
                                }
                                else
                                {
                                    Labels[index].Points.Add(new Point
                                    {
                                        X = ctrx,
                                        Y = ctry
                                    });
                                }
                            }
                        }
                    }
                }

                //signature
                br.BaseStream.Position = (br.BaseStream.Position + 0xf) & ~0xf;
                sig = br.ReadBytes((int)(br.BaseStream.Length - br.BaseStream.Position));
            }
        }
Ejemplo n.º 2
0
        public T2B(string filename)
        {
            using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename)))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Entries
                for (int i = 0; i < header.entryCount; i++)
                {
                    br.ReadInt32();
                    var entryLength = br.ReadByte();
                    br.BaseStream.Position -= 0x5;
                    var entry = new StringEntry
                    {
                        entryTypeID = br.ReadUInt32(),
                        entryLength = br.ReadByte(),
                        typeMask    = br.ReadBytes((entryLength > 10) ? 7 : 3)
                    };

                    //cultivate data
                    var mask = entry.typeMask.Reverse().ToList();
                    for (int j = 0; j < 3; j++)
                    {
                        for (int count = 0; count < 8; count += 2)
                        {
                            var type = (byte)((mask[j] & (0x3 << count)) >> count);
                            if (type != 0x3)
                            {
                                entry.data.Add(new StringEntry.TypeEntry
                                {
                                    type  = type,
                                    value = br.ReadUInt32()
                                });
                            }

                            if (entry.data.Count == entry.entryLength)
                            {
                                break;
                            }
                        }

                        if (entry.data.Count == entry.entryLength)
                        {
                            break;
                        }
                    }

                    entries.Add(entry);
                }

                //Text
                var id = 0;
                foreach (var entry in entries)
                {
                    foreach (var data in entry.data)
                    {
                        if (data.type == 0)
                        {
                            if (data.value != 0xffffffff)
                            {
                                if (!offsets.Contains(data.value))
                                {
                                    br.BaseStream.Position = header.stringSecOffset + data.value;
                                    Labels.Add(new Label
                                    {
                                        Text      = br.ReadCStringSJIS().Replace("\\n", "\n"),
                                        TextID    = id,
                                        Name      = $"text{id++:0000}",
                                        relOffset = data.value
                                    });
                                    offsets.Add(data.value);
                                }
                            }
                        }
                    }
                }

                //signature
                br.BaseStream.Position = (br.BaseStream.Position + 0xf) & ~0xf;
                sig = br.ReadBytes((int)(br.BaseStream.Length - br.BaseStream.Position));
            }
        }