diff --git a/pkNX.Game/Editors/Poke/PokeEditor8a.cs b/pkNX.Game/Editors/Poke/PokeEditor8a.cs index b64f80bf..b4e344ad 100644 --- a/pkNX.Game/Editors/Poke/PokeEditor8a.cs +++ b/pkNX.Game/Editors/Poke/PokeEditor8a.cs @@ -16,6 +16,7 @@ public class PokeEditor8a : IDataEditor public TableCache PokeResourceList { get; init; } = null!; public TableCache PokeResourceTable { get; init; } = null!; public TableCache EncounterRateTable { get; init; } = null!; + public TableCache CaptureCollisionTable { get; init; } = null!; public void CancelEdits() { } @@ -34,5 +35,6 @@ public void Save() PokeResourceList.Save(); PokeResourceTable.Save(); EncounterRateTable.Save(); + CaptureCollisionTable.Save(); } } diff --git a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeCaptureCollisionArchive8a.cs b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeCaptureCollisionArchive8a.cs index d57c0799..e41052cd 100644 --- a/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeCaptureCollisionArchive8a.cs +++ b/pkNX.Structures.FlatBuffers/Arceus/Poke/PokeCaptureCollisionArchive8a.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,54 @@ public class PokeCaptureCollisionArchive8a : IFlatBufferArchive FlatBufferConverter.SerializeFrom(this); [FlatBufferItem(00)] public PokeCaptureCollision8a[] Table { get; set; } = Array.Empty(); + + public PokeCaptureCollision8a GetEntry(ushort species, ushort form) + { + return Table.FirstOrDefault(x => x.Species == species && x.Form == form) ?? + new PokeCaptureCollision8a { }; + } + + public bool HasEntry(ushort species, ushort form) + { + return Table.Any(x => x.Species == species && x.Form == form); + } + + public PokeCaptureCollision8a 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 PokeCaptureCollision8a + { + Species = species, + Form = form, + Colliders = new PokeCaptureCollider[] + { + new() { + Shape = "Capsule", + ShapeParameters = new float[]{ 0.5f, 0.2f, 0, 0, 0, 0, 0, 0 }, + SocketName = "waist", + Type = "Normal", + }, + new() { + Shape = "Capsule", + ShapeParameters = new float[]{ 0.5f, 0.2f, 0, 0, 0, 0, 0, 0 }, + Type = "Pysics", + }, + new() { + Shape = "Capsule", + ShapeParameters = new float[]{ 0.5f, 0.2f, 0, 0, 0, 0, 0, 0 }, + SocketName = "origin", + Type = "Barrier", + }, + } + }; + + Table = Table.Append(entry) + .OrderBy(x => x.Species) + .ThenBy(x => x.Form) + .ToArray(); + return entry; + } } [FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))] @@ -37,5 +87,5 @@ public class PokeCaptureCollider [FlatBufferItem(04)] public float OffsetY { get; set; } [FlatBufferItem(05)] public float OffsetZ { get; set; } [FlatBufferItem(06)] public string Type { get; set; } = string.Empty; - [FlatBufferItem(07)] public string Field_07 { get; set; } = string.Empty; + [FlatBufferItem(07)] public string Field_07 { get; set; } = string.Empty; // Heatran has this on collider[1] (PM0485), some have it set to SemiLegendFlick. Something like a script tag maybe? }