From 8a75c8a725d97adcb38e7fda91803f72948ae396 Mon Sep 17 00:00:00 2001 From: Jelle <60387522+JelleInfinity@users.noreply.github.com> Date: Tue, 18 Oct 2022 21:18:09 +0200 Subject: [PATCH] Expose Encounter Multiplier editor --- pkNX.Game/Editors/Poke/PokeEditor8a.cs | 2 ++ .../Slots/EncounterMultiplerArchive8a.cs | 29 +++++++++++++++++-- .../Field/Slots/EncounterMultiplier8a.cs | 24 +++++++-------- .../Arceus/Util/EncounterTable8aUtil.cs | 8 ++--- pkNX.WinForms/Dumping/GameDumperPLA.cs | 2 +- pkNX.WinForms/MainEditor/EditorPLA.cs | 8 +++++ pkNX.WinForms/Subforms/PokeDataUI8a.cs | 5 ++++ 7 files changed, 59 insertions(+), 19 deletions(-) diff --git a/pkNX.Game/Editors/Poke/PokeEditor8a.cs b/pkNX.Game/Editors/Poke/PokeEditor8a.cs index b5795d83..90d83516 100644 --- a/pkNX.Game/Editors/Poke/PokeEditor8a.cs +++ b/pkNX.Game/Editors/Poke/PokeEditor8a.cs @@ -15,6 +15,7 @@ public class PokeEditor8a : IDataEditor public TableCache DexResearch { get; set; } public TableCache PokeResourceList { get; set; } public TableCache PokeResourceTable { get; set; } + public TableCache EncounterRateTable { get; set; } public void CancelEdits() { } @@ -32,5 +33,6 @@ public void Save() DexResearch.Save(); PokeResourceList.Save(); PokeResourceTable.Save(); + EncounterRateTable.Save(); } } diff --git a/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplerArchive8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplerArchive8a.cs index b7697eb1..a7659392 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplerArchive8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplerArchive8a.cs @@ -1,5 +1,7 @@ using System; using System.ComponentModel; +using System.Diagnostics; +using System.Linq; using FlatSharp.Attributes; // ReSharper disable UnusedAutoPropertyAccessor.Global @@ -12,7 +14,7 @@ namespace pkNX.Structures.FlatBuffers; [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] -public class EncounterMultiplerArchive8a : IFlatBufferArchive +public class EncounterMultiplierArchive8a : IFlatBufferArchive { public byte[] Write() => FlatBufferConverter.SerializeFrom(this); @@ -20,9 +22,32 @@ public class EncounterMultiplerArchive8a : IFlatBufferArchive z.Species == slot.Species && z.Form == slot.Form); + var result = GetEntry((ushort)slot.Species, (ushort)slot.Form); if (result == null) throw new ArgumentException($"Invalid Encounter Slot {slot.Species} - {slot.Form}"); return result; } + + public EncounterMultiplier8a GetEntry(ushort species, ushort form) + { + return Table.FirstOrDefault(x => x.Species == species && x.Form == form) ?? + new EncounterMultiplier8a { }; + } + + public bool HasEntry(ushort species, ushort form) + { + return Table.Any(x => x.Species == species && x.Form == form); + } + + public EncounterMultiplier8a AddEntry(ushort species, ushort form) + { + Debug.Assert(!HasEntry(species, form), "The encounter rate table already contains an entry for the same species and form!"); + + var entry = new EncounterMultiplier8a { Species = species, Form = form }; + Table = Table.Append(entry) + .OrderBy(x => x.Species) + .ThenBy(x => x.Form) + .ToArray(); + return entry; + } } diff --git a/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplier8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplier8a.cs index 698f2205..7af29387 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplier8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Field/Slots/EncounterMultiplier8a.cs @@ -16,18 +16,18 @@ public class EncounterMultiplier8a : ISlotModifierTime, ISlotModifierWeather { [FlatBufferItem(00)] public int Species { get; set; } [FlatBufferItem(01)] public int Form { get; set; } - [FlatBufferItem(02)] public float TimeOfDayMultiplier_0 { get; set; } - [FlatBufferItem(03)] public float TimeOfDayMultiplier_1 { get; set; } - [FlatBufferItem(04)] public float TimeOfDayMultiplier_2 { get; set; } - [FlatBufferItem(05)] public float TimeOfDayMultiplier_3 { get; set; } - [FlatBufferItem(06)] public float WeatherMultiplier_1 { get; set; } - [FlatBufferItem(07)] public float WeatherMultiplier_2 { get; set; } - [FlatBufferItem(08)] public float WeatherMultiplier_3 { get; set; } - [FlatBufferItem(09)] public float WeatherMultiplier_4 { get; set; } - [FlatBufferItem(10)] public float WeatherMultiplier_5 { get; set; } - [FlatBufferItem(11)] public float WeatherMultiplier_6 { get; set; } - [FlatBufferItem(12)] public float WeatherMultiplier_7 { get; set; } - [FlatBufferItem(13)] public float WeatherMultiplier_8 { get; set; } + [FlatBufferItem(02)] public float TimeOfDayMultiplier_0 { get; set; } = -1; + [FlatBufferItem(03)] public float TimeOfDayMultiplier_1 { get; set; } = -1; + [FlatBufferItem(04)] public float TimeOfDayMultiplier_2 { get; set; } = -1; + [FlatBufferItem(05)] public float TimeOfDayMultiplier_3 { get; set; } = -1; + [FlatBufferItem(06)] public float WeatherMultiplier_1 { get; set; } = -1; + [FlatBufferItem(07)] public float WeatherMultiplier_2 { get; set; } = -1; + [FlatBufferItem(08)] public float WeatherMultiplier_3 { get; set; } = -1; + [FlatBufferItem(09)] public float WeatherMultiplier_4 { get; set; } = -1; + [FlatBufferItem(10)] public float WeatherMultiplier_5 { get; set; } = -1; + [FlatBufferItem(11)] public float WeatherMultiplier_6 { get; set; } = -1; + [FlatBufferItem(12)] public float WeatherMultiplier_7 { get; set; } = -1; + [FlatBufferItem(13)] public float WeatherMultiplier_8 { get; set; } = -1; public float GetTimeMultiplier(int index) => index switch { diff --git a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs index 683cfebe..7f087311 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Util/EncounterTable8aUtil.cs @@ -213,7 +213,7 @@ public static IEnumerable GetUnownLinesBias(AreaInstance8a area, IReadOn } } - public static IEnumerable GetLines(EncounterMultiplerArchive8a multiplier_archive, + public static IEnumerable GetLines(EncounterMultiplierArchive8a multiplier_archive, PokeMiscTable8a misc, string[] speciesNames, AreaInstance8a area, NewHugeOutbreakGroupArchive8a nhoGroup, @@ -275,7 +275,7 @@ public static IEnumerable GetUnownLinesBias(AreaInstance8a area, IReadOn } private static IEnumerable GetTableSummary(EncounterTable8a t, - EncounterMultiplerArchive8a multiplier_archive, string[] speciesNames, + EncounterMultiplierArchive8a multiplier_archive, string[] speciesNames, PokeMiscTable8a misc, AreaInstance8a area, NewHugeOutbreakGroupArchive8a nhoGroup, @@ -310,7 +310,7 @@ public static IEnumerable GetUnownLinesBias(AreaInstance8a area, IReadOn } private static IEnumerable GetLines(IReadOnlyList arr, - EncounterMultiplerArchive8a multiplier_archive, IReadOnlyList speciesNames, int lvMin, int lvMax, + EncounterMultiplierArchive8a multiplier_archive, IReadOnlyList speciesNames, int lvMin, int lvMax, PokeMiscTable8a misc) { var dividedTables = EncounterDetail8a.GetEmpty(); @@ -365,7 +365,7 @@ public static IEnumerable GetUnownLinesBias(AreaInstance8a area, IReadOn } } - private static void FillSlots(IEnumerable arr, EncounterMultiplerArchive8a multArchive, List[,] dividedTables) + private static void FillSlots(IEnumerable arr, EncounterMultiplierArchive8a multArchive, List[,] dividedTables) { var ctr = 0; foreach (var slot in arr.OrderByDescending(sl => sl.BaseProbability)) diff --git a/pkNX.WinForms/Dumping/GameDumperPLA.cs b/pkNX.WinForms/Dumping/GameDumperPLA.cs index 39831285..57bc1314 100644 --- a/pkNX.WinForms/Dumping/GameDumperPLA.cs +++ b/pkNX.WinForms/Dumping/GameDumperPLA.cs @@ -402,7 +402,7 @@ public void DumpWilds() Dictionary map = GetPlaceNameMap(); var multdata = ROM.GetFile(GameFile.EncounterRateTable)[0]; - var multipliers = FlatBufferConverter.DeserializeFrom(multdata); + var multipliers = FlatBufferConverter.DeserializeFrom(multdata); var miscdata = ROM.GetFile(GameFile.PokeMisc)[0]; var misc = FlatBufferConverter.DeserializeFrom(miscdata); diff --git a/pkNX.WinForms/MainEditor/EditorPLA.cs b/pkNX.WinForms/MainEditor/EditorPLA.cs index 7f604759..f3346835 100644 --- a/pkNX.WinForms/MainEditor/EditorPLA.cs +++ b/pkNX.WinForms/MainEditor/EditorPLA.cs @@ -155,6 +155,7 @@ public void EditPokemon() DexResearch = Data.DexResearch, PokeResourceList = new(ROM.GetFile(GameFile.PokemonResourceList)), PokeResourceTable = new(ROM.GetFile(GameFile.PokemonResourceTable)), + EncounterRateTable = new(ROM.GetFile(GameFile.EncounterRateTable)), }; using var form = new PokeDataUI8a(editor, ROM, Data); form.ShowDialog(); @@ -315,6 +316,13 @@ void Randomize(IEnumerable arr) } } + [EditorCallable(EditorCategory.Field)] + public void EditEncounterRate() + { + var names = ROM.GetStrings(TextName.SpeciesNames); + PopFlat(GameFile.EncounterRateTable, "Encounter Rate Editor", (z, _) => $"{names[z.Species]}{(z.Form == 0 ? "" : $"-{z.Form}")}"); + } + [EditorCallable(EditorCategory.Field)] public void EditMapViewer() { diff --git a/pkNX.WinForms/Subforms/PokeDataUI8a.cs b/pkNX.WinForms/Subforms/PokeDataUI8a.cs index afa06c3d..a39ca58f 100644 --- a/pkNX.WinForms/Subforms/PokeDataUI8a.cs +++ b/pkNX.WinForms/Subforms/PokeDataUI8a.cs @@ -862,6 +862,11 @@ private void CHK_IsPresentInGame_CheckedChanged(object sender, EventArgs e) { Editor.PokeResourceTable.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, 0); } + + if (!Editor.EncounterRateTable.Root.HasEntry(cPersonal.DexIndexNational, cPersonal.Form)) + { + Editor.EncounterRateTable.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form); + } } }