diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs index 463652f6..eff07694 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroup8a.cs @@ -21,46 +21,11 @@ public class NewHugeOutbreakGroupLotteryArchive8a : IFlatBufferArchive z.LotteryGroup == hash); + if (group == null) + return false; - 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; + return group.IsUseTable(groups, tableID); } } @@ -71,6 +36,26 @@ public class NewHugeOutbreakGroupLottery8a [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(); + + public bool IsUseTable(NewHugeOutbreakGroupArchive8a groups, ulong tableID) + { + foreach (var lotteryChoice in Table1) + { + if (lotteryChoice.UsesTable(groups, tableID)) + return true; + } + foreach (var lotteryChoice in Table2) + { + if (lotteryChoice.UsesTable(groups, tableID)) + return true; + } + foreach (var lotteryChoice in Table3) + { + if (lotteryChoice.UsesTable(groups, tableID)) + return true; + } + return false; + } } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] @@ -78,4 +63,14 @@ public class NewHugeOutbreakGroupLotteryDetail8a { [FlatBufferItem(00)] public ulong Group { get; set; } [FlatBufferItem(01)] public int Rate { get; set; } + + public override string ToString() => $"{Group:X16}|{Rate}"; + + public bool UsesTable(NewHugeOutbreakGroupArchive8a groups, ulong tableID) + { + var lottery = Array.Find(groups.Table, z => z.Group == Group); + if (lottery is null) + return false; + return lottery.UsesTable(tableID); + } } diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs index 8740f849..c6bb395d 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakGroupLottery8a.cs @@ -24,7 +24,15 @@ public class NewHugeOutbreakGroup8a : IFlatBufferArchive(); - [FlatBufferItem(02)] public ulong Field_02 { get; set; } + [FlatBufferItem(02)] public ulong EncounterTableID { get; set; } + + public bool UsesTable(ulong tableID) + { + if (EncounterTableID == tableID) + return true; + var matches = Array.Find(Table, z => z.EncounterTableID == tableID); + return matches is not null; + } } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] @@ -39,4 +47,5 @@ public class NewHugeOutbreakDetail8a : IHasCondition8a [FlatBufferItem(6)] public string ConditionArg5 { get; set; } = string.Empty; [FlatBufferItem(7)] public ulong EncounterTableID { get; set; } [FlatBufferItem(8)] public int Rate { get; set; } + public override string ToString() => $"PlacementParameters(/* ConditionTypeID = */ {this.GetConditionTypeSummary()}, /* Condition = */ {this.GetConditionSummary()}, {EncounterTableID:X16}, {Rate})"; } diff --git a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs index 9c50b555..358ed894 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/NewHuge/NewHugeOutbreakLottery8a.cs @@ -25,8 +25,8 @@ public class NewHugeOutbreakLottery8a [FlatBufferItem(00)] public ulong Hash { get; set; } [FlatBufferItem(01)] public string Field_01 { get; set; } = string.Empty; [FlatBufferItem(02)] public int OutbreakChance { get; set; } - [FlatBufferItem(03)] public int Field_03 { get; set; } - [FlatBufferItem(04)] public int Field_04 { get; set; } + [FlatBufferItem(03)] public int OutbreakTotalMin { get; set; } + [FlatBufferItem(04)] public int OutbreakTotalMax { get; set; } [FlatBufferItem(05)] public int Field_05 { get; set; } [FlatBufferItem(06)] public int Field_06 { get; set; } [FlatBufferItem(07)] public int MinCountFirst { get; set; } @@ -35,9 +35,13 @@ public class NewHugeOutbreakLottery8a [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; } - [FlatBufferItem(14)] public int Field_14 { get; set; } + [FlatBufferItem(13)] public int BerryChance { get; set; } + [FlatBufferItem(14)] public int RollBonus { get; set; } [FlatBufferItem(15)] public string[] Field_15 { get; set; } = Array.Empty(); [FlatBufferItem(16)] public int[] Field_16 { get; set; } = Array.Empty(); - [FlatBufferItem(17)] public int[] Field_17 { get; set; } = Array.Empty(); + [FlatBufferItem(17)] public int[] StarChanceParams { get; set; } = Array.Empty(); + + // Stars are checked before berries + public int StarMin => StarChanceParams[0]; + public int StarMax => StarChanceParams[1]; } diff --git a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs index 493f5249..9865a694 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs @@ -12,7 +12,9 @@ public static class EncounterTable8aUtil private const float LandmarkBias = 15; public static IEnumerable GetEncounterDump(AreaInstance8a area, - IReadOnlyDictionary map, PokeMiscTable8a misc) + IReadOnlyDictionary map, PokeMiscTable8a misc, + NewHugeOutbreakGroupArchive8a nhoGroup, + NewHugeOutbreakGroupLotteryArchive8a nhoLottery) { if (area.Locations.Length == 0) yield break; @@ -23,17 +25,20 @@ public static class EncounterTable8aUtil if (slots.Count == 0) continue; - foreach (var p in GetAreas(area, slots, table, map, misc)) + foreach (var p in GetAreas(area, slots, table, map, misc, nhoGroup, nhoLottery)) yield return p; foreach (var x in area.SubAreas) { - foreach (var p in GetAreas(x, slots, table, map, misc)) + foreach (var p in GetAreas(x, slots, table, map, misc, nhoGroup, nhoLottery)) yield return p; } } } - private static IEnumerable GetAreas(AreaInstance8a area, IReadOnlyCollection slots, EncounterTable8a table, IReadOnlyDictionary map, PokeMiscTable8a misc) + private static IEnumerable GetAreas(AreaInstance8a area, IReadOnlyCollection slots, EncounterTable8a table, + IReadOnlyDictionary map, PokeMiscTable8a misc, + NewHugeOutbreakGroupArchive8a nhoGroup, + NewHugeOutbreakGroupLotteryArchive8a nhoLottery) { if (area.Locations.Length == 0) yield break; @@ -47,6 +52,13 @@ private static IEnumerable GetAreas(AreaInstance8a area, IReadOnlyCollec foreach (var a in GetAll(sl, SpawnerType.Spawner)) yield return a; } + { + var s = area.Spawners; + var spawners = s.Where(z => nhoLottery.IsAreaGroup(z, nhoGroup, table.TableID)); + var sl = spawners.SelectMany(z => z.GetIntersectingLocations(area.Locations, SpawnerBias)); + foreach (var a in GetAll(sl, SpawnerType.Spawner)) + yield return a; + } // Wormholes { diff --git a/pkNX.WinForms/Dumping/GameDumperPLA.cs b/pkNX.WinForms/Dumping/GameDumperPLA.cs index e525bc67..dfd13c23 100644 --- a/pkNX.WinForms/Dumping/GameDumperPLA.cs +++ b/pkNX.WinForms/Dumping/GameDumperPLA.cs @@ -413,7 +413,7 @@ public void DumpWilds() allUnownLines.AddRange(unown); allUnownLinesBias.AddRange(unownBias); - var slices = EncounterTable8aUtil.GetEncounterDump(instance, map, misc); + var slices = EncounterTable8aUtil.GetEncounterDump(instance, map, misc, nhoGroup, nhoGroupL); foreach (var s in slices) { if (!hexBin.Any(z => z.SequenceEqual(s)))