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