Update to latest version of pkmnLib.
This commit is contained in:
100
PkmnLibSharp/Library/AbilityLibrary.cs
Normal file
100
PkmnLibSharp/Library/AbilityLibrary.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using PkmnLibSharp.Utilities;
|
||||
|
||||
namespace PkmnLibSharp.Library
|
||||
{
|
||||
public class AbilityLibrary : PointerWrapper
|
||||
{
|
||||
private readonly Dictionary<string, Ability> _cache =
|
||||
new Dictionary<string, Ability>(StringComparer.InvariantCultureIgnoreCase);
|
||||
|
||||
public ulong Count => Creaturelib.Generated.TalentLibrary.GetCount(Ptr);
|
||||
|
||||
public void Insert(string key, Ability ability)
|
||||
{
|
||||
Creaturelib.Generated.TalentLibrary.Insert(Ptr, key.ToPtr(), ability.Ptr).Assert();
|
||||
_cache.Add(key, ability);
|
||||
}
|
||||
|
||||
public void Delete(string key)
|
||||
{
|
||||
Creaturelib.Generated.TalentLibrary.Delete(Ptr, key.ToPtr()).Assert();
|
||||
_cache.Remove(key);
|
||||
}
|
||||
|
||||
public bool TryGet(string key, out Ability? ability)
|
||||
{
|
||||
if (_cache.TryGetValue(key, out ability))
|
||||
return true;
|
||||
var ptr = IntPtr.Zero;
|
||||
if (Creaturelib.Generated.TalentLibrary.TryGet(Ptr, key.ToPtr(), ref ptr) != MarshalHelper.True)
|
||||
return false;
|
||||
if (TryResolvePointer(ptr, out ability))
|
||||
{
|
||||
_cache.Add(key, ability!);
|
||||
return true;
|
||||
}
|
||||
|
||||
ability = Constructor.Active.ConstructAbility(ptr)!;
|
||||
_cache.Add(key, ability);
|
||||
return true;
|
||||
}
|
||||
|
||||
public Ability Get(string key)
|
||||
{
|
||||
if (_cache.TryGetValue(key, out var ability))
|
||||
return ability;
|
||||
var ptr = IntPtr.Zero;
|
||||
Creaturelib.Generated.TalentLibrary.Get(Ptr, key.ToPtr(), ref ptr).Assert();
|
||||
if (TryResolvePointer(ptr, out Ability? s))
|
||||
{
|
||||
_cache.Add(key, s!);
|
||||
return s!;
|
||||
}
|
||||
|
||||
ability = Constructor.Active.ConstructAbility(ptr)!;
|
||||
_cache.Add(key, ability);
|
||||
return ability;
|
||||
}
|
||||
|
||||
public IEnumerable<Ability> GetEnumerator()
|
||||
{
|
||||
var count = Creaturelib.Generated.TalentLibrary.GetCount(Ptr);
|
||||
var ptr = IntPtr.Zero;
|
||||
for (ulong i = 0; i < count; i++)
|
||||
{
|
||||
Creaturelib.Generated.TalentLibrary.GetAtIndex(Ptr, i, ref ptr).Assert();
|
||||
if (TryResolvePointer(ptr, out Ability? ability))
|
||||
yield return ability!;
|
||||
else
|
||||
yield return Constructor.Active.ConstructAbility(ptr)!;
|
||||
}
|
||||
}
|
||||
|
||||
internal AbilityLibrary(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
public AbilityLibrary(ulong initialCapacity) : base()
|
||||
{
|
||||
var ptr = IntPtr.Zero;
|
||||
Creaturelib.Generated.TalentLibrary.Construct(ref ptr, initialCapacity).Assert();
|
||||
Initialize(ptr);
|
||||
}
|
||||
|
||||
protected override void DeletePtr()
|
||||
{
|
||||
Creaturelib.Generated.TalentLibrary.Destruct(Ptr);
|
||||
}
|
||||
|
||||
protected internal override void MarkAsDeleted()
|
||||
{
|
||||
base.MarkAsDeleted();
|
||||
foreach (var ability in _cache)
|
||||
{
|
||||
ability.Value.MarkAsDeleted();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,6 +99,21 @@ namespace PkmnLibSharp.Library
|
||||
}
|
||||
}
|
||||
|
||||
private AbilityLibrary? _abilityLibrary;
|
||||
|
||||
public AbilityLibrary AbilityLibrary
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_abilityLibrary != null) return _abilityLibrary;
|
||||
var ptr = DataLibrary.GetTalentLibrary(Ptr);
|
||||
if (TryResolvePointer(ptr, out _abilityLibrary))
|
||||
return _abilityLibrary!;
|
||||
_abilityLibrary = new AbilityLibrary(ptr);
|
||||
return _abilityLibrary;
|
||||
}
|
||||
}
|
||||
|
||||
private NatureLibrary? _natureLibrary;
|
||||
|
||||
public NatureLibrary NatureLibrary
|
||||
@@ -119,13 +134,12 @@ namespace PkmnLibSharp.Library
|
||||
{
|
||||
}
|
||||
|
||||
public PokemonLibrary(LibrarySettings settings, SpeciesLibrary species, MoveLibrary moves,
|
||||
ItemLibrary items,
|
||||
GrowthRateLibrary growthRates, TypeLibrary types, NatureLibrary natures)
|
||||
public PokemonLibrary(LibrarySettings settings, SpeciesLibrary species, MoveLibrary moves, ItemLibrary items,
|
||||
GrowthRateLibrary growthRates, TypeLibrary types, AbilityLibrary abilityLibrary, NatureLibrary natures)
|
||||
{
|
||||
var ptr = IntPtr.Zero;
|
||||
Pkmnlib.Generated.PokemonLibrary.Construct(ref ptr, settings.Ptr, species.Ptr, moves.Ptr, items.Ptr,
|
||||
growthRates.Ptr, types.Ptr, natures.Ptr).Assert();
|
||||
growthRates.Ptr, types.Ptr, abilityLibrary.Ptr, natures.Ptr).Assert();
|
||||
Initialize(ptr);
|
||||
_settings = settings;
|
||||
_species = species;
|
||||
|
||||
45
PkmnLibSharp/Library/Species/Ability.cs
Normal file
45
PkmnLibSharp/Library/Species/Ability.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using PkmnLibSharp.Utilities;
|
||||
|
||||
namespace PkmnLibSharp.Library
|
||||
{
|
||||
public class Ability : PointerWrapper
|
||||
{
|
||||
public Ability(string name, string effect, EffectParameter[] parameters)
|
||||
{
|
||||
var pars = parameters.Select(x => x.Ptr).ToArray();
|
||||
Initialize(Creaturelib.Generated.Talent.Construct(name.ToPtr(), effect.ToPtr(), pars.ArrayPtr(), (ulong)pars.Length));
|
||||
foreach (var intPtr in pars)
|
||||
Marshal.FreeHGlobal(intPtr);
|
||||
}
|
||||
|
||||
private string? _name;
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_name != null) return _name;
|
||||
_name = Creaturelib.Generated.Talent.GetName(Ptr).PtrString();
|
||||
return _name!;
|
||||
}
|
||||
}
|
||||
|
||||
private string? _effect;
|
||||
public string Effect
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_effect != null) return _effect;
|
||||
_effect = Creaturelib.Generated.Talent.GetEffect(Ptr).PtrString();
|
||||
return _effect!;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected override void DeletePtr()
|
||||
{
|
||||
Creaturelib.Generated.Talent.Destruct(Ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,35 +11,31 @@ namespace PkmnLibSharp.Library
|
||||
{
|
||||
public class Forme : PointerWrapper
|
||||
{
|
||||
private ReadOnlyArray<string>? _abilities;
|
||||
private ReadOnlyArray<string>? _hiddenAbilities;
|
||||
private ReadOnlyArray<Ability>? _abilities;
|
||||
private ReadOnlyArray<Ability>? _hiddenAbilities;
|
||||
private LearnableMoves? _moves;
|
||||
private string? _name;
|
||||
private ReadOnlyArray<byte>? _types;
|
||||
|
||||
public Forme(string name, float height, float weight, uint baseExperience, byte[] types,
|
||||
ushort baseHealth, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack,
|
||||
ushort baseSpecialDefense, ushort baseSpeed, IReadOnlyCollection<string> abilities,
|
||||
IReadOnlyCollection<string> hiddenAbilities, LearnableMoves moves, IReadOnlyCollection<string> tags)
|
||||
|
||||
public Forme(string name, float height, float weight, uint baseExperience, byte[] types, ushort baseHealth,
|
||||
ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack, ushort baseSpecialDefense,
|
||||
ushort baseSpeed, IReadOnlyCollection<Ability> abilities, IReadOnlyCollection<Ability> hiddenAbilities,
|
||||
LearnableMoves moves, IReadOnlyCollection<string> tags)
|
||||
{
|
||||
var abilitiesConverted = abilities.Select(x => x.ToPtr()).ToArray();
|
||||
var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.ToPtr()).ToArray();
|
||||
var abilitiesConverted = abilities.Select(x => x.Ptr).ToArray();
|
||||
var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.Ptr).ToArray();
|
||||
var tagsConverted = tags.Select(x => x.ToPtr()).ToArray();
|
||||
var ab = abilitiesConverted.ArrayPtr();
|
||||
var hab = hiddenAbilitiesConverted.ArrayPtr();
|
||||
var tagsPtr = tagsConverted.ArrayPtr();
|
||||
|
||||
|
||||
var ptr = PokemonForme.Construct(name.ToPtr(), height, weight, baseExperience, types.ArrayPtr(),
|
||||
(ulong) types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack,
|
||||
baseSpecialDefense, baseSpeed, ab, (ulong) abilities.Count, hab,
|
||||
(ulong) hiddenAbilities.Count, moves.Ptr, tagsPtr, (ulong) tags.Count);
|
||||
foreach (var intPtr in abilitiesConverted)
|
||||
Marshal.FreeHGlobal(intPtr);
|
||||
foreach (var intPtr in hiddenAbilitiesConverted)
|
||||
Marshal.FreeHGlobal(intPtr);
|
||||
(ulong)types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack, baseSpecialDefense,
|
||||
baseSpeed, ab, (ulong)abilities.Count, hab, (ulong)hiddenAbilities.Count, moves.Ptr, tagsPtr,
|
||||
(ulong)tags.Count);
|
||||
Initialize(ptr);
|
||||
}
|
||||
|
||||
|
||||
public string Name => _name ??= SpeciesVariant.GetName(Ptr).PtrString()!;
|
||||
public float Height => SpeciesVariant.GetHeight(Ptr);
|
||||
public float Weight => SpeciesVariant.GetWeight(Ptr);
|
||||
@@ -61,19 +57,19 @@ namespace PkmnLibSharp.Library
|
||||
}
|
||||
}
|
||||
|
||||
public uint BaseHealth => SpeciesVariant.GetStatistic(Ptr, (byte) Statistic.Health);
|
||||
public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Attack);
|
||||
public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Defense);
|
||||
public uint BaseHealth => SpeciesVariant.GetStatistic(Ptr, (byte)Statistic.Health);
|
||||
public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.Attack);
|
||||
public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.Defense);
|
||||
|
||||
public uint BaseSpecialAttack =>
|
||||
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.SpecialAttack);
|
||||
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.SpecialAttack);
|
||||
|
||||
public uint BaseSpecialDefense =>
|
||||
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.SpecialDefense);
|
||||
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.SpecialDefense);
|
||||
|
||||
public uint BaseSpeed => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Speed);
|
||||
public uint BaseSpeed => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.Speed);
|
||||
|
||||
public ReadOnlyArray<string> Abilities
|
||||
public ReadOnlyArray<Ability> Abilities
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -81,12 +77,12 @@ namespace PkmnLibSharp.Library
|
||||
return _abilities;
|
||||
|
||||
var abilityCount = SpeciesVariant.GetTalentCount(Ptr);
|
||||
var abilities = new string[abilityCount];
|
||||
var abilities = new Ability[abilityCount];
|
||||
for (byte i = 0; i < abilityCount; i++)
|
||||
{
|
||||
var s = IntPtr.Zero;
|
||||
SpeciesVariant.GetTalent(Ptr, MarshalHelper.False, i, ref s).Assert();
|
||||
abilities[i] = s.PtrString()!;
|
||||
abilities[i] = Constructor.Active.ConstructAbility(s)!;
|
||||
}
|
||||
|
||||
_abilities = abilities.ToReadOnly();
|
||||
@@ -94,7 +90,7 @@ namespace PkmnLibSharp.Library
|
||||
}
|
||||
}
|
||||
|
||||
public ReadOnlyArray<string> HiddenAbilities
|
||||
public ReadOnlyArray<Ability> HiddenAbilities
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -102,12 +98,12 @@ namespace PkmnLibSharp.Library
|
||||
return _hiddenAbilities;
|
||||
|
||||
var abilityCount = SpeciesVariant.GetSecretTalentCount(Ptr);
|
||||
var abilities = new string[abilityCount];
|
||||
var abilities = new Ability[abilityCount];
|
||||
for (byte i = 0; i < abilityCount; i++)
|
||||
{
|
||||
var s = IntPtr.Zero;
|
||||
SpeciesVariant.GetTalent(Ptr, MarshalHelper.True, i, ref s).Assert();
|
||||
abilities[i] = s.PtrString()!;
|
||||
abilities[i] = Constructor.Active.ConstructAbility(s)!;
|
||||
}
|
||||
|
||||
_hiddenAbilities = abilities.ToReadOnly();
|
||||
@@ -121,7 +117,7 @@ namespace PkmnLibSharp.Library
|
||||
{
|
||||
if (_moves != null) return _moves;
|
||||
var movesPtr = SpeciesVariant.GetLearnableAttacks(Ptr);
|
||||
if (!TryResolvePointer(movesPtr, out _moves))
|
||||
if (!TryResolvePointer(movesPtr, out _moves))
|
||||
_moves = Constructor.Active.ConstructLearnableMoves(movesPtr);
|
||||
|
||||
return _moves!;
|
||||
@@ -132,7 +128,7 @@ namespace PkmnLibSharp.Library
|
||||
{
|
||||
return Types[index];
|
||||
}
|
||||
|
||||
|
||||
public byte GetRandomAbility(Random rand)
|
||||
{
|
||||
return SpeciesVariant.GetRandomTalent(Ptr, rand.Ptr);
|
||||
|
||||
Reference in New Issue
Block a user