Example #1
0
        /// <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());
        }
Example #2
0
        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"));
        }
Example #3
0
        //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);
        }