diff --git a/PkmnLibSharp/Battling/LearnedMove.cs b/PkmnLibSharp/Battling/LearnedMove.cs index 96ee191..6da86e1 100644 --- a/PkmnLibSharp/Battling/LearnedMove.cs +++ b/PkmnLibSharp/Battling/LearnedMove.cs @@ -25,7 +25,7 @@ namespace PkmnLibSharp.Battling var ptr = LearnedAttack.GetAttack(Ptr); if (TryResolvePointer(ptr, out _move)) return _move!; - _move = new MoveData(ptr); + _move = Constructor.Active.ConstructMove(ptr)!; return _move; } } diff --git a/PkmnLibSharp/Battling/Pokemon.cs b/PkmnLibSharp/Battling/Pokemon.cs index b203b66..fe735c1 100644 --- a/PkmnLibSharp/Battling/Pokemon.cs +++ b/PkmnLibSharp/Battling/Pokemon.cs @@ -149,7 +149,7 @@ namespace PkmnLibSharp.Battling if (ptr == IntPtr.Zero) return null; if (!TryResolvePointer(ptr, out Item? item)) { - item = new Item(ptr); + item = Constructor.Active.ConstructItem(ptr); } return item; } diff --git a/PkmnLibSharp/Library/Items/Item.cs b/PkmnLibSharp/Library/Items/Item.cs index 884c416..1fe7c13 100644 --- a/PkmnLibSharp/Library/Items/Item.cs +++ b/PkmnLibSharp/Library/Items/Item.cs @@ -7,11 +7,7 @@ namespace PkmnLibSharp.Library.Items public class Item : PointerWrapper { private string? _name; - - internal Item(IntPtr ptr) : base(ptr) - { - } - + public string Name => _name ??= Creaturelib.Generated.Item.GetName(Ptr).PtrString()!; public ItemCategory Category => (ItemCategory) Creaturelib.Generated.Item.GetCategory(Ptr); diff --git a/PkmnLibSharp/Library/Items/ItemLibrary.cs b/PkmnLibSharp/Library/Items/ItemLibrary.cs index 704d5a1..6d0d8fa 100644 --- a/PkmnLibSharp/Library/Items/ItemLibrary.cs +++ b/PkmnLibSharp/Library/Items/ItemLibrary.cs @@ -45,7 +45,7 @@ namespace PkmnLibSharp.Library.Items return true; } - item = new Item(ptr); + item = Constructor.Active.ConstructItem(ptr)!; _cache.Add(key, item); return true; } @@ -62,7 +62,7 @@ namespace PkmnLibSharp.Library.Items return i!; } - item = new Item(ptr); + item = Constructor.Active.ConstructItem(ptr)!; _cache.Add(key, item); return item; } @@ -76,7 +76,8 @@ namespace PkmnLibSharp.Library.Items Creaturelib.Generated.ItemLibrary.GetAtIndex(Ptr, i, ref ptr).Assert(); if (TryResolvePointer(ptr, out Item? item)) yield return item!; - yield return new Item(ptr); + else + yield return Constructor.Active.ConstructItem(ptr)!; } } diff --git a/PkmnLibSharp/Library/Moves/MoveData.cs b/PkmnLibSharp/Library/Moves/MoveData.cs index 4e18d28..e95286c 100644 --- a/PkmnLibSharp/Library/Moves/MoveData.cs +++ b/PkmnLibSharp/Library/Moves/MoveData.cs @@ -10,11 +10,7 @@ namespace PkmnLibSharp.Library.Moves { private string? _name; private string? _secondaryEffectName; - - internal MoveData(IntPtr ptr) : base(ptr) - { - } - + public string Name => _name ??= AttackData.GetName(Ptr).PtrString()!; public byte Type => AttackData.GetType(Ptr); public MoveCategory Category => (MoveCategory) AttackData.GetCategory(Ptr); diff --git a/PkmnLibSharp/Library/Moves/MoveLibrary.cs b/PkmnLibSharp/Library/Moves/MoveLibrary.cs index fb5a3a3..5f4472d 100644 --- a/PkmnLibSharp/Library/Moves/MoveLibrary.cs +++ b/PkmnLibSharp/Library/Moves/MoveLibrary.cs @@ -41,7 +41,7 @@ namespace PkmnLibSharp.Library.Moves return true; } - move = new MoveData(ptr); + move = Constructor.Active.ConstructMove(ptr)!; _cache.Add(key, move); return true; } @@ -58,7 +58,7 @@ namespace PkmnLibSharp.Library.Moves return m!; } - move = new MoveData(ptr); + move = Constructor.Active.ConstructMove(ptr)!; _cache.Add(key, move); return move; } @@ -79,7 +79,8 @@ namespace PkmnLibSharp.Library.Moves AttackLibrary.GetAtIndex(Ptr, i, ref ptr).Assert(); if (TryResolvePointer(ptr, out MoveData? move)) yield return move!; - yield return new MoveData(ptr); + else + yield return Constructor.Active.ConstructMove(ptr)!; } } diff --git a/PkmnLibSharp/Library/SpeciesLibrary.cs b/PkmnLibSharp/Library/SpeciesLibrary.cs index adc0d9a..3ab16de 100644 --- a/PkmnLibSharp/Library/SpeciesLibrary.cs +++ b/PkmnLibSharp/Library/SpeciesLibrary.cs @@ -83,7 +83,8 @@ namespace PkmnLibSharp.Library Creaturelib.Generated.SpeciesLibrary.GetAtIndex(Ptr, i, ref ptr).Assert(); if (TryResolvePointer(ptr, out Species? species)) yield return species!; - yield return Constructor.Active.ConstructSpecies(ptr)!; + else + yield return Constructor.Active.ConstructSpecies(ptr)!; } } diff --git a/PkmnLibSharp/Utilities/Constructor.cs b/PkmnLibSharp/Utilities/Constructor.cs index 673b3d3..01e843a 100644 --- a/PkmnLibSharp/Utilities/Constructor.cs +++ b/PkmnLibSharp/Utilities/Constructor.cs @@ -2,27 +2,33 @@ using System; using System.Runtime.Serialization; using PkmnLibSharp.Battling; using PkmnLibSharp.Library; +using PkmnLibSharp.Library.Items; +using PkmnLibSharp.Library.Moves; namespace PkmnLibSharp.Utilities { public abstract class Constructor { public static Constructor Active { get; set; } = - new Constructor(); + new Constructor(); internal abstract Species? ConstructSpecies(IntPtr ptr); internal abstract Forme? ConstructForme(IntPtr ptr); + internal abstract MoveData? ConstructMove(IntPtr ptr); + internal abstract Item? ConstructItem(IntPtr ptr); internal abstract LearnableMoves? ConstructLearnableMoves(IntPtr ptr); internal abstract Pokemon? ConstructPokemon(IntPtr ptr); internal abstract Battle? ConstructBattle(IntPtr ptr); } public class Constructor< - TSpecies, TForme, TLearnableMoves, + TSpecies, TForme, TMoveData, TItem, TLearnableMoves, TPokemon, TBattle> : Constructor where TSpecies : Species where TForme : Forme + where TMoveData : MoveData + where TItem: Item where TLearnableMoves : LearnableMoves where TPokemon : Pokemon @@ -30,6 +36,8 @@ namespace PkmnLibSharp.Utilities { private readonly Type _speciesType = typeof(TSpecies); private readonly Type _formeType = typeof(TForme); + private readonly Type _moveDataType = typeof(TMoveData); + private readonly Type _itemType = typeof(TItem); private readonly Type _learnableMovesType = typeof(TLearnableMoves); private readonly Type _pokemonType = typeof(TPokemon); @@ -53,6 +61,16 @@ namespace PkmnLibSharp.Utilities return Create(ptr, _formeType); } + internal override MoveData? ConstructMove(IntPtr ptr) + { + return Create(ptr, _moveDataType); + } + + internal override Item? ConstructItem(IntPtr ptr) + { + return Create(ptr, _itemType); + } + internal override LearnableMoves? ConstructLearnableMoves(IntPtr ptr) { return Create(ptr, _learnableMovesType);