public void Read(string file) { BinaryReader br = new BinaryReader(File.OpenRead(file)); nanr = new sNANR(); // Generic header nanr.header.id = br.ReadChars(4); nanr.header.endianess = br.ReadUInt16(); if (nanr.header.endianess == 0xFFFE) { nanr.header.id.Reverse <char>(); } nanr.header.constant = br.ReadUInt16(); nanr.header.file_size = br.ReadUInt32(); nanr.header.header_size = br.ReadUInt16(); nanr.header.nSection = br.ReadUInt16(); #region ABNK // ABNK (Animation BaNK) nanr.abnk.id = br.ReadChars(4); nanr.abnk.length = br.ReadUInt32(); nanr.abnk.nBanks = br.ReadUInt16(); nanr.abnk.tFrames = br.ReadUInt16(); nanr.abnk.constant = br.ReadUInt32(); nanr.abnk.offset1 = br.ReadUInt32(); nanr.abnk.offset2 = br.ReadUInt32(); nanr.abnk.padding = br.ReadUInt64(); nanr.abnk.anis = new sNANR.Animation[nanr.abnk.nBanks]; // Bank header for (int i = 0; i < nanr.abnk.nBanks; i++) { br.BaseStream.Position = 0x30 + i * 0x10; sNANR.Animation ani = new sNANR.Animation(); ani.nFrames = br.ReadUInt32(); ani.dataType = br.ReadUInt16(); ani.unknown1 = br.ReadUInt16(); ani.unknown2 = br.ReadUInt16(); ani.unknown3 = br.ReadUInt16(); ani.offset_frame = br.ReadUInt32(); ani.frames = new sNANR.Frame[ani.nFrames]; // Frame header for (int j = 0; j < ani.nFrames; j++) { br.BaseStream.Position = 0x18 + nanr.abnk.offset1 + j * 0x08 + ani.offset_frame; sNANR.Frame frame = new sNANR.Frame(); frame.offset_data = br.ReadUInt32(); frame.unknown1 = br.ReadUInt16(); frame.constant = br.ReadUInt16(); // Frame data br.BaseStream.Position = 0x18 + nanr.abnk.offset2 + frame.offset_data; frame.data.nCell = br.ReadUInt16(); ani.frames[j] = frame; } nanr.abnk.anis[i] = ani; } #endregion #region LABL br.BaseStream.Position = nanr.header.header_size + nanr.abnk.length; List <uint> offsets = new List <uint>(); List <String> names = new List <string>(); nanr.labl.names = new string[nanr.abnk.nBanks]; nanr.labl.id = br.ReadChars(4); if (new String(nanr.labl.id) != "LBAL") { goto Tercera; } nanr.labl.section_size = br.ReadUInt32(); // Offset for (int i = 0; i < nanr.abnk.nBanks; i++) { uint offset = br.ReadUInt32(); if (offset >= nanr.labl.section_size - 8) { br.BaseStream.Position -= 4; break; } offsets.Add(offset); } nanr.labl.offset = offsets.ToArray(); // Names for (int i = 0; i < nanr.labl.offset.Length; i++) { names.Add(""); byte c = br.ReadByte(); while (c != 0x00) { names[i] += (char)c; c = br.ReadByte(); } } Tercera: for (int i = 0; i < nanr.abnk.nBanks; i++) { if (names.Count > i) { nanr.labl.names[i] = names[i]; } else { nanr.labl.names[i] = i.ToString(); } } #endregion #region UEXT nanr.uext.id = br.ReadChars(4); if (new String(nanr.uext.id) != "TXEU") { goto Fin; } nanr.uext.section_size = br.ReadUInt32(); nanr.uext.unknown = br.ReadUInt32(); #endregion Fin: br.Close(); }
public void Read(string file) { BinaryReader br = new BinaryReader(File.OpenRead(file)); nanr = new sNANR(); // Generic header nanr.header.id = br.ReadChars(4); nanr.header.endianess = br.ReadUInt16(); if (nanr.header.endianess == 0xFFFE) nanr.header.id.Reverse<char>(); nanr.header.constant = br.ReadUInt16(); nanr.header.file_size = br.ReadUInt32(); nanr.header.header_size = br.ReadUInt16(); nanr.header.nSection = br.ReadUInt16(); #region ABNK // ABNK (Animation BaNK) nanr.abnk.id = br.ReadChars(4); nanr.abnk.length = br.ReadUInt32(); nanr.abnk.nBanks = br.ReadUInt16(); nanr.abnk.tFrames = br.ReadUInt16(); nanr.abnk.constant = br.ReadUInt32(); nanr.abnk.offset1 = br.ReadUInt32(); nanr.abnk.offset2 = br.ReadUInt32(); nanr.abnk.padding = br.ReadUInt64(); nanr.abnk.anis = new sNANR.Animation[nanr.abnk.nBanks]; // Bank header for (int i = 0; i < nanr.abnk.nBanks; i++) { br.BaseStream.Position = 0x30 + i * 0x10; sNANR.Animation ani = new sNANR.Animation(); ani.nFrames = br.ReadUInt32(); ani.dataType = br.ReadUInt16(); ani.unknown1 = br.ReadUInt16(); ani.unknown2 = br.ReadUInt16(); ani.unknown3 = br.ReadUInt16(); ani.offset_frame = br.ReadUInt32(); ani.frames = new sNANR.Frame[ani.nFrames]; // Frame header for (int j = 0; j < ani.nFrames; j++) { br.BaseStream.Position = 0x18 + nanr.abnk.offset1 + j * 0x08 + ani.offset_frame; sNANR.Frame frame = new sNANR.Frame(); frame.offset_data = br.ReadUInt32(); frame.unknown1 = br.ReadUInt16(); frame.constant = br.ReadUInt16(); // Frame data br.BaseStream.Position = 0x18 + nanr.abnk.offset2 + frame.offset_data; frame.data.nCell = br.ReadUInt16(); ani.frames[j] = frame; } nanr.abnk.anis[i] = ani; } #endregion #region LABL br.BaseStream.Position = nanr.header.header_size + nanr.abnk.length; List<uint> offsets = new List<uint>(); List<String> names = new List<string>(); nanr.labl.names = new string[nanr.abnk.nBanks]; nanr.labl.id = br.ReadChars(4); if (new String(nanr.labl.id) != "LBAL") goto Tercera; nanr.labl.section_size = br.ReadUInt32(); // Offset for (int i = 0; i < nanr.abnk.nBanks; i++) { uint offset = br.ReadUInt32(); if (offset >= nanr.labl.section_size - 8) { br.BaseStream.Position -= 4; break; } offsets.Add(offset); } nanr.labl.offset = offsets.ToArray(); // Names for (int i = 0; i < nanr.labl.offset.Length; i++) { names.Add(""); byte c = br.ReadByte(); while (c != 0x00) { names[i] += (char)c; c = br.ReadByte(); } } Tercera: for (int i = 0; i < nanr.abnk.nBanks; i++) if (names.Count > i) nanr.labl.names[i] = names[i]; else nanr.labl.names[i] = i.ToString(); #endregion #region UEXT nanr.uext.id = br.ReadChars(4); if (new String(nanr.uext.id) != "TXEU") goto Fin; nanr.uext.section_size = br.ReadUInt32(); nanr.uext.unknown = br.ReadUInt32(); #endregion Fin: br.Close(); }