From 95b0b70d4d5dae996be7c0eae40f5a4c10b6db60 Mon Sep 17 00:00:00 2001 From: Jelle <60387522+JelleInfinity@users.noreply.github.com> Date: Thu, 13 Oct 2022 14:15:30 +0200 Subject: [PATCH] Allow adding entries to SymbolBehave --- pkNX.Game/Editors/Poke/PokeEditor8a.cs | 2 + pkNX.Game/GameData8a.cs | 3 +- pkNX.Game/GameManagerPLA.cs | 1 + .../Arceus/Poke/PokeAIArchive8a.cs | 84 +++++++++++++------ .../Arceus/Poke/PokeMiscTable8a.cs | 5 +- pkNX.WinForms/MainEditor/EditorPLA.cs | 3 +- pkNX.WinForms/Subforms/PokeDataUI8a.cs | 6 ++ 7 files changed, 75 insertions(+), 29 deletions(-) diff --git a/pkNX.Game/Editors/Poke/PokeEditor8a.cs b/pkNX.Game/Editors/Poke/PokeEditor8a.cs index e0da64f8..f98fb678 100644 --- a/pkNX.Game/Editors/Poke/PokeEditor8a.cs +++ b/pkNX.Game/Editors/Poke/PokeEditor8a.cs @@ -7,6 +7,7 @@ public class PokeEditor8a : IDataEditor { public IPersonalTable Personal { get; set; } public TableCache PokeMisc { get; set; } + public TableCache SymbolBehave { get; set; } public TableCache Evolve { get; set; } public TableCache Learn { get; set; } public TableCache FieldDropTables { get; set; } @@ -21,6 +22,7 @@ public void Save() { Personal.Save(); PokeMisc.Save(); + SymbolBehave.Save(); Learn.Save(); Evolve.Save(); FieldDropTables.Save(); diff --git a/pkNX.Game/GameData8a.cs b/pkNX.Game/GameData8a.cs index 04df5050..24a0c801 100644 --- a/pkNX.Game/GameData8a.cs +++ b/pkNX.Game/GameData8a.cs @@ -1,4 +1,4 @@ -using pkNX.Structures; +using pkNX.Structures; using pkNX.Structures.FlatBuffers; namespace pkNX.Game; @@ -7,6 +7,7 @@ public class GameData8a { public IPersonalTable PersonalData { get; internal set; } public TableCache PokeMiscData { get; internal set; } + public TableCache SymbolBehaveData { get; internal set; } public DataCache MoveData { get; internal set; } public TableCache EvolutionData { get; internal set; } diff --git a/pkNX.Game/GameManagerPLA.cs b/pkNX.Game/GameManagerPLA.cs index 2a414497..cbeb75fd 100644 --- a/pkNX.Game/GameManagerPLA.cs +++ b/pkNX.Game/GameManagerPLA.cs @@ -51,6 +51,7 @@ private void ResetData() // Single Files PersonalData = new PersonalTable8LA(GetFile(GameFile.PersonalStats)), PokeMiscData = new(GetFile(GameFile.PokeMisc)), + SymbolBehaveData = new(GetFile(GameFile.SymbolBehave)), LevelUpData = new(GetFile(GameFile.Learnsets)), EvolutionData = new(GetFile(GameFile.Evolutions)), diff --git a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAIArchive8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAIArchive8a.cs index a4131e1a..1913f0a4 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAIArchive8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeAIArchive8a.cs @@ -1,5 +1,7 @@ using System; using System.ComponentModel; +using System.Diagnostics; +using System.Linq; using FlatSharp.Attributes; // ReSharper disable UnusedAutoPropertyAccessor.Global @@ -17,6 +19,30 @@ public class PokeAIArchive8a : IFlatBufferArchive public byte[] Write() => FlatBufferConverter.SerializeFrom(this); [FlatBufferItem(0)] public PokeAI8a[] Table { get; set; } = Array.Empty(); + + public PokeAI8a GetEntry(ushort species, ushort form) + { + return Table.FirstOrDefault(z => z.Species == species && z.Form == form) ?? + new PokeAI8a { }; + } + + public bool HasEntry(ushort species, ushort form, bool isAlpha) + { + return Table.Any(x => x.Species == species && x.Form == form && x.IsAlpha == isAlpha); + } + + public PokeAI8a AddEntry(ushort species, ushort form, bool isAlpha) + { + Debug.Assert(!HasEntry(species, form, isAlpha), "The symbol behave table already contains an entry for the same species + form!"); + + var entry = new PokeAI8a { Species = species, Form = form, IsAlpha = isAlpha }; + Table = Table.Append(entry) + .OrderBy(x => x.Species) + .ThenBy(x => x.Form) + .ThenBy(x => x.IsAlpha) + .ToArray(); + return entry; + } } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] @@ -29,16 +55,16 @@ public class PokeAI8a [FlatBufferItem(04)] public string Behavior2 { get; set; } = string.Empty; [FlatBufferItem(05)] public string Behavior3 { get; set; } = string.Empty; [FlatBufferItem(06)] public bool Field_06 { get; set; } // bool - [FlatBufferItem(07)] public ulong Field_07 { get; set; } // ulong - [FlatBufferItem(08)] public bool Field_08 { get; set; } // bool, always true + [FlatBufferItem(07)] public ulong Field_07 { get; set; } // ulong 2458747221614355867 + [FlatBufferItem(08)] public bool Field_08 { get; set; } = true; // bool, always true [FlatBufferItem(09)] public PokeAI8a_F09 Field_09 { get; set; } = new(); - [FlatBufferItem(10)] public bool Field_10 { get; set; } // bool, always true + [FlatBufferItem(10)] public bool Field_10 { get; set; } = true; // bool, always true [FlatBufferItem(11)] public PokeAI8a_F09 Field_11 { get; set; } = new(); - [FlatBufferItem(12)] public bool Field_12 { get; set; } // bool, always true except for Darkrai + [FlatBufferItem(12)] public bool Field_12 { get; set; } = true; // bool, always true except for Darkrai [FlatBufferItem(13)] public PokeAI8a_F09 Field_13 { get; set; } = new(); - [FlatBufferItem(14)] public bool Field_14 { get; set; } // bool, always true + [FlatBufferItem(14)] public bool Field_14 { get; set; } = true; // bool, always true [FlatBufferItem(15)] public PokeAI8a_F09 Field_15 { get; set; } = new(); - [FlatBufferItem(16)] public bool Field_16 { get; set; } // bool, always true + [FlatBufferItem(16)] public bool Field_16 { get; set; } = true; // bool, always true [FlatBufferItem(17)] public PokeAI8a_F09 Field_17 { get; set; } = new(); [FlatBufferItem(18)] public PokeAI8a_F18 Field_18 { get; set; } = new(); // only used by Kleavor-1 [FlatBufferItem(19)] public PokeAI8a_F18 Field_19 { get; set; } = new(); // assumed same as above, none use @@ -47,14 +73,14 @@ public class PokeAI8a [FlatBufferItem(22)] public string MoveEffect1 { get; set; } = string.Empty; [FlatBufferItem(23)] public string MoveEffect2 { get; set; } = string.Empty; [FlatBufferItem(24)] public PokeAI8a_F24 Field_24 { get; set; } = new(); - [FlatBufferItem(25)] public float Field_25 { get; set; } // float - [FlatBufferItem(26)] public float Field_26 { get; set; } // float - [FlatBufferItem(27)] public PlacementV3f8a Field_27 { get; set; } = new(); - [FlatBufferItem(28)] public PlacementV3f8a Field_28 { get; set; } = new(); - [FlatBufferItem(29)] public PlacementV3f8a Field_29 { get; set; } = new(); - [FlatBufferItem(30)] public PlacementV3f8a Field_30 { get; set; } = new(); + [FlatBufferItem(25)] public float Field_25 { get; set; } = 20; // float + [FlatBufferItem(26)] public float Field_26 { get; set; } = 30; // float + [FlatBufferItem(27)] public PlacementV3f8a Field_27 { get; set; } = new(20, 50, 100); + [FlatBufferItem(28)] public PlacementV3f8a Field_28 { get; set; } = new(20, 50, 100); + [FlatBufferItem(29)] public PlacementV3f8a Field_29 { get; set; } = new(20, 50, 100); + [FlatBufferItem(30)] public PlacementV3f8a Field_30 { get; set; } = new(15, 10, 15); [FlatBufferItem(31)] public int Field_31 { get; set; } // int - [FlatBufferItem(32)] public int Field_32 { get; set; } // int + [FlatBufferItem(32)] public int Field_32 { get; set; } = -1;// int [FlatBufferItem(33)] public int Field_33 { get; set; } // int [FlatBufferItem(34)] public float Field_34 { get; set; } // cascoon/silcoon } @@ -62,7 +88,7 @@ public class PokeAI8a [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] public class PokeAI8a_F24 { - [FlatBufferItem(00)] public float Field_00 { get; set; } + [FlatBufferItem(00)] public float Field_00 { get; set; } = 7; } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] @@ -78,20 +104,26 @@ public class PokeAI8a_F18 [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] public class PokeAI8a_F09 { - [FlatBufferItem(00)] public PokeAI8_F08 Field_00 { get; set; } = new(); - [FlatBufferItem(01)] public PokeAI8_F08 Field_01 { get; set; } = new(); - [FlatBufferItem(02)] public PokeAI8_F08 Field_02 { get; set; } = new(); - [FlatBufferItem(03)] public PokeAI8_F08 Field_03 { get; set; } = new(); - [FlatBufferItem(04)] public PokeAI8_F08 Field_04 { get; set; } = new(); - [FlatBufferItem(05)] public PokeAI8_F08 Field_05 { get; set; } = new(); - [FlatBufferItem(06)] public PokeAI8_F08 Field_06 { get; set; } = new(); - [FlatBufferItem(07)] public PokeAI8_F08 Field_07 { get; set; } = new(); - [FlatBufferItem(08)] public PokeAI8_F08 Field_08 { get; set; } = new(); + [FlatBufferItem(00)] public PokeAIBehaviour Field_00 { get; set; } = new(); + [FlatBufferItem(01)] public PokeAIBehaviour Field_01 { get; set; } = new(); + [FlatBufferItem(02)] public PokeAIBehaviour Field_02 { get; set; } = new(); + [FlatBufferItem(03)] public PokeAIBehaviour Field_03 { get; set; } = new(); + [FlatBufferItem(04)] public PokeAIBehaviour Field_04 { get; set; } = new PokeAIBehaviour { Hash = 1234775724179408742, Parameters = new string[] { "3", "5", "60", "90", "4", "run", "Normal" } }; + [FlatBufferItem(05)] public PokeAIBehaviour Field_05 { get; set; } = new(); + [FlatBufferItem(06)] public PokeAIBehaviour Field_06 { get; set; } = new(); + [FlatBufferItem(07)] public PokeAIBehaviour Field_07 { get; set; } = new(); + [FlatBufferItem(08)] public PokeAIBehaviour Field_08 { get; set; } = new(); } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] -public class PokeAI8_F08 +public class PokeAIBehaviour { - [FlatBufferItem(00)] public ulong Hash { get; set; } - [FlatBufferItem(01)] public string[] Field_01 { get; set; } = Array.Empty(); + // Hash 9252365659083253459 = new string[] { "0.2", "35" }; + // Hash 17205188591700921149 = new string[] { "10", "3", "run", "Normal" }; + // Hash 17205188591700921149 = new string[] { "10", "0.5", "run", "Normal" }; + // Hash 1234775724179408742 = new string[] { "3", "5", "60", "90", "4", "run", "Normal" }; + + [FlatBufferItem(00)] public ulong Hash { get; set; } = 9252365659083253459; + [FlatBufferItem(01)] public string[] Parameters { get; set; } = new string[] { "0.2", "35" }; } + diff --git a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeMiscTable8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeMiscTable8a.cs index 32369d74..92e6f4fe 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeMiscTable8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeMiscTable8a.cs @@ -36,7 +36,10 @@ public PokeMisc8a AddEntry(ushort species, ushort form) Debug.Assert(!HasEntry(species, form), "The misc table already contains an entry for the same species + form!"); var entry = new PokeMisc8a { Species = species, Form = form }; - Table = Table.Append(entry); + Table = Table.Append(entry) + .OrderBy(x => x.Species) + .ThenBy(x => x.Form) + .ToArray(); return entry; } } diff --git a/pkNX.WinForms/MainEditor/EditorPLA.cs b/pkNX.WinForms/MainEditor/EditorPLA.cs index d924a776..5d2eed6b 100644 --- a/pkNX.WinForms/MainEditor/EditorPLA.cs +++ b/pkNX.WinForms/MainEditor/EditorPLA.cs @@ -141,6 +141,7 @@ public void EditPokemon() { Personal = Data.PersonalData, PokeMisc = Data.PokeMiscData, + SymbolBehave = Data.SymbolBehaveData, Evolve = Data.EvolutionData, Learn = Data.LevelUpData, FieldDropTables = Data.FieldDrops, @@ -166,7 +167,7 @@ public void EditMiscSpeciesInfo() public void EditSymbolBehave() { var names = ROM.GetStrings(TextName.SpeciesNames); - PopFlat(GameFile.SymbolBehave, "Symbol Behavior Editor", z => $"{names[z.Species]}{(z.Form != 0 ? $"-{z.Form}" : "")}"); + PopFlat(GameFile.SymbolBehave, "Symbol Behavior Editor", z => $"{names[z.Species]}{(z.IsAlpha ? "*" : "")}{(z.Form != 0 ? $"-{z.Form}" : "")}"); } [EditorCallable(EditorCategory.Pokemon)] diff --git a/pkNX.WinForms/Subforms/PokeDataUI8a.cs b/pkNX.WinForms/Subforms/PokeDataUI8a.cs index 4eb5dfba..adcd392e 100644 --- a/pkNX.WinForms/Subforms/PokeDataUI8a.cs +++ b/pkNX.WinForms/Subforms/PokeDataUI8a.cs @@ -846,6 +846,12 @@ private void CHK_IsPresentInGame_CheckedChanged(object sender, EventArgs e) // Reload entry with correct misc data LoadMisc(entry); } + + if (!Editor.SymbolBehave.Root.HasEntry(cPersonal.DexIndexNational, cPersonal.Form, false)) + { + Editor.SymbolBehave.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, false); + Editor.SymbolBehave.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, true); + } } }