From 014d26656fd07e25ddb342467e85f28561a1913f Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 27 Feb 2022 12:38:01 -0800 Subject: [PATCH] Start associating NHO spawners to tables --- .../Arceus/NewHuge/NewHugeOutbreakGroup8a.cs | 47 ++++++++++++++++++- .../NewHuge/NewHugeOutbreakGroupLottery8a.cs | 4 +- .../NewHuge/NewHugeOutbreakLottery8a.cs | 10 ++-- .../Arceus/Util/EncounterTable8aUtil.cs | 29 +++++++++--- pkNX.WinForms/Dumping/GameDumperPLA.cs | 7 ++- pkNX.WinForms/Main.cs | 2 - pkNX.WinForms/MainEditor/EditorPLA.cs | 4 +- 7 files changed, 84 insertions(+), 19 deletions(-) diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs index c2351196..463652f6 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs @@ -17,12 +17,57 @@ public class NewHugeOutbreakGroupLotteryArchive8a : IFlatBufferArchive FlatBufferConverter.SerializeFrom(this); [FlatBufferItem(0)] public NewHugeOutbreakGroupLottery8a[] Table { get; set; } = Array.Empty(); + + public bool IsAreaGroup(PlacementSpawner8a spawner, NewHugeOutbreakGroupArchive8a groups, ulong tableID) + { + var hash = spawner.Field_20_Value.EncounterTableID; + foreach (var t in Table) + { + if (t.LotteryGroup != hash) + continue; + + foreach (var lotteryChoice in t.Table1) + { + var group = lotteryChoice.Group; + var lottery = Array.Find(groups.Table, z => z.Group == group); + if (lottery is null) + continue; + var tables = lottery.Table; + var matches = Array.Find(tables, z => z.EncounterTableID == tableID); + if (matches is not null) + return true; + } + foreach (var lotteryChoice in t.Table2) + { + var group = lotteryChoice.Group; + var lottery = Array.Find(groups.Table, z => z.Group == group); + if (lottery is null) + continue; + var tables = lottery.Table; + var matches = Array.Find(tables, z => z.EncounterTableID == tableID); + if (matches is not null) + return true; + } + foreach (var lotteryChoice in t.Table3) + { + var group = lotteryChoice.Group; + var lottery = Array.Find(groups.Table, z => z.Group == group); + if (lottery is null) + continue; + var tables = lottery.Table; + var matches = Array.Find(tables, z => z.EncounterTableID == tableID); + if (matches is not null) + return true; + } + } + return false; + } } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] public class NewHugeOutbreakGroupLottery8a { - [FlatBufferItem(00)] public ulong EncounterTable { get; set; } + [FlatBufferItem(00)] public ulong LotteryGroup { get; set; } [FlatBufferItem(01)] public NewHugeOutbreakGroupLotteryDetail8a[] Table1 { get; set; } = Array.Empty(); [FlatBufferItem(02)] public NewHugeOutbreakGroupLotteryDetail8a[] Table2 { get; set; } = Array.Empty(); [FlatBufferItem(03)] public NewHugeOutbreakGroupLotteryDetail8a[] Table3 { get; set; } = Array.Empty(); diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs index 00c7cd63..8740f849 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs @@ -22,7 +22,7 @@ public class NewHugeOutbreakGroupArchive8a : IFlatBufferArchive { - [FlatBufferItem(00)] public ulong Field_00 { get; set; } + [FlatBufferItem(00)] public ulong Group { get; set; } [FlatBufferItem(01)] public NewHugeOutbreakDetail8a[] Table { get; set; } = Array.Empty(); [FlatBufferItem(02)] public ulong Field_02 { get; set; } } @@ -37,6 +37,6 @@ public class NewHugeOutbreakDetail8a : IHasCondition8a [FlatBufferItem(4)] public string ConditionArg3 { get; set; } = string.Empty; [FlatBufferItem(5)] public string ConditionArg4 { get; set; } = string.Empty; [FlatBufferItem(6)] public string ConditionArg5 { get; set; } = string.Empty; - [FlatBufferItem(7)] public ulong Field_07 { get; set; } + [FlatBufferItem(7)] public ulong EncounterTableID { get; set; } [FlatBufferItem(8)] public int Rate { get; set; } } diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs index bea0381b..9c50b555 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs @@ -24,15 +24,15 @@ public class NewHugeOutbreakLottery8a { [FlatBufferItem(00)] public ulong Hash { get; set; } [FlatBufferItem(01)] public string Field_01 { get; set; } = string.Empty; - [FlatBufferItem(02)] public int Field_02 { get; set; } + [FlatBufferItem(02)] public int OutbreakChance { get; set; } [FlatBufferItem(03)] public int Field_03 { get; set; } [FlatBufferItem(04)] public int Field_04 { get; set; } [FlatBufferItem(05)] public int Field_05 { get; set; } [FlatBufferItem(06)] public int Field_06 { get; set; } - [FlatBufferItem(07)] public int Field_07 { get; set; } - [FlatBufferItem(08)] public int Field_08 { get; set; } - [FlatBufferItem(09)] public int Field_09 { get; set; } - [FlatBufferItem(10)] public int Field_10 { get; set; } + [FlatBufferItem(07)] public int MinCountFirst { get; set; } + [FlatBufferItem(08)] public int MaxCountFirst { get; set; } + [FlatBufferItem(09)] public int MinCountSecond { get; set; } + [FlatBufferItem(10)] public int MaxCountSecond { get; set; } [FlatBufferItem(11)] public int Field_11 { get; set; } [FlatBufferItem(12)] public int Field_12 { get; set; } [FlatBufferItem(13)] public int Field_13 { get; set; } diff --git a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs index 69ca874e..493f5249 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs @@ -176,24 +176,31 @@ public static IEnumerable GetUnownLinesBias(AreaInstance8a area, IReadOn public static IEnumerable GetLines(EncounterMultiplerArchive8a multiplier_archive, PokeMiscTable8a misc, string[] speciesNames, - AreaInstance8a area, IReadOnlyDictionary map) + AreaInstance8a area, + NewHugeOutbreakGroupArchive8a nhoGroup, + NewHugeOutbreakGroupLotteryArchive8a nhoLottery, + IReadOnlyDictionary map) { yield return $"Area: {area.AreaName}"; foreach (var enctable in area.Encounters) { - foreach (var line in GetTableSummary(enctable, multiplier_archive, speciesNames, misc, area, map)) + foreach (var line in GetTableSummary(enctable, multiplier_archive, speciesNames, misc, area, nhoGroup, nhoLottery, map)) yield return $"\t{line}"; yield return string.Empty; } } - private static IEnumerable GetUsedSpawnerSummary(EncounterTable8a t, AreaInstance8a area, IReadOnlyDictionary valueTuples) + private static IEnumerable GetUsedSpawnerSummary(EncounterTable8a t, AreaInstance8a area, + IReadOnlyDictionary valueTuples, + NewHugeOutbreakGroupArchive8a nhoGroup, + NewHugeOutbreakGroupLotteryArchive8a nhoLottery) { var usedBySpawners = Array.FindAll(area.Spawners, z => z.UsesTable(t.TableID)); var usedByWormholes = Array.FindAll(area.Wormholes, z => z.UsesTable(t.TableID)); var usedByLandmarkSpawns = Array.FindAll(area.LandItems, z => z.UsesTable(t.TableID)); var usedByLandmarks = Array.FindAll(area.LandMarks, z => usedByLandmarkSpawns.Any(sz => z.UsesTable(sz.LandmarkItemSpawnTableID))); + var usedByNHO = Array.FindAll(area.Spawners, z => nhoLottery.IsAreaGroup(z, nhoGroup, t.TableID)); foreach (var s in usedBySpawners) { @@ -202,6 +209,13 @@ private static IEnumerable GetUsedSpawnerSummary(EncounterTable8a t, Are var p = s.Parameters; yield return $"Spawner @ {s.NameSummary}_{s.Field_01:X16} ({p.GetConditionSummary()}) @ {p.Coordinates.ToTriple()}, {area.AreaName} = {name}"; } + foreach (var s in usedByNHO) + { + var contained = s.GetContainingLocations(area.Locations).First().PlaceName; + var name = valueTuples[contained].Name; + var p = s.Parameters; + yield return $"SpawnerNHO @ {s.NameSummary}_{s.Field_01:X16} ({p.GetConditionSummary()}) @ {p.Coordinates.ToTriple()}, {area.AreaName} = {name}"; + } foreach (var s in usedByWormholes) { var contained = s.GetContainingLocations(area.Locations).First().PlaceName; @@ -223,12 +237,15 @@ private static IEnumerable GetUsedSpawnerSummary(EncounterTable8a t, Are private static IEnumerable GetTableSummary(EncounterTable8a t, EncounterMultiplerArchive8a multiplier_archive, string[] speciesNames, PokeMiscTable8a misc, - AreaInstance8a area, IReadOnlyDictionary valueTuples) + AreaInstance8a area, + NewHugeOutbreakGroupArchive8a nhoGroup, + NewHugeOutbreakGroupLotteryArchive8a nhoLottery, + IReadOnlyDictionary valueTuples) { yield return $"{t}:"; var totalUses = 0; - foreach (var line in GetUsedSpawnerSummary(t, area, valueTuples)) + foreach (var line in GetUsedSpawnerSummary(t, area, valueTuples, nhoGroup, nhoLottery)) { totalUses++; yield return $"\t{line}"; @@ -236,7 +253,7 @@ private static IEnumerable GetUsedSpawnerSummary(EncounterTable8a t, Are foreach (var subArea in area.SubAreas) { - foreach (var line in GetUsedSpawnerSummary(t, subArea, valueTuples)) + foreach (var line in GetUsedSpawnerSummary(t, subArea, valueTuples, nhoGroup, nhoLottery)) { totalUses++; yield return $"\t{line}"; diff --git a/pkNX.WinForms/Dumping/GameDumperPLA.cs b/pkNX.WinForms/Dumping/GameDumperPLA.cs index 9663bbe8..e525bc67 100644 --- a/pkNX.WinForms/Dumping/GameDumperPLA.cs +++ b/pkNX.WinForms/Dumping/GameDumperPLA.cs @@ -373,6 +373,11 @@ public void DumpWilds() var miscdata = ROM.GetFile(GameFile.PokeMisc)[0]; var misc = FlatBufferConverter.DeserializeFrom(miscdata); + var nhoGroup_b = ROM.GetFile(GameFile.NewHugeGroup)[0]; + var nhoGroup = FlatBufferConverter.DeserializeFrom(nhoGroup_b); + var nhoGroupL_b = ROM.GetFile(GameFile.NewHugeGroupLottery)[0]; + var nhoGroupL = FlatBufferConverter.DeserializeFrom(nhoGroupL_b); + var resident = (GFPack)ROM.GetFile(GameFile.Resident); var bin_settings = resident.GetDataFullPath("bin/field/resident/AreaSettings.bin"); var settings = FlatBufferConverter.DeserializeFrom(bin_settings); @@ -398,7 +403,7 @@ public void DumpWilds() foreach (var areaNameList in ResidentAreaSet.AreaNames) { var instance = AreaInstance8a.Create(resident, areaNameList, settings); - var lines = EncounterTable8aUtil.GetLines(multipliers, misc, speciesName, instance, map).ToList(); + var lines = EncounterTable8aUtil.GetLines(multipliers, misc, speciesName, instance, nhoGroup, nhoGroupL, map).ToList(); File.WriteAllLines(GetPath(wild, $"Encounters_{instance.AreaName}.txt"), lines); var unown = EncounterTable8aUtil.GetUnownLines(instance, map).Distinct().ToList(); diff --git a/pkNX.WinForms/Main.cs b/pkNX.WinForms/Main.cs index 089e8ce3..c4759f97 100644 --- a/pkNX.WinForms/Main.cs +++ b/pkNX.WinForms/Main.cs @@ -112,9 +112,7 @@ private void OpenPath(string path) else OpenFile(path); } -#pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) -#pragma warning restore CA1031 // Do not catch general exception types { WinFormsUtil.Error($"Failed to open -- {path}", ex.Message); } diff --git a/pkNX.WinForms/MainEditor/EditorPLA.cs b/pkNX.WinForms/MainEditor/EditorPLA.cs index a068718e..ce6d37f9 100644 --- a/pkNX.WinForms/MainEditor/EditorPLA.cs +++ b/pkNX.WinForms/MainEditor/EditorPLA.cs @@ -410,10 +410,10 @@ public void EditOutbreakDetail() => PopFlat(GameFile.Outbreak, "Outbreak Proc Editor", z => z.WorkValueName); public void EditNewOutbreak_Group() - => PopFlat(GameFile.NewHugeGroup, "New Outbreak Group Editor", z => z.Field_00.ToString("X16")); + => PopFlat(GameFile.NewHugeGroup, "New Outbreak Group Editor", z => z.Group.ToString("X16")); public void EditNewOutbreak_GroupLottery() - => PopFlat(GameFile.NewHugeGroupLottery, "New Outbreak Group Lottery Editor", z => z.EncounterTable.ToString("X16")); + => PopFlat(GameFile.NewHugeGroupLottery, "New Outbreak Group Lottery Editor", z => z.LotteryGroup.ToString("X16")); public void EditNewOutbreak_Lottery() => PopFlat(GameFile.NewHugeLottery, "New Outbreak Lottery Editor", z => z.Hash.ToString("X16"));