Пример #1
0
        public static void WriteMessageTable(MessageTable table)
        {
            byte[] new_message_data = table.Rebuild();

            int fileIndex = RomUtils.GetFileIndexForWriting(MESSAGE_DATA_ADDRESS);
            var file      = RomData.MMFileList[fileIndex];

            file.Data = new_message_data;
            file.End  = file.Addr + new_message_data.Length;


            fileIndex = RomUtils.GetFileIndexForWriting(MESSAGE_TABLE_ADDRESS);
            file      = RomData.MMFileList[fileIndex];
            int code_baseAddr = MESSAGE_TABLE_ADDRESS - file.Addr;
            var code_data     = file.Data;

            foreach (var item in table.messages.Values)
            {
                ReadWriteUtils.Arr_WriteU16(code_data, code_baseAddr, item.Id);
                ReadWriteUtils.Arr_WriteU32(code_data, code_baseAddr + 4, (uint)item.address);
                code_baseAddr += 8;
            }

            //write terminator record
            ReadWriteUtils.Arr_WriteU16(code_data, code_baseAddr, 0xFFFF);
            ReadWriteUtils.Arr_WriteU32(code_data, code_baseAddr + 4, 0);
        }
Пример #2
0
        public static void WriteMessageTable(MessageTable table, bool isQuickTextEnabled)
        {
            if (isQuickTextEnabled)
            {
                var regex = new Regex("(?<!(?:\x1B|\x1C|\x1D|\x1E).?)(?:\x1F..|\x17|\x18)", RegexOptions.Singleline);
                foreach (var messageEntry in table.messages.Values)
                {
                    messageEntry.Message = regex.Replace(messageEntry.Message, "");
                }
            }
            byte[] new_message_data = table.Rebuild();

            int fileIndex = RomUtils.GetFileIndexForWriting(MESSAGE_DATA_ADDRESS);
            var file      = RomData.MMFileList[fileIndex];

            file.Data = new_message_data;
            file.End  = file.Addr + new_message_data.Length;


            fileIndex = RomUtils.GetFileIndexForWriting(MESSAGE_TABLE_ADDRESS);
            file      = RomData.MMFileList[fileIndex];
            int code_baseAddr = MESSAGE_TABLE_ADDRESS - file.Addr;
            var code_data     = file.Data;

            foreach (var item in table.messages.Values)
            {
                ReadWriteUtils.Arr_WriteU16(code_data, code_baseAddr, item.Id);
                ReadWriteUtils.Arr_WriteU32(code_data, code_baseAddr + 4, (uint)item.address);
                code_baseAddr += 8;
            }

            //write terminator record
            ReadWriteUtils.Arr_WriteU16(code_data, code_baseAddr, 0xFFFF);
            ReadWriteUtils.Arr_WriteU32(code_data, code_baseAddr + 4, 0);
        }
Пример #3
0
        public void InitializeTable()
        {
            Dictionary <ushort, MessageEntry> messageTable = new Dictionary <ushort, MessageEntry>();

            int    fileIndex     = RomUtils.GetFileIndexForWriting(MESSAGE_TABLE_ADDRESS);
            MMFile file          = RomData.MMFileList[fileIndex];
            int    code_baseAddr = MESSAGE_TABLE_ADDRESS - file.Addr;
            var    code_data     = file.Data;

            fileIndex = RomUtils.GetFileIndexForWriting(MESSAGE_DATA_ADDRESS);
            file      = RomData.MMFileList[fileIndex];

            var message_data = file.Data;

            while (true)
            {
                ushort textId = ReadWriteUtils.Arr_ReadU16(code_data, code_baseAddr);
                if (textId >= 0xFFFF)
                {
                    break;
                }

                int address = ReadWriteUtils.Arr_ReadS32(code_data, code_baseAddr + 4) & 0xFFFFFF;

                byte[] header = new byte[11];
                Array.Copy(message_data, address, header, 0, 11);

                int    cur     = address + 11 - 1;
                string message = "";

                do
                {
                    cur++;
                    message += (char)message_data[cur];
                }while (message_data[cur] != 0xBF);


                MessageEntry messageEntry = new MessageEntry()
                {
                    Id      = textId,
                    Header  = header,
                    Message = message
                };
                messageTable.Add(textId, messageEntry);
                code_baseAddr += 8;
            }

            messages = messageTable;
        }
Пример #4
0
        public static void WriteEntrances(int[] olde, int[] newe)
        {
            int f = RomUtils.GetFileIndexForWriting(0xC5BC64);

            uint[] data = new uint[newe.Length];

            for (int i = 0; i < newe.Length; i++)
            {
                data[i] = ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, GetEntranceAddr(newe[i]));
            }

            for (int i = 0; i < newe.Length; i++)
            {
                ReadWriteUtils.Arr_WriteU32(RomData.MMFileList[f].Data, GetEntranceAddr(olde[i]), data[i]);
            }
        }
Пример #5
0
        private static int GetEntranceAddr(int ent)
        {
            int offset = ((ent >> 9) * 12) + 0xC5BC64;
            int f      = RomUtils.GetFileIndexForWriting(offset);

            offset -= RomData.MMFileList[f].Addr;
            uint p1 = ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, offset);

            offset = ((ent >> 4) & 0x1F) * 4;

            p1 = (uint)((p1 & 0xFFFFFF) + 0xA96540 - RomData.MMFileList[f].Addr);
            p1 = ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, (int)(p1 + offset));
            p1 = (uint)((p1 & 0xFFFFFF) + 0xA96540 - RomData.MMFileList[f].Addr);

            offset = (ent & 0xF) << 2;
            return((int)p1 + offset);
        }