internal static void Process()
        {
            LoadWorld();
            LoadFields();
            if (DumpMonsterAndCharacterDat.MonsterData?.IsEmpty ?? true)
            {
                DumpMonsterAndCharacterDat.LoadMonsters(); //load all the monsters.
            }
            using (StreamWriter csvFile = new StreamWriter(new FileStream("BattleEncounters.csv", FileMode.Create, FileAccess.Write, FileShare.ReadWrite), System.Text.Encoding.UTF8))
            {
                string header =
                    $"{nameof(Battle.Encounter.ID)}{Ls}" +
                    $"{nameof(Battle.Encounter.Filename)}{Ls}" +
                    $"{nameof(BattleStageNames)}{Ls}" +
                    $"{nameof(Battle.Encounter.BEnemies)}{Ls}" +
                    $"{nameof(Fields)}{Ls}";
                csvFile.WriteLine(header);
                foreach (Battle.Encounter e in Memory.Encounters)
                {
                    //wip
                    string data =
                        $"{e.ID}{Ls}" +
                        $"{e.Filename}{Ls}" +
                        $"\"{BattleStageNames[e.Scenario]}\"{Ls}";
                    string             enemies = "\"";
                    IEnumerable <byte> unique  = e.UniqueMonstersList;
                    IEnumerable <KeyValuePair <byte, int> > counts = e.UniqueMonstersList.Select(x => new KeyValuePair <byte, int>(x, e.EnabledMonsters.Count(y => y.Value == x)));
                    unique.ForEach(x =>
                    {
                        string name = "<unknown>";
                        if (DumpMonsterAndCharacterDat.MonsterData.TryGetValue(x, out Debug_battleDat battleDat) && battleDat != null)
                        {
                            name  = battleDat.information.name.Value_str.Trim();
                            name += $" ({battleDat.fileName})";
                        }

                        Debug.Assert(enemies != null, nameof(enemies) + " != null");
                        enemies += $"{counts.First(y => y.Key == x).Value} × {name}{Ls} ";
                    });
                    enemies = enemies.TrimEnd(Ls[0], ' ') + "\"";
                    data   += $"{enemies}{Ls}";
                    //check encounters in fields and confirm encounter rate is above 0.
                    IEnumerable <string> fieldMatches = FieldData.Where(x => x.Value.MrtRat != null && (x.Value.MrtRat.Any(y => y.Key == e.ID && y.Value > 0))).Select(x => x.Value.FileName);
                    IEnumerable <string> second       = _fieldsWithBattleScripts.Where(x => x.Value == e.ID).Select(x => x.Key);
                    if (second.Any())
                    {
                        if (fieldMatches.Any())
                        {
                            fieldMatches = fieldMatches.Concat(second).Distinct();
                        }
                        else
                        {
                            fieldMatches = second;
                        }
                    }

                    if (fieldMatches.Any())
                    {
                        data += $"\"{string.Join($"{Ls} ", fieldMatches).TrimEnd(Ls[0], ' ')}\"{Ls}";
                    }
                    else if (_worldEncounters.Any(x => x == e.ID))
                    {
                        data += $"\"World Map\"{Ls}";
                    }
                    else if (WorldEncountersLunar.Any(x => x == e.ID))
                    {
                        data += $"\"World Map - Lunar Cry\"{Ls}";
                    }
                    else
                    {
                        data += Ls;
                    }
                    csvFile.WriteLine(data);
                }
            }
        }
        internal static async Task Process()
        {
            await Task.WhenAll(Task.Run(() => LoadWorld()), LoadFields(),
                               DumpMonsterAndCharacterDat.LoadMonsters() //load all the monsters.
                               );

            using (var csvFile = new StreamWriter(new FileStream("BattleEncounters.csv", FileMode.Create, FileAccess.Write, FileShare.ReadWrite), System.Text.Encoding.UTF8))
            {
                var header =
                    $"{nameof(Encounter.ID)}{Ls}" +
                    $"{nameof(Encounter.Filename)}{Ls}" +
                    $"{nameof(BattleStageNames)}{Ls}" +
                    $"{nameof(Encounter.BEnemies)}{Ls}" +
                    $"{nameof(Fields)}{Ls}";
                csvFile.WriteLine(header);
                foreach (var e in Memory.Encounters)
                {
                    //wip
                    var data =
                        $"{e.ID}{Ls}" +
                        $"{e.Filename}{Ls}" +
                        $"\"{BattleStageNames[e.Scenario]}\"{Ls}";
                    var enemies = "\"";
                    var unique  = e.UniqueMonstersList;
                    var counts  = e.UniqueMonstersList.Select(x => new KeyValuePair <byte, int>(x, e.EnabledMonsters.Count(y => y.Value == x)));
                    unique.ForEach(x =>
                    {
                        var name = "<unknown>";
                        if (DumpMonsterAndCharacterDat.MonsterData.TryGetValue(x, out var battleDat) && battleDat != null)
                        {
                            name  = battleDat.Information.Name.Value_str.Trim();
                            name += $" ({battleDat.FileName})";
                        }

                        Debug.Assert(enemies != null, nameof(enemies) + " != null");
                        enemies += $"{counts.First(y => y.Key == x).Value} × {name}{Ls} ";
                    });
                    enemies = enemies.TrimEnd(Ls[0], ' ') + "\"";
                    data   += $"{enemies}{Ls}";
                    //check encounters in fields and confirm encounter rate is above 0.
                    if (FieldData != null)
                    {
                        var fieldMatches = FieldData.Where(x => x.Value.MrtRat != null && (x.Value.MrtRat.Any(y => y.Key == e.ID && y.Value > 0))).Select(x => x.Value.FileName);
                        if (_fieldsWithBattleScripts != null)
                        {
                            var second = _fieldsWithBattleScripts.Where(x => x.Value == e.ID).Select(x => x.Key);
                            if (second.Any())
                            {
                                fieldMatches = fieldMatches.Any() ? fieldMatches.Concat(second).Distinct() : second;
                            }
                        }

                        if (fieldMatches.Any())
                        {
                            data += $"\"{string.Join($"{Ls} ", fieldMatches).TrimEnd(Ls[0], ' ')}\"{Ls}";
                        }
                        else if (_worldEncounters.Any(x => x == e.ID))
                        {
                            data += $"\"World Map\"{Ls}";
                        }
                        else if (WorldEncountersLunar.Any(x => x == e.ID))
                        {
                            data += $"\"World Map - Lunar Cry\"{Ls}";
                        }
                        else
                        {
                            data += Ls;
                        }
                    }

                    csvFile.WriteLine(data);
                }
            }
        }