From f69b9844e08627d60f181a8a7d6194ce9191dbf2 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 12 Feb 2022 14:08:08 -0800 Subject: [PATCH] Add static/gift randomizer --- .../Arceus/Poke/PokeAdd8a.cs | 20 ++-- pkNX.WinForms/MainEditor/EditorPLA.cs | 93 ++++++++++++++++--- 2 files changed, 92 insertions(+), 21 deletions(-) diff --git a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAdd8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAdd8a.cs index e0db4735..214cace9 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAdd8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAdd8a.cs @@ -29,18 +29,18 @@ public class PokeAdd8a [FlatBufferItem(04)] public ShinyType8a ShinyLock { get; set; } [FlatBufferItem(05)] public int Level { get; set; } [FlatBufferItem(06)] public int AbilityRandType { get; set; } - [FlatBufferItem(07)] public int Nature { get; set; } + [FlatBufferItem(07)] public NatureType8a Nature { get; set; } [FlatBufferItem(08)] public int Height { get; set; } [FlatBufferItem(09)] public int Weight { get; set; } [FlatBufferItem(10)] public bool IsOybn { get; set; } - [FlatBufferItem(11)] public int Field_11 { get; set; } // All Entries have empty - [FlatBufferItem(12)] public int Field_12 { get; set; } // All Entries have empty - [FlatBufferItem(13)] public int Field_13 { get; set; } // All Entries have empty - [FlatBufferItem(14)] public int Field_14 { get; set; } // All Entries have empty - [FlatBufferItem(15)] public int Field_15 { get; set; } // All Entries have empty - [FlatBufferItem(16)] public int Field_16 { get; set; } // All Entries have empty - [FlatBufferItem(17)] public int Field_17 { get; set; } // All Entries have empty - [FlatBufferItem(18)] public int Field_18 { get; set; } // All Entries have empty + [FlatBufferItem(11)] public int Move1 { get; set; } + [FlatBufferItem(12)] public bool Mastered1 { get; set; } + [FlatBufferItem(13)] public int Move2 { get; set; } + [FlatBufferItem(14)] public bool Mastered2 { get; set; } + [FlatBufferItem(15)] public int Move3 { get; set; } + [FlatBufferItem(16)] public bool Mastered3 { get; set; } + [FlatBufferItem(17)] public int Move4 { get; set; } + [FlatBufferItem(18)] public bool Mastered4 { get; set; } [FlatBufferItem(19)] public int IV_HP { get; set; } [FlatBufferItem(20)] public int IV_ATK { get; set; } [FlatBufferItem(21)] public int IV_DEF { get; set; } @@ -57,7 +57,7 @@ public class PokeAdd8a public string Dump(string[] speciesNames) { - var natureStr = Nature == -1 ? "" : $", Nature = {Nature}"; + var natureStr = Nature == NatureType8a.Random ? "" : $", Nature = {Nature}"; var shinyStr = $", Shiny = {ShinyLock}"; var gvStr = ""; if (GV_HP != 0) diff --git a/pkNX.WinForms/MainEditor/EditorPLA.cs b/pkNX.WinForms/MainEditor/EditorPLA.cs index 26c30426..38955743 100644 --- a/pkNX.WinForms/MainEditor/EditorPLA.cs +++ b/pkNX.WinForms/MainEditor/EditorPLA.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; using pkNX.Containers; using pkNX.Game; +using pkNX.Randomization; using pkNX.Structures; using pkNX.Structures.FlatBuffers; using pkNX.WinForms.Subforms; @@ -56,23 +58,26 @@ public void EditTrainers() form.ShowDialog(); } - public void PopFlat(GameFile file, string title, Func getName, bool canSave = true) where T1 : class, IFlatBufferArchive where T2 : class + public void PopFlat(GameFile file, string title, Func getName, Action? rand = null, bool canSave = true) where T1 : class, IFlatBufferArchive where T2 : class { var obj = ROM.GetFile(file); var data = obj[0]; var root = FlatBufferConverter.DeserializeFrom(data); - var names = root.Table.Select(getName).ToArray(); - var cache = new DataCache(root.Table); - using var form = new GenericEditor(cache, names, title, canSave: canSave); - form.ShowDialog(); - if (!form.Modified) - { - cache.CancelEdits(); + var arr = root.Table; + if (!PopFlat(arr, title, getName, rand, canSave)) return; - } obj[0] = FlatBufferConverter.SerializeFrom(root); } + private static bool PopFlat(T2[] arr, string title, Func getName, Action? rand = null, bool canSave = false) where T2 : class + { + var names = arr.Select(getName).ToArray(); + var cache = new DataCache(arr); + using var form = new GenericEditor(cache, names, title, randomize: rand, canSave: canSave); + form.ShowDialog(); + return form.Modified; + } + public void EditThrowable_Param() { var itemNames = ROM.GetStrings(TextName.ItemNames); @@ -113,7 +118,13 @@ public void EditApp_Config_List() public void EditStatic() { var names = ROM.GetStrings(TextName.SpeciesNames); - PopFlat(GameFile.EncounterStatic, "Static Encounter Editor", z => $"{z.EncounterName} ({GetDetail(z, names)})"); + var obj = ROM.GetFile(GameFile.EncounterStatic); + var data = obj[0]; + var root = FlatBufferConverter.DeserializeFrom(data); + var entries = root.Table; + var result = PopFlat(entries, "Static Encounter Editor", z => $"{z.EncounterName} ({GetDetail(z, names)})", () => Randomize(entries)); + if (result) + obj[0] = FlatBufferConverter.SerializeFrom(root); static string GetDetail(EventEncount8a z, string[] names) { @@ -122,12 +133,72 @@ static string GetDetail(EventEncount8a z, string[] names) var s = x[0]; return $"{names[s.Species]}{(s.Form == 0 ? "" : $"-{s.Form}")} @ lv {s.Level}"; } + + void Randomize(IEnumerable arr) + { + var pt = ROM.Data.PersonalData; + int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1) + .Select((z, i) => new { Species = i, Present = ((PersonalInfoLA)z).IsPresentInGame }) + .Where(z => !z.Present).Select(z => z.Species).ToArray(); + + var spec = EditUtil.Settings.Species; + var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData); + var frand = new FormRandomizer(ROM.Data.PersonalData); + srand.Initialize(spec, ban); + foreach (var entry in arr) + { + if (entry.Table is not { Length: > 0 } x) + continue; + var t = x[0]; + if (t.Form != 0 || t.Species is (int)Species.Arceus) // Keep boss battles same? + continue; + t.Species = srand.GetRandomSpecies(t.Species); + t.Form = (byte)frand.GetRandomForme(t.Species, false, false, true, true, ROM.Data.PersonalData.Table); + t.Nature = (int)Nature.Serious; + t.Gender = (int)FixedGender.Random; + t.ShinyLock = ShinyType8a.Random; + t.Move1 = t.Move2 = t.Move3 = t.Move4 = 0; + t.Mastered1 = t.Mastered2 = t.Mastered3 = t.Mastered4 = true; + t.IV_HP = t.IV_ATK = t.IV_DEF = t.IV_SPA = t.IV_SPD = t.IV_SPE = 31; + t.GV_HP = t.GV_ATK = t.GV_DEF = t.GV_SPA = t.GV_SPD = t.GV_SPE = 31; + } + } } public void EditGift() { var names = ROM.GetStrings(TextName.SpeciesNames); - PopFlat(GameFile.EncounterGift, "Gift Encounter Editor", z => $"{names[z.Species]} @ lv {z.Level}"); + var obj = ROM.GetFile(GameFile.EncounterGift); + var data = obj[0]; + var root = FlatBufferConverter.DeserializeFrom(data); + var entries = root.Table; + var result = PopFlat(entries, "Gift Encounter Editor", z => $"{names[z.Species]} @ lv {z.Level}", () => Randomize(entries)); + if (result) + obj[0] = FlatBufferConverter.SerializeFrom(root); + + void Randomize(IEnumerable arr) + { + var pt = ROM.Data.PersonalData; + int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1) + .Select((z, i) => new { Species = i, Present = ((PersonalInfoLA)z).IsPresentInGame }) + .Where(z => !z.Present).Select(z => z.Species).ToArray(); + + var spec = EditUtil.Settings.Species; + var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData); + var frand = new FormRandomizer(ROM.Data.PersonalData); + srand.Initialize(spec, ban); + foreach (var t in arr) + { + if (t.Form != 0 || t.Species is (int)Species.Arceus) // Keep boss battles same? + continue; + t.Species = srand.GetRandomSpecies(t.Species); + t.Form = (byte)frand.GetRandomForme(t.Species, false, false, true, true, ROM.Data.PersonalData.Table); + t.Nature = NatureType8a.Random; + t.Gender = (int)FixedGender.Random; + t.ShinyLock = ShinyType8a.Random; + t.Move1 = t.Move2 = t.Move3 = t.Move4 = 0; + } + } } public void EditMiscSpeciesInfo()