Update to latest version of pkmnLib.

This commit is contained in:
2021-11-27 11:27:19 +01:00
parent d542e75cd1
commit 382cbf2673
46 changed files with 642 additions and 342 deletions

View 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();
}
}
}
}

View File

@@ -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;

View 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);
}
}
}

View File

@@ -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);