コード例 #1
0
        private void ReadItems(Mother3Rom rom)
        {
            IMother3Reader reader = new Mother3Reader(rom);

            TableInfo info = rom.Settings.DataTables["Items"];
            reader.Position = info.Address;

            Items = new List<Item>();
            for (int i = 0; i < info.Count; i++)
                Items.Add(reader.ReadItem());
        }
コード例 #2
0
        private void ReadTextBank(Mother3Rom rom)
        {
            Mother3Reader reader = new Mother3Reader(rom);
            reader.Position = rom.Settings.BankAddresses["TextTable"];
            int[] pointers = reader.ReadOffsetTable();

            RoomDescriptions = ReadOffsetText(rom, pointers[0], pointers[1], false);
            ItemNames = ReadTableText(rom, pointers[2]);
            ItemDescriptions = ReadOffsetText(rom, pointers[3], pointers[4], false);
            CharacterNames = ReadTableText(rom, pointers[5]);
            PartyCharacterNames = ReadTableText(rom, pointers[6]);
            EnemyNames = ReadTableText(rom, pointers[7], bugContext: 1);
            PsiNames = ReadTableText(rom, pointers[8]);
            PsiDescriptions = ReadOffsetText(rom, pointers[9], pointers[10], false);
            Statuses = ReadTableText(rom, pointers[11]);
            DefaultNames = ReadTableText(rom, pointers[12]);
            SpecialText = ReadTableText(rom, pointers[13]);
            SkillDescriptions = ReadOffsetText(rom, pointers[14], pointers[15], false);
        }
コード例 #3
0
        private Dictionary<int, string> ReadOffsetText(Mother3Rom rom, int tableOffset, int textOffset, bool dialog)
        {
            Mother3Reader reader = new Mother3Reader(rom);

            reader.Position = tableOffset;
            int[] pointers = reader.ReadMiniOffsetTable(textOffset);

            Dictionary<int, string> text = new Dictionary<int, string>();

            for (int i = 0; i < pointers.Length; i++)
            {
                reader.Position = pointers[i];

                if (pointers[i] != 0)
                {
                    if (dialog)
                    {
                        text.Add(i, reader.ReadDialogString());
                    }
                    else
                    {
                        text.Add(i, reader.ReadCodedString());
                    }
                }
            }

            return text;
        }
コード例 #4
0
        private Dictionary<int, string> ReadTableText(Mother3Rom rom, int offset, int bugContext = 0)
        {
            if (offset == 0)
            {
                return null;
            }

            Mother3Reader reader = new Mother3Reader(rom);
            reader.Position = offset;

            FixedTableHeader header = reader.ReadFixedTableHeader();

            if (bugContext == 1)
            {
                // Bug in English versions 1.0 through 1.2 -- one of the entries is
                // missing from the table, so the header's entry count is too high by one
                switch (rom.Settings.Version)
                {
                    case Mother3Version.English10:
                    case Mother3Version.English11:
                    case Mother3Version.English12:
                        header = new FixedTableHeader(header.EntryLength, header.Count - 1);
                        break;
                }
            }

            Dictionary<int, string> text = new Dictionary<int, string>();

            for (int i = 0; i < header.Count; i++)
            {
                text.Add(i, reader.ReadCodedString(header.EntryLength));
            }

            return text;
        }
コード例 #5
0
        private void ReadMainScript(Mother3Rom rom)
        {
            // The main script is technically part of the map bank, but it makes more sense here
            Mother3Reader reader = new Mother3Reader(rom);
            reader.Position = rom.Settings.BankAddresses["Maps.MainScript"];
            int[] pointers = reader.ReadOffsetTable();

            MainScript = new Dictionary<int, Dictionary<int, string>>();

            int entryCount = pointers.Length / 2;

            Parallel.For(0, entryCount, parallelOptions, i =>
            {
                int miniOffsetPointer = pointers[i * 2];
                int textPointer = pointers[i * 2 + 1];

                if (miniOffsetPointer != 0 && textPointer != 0)
                {
                    MainScript.Add(i, ReadOffsetText(rom, miniOffsetPointer, textPointer, true));
                }
            });

            // Attempt to order the script entries (they'll be out of order due to the threading)
            var list = MainScript.ToList();
            list.Sort((a, b) => a.Key.CompareTo(b.Key));
            MainScript = list.ToDictionary(kv => kv.Key, kv => kv.Value);
        }