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)); } }
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)); } }