/// <summary> /// Info file to bytes. /// </summary> /// <returns>The to bytes.</returns> /// <param name="f">F.</param> public static byte[] infoToBytes(NitroStructures.infoFile f) { //Update offsets. f.updateOffsets(); //Make new stream. MemoryStream o = new MemoryStream(); BinaryWriter bw = new BinaryWriter(o); //Start writing simple data. bw.Write(f.magic); bw.Write(f.fileSize); bw.Write(f.sseqOffset); bw.Write(f.seqArcOffset); bw.Write(f.bankOffset); bw.Write(f.waveOffset); bw.Write(f.playerOffset); bw.Write(f.groupOffset); bw.Write(f.player2Offset); bw.Write(f.strmOffset); bw.Write(f.reserved); //Write sseq. bw.Write(f.sseqRecord.count); for (int i = 0; i < f.sseqRecord.offsets.Length; i++) { if (f.sseqInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.sseqRecord.offsets [i]); } } foreach (NitroStructures.sseqInfo i in f.sseqInfo) { if (!i.isPlaceHolder) { bw.Write(i.fileId); bw.Write(i.bank); bw.Write(i.volume); bw.Write(i.channelPriority); bw.Write(i.playerPriority); bw.Write(i.playerNumber); bw.Write(i.unknown1); bw.Write(i.unknown2); } } //Write SeqArc bw.Write(f.seqArcRecord.count); for (int i = 0; i < f.seqArcRecord.offsets.Length; i++) { if (f.seqArcInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.seqArcRecord.offsets [i]); } } foreach (NitroStructures.seqArcInfo i in f.seqArcInfo) { if (!i.isPlaceHolder) { bw.Write(i.fileId); } } //Write Bank bw.Write(f.bankRecord.count); for (int i = 0; i < f.bankRecord.offsets.Length; i++) { if (f.bankInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.bankRecord.offsets [i]); } } foreach (NitroStructures.bankInfo i in f.bankInfo) { if (!i.isPlaceHolder) { bw.Write(i.fileId); bw.Write(i.wave0); bw.Write(i.wave1); bw.Write(i.wave2); bw.Write(i.wave3); } } //Write Wave bw.Write(f.waveRecord.count); for (int i = 0; i < f.waveRecord.offsets.Length; i++) { if (f.waveInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.waveRecord.offsets [i]); } } foreach (NitroStructures.waveInfo i in f.waveInfo) { if (!i.isPlaceHolder) { bw.Write(i.fileId); } } //Write Player bw.Write(f.playerRecord.count); for (int i = 0; i < f.playerRecord.offsets.Length; i++) { if (f.playerInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.playerRecord.offsets [i]); } } foreach (NitroStructures.playerInfo i in f.playerInfo) { if (!i.isPlaceHolder) { bw.Write(i.seqMax); bw.Write(i.channelFlag); bw.Write(i.heapSize); } } //Write group bw.Write(f.groupRecord.count); for (int i = 0; i < f.groupRecord.offsets.Length; i++) { if (f.groupInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.groupRecord.offsets [i]); } } foreach (NitroStructures.groupInfo i in f.groupInfo) { bw.Write(i.count); foreach (NitroStructures.groupSubInfo j in i.subInfo) { bw.Write(j.type); bw.Write(j.loadFlag); bw.Write(j.padding); bw.Write(j.nEntry); } } //Write Player2 bw.Write(f.player2Record.count); for (int i = 0; i < f.player2Record.offsets.Length; i++) { if (f.player2Info [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.player2Record.offsets [i]); } } foreach (NitroStructures.player2Info i in f.player2Info) { if (!i.isPlaceHolder) { bw.Write(i.count); bw.Write(i.v0); bw.Write(i.v1); bw.Write(i.v2); bw.Write(i.v3); bw.Write(i.v4); bw.Write(i.v5); bw.Write(i.v6); bw.Write(i.v7); bw.Write(i.v8); bw.Write(i.v9); bw.Write(i.v10); bw.Write(i.v11); bw.Write(i.v12); bw.Write(i.v13); bw.Write(i.v14); bw.Write(i.v15); bw.Write(i.reserved); } } //Write Strm bw.Write(f.strmRecord.count); for (int i = 0; i < f.strmRecord.offsets.Length; i++) { if (f.strmInfo [i].isPlaceHolder) { bw.Write(0x00000000); } else { bw.Write(f.strmRecord.offsets [i]); } } foreach (NitroStructures.strmInfo i in f.strmInfo) { if (!i.isPlaceHolder) { bw.Write(i.fileId); bw.Write(i.volume); bw.Write(i.priority); bw.Write(i.player); bw.Write(i.reserved); } } //Return bytes. return(o.ToArray()); }
public static void Main(string[] args) { //Some dummy code for messing around with SYMB and INFO files. /* * NitroStructures.infoFile f = NitroFileLoader.loadInfoFile (File.ReadAllBytes ("infoNSMB.bin")); * * NitroStructures.infoFile h = f; * * byte[] infoTest = NitroFileLoader.infoToBytes (f); * File.WriteAllBytes ("test.bin",infoTest); * * f = NitroFileLoader.loadInfoFile (File.ReadAllBytes ("test.bin")); * File.WriteAllBytes ("test2.bin", NitroFileLoader.infoToBytes (f)); * * * * NitroStructures.symbFile s = NitroFileLoader.loadSymbFile(File.ReadAllBytes("symb.bin")); * * NitroStructures.symbFile t = s; * * byte[] symbTest = NitroFileLoader.symbToBytes(s); * File.WriteAllBytes("test.bin", symbTest); * * symbData sData = new symbData (); * sData.load (s); * * File.WriteAllBytes ("test2.bin", NitroFileLoader.symbToBytes(sData.toSymb())); */ //Test seqArc loading. /* * byte[] seqArcNintendo = File.ReadAllBytes("sound_data/Sequence Archive/05NCS_SEQARC_NINTENDO.ssar"); * byte[] seqArcVoice = File.ReadAllBytes("sound_data/Sequence Archive/02NCS_SEQARC_VOICE.ssar"); * seqArc sN = new seqArc (); * sN.load (seqArcNintendo); * seqArc vN = new seqArc (); * vN.load (seqArcVoice); */ /* * //Wave arcs. * byte[] waveArcNintendo = File.ReadAllBytes("sound_data/Wave Archive/01NCS_WAVE_SE_NINTENDO.swar"); * swarFile sW = new swarFile (); * sW.load (waveArcNintendo); * byte[] waveArcResident = File.ReadAllBytes ("sound_data/Wave Archive/04NCS_WAVE_RESIDENT.swar"); * swarFile sR = new swarFile (); * sR.load (waveArcResident); * * sW.extract ("NINTENDO_WAVE"); * sR.extract ("RESIDENT_WAVE"); * * sR.compress ("RESIDENT_WAVE"); * sW.compress ("NINTENDO_WAVE"); * File.WriteAllBytes ("WWAVE.swar", sW.toBytes ()); * File.WriteAllBytes ("RWAVE.swar", sR.toBytes ()); * * * //SBNK * byte[] bankWater = File.ReadAllBytes("sound_data/Bank/070NCS_BANK_BGM_WATER.sbnk"); * sbnkFile water = new sbnkFile (); * water.load (bankWater); * * * //SDAT * byte[] dataSdatB = File.ReadAllBytes("data.sdat"); * sdatFile dataSdat = new sdatFile (); * //dataSdat.load (dataSdatB); * //dataSdat.extract ("extract"); * dataSdat.compress ("extract"); * byte[] newSdat = dataSdat.toBytes (); * File.WriteAllBytes ("test.sdat", newSdat); * * //Extract other sdat. * byte[] otherSdatB = File.ReadAllBytes("test.sdat"); * sdatFile otherSdat = new sdatFile (); * otherSdat.load (otherSdatB); * otherSdat.extract ("extract2"); */ //Info. NitroStructures.infoFile f = new NitroStructures.infoFile(); f = NitroFileLoader.loadInfoFile(File.ReadAllBytes("info.bin")); }
//Info Tools #region infoTools //Load info file. public static NitroStructures.infoFile loadInfoFile(byte[] b) { //Make reader. MemoryStream src = new MemoryStream(b); BinaryDataReader br = new BinaryDataReader(src); //Make new file. NitroStructures.infoFile f = new NitroStructures.infoFile(); //Load basic stuff. f.magic = br.ReadChars(4); f.fileSize = br.ReadUInt32(); f.sseqOffset = br.ReadUInt32(); f.seqArcOffset = br.ReadUInt32(); f.bankOffset = br.ReadUInt32(); f.waveOffset = br.ReadUInt32(); f.playerOffset = br.ReadUInt32(); f.groupOffset = br.ReadUInt32(); f.player2Offset = br.ReadUInt32(); f.strmOffset = br.ReadUInt32(); f.reserved = br.ReadBytes(24); //Sseq record. br.Position = (int)f.sseqOffset; f.sseqRecord.count = br.ReadUInt32(); f.sseqRecord.offsets = br.ReadUInt32s((int)f.sseqRecord.count); f.sseqInfo = new NitroStructures.sseqInfo[(int)f.sseqRecord.count]; for (int i = 0; i < f.sseqRecord.count; i++) { //Set position. br.Position = (int)f.sseqRecord.offsets[i]; f.sseqInfo [i].fileId = br.ReadUInt32(); f.sseqInfo [i].bank = br.ReadUInt16(); f.sseqInfo [i].volume = br.ReadByte(); f.sseqInfo [i].channelPriority = br.ReadByte(); f.sseqInfo [i].playerPriority = br.ReadByte(); f.sseqInfo [i].playerNumber = br.ReadByte(); f.sseqInfo [i].unknown1 = br.ReadByte(); f.sseqInfo [i].unknown2 = br.ReadByte(); f.sseqInfo [i].isPlaceHolder = false; //If not null if (f.sseqRecord.offsets [i] == 0) { f.sseqInfo [i].isPlaceHolder = true; } } //SeqArc br.Position = (int)f.seqArcOffset; f.seqArcRecord.count = br.ReadUInt32(); f.seqArcRecord.offsets = br.ReadUInt32s((int)f.seqArcRecord.count); f.seqArcInfo = new NitroStructures.seqArcInfo[(int)f.seqArcRecord.count]; for (int i = 0; i < f.seqArcRecord.count; i++) { //Set position. br.Position = (int)f.seqArcRecord.offsets[i]; f.seqArcInfo [i].fileId = br.ReadUInt32(); f.seqArcInfo [i].isPlaceHolder = false; //If not null if (f.seqArcRecord.offsets [i] == 0) { f.seqArcInfo [i].isPlaceHolder = true; } } //Bank br.Position = (int)f.bankOffset; f.bankRecord.count = br.ReadUInt32(); f.bankRecord.offsets = br.ReadUInt32s((int)f.bankRecord.count); f.bankInfo = new NitroStructures.bankInfo[(int)f.bankRecord.count]; for (int i = 0; i < f.bankRecord.count; i++) { //Set position. br.Position = (int)f.bankRecord.offsets[i]; f.bankInfo [i].fileId = br.ReadUInt32(); f.bankInfo [i].wave0 = br.ReadUInt16(); f.bankInfo [i].wave1 = br.ReadUInt16(); f.bankInfo [i].wave2 = br.ReadUInt16(); f.bankInfo [i].wave3 = br.ReadUInt16(); f.bankInfo [i].isPlaceHolder = false; //If not null if (f.bankRecord.offsets [i] == 0) { f.bankInfo [i].isPlaceHolder = true; } } //Wave br.Position = (int)f.waveOffset; f.waveRecord.count = br.ReadUInt32(); f.waveRecord.offsets = br.ReadUInt32s((int)f.waveRecord.count); f.waveInfo = new NitroStructures.waveInfo[(int)f.waveRecord.count]; for (int i = 0; i < f.waveRecord.count; i++) { //Set position. br.Position = (int)f.waveRecord.offsets[i]; f.waveInfo [i].fileId = br.ReadUInt32(); f.waveInfo [i].isPlaceHolder = false; //If not null if (f.waveRecord.offsets [i] == 0) { f.waveInfo [i].isPlaceHolder = true; } } //Player br.Position = (int)f.playerOffset; f.playerRecord.count = br.ReadUInt32(); f.playerRecord.offsets = br.ReadUInt32s((int)f.playerRecord.count); f.playerInfo = new NitroStructures.playerInfo[(int)f.playerRecord.count]; for (int i = 0; i < f.playerRecord.count; i++) { //Set position. br.Position = (int)f.playerRecord.offsets[i]; f.playerInfo [i].seqMax = br.ReadUInt16(); f.playerInfo [i].channelFlag = br.ReadUInt16(); f.playerInfo [i].heapSize = br.ReadUInt32(); f.playerInfo [i].isPlaceHolder = false; //If not null. if (f.playerRecord.offsets [i] == 0) { f.playerInfo [i].isPlaceHolder = true; } } //Group br.Position = (int)f.groupOffset; f.groupRecord.count = br.ReadUInt32(); f.groupRecord.offsets = br.ReadUInt32s((int)f.groupRecord.count); f.groupInfo = new NitroStructures.groupInfo[(int)f.groupRecord.count]; for (int i = 0; i < f.groupRecord.count; i++) { //Set position. br.Position = (int)f.groupRecord.offsets[i]; //Read count. f.groupInfo[i].count = br.ReadUInt32(); f.groupInfo [i].isPlaceHolder = false; //Get sub info. f.groupInfo[i].subInfo = new NitroStructures.groupSubInfo[(int)f.groupInfo[i].count]; for (int j = 0; j < f.groupInfo[i].count; j++) { //Now get the data. f.groupInfo[i].subInfo[j].type = br.ReadByte(); f.groupInfo[i].subInfo[j].loadFlag = br.ReadByte(); f.groupInfo [i].subInfo [j].padding = br.ReadUInt16(); f.groupInfo [i].subInfo [j].nEntry = br.ReadUInt32(); //Subgroups can't be placeholders, since there is not offset to it. } //Check if placeholder. if (f.groupRecord.offsets[i] == 0) { f.groupInfo [i].isPlaceHolder = true; } } //Player2 br.Position = (int)f.player2Offset; f.player2Record.count = br.ReadUInt32(); f.player2Record.offsets = br.ReadUInt32s((int)f.player2Record.count); f.player2Info = new NitroStructures.player2Info[(int)f.player2Record.count]; for (int i = 0; i < f.player2Record.count; i++) { //Set position. br.Position = (int)f.player2Record.offsets[i]; f.player2Info [i].count = br.ReadByte(); f.player2Info [i].v0 = br.ReadByte(); f.player2Info [i].v1 = br.ReadByte(); f.player2Info [i].v2 = br.ReadByte(); f.player2Info [i].v3 = br.ReadByte(); f.player2Info [i].v4 = br.ReadByte(); f.player2Info [i].v5 = br.ReadByte(); f.player2Info [i].v6 = br.ReadByte(); f.player2Info [i].v7 = br.ReadByte(); f.player2Info [i].v8 = br.ReadByte(); f.player2Info [i].v9 = br.ReadByte(); f.player2Info [i].v10 = br.ReadByte(); f.player2Info [i].v11 = br.ReadByte(); f.player2Info [i].v12 = br.ReadByte(); f.player2Info [i].v13 = br.ReadByte(); f.player2Info [i].v14 = br.ReadByte(); f.player2Info [i].v15 = br.ReadByte(); f.player2Info [i].reserved = br.ReadBytes(7); f.player2Info [i].isPlaceHolder = false; //If not null if (f.player2Record.offsets [i] == 0) { f.player2Info [i].isPlaceHolder = true; } } //Strm br.Position = (int)f.strmOffset; f.strmRecord.count = br.ReadUInt32(); f.strmRecord.offsets = br.ReadUInt32s((int)f.strmRecord.count); f.strmInfo = new NitroStructures.strmInfo[(int)f.strmRecord.count]; for (int i = 0; i < f.strmRecord.count; i++) { //Set position. br.Position = (int)f.waveRecord.offsets[i]; f.strmInfo [i].fileId = br.ReadUInt32(); f.strmInfo [i].volume = br.ReadByte(); f.strmInfo [i].priority = br.ReadByte(); f.strmInfo [i].player = br.ReadByte(); f.strmInfo [i].reserved = br.ReadBytes(5); f.strmInfo [i].isPlaceHolder = false; //If not null if (f.strmRecord.offsets [i] == 0) { f.strmInfo [i].isPlaceHolder = true; } } //Return final. return(f); }