コード例 #1
0
        public BMG_New(EndianBinaryReader stream)
        {
            //Loads a BMG file from a file stream

            messageList = new List<Message>();

            //There are two headers at the start of the BMG file. One is
            //the main file header, which begins with the string "MESGbmg1."
            //It contains the file size and two other variables with unknown
            //purposes. The other is the INF1 header, which begins with "INF1"
            //and contains the INF1's size, the number of messages, and the
            //size of the message entries. For TWW, the message entry size is 0x18.
            //We only need the number of message entries to parse the file, so we'll
            //pull that from INF1 and disregard everything else.

            windWakerCheck = (ushort)stream.ReadInt16At(0x2A);

            if (windWakerCheck != 0x18)
            {
                IsWindWaker = false;

                return;
            }

            numEntries = (ushort)stream.ReadInt16At(0x28);

            stream.BaseStream.Position = 0x30;

            for (int i = 0; i < numEntries; i++)
            {
                Message mes = new Message(stream);

                //There are many null entries in the file as it is.
                //This will filter them out. Why do they exist?
                //Nintendo. That's why.
                if (mes.charOffset == 0)
                {
                    continue;
                }

                messageList.Add(mes);
            }

            dat1Size = (uint)stream.ReadInt32At((stream.BaseStream.Position + 0xC));

            stream.BaseStream.Position += 0x11;

            uint charDataSize = 0;

            for (int j = 0; j < messageList.Count; j++)
            {
                if (j == (messageList.Count - 1))
                {
                    charDataSize = (uint)(dat1Size - messageList[j].charOffset);
                }

                else
                {
                    charDataSize = (uint)(messageList[j + 1].charOffset - messageList[j].charOffset);
                }

                messageList[j].GetCharData(stream, charDataSize);
            }

            //ExportBMGFromPath(messageList);
        }