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()); }
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); }
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; }
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; }
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); }