Update to latest version of pkmnLib.

This commit is contained in:
Deukhoofd 2021-11-27 11:27:19 +01:00
parent d542e75cd1
commit 382cbf2673
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
46 changed files with 642 additions and 342 deletions

View File

@ -106,10 +106,10 @@ namespace PkmnLibSharp.Battling
} }
else else
{ {
AbilityIndex = forme!.Abilities.IndexOf(Ability); AbilityIndex = forme!.Abilities.IndexOf(ability => ability!.Name == Ability);
if (AbilityIndex == -1) if (AbilityIndex == -1)
{ {
AbilityIndex = forme.HiddenAbilities.IndexOf(Ability); AbilityIndex = forme.HiddenAbilities.IndexOf(ability => ability!.Name == Ability);
if (AbilityIndex == -1) if (AbilityIndex == -1)
{ {
throw new Exception( throw new Exception(

View File

@ -212,7 +212,7 @@ namespace Creaturelib.Generated
internal static extern byte GetRealTalentIndex(IntPtr p); internal static extern byte GetRealTalentIndex(IntPtr p);
/// <param name="p">const Creature *</param> /// <param name="p">const Creature *</param>
/// <param name="out">const char * &</param> /// <param name="out">const Talent * &</param>
/// <returns>unsigned char</returns> /// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Creature_GetActiveTalent")] [DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Creature_GetActiveTalent")]
internal static extern byte GetActiveTalent(IntPtr p, ref IntPtr @out); internal static extern byte GetActiveTalent(IntPtr p, ref IntPtr @out);

View File

@ -7,5 +7,6 @@ namespace Creaturelib
internal enum DamageSource : byte internal enum DamageSource : byte
{ {
AttackDamage = 0, AttackDamage = 0,
Misc = 1,
} }
} }

View File

@ -13,9 +13,10 @@ namespace Creaturelib.Generated
/// <param name="items">ItemLibrary *</param> /// <param name="items">ItemLibrary *</param>
/// <param name="growthRates">GrowthRateLibrary *</param> /// <param name="growthRates">GrowthRateLibrary *</param>
/// <param name="typeLibrary">TypeLibrary *</param> /// <param name="typeLibrary">TypeLibrary *</param>
/// <param name="talentLibrary">TalentLibrary *</param>
/// <returns>unsigned char</returns> /// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_DataLibrary_Construct")] [DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_DataLibrary_Construct")]
internal static extern byte Construct(ref IntPtr @out, IntPtr settings, IntPtr species, IntPtr attacks, IntPtr items, IntPtr growthRates, IntPtr typeLibrary); internal static extern byte Construct(ref IntPtr @out, IntPtr settings, IntPtr species, IntPtr attacks, IntPtr items, IntPtr growthRates, IntPtr typeLibrary, IntPtr talentLibrary);
/// <param name="p">const DataLibrary *</param> /// <param name="p">const DataLibrary *</param>
/// <returns>void</returns> /// <returns>void</returns>
@ -52,5 +53,10 @@ namespace Creaturelib.Generated
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_DataLibrary_GetTypeLibrary")] [DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_DataLibrary_GetTypeLibrary")]
internal static extern IntPtr GetTypeLibrary(IntPtr p); internal static extern IntPtr GetTypeLibrary(IntPtr p);
/// <param name="p">const DataLibrary *</param>
/// <returns>const TalentLibrary *</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_DataLibrary_GetTalentLibrary")]
internal static extern IntPtr GetTalentLibrary(IntPtr p);
} }
} }

View File

@ -18,9 +18,9 @@ namespace Creaturelib.Generated
/// <param name="baseMagicalAttack">unsigned short</param> /// <param name="baseMagicalAttack">unsigned short</param>
/// <param name="baseMagicalDefense">unsigned short</param> /// <param name="baseMagicalDefense">unsigned short</param>
/// <param name="baseSpeed">unsigned short</param> /// <param name="baseSpeed">unsigned short</param>
/// <param name="talents">const char * *</param> /// <param name="talents">const Talent * *</param>
/// <param name="talentsLength">long unsigned int</param> /// <param name="talentsLength">long unsigned int</param>
/// <param name="secretTalents">const char * *</param> /// <param name="secretTalents">const Talent * *</param>
/// <param name="secretTalentsLength">long unsigned int</param> /// <param name="secretTalentsLength">long unsigned int</param>
/// <param name="attacks">const LearnableAttacks *</param> /// <param name="attacks">const LearnableAttacks *</param>
/// <param name="flags">const char * *</param> /// <param name="flags">const char * *</param>
@ -84,7 +84,7 @@ namespace Creaturelib.Generated
/// <param name="p">SpeciesVariant *</param> /// <param name="p">SpeciesVariant *</param>
/// <param name="secret">bool</param> /// <param name="secret">bool</param>
/// <param name="index">unsigned char</param> /// <param name="index">unsigned char</param>
/// <param name="out">const char * &</param> /// <param name="out">const Talent * &</param>
/// <returns>unsigned char</returns> /// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_SpeciesVariant_GetTalent")] [DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_SpeciesVariant_GetTalent")]
internal static extern byte GetTalent(IntPtr p, byte secret, byte index, ref IntPtr @out); internal static extern byte GetTalent(IntPtr p, byte secret, byte index, ref IntPtr @out);

View File

@ -0,0 +1,33 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System;
using System.Runtime.InteropServices;
namespace Creaturelib.Generated
{
internal static class Talent
{
/// <param name="name">const char *</param>
/// <param name="effect">const char *</param>
/// <param name="effectParameters">EffectParameter * *</param>
/// <param name="effectParameterCount">long unsigned int</param>
/// <returns>Talent *</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Talent_Construct")]
internal static extern IntPtr Construct(IntPtr name, IntPtr effect, IntPtr effectParameters, ulong effectParameterCount);
/// <param name="p">const Talent *</param>
/// <returns>void</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Talent_Destruct")]
internal static extern void Destruct(IntPtr p);
/// <param name="talent">const Talent *</param>
/// <returns>const char *</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Talent_GetName")]
internal static extern IntPtr GetName(IntPtr talent);
/// <param name="talent">const Talent *</param>
/// <returns>const char *</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_Talent_GetEffect")]
internal static extern IntPtr GetEffect(IntPtr talent);
}
}

View File

@ -0,0 +1,87 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System;
using System.Runtime.InteropServices;
namespace Creaturelib.Generated
{
internal static class TalentLibrary
{
/// <param name="library">TalentLibrary * &</param>
/// <param name="initialCapacity">long unsigned int</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_Construct")]
internal static extern byte Construct(ref IntPtr library, ulong initialCapacity);
/// <param name="p">const TalentLibrary *</param>
/// <returns>void</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_Destruct")]
internal static extern void Destruct(IntPtr p);
/// <param name="p">TalentLibrary *</param>
/// <param name="name">const char *</param>
/// <param name="t">Talent *</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_Insert")]
internal static extern byte Insert(IntPtr p, IntPtr name, IntPtr t);
/// <param name="p">TalentLibrary *</param>
/// <param name="hashedKey">unsigned int</param>
/// <param name="t">Talent *</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_InsertWithHash")]
internal static extern byte InsertWithHash(IntPtr p, uint hashedKey, IntPtr t);
/// <param name="p">TalentLibrary *</param>
/// <param name="name">const char *</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_Delete")]
internal static extern byte Delete(IntPtr p, IntPtr name);
/// <param name="p">TalentLibrary *</param>
/// <param name="hashedKey">unsigned int</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_DeleteWithHash")]
internal static extern byte DeleteWithHash(IntPtr p, uint hashedKey);
/// <param name="p">TalentLibrary *</param>
/// <param name="name">const char *</param>
/// <param name="out">const Talent * &</param>
/// <returns>bool</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_TryGet")]
internal static extern byte TryGet(IntPtr p, IntPtr name, ref IntPtr @out);
/// <param name="p">TalentLibrary *</param>
/// <param name="hashedKey">unsigned int</param>
/// <param name="out">const Talent * &</param>
/// <returns>bool</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_TryGetWithHash")]
internal static extern byte TryGetWithHash(IntPtr p, uint hashedKey, ref IntPtr @out);
/// <param name="p">TalentLibrary *</param>
/// <param name="name">const char *</param>
/// <param name="out">const Talent * &</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_Get")]
internal static extern byte Get(IntPtr p, IntPtr name, ref IntPtr @out);
/// <param name="p">TalentLibrary *</param>
/// <param name="hashedKey">unsigned int</param>
/// <param name="out">const Talent * &</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_GetWithHash")]
internal static extern byte GetWithHash(IntPtr p, uint hashedKey, ref IntPtr @out);
/// <param name="p">TalentLibrary *</param>
/// <returns>long unsigned int</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_GetCount")]
internal static extern ulong GetCount(IntPtr p);
/// <param name="p">TalentLibrary *</param>
/// <param name="index">long unsigned int</param>
/// <param name="out">const Talent * &</param>
/// <returns>unsigned char</returns>
[DllImport("libCreatureLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "CreatureLib_TalentLibrary_GetAtIndex")]
internal static extern byte GetAtIndex(IntPtr p, ulong index, ref IntPtr @out);
}
}

View File

@ -7,5 +7,6 @@ namespace Pkmnlib
internal enum DamageSource : byte internal enum DamageSource : byte
{ {
AttackDamage = 0, AttackDamage = 0,
Misc = 1,
} }
} }

View File

@ -1,15 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum METADATATYPE : int
{
MDT_TYPE = 1,
MDT_FUNC = 2,
MDT_VAR = 3,
MDT_VIRTPROP = 4,
MDT_FUNC_OR_VAR = 5,
}
}

View File

@ -6,6 +6,6 @@ namespace Pkmnlib
[SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum PkmnDamageSource : byte internal enum PkmnDamageSource : byte
{ {
Struggle = 1, Struggle = 2,
} }
} }

View File

@ -18,9 +18,9 @@ namespace Pkmnlib.Generated
/// <param name="baseMagicalAttack">unsigned short</param> /// <param name="baseMagicalAttack">unsigned short</param>
/// <param name="baseMagicalDefense">unsigned short</param> /// <param name="baseMagicalDefense">unsigned short</param>
/// <param name="baseSpeed">unsigned short</param> /// <param name="baseSpeed">unsigned short</param>
/// <param name="talents">const char * *</param> /// <param name="talents">const Talent * *</param>
/// <param name="talentsLength">long unsigned int</param> /// <param name="talentsLength">long unsigned int</param>
/// <param name="secretTalents">const char * *</param> /// <param name="secretTalents">const Talent * *</param>
/// <param name="secretTalentsLength">long unsigned int</param> /// <param name="secretTalentsLength">long unsigned int</param>
/// <param name="attacks">const LearnableMoves *</param> /// <param name="attacks">const LearnableMoves *</param>
/// <param name="flags">const char * *</param> /// <param name="flags">const char * *</param>

View File

@ -13,10 +13,11 @@ namespace Pkmnlib.Generated
/// <param name="items">ItemLibrary *</param> /// <param name="items">ItemLibrary *</param>
/// <param name="growthRates">GrowthRateLibrary *</param> /// <param name="growthRates">GrowthRateLibrary *</param>
/// <param name="typeLibrary">TypeLibrary *</param> /// <param name="typeLibrary">TypeLibrary *</param>
/// <param name="talentLibrary">TalentLibrary *</param>
/// <param name="natures">NatureLibrary *</param> /// <param name="natures">NatureLibrary *</param>
/// <returns>unsigned char</returns> /// <returns>unsigned char</returns>
[DllImport("libpkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_PokemonLibrary_Construct")] [DllImport("libpkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_PokemonLibrary_Construct")]
internal static extern byte Construct(ref IntPtr @out, IntPtr settings, IntPtr species, IntPtr moves, IntPtr items, IntPtr growthRates, IntPtr typeLibrary, IntPtr natures); internal static extern byte Construct(ref IntPtr @out, IntPtr settings, IntPtr species, IntPtr moves, IntPtr items, IntPtr growthRates, IntPtr typeLibrary, IntPtr talentLibrary, IntPtr natures);
/// <param name="p">const PokemonLibrary *</param> /// <param name="p">const PokemonLibrary *</param>
/// <returns>void</returns> /// <returns>void</returns>

View File

@ -1,23 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum error_type : int
{
_S_error_collate = 0,
_S_error_ctype = 1,
_S_error_escape = 2,
_S_error_backref = 3,
_S_error_brack = 4,
_S_error_paren = 5,
_S_error_brace = 6,
_S_error_badbrace = 7,
_S_error_range = 8,
_S_error_space = 9,
_S_error_badrepeat = 10,
_S_error_complexity = 11,
_S_error_stack = 12,
}
}

View File

@ -1,20 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum file_type : byte
{
not_found = 255,
none = 0,
regular = 1,
directory = 2,
symlink = 3,
block = 4,
character = 5,
fifo = 6,
socket = 7,
unknown = 8,
}
}

View File

@ -1,13 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum format : byte
{
native_format = 0,
generic_format = 1,
auto_format = 2,
}
}

View File

@ -1,10 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum match_flag_type : int
{
}
}

View File

@ -1,29 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum perms : int
{
none = 0,
others_exec = 1,
others_write = 2,
others_read = 4,
others_all = 7,
group_exec = 8,
group_write = 16,
group_read = 32,
group_all = 56,
owner_exec = 64,
owner_write = 128,
owner_read = 256,
owner_all = 448,
all = 511,
sticky_bit = 512,
set_gid = 1024,
set_uid = 2048,
mask = 4095,
unknown = 65535,
}
}

View File

@ -1,10 +0,0 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System.Diagnostics.CodeAnalysis;
namespace Pkmnlib
{
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum syntax_option_type : int
{
}
}

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; private NatureLibrary? _natureLibrary;
public NatureLibrary NatureLibrary public NatureLibrary NatureLibrary
@ -119,13 +134,12 @@ namespace PkmnLibSharp.Library
{ {
} }
public PokemonLibrary(LibrarySettings settings, SpeciesLibrary species, MoveLibrary moves, public PokemonLibrary(LibrarySettings settings, SpeciesLibrary species, MoveLibrary moves, ItemLibrary items,
ItemLibrary items, GrowthRateLibrary growthRates, TypeLibrary types, AbilityLibrary abilityLibrary, NatureLibrary natures)
GrowthRateLibrary growthRates, TypeLibrary types, NatureLibrary natures)
{ {
var ptr = IntPtr.Zero; var ptr = IntPtr.Zero;
Pkmnlib.Generated.PokemonLibrary.Construct(ref ptr, settings.Ptr, species.Ptr, moves.Ptr, items.Ptr, 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); Initialize(ptr);
_settings = settings; _settings = settings;
_species = species; _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 public class Forme : PointerWrapper
{ {
private ReadOnlyArray<string>? _abilities; private ReadOnlyArray<Ability>? _abilities;
private ReadOnlyArray<string>? _hiddenAbilities; private ReadOnlyArray<Ability>? _hiddenAbilities;
private LearnableMoves? _moves; private LearnableMoves? _moves;
private string? _name; private string? _name;
private ReadOnlyArray<byte>? _types; private ReadOnlyArray<byte>? _types;
public Forme(string name, float height, float weight, uint baseExperience, byte[] types, public Forme(string name, float height, float weight, uint baseExperience, byte[] types, ushort baseHealth,
ushort baseHealth, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack, ushort baseSpecialDefense,
ushort baseSpecialDefense, ushort baseSpeed, IReadOnlyCollection<string> abilities, ushort baseSpeed, IReadOnlyCollection<Ability> abilities, IReadOnlyCollection<Ability> hiddenAbilities,
IReadOnlyCollection<string> hiddenAbilities, LearnableMoves moves, IReadOnlyCollection<string> tags) LearnableMoves moves, IReadOnlyCollection<string> tags)
{ {
var abilitiesConverted = abilities.Select(x => x.ToPtr()).ToArray(); var abilitiesConverted = abilities.Select(x => x.Ptr).ToArray();
var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.ToPtr()).ToArray(); var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.Ptr).ToArray();
var tagsConverted = tags.Select(x => x.ToPtr()).ToArray(); var tagsConverted = tags.Select(x => x.ToPtr()).ToArray();
var ab = abilitiesConverted.ArrayPtr(); var ab = abilitiesConverted.ArrayPtr();
var hab = hiddenAbilitiesConverted.ArrayPtr(); var hab = hiddenAbilitiesConverted.ArrayPtr();
var tagsPtr = tagsConverted.ArrayPtr(); var tagsPtr = tagsConverted.ArrayPtr();
var ptr = PokemonForme.Construct(name.ToPtr(), height, weight, baseExperience, types.ArrayPtr(), var ptr = PokemonForme.Construct(name.ToPtr(), height, weight, baseExperience, types.ArrayPtr(),
(ulong) types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack, (ulong)types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack, baseSpecialDefense,
baseSpecialDefense, baseSpeed, ab, (ulong) abilities.Count, hab, baseSpeed, ab, (ulong)abilities.Count, hab, (ulong)hiddenAbilities.Count, moves.Ptr, tagsPtr,
(ulong) hiddenAbilities.Count, moves.Ptr, tagsPtr, (ulong) tags.Count); (ulong)tags.Count);
foreach (var intPtr in abilitiesConverted)
Marshal.FreeHGlobal(intPtr);
foreach (var intPtr in hiddenAbilitiesConverted)
Marshal.FreeHGlobal(intPtr);
Initialize(ptr); Initialize(ptr);
} }
public string Name => _name ??= SpeciesVariant.GetName(Ptr).PtrString()!; public string Name => _name ??= SpeciesVariant.GetName(Ptr).PtrString()!;
public float Height => SpeciesVariant.GetHeight(Ptr); public float Height => SpeciesVariant.GetHeight(Ptr);
public float Weight => SpeciesVariant.GetWeight(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 BaseHealth => SpeciesVariant.GetStatistic(Ptr, (byte)Statistic.Health);
public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Attack); public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.Attack);
public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Defense); public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.Defense);
public uint BaseSpecialAttack => public uint BaseSpecialAttack =>
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.SpecialAttack); SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic)Statistic.SpecialAttack);
public uint BaseSpecialDefense => 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 get
{ {
@ -81,12 +77,12 @@ namespace PkmnLibSharp.Library
return _abilities; return _abilities;
var abilityCount = SpeciesVariant.GetTalentCount(Ptr); var abilityCount = SpeciesVariant.GetTalentCount(Ptr);
var abilities = new string[abilityCount]; var abilities = new Ability[abilityCount];
for (byte i = 0; i < abilityCount; i++) for (byte i = 0; i < abilityCount; i++)
{ {
var s = IntPtr.Zero; var s = IntPtr.Zero;
SpeciesVariant.GetTalent(Ptr, MarshalHelper.False, i, ref s).Assert(); SpeciesVariant.GetTalent(Ptr, MarshalHelper.False, i, ref s).Assert();
abilities[i] = s.PtrString()!; abilities[i] = Constructor.Active.ConstructAbility(s)!;
} }
_abilities = abilities.ToReadOnly(); _abilities = abilities.ToReadOnly();
@ -94,7 +90,7 @@ namespace PkmnLibSharp.Library
} }
} }
public ReadOnlyArray<string> HiddenAbilities public ReadOnlyArray<Ability> HiddenAbilities
{ {
get get
{ {
@ -102,12 +98,12 @@ namespace PkmnLibSharp.Library
return _hiddenAbilities; return _hiddenAbilities;
var abilityCount = SpeciesVariant.GetSecretTalentCount(Ptr); var abilityCount = SpeciesVariant.GetSecretTalentCount(Ptr);
var abilities = new string[abilityCount]; var abilities = new Ability[abilityCount];
for (byte i = 0; i < abilityCount; i++) for (byte i = 0; i < abilityCount; i++)
{ {
var s = IntPtr.Zero; var s = IntPtr.Zero;
SpeciesVariant.GetTalent(Ptr, MarshalHelper.True, i, ref s).Assert(); SpeciesVariant.GetTalent(Ptr, MarshalHelper.True, i, ref s).Assert();
abilities[i] = s.PtrString()!; abilities[i] = Constructor.Active.ConstructAbility(s)!;
} }
_hiddenAbilities = abilities.ToReadOnly(); _hiddenAbilities = abilities.ToReadOnly();
@ -121,7 +117,7 @@ namespace PkmnLibSharp.Library
{ {
if (_moves != null) return _moves; if (_moves != null) return _moves;
var movesPtr = SpeciesVariant.GetLearnableAttacks(Ptr); var movesPtr = SpeciesVariant.GetLearnableAttacks(Ptr);
if (!TryResolvePointer(movesPtr, out _moves)) if (!TryResolvePointer(movesPtr, out _moves))
_moves = Constructor.Active.ConstructLearnableMoves(movesPtr); _moves = Constructor.Active.ConstructLearnableMoves(movesPtr);
return _moves!; return _moves!;
@ -132,7 +128,7 @@ namespace PkmnLibSharp.Library
{ {
return Types[index]; return Types[index];
} }
public byte GetRandomAbility(Random rand) public byte GetRandomAbility(Random rand)
{ {
return SpeciesVariant.GetRandomTalent(Ptr, rand.Ptr); return SpeciesVariant.GetRandomTalent(Ptr, rand.Ptr);

BIN
PkmnLibSharp/Native/Linux/libArbutils.so (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
PkmnLibSharp/Native/Linux/libpkmnLib.so (Stored with Git LFS)

Binary file not shown.

BIN
PkmnLibSharp/Native/Linux/libpkmnlib_ai.so (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
PkmnLibSharp/Native/Windows/libpkmnLib.dll (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

View File

@ -10,25 +10,29 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Content Include="Native\Linux\*.so.*" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' "> <Content Include="Native\Linux\*.so.*" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Link>%(Filename)%(Extension)</Link> <Link>%(Filename)%(Extension)</Link>
</Content> </Content>
<Content Include="Native\Linux\*.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Link>%(Filename)%(Extension)</Link>
</Content>
<Content Include="Native\Windows\*.dll.*" Condition=" '$(OS)' == 'Windows_NT' "> <Content Include="Native\Windows\*.dll.*" Condition=" '$(OS)' == 'Windows_NT' ">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Link>%(Filename)%(Extension)</Link> <Link>%(Filename)%(Extension)</Link>
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Nullable" Version="1.3.0"> <PackageReference Include="Nullable" Version="1.3.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -14,21 +14,28 @@ namespace PkmnLibSharp.Utilities
public abstract class Constructor public abstract class Constructor
{ {
public static Constructor Active { get; set; } = public static Constructor Active { get; set; } =
new Constructor< new Constructor<Species, Forme, MoveData, Item, LearnableMoves, Pokemon, Battle, BattleParty, BattleSide,
Species, Forme, MoveData, Item, LearnableMoves, LearnedMove, Ability>();
Pokemon, Battle, BattleParty, BattleSide, LearnedMove>();
internal enum GenericType internal enum GenericType
{ {
Species, Forme, MoveData, Item, LearnableMoves, EvolutionData, Species,
Pokemon, Battle, Forme,
MoveData,
Item,
LearnableMoves,
EvolutionData,
Pokemon,
Battle,
BattleParty, BattleParty,
BattleSide, BattleSide,
LearnedMove LearnedMove,
Ability
} }
internal abstract Species? ConstructSpecies(IntPtr ptr); internal abstract Species? ConstructSpecies(IntPtr ptr);
internal abstract Ability? ConstructAbility(IntPtr ptr);
internal abstract Forme? ConstructForme(IntPtr ptr); internal abstract Forme? ConstructForme(IntPtr ptr);
internal abstract MoveData? ConstructMove(IntPtr ptr); internal abstract MoveData? ConstructMove(IntPtr ptr);
internal abstract Item? ConstructItem(IntPtr ptr); internal abstract Item? ConstructItem(IntPtr ptr);
@ -66,37 +73,36 @@ namespace PkmnLibSharp.Utilities
} }
public class Constructor< public class Constructor<
TSpecies, TForme, TMoveData, TItem, TLearnableMoves, TSpecies, TForme, TMoveData, TItem, TLearnableMoves, TPokemon, TBattle, TBattleParty, TBattleSide, TLearnedMove,
TPokemon, TBattle, TBattleParty, TBattleSide, TLearnedMove> TAbility> : Constructor where TSpecies : Species
: Constructor where TForme : Forme
where TSpecies : Species where TMoveData : MoveData
where TForme : Forme where TItem : Item
where TMoveData : MoveData
where TItem: Item
where TLearnableMoves : LearnableMoves where TLearnableMoves : LearnableMoves
where TPokemon : Pokemon where TPokemon : Pokemon
where TBattle : Battle where TBattle : Battle
where TBattleParty : BattleParty where TBattleParty : BattleParty
where TBattleSide : BattleSide where TBattleSide : BattleSide
where TLearnedMove : LearnedMove where TLearnedMove : LearnedMove
where TAbility : Ability
{ {
private readonly Type _speciesType = typeof(TSpecies); private readonly Type _speciesType = typeof(TSpecies);
private readonly Type _formeType = typeof(TForme); private readonly Type _formeType = typeof(TForme);
private readonly Type _moveDataType = typeof(TMoveData); private readonly Type _moveDataType = typeof(TMoveData);
private readonly Type _itemType = typeof(TItem); private readonly Type _itemType = typeof(TItem);
private readonly Type _learnableMovesType = typeof(TLearnableMoves); private readonly Type _learnableMovesType = typeof(TLearnableMoves);
private readonly Type _abilityType = typeof(TAbility);
private readonly Type _pokemonType = typeof(TPokemon); private readonly Type _pokemonType = typeof(TPokemon);
private readonly Type _battleType = typeof(TBattle); private readonly Type _battleType = typeof(TBattle);
private readonly Type _battlePartyType = typeof(TBattleParty); private readonly Type _battlePartyType = typeof(TBattleParty);
private readonly Type _battleSideType = typeof(TBattleSide); private readonly Type _battleSideType = typeof(TBattleSide);
private readonly Type _learnedMoveType = typeof(TLearnedMove); private readonly Type _learnedMoveType = typeof(TLearnedMove);
private static T? Create<T>(IntPtr ptr, Type t) where T : PointerWrapper private static T? Create<T>(IntPtr ptr, Type t) where T : PointerWrapper
{ {
if (ptr == IntPtr.Zero) return null; if (ptr == IntPtr.Zero) return null;
var o = (T) FormatterServices.GetUninitializedObject(t); var o = (T)FormatterServices.GetUninitializedObject(t);
o.Initialize(ptr); o.Initialize(ptr);
return o; return o;
} }
@ -106,6 +112,11 @@ namespace PkmnLibSharp.Utilities
return Create<TSpecies>(ptr, _speciesType); return Create<TSpecies>(ptr, _speciesType);
} }
internal override Ability? ConstructAbility(IntPtr ptr)
{
return Create<TAbility>(ptr, _abilityType);
}
internal override Forme? ConstructForme(IntPtr ptr) internal override Forme? ConstructForme(IntPtr ptr)
{ {
return Create<TForme>(ptr, _formeType); return Create<TForme>(ptr, _formeType);

View File

@ -1,3 +1,4 @@
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@ -37,5 +38,19 @@ namespace PkmnLibSharp.Utilities
{ {
return _arr.IndexOf(item); return _arr.IndexOf(item);
} }
public int IndexOf(Func<T, bool> predicate)
{
for (var index = 0; index < _arr.Count; index++)
{
var a = _arr[index];
if (predicate(a))
{
return index;
}
}
return -1;
}
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -23,6 +23,12 @@ def write_enum(enum, enumNames):
return return
if (enum["name"].startswith("as")): if (enum["name"].startswith("as")):
return return
if (enum["name"][0] >= 'a' and enum["name"][0] <= 'z'):
return
if (enum["name"] == "EPOLL_EVENTS"):
return;
if (enum["name"] == "METADATATYPE"):
return;
filename = "Generated/{}/{}.cs".format(clean_namespace(namespace), enum["name"]) filename = "Generated/{}/{}.cs".format(clean_namespace(namespace), enum["name"])
os.makedirs(os.path.dirname(filename), exist_ok=True) os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f: with open(filename, "w") as f:

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"enums":[{"byteSize":4,"filename":"libpkmnlib_ai","name":"memory_order","values":{"0":"relaxed","1":"consume","2":"acquire","3":"release","4":"acq_rel","5":"seq_cst"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"float_denorm_style","values":{"-1":"denorm_indeterminate","0":"denorm_absent","1":"denorm_present"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"float_round_style","values":{"-1":"round_indeterminate","0":"round_toward_zero","1":"round_to_nearest","2":"round_toward_infinity","3":"round_toward_neg_infinity"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"launch","values":{"1":"async","2":"deferred"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"errc","values":{"1":"operation_not_permitted","10":"no_child_process","100":"network_down","101":"network_unreachable","102":"network_reset","103":"connection_aborted","104":"connection_reset","105":"no_buffer_space","106":"already_connected","107":"not_connected","11":"operation_would_block","110":"timed_out","111":"connection_refused","113":"host_unreachable","114":"connection_already_in_progress","115":"operation_in_progress","12":"not_enough_memory","125":"operation_canceled","13":"permission_denied","130":"owner_dead","131":"state_not_recoverable","14":"bad_address","16":"device_or_resource_busy","17":"file_exists","18":"cross_device_link","19":"no_such_device","2":"no_such_file_or_directory","20":"not_a_directory","21":"is_a_directory","22":"invalid_argument","23":"too_many_files_open_in_system","24":"too_many_files_open","25":"inappropriate_io_control_operation","26":"text_file_busy","27":"file_too_large","28":"no_space_on_device","29":"invalid_seek","3":"no_such_process","30":"read_only_file_system","31":"too_many_links","32":"broken_pipe","33":"argument_out_of_domain","34":"result_out_of_range","35":"resource_deadlock_would_occur","36":"filename_too_long","37":"no_lock_available","38":"function_not_supported","39":"directory_not_empty","4":"interrupted","40":"too_many_symbolic_link_levels","42":"no_message","43":"identifier_removed","5":"io_error","6":"no_such_device_or_address","60":"not_a_stream","61":"no_message_available","62":"stream_timeout","63":"no_stream_resources","67":"no_link","7":"argument_list_too_long","71":"protocol_error","74":"bad_message","75":"value_too_large","8":"executable_format_error","84":"illegal_byte_sequence","88":"not_a_socket","89":"destination_address_required","9":"bad_file_descriptor","90":"message_size","91":"wrong_protocol_type","92":"no_protocol_option","93":"protocol_not_supported","95":"not_supported","97":"address_family_not_supported","98":"address_in_use","99":"address_not_available"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"future_errc","values":{"1":"future_already_retrieved","2":"promise_already_satisfied","3":"no_state","4":"broken_promise"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"AttackTarget","values":{"0":"Adjacent","1":"AdjacentAlly","10":"RandomOpponent","11":"Self","2":"AdjacentAllySelf","3":"AdjacentOpponent","4":"All","5":"AllAdjacent","6":"AllAdjacentOpponent","7":"AllAlly","8":"AllOpponent","9":"Any"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"EffectParameterType","values":{"0":"None","1":"Bool","2":"Int","3":"Float","4":"String"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"Statistic","values":{"0":"Health","1":"PhysicalAttack","2":"PhysicalDefense","3":"MagicalAttack","4":"MagicalDefense","5":"Speed"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"TurnChoiceKind","values":{"0":"Pass","1":"Attack","2":"Item","3":"Switch","4":"Flee"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"ScriptCategory","values":{"0":"Attack","1":"Talent","2":"Status","3":"Creature","4":"Battle","5":"Side"}}],"functions":[{"filename":"libpkmnlib_ai","name":"pkmnlibai_C_GetLastException","parameters":[],"returns":"const char *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_C_GetLastExceptionStacktrace","parameters":[],"returns":"const char *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_PokemonAI_Delete","parameters":[{"name":"p","type":"PokemonAI *"}],"returns":"void"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_PokemonAI_GetChoice","parameters":[{"name":"out","type":"BaseTurnChoice * &"},{"name":"p","type":"PokemonAI *"},{"name":"battle","type":"Battle *"},{"name":"user","type":"Pokemon *"}],"returns":"unsigned char"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_RandomAI_Create","parameters":[],"returns":"RandomAI *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_NaiveAI_Create","parameters":[],"returns":"NaiveAI *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_DepthSearchAI_Create","parameters":[],"returns":"DepthSearchAI *"}]} {"enums":[{"byteSize":4,"filename":"libpkmnlib_ai","name":"memory_order","values":{"0":"relaxed","1":"consume","2":"acquire","3":"release","4":"acq_rel","5":"seq_cst"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"float_denorm_style","values":{"-1":"denorm_indeterminate","0":"denorm_absent","1":"denorm_present"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"float_round_style","values":{"-1":"round_indeterminate","0":"round_toward_zero","1":"round_to_nearest","2":"round_toward_infinity","3":"round_toward_neg_infinity"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"launch","values":{"1":"async","2":"deferred"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"errc","values":{"1":"operation_not_permitted","10":"no_child_process","100":"network_down","101":"network_unreachable","102":"network_reset","103":"connection_aborted","104":"connection_reset","105":"no_buffer_space","106":"already_connected","107":"not_connected","11":"operation_would_block","110":"timed_out","111":"connection_refused","113":"host_unreachable","114":"connection_already_in_progress","115":"operation_in_progress","12":"not_enough_memory","125":"operation_canceled","13":"permission_denied","130":"owner_dead","131":"state_not_recoverable","14":"bad_address","16":"device_or_resource_busy","17":"file_exists","18":"cross_device_link","19":"no_such_device","2":"no_such_file_or_directory","20":"not_a_directory","21":"is_a_directory","22":"invalid_argument","23":"too_many_files_open_in_system","24":"too_many_files_open","25":"inappropriate_io_control_operation","26":"text_file_busy","27":"file_too_large","28":"no_space_on_device","29":"invalid_seek","3":"no_such_process","30":"read_only_file_system","31":"too_many_links","32":"broken_pipe","33":"argument_out_of_domain","34":"result_out_of_range","35":"resource_deadlock_would_occur","36":"filename_too_long","37":"no_lock_available","38":"function_not_supported","39":"directory_not_empty","4":"interrupted","40":"too_many_symbolic_link_levels","42":"no_message","43":"identifier_removed","5":"io_error","6":"no_such_device_or_address","60":"not_a_stream","61":"no_message_available","62":"stream_timeout","63":"no_stream_resources","67":"no_link","7":"argument_list_too_long","71":"protocol_error","74":"bad_message","75":"value_too_large","8":"executable_format_error","84":"illegal_byte_sequence","88":"not_a_socket","89":"destination_address_required","9":"bad_file_descriptor","90":"message_size","91":"wrong_protocol_type","92":"no_protocol_option","93":"protocol_not_supported","95":"not_supported","97":"address_family_not_supported","98":"address_in_use","99":"address_not_available"}},{"byteSize":4,"filename":"libpkmnlib_ai","name":"future_errc","values":{"1":"future_already_retrieved","2":"promise_already_satisfied","3":"no_state","4":"broken_promise"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"AttackTarget","values":{"0":"Adjacent","1":"AdjacentAlly","10":"RandomOpponent","11":"Self","2":"AdjacentAllySelf","3":"AdjacentOpponent","4":"All","5":"AllAdjacent","6":"AllAdjacentOpponent","7":"AllAlly","8":"AllOpponent","9":"Any"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"TurnChoiceKind","values":{"0":"Pass","1":"Attack","2":"Item","3":"Switch","4":"Flee"}},{"byteSize":1,"filename":"libpkmnlib_ai","name":"ScriptCategory","values":{"0":"Attack","1":"Talent","2":"Status","3":"Creature","4":"Battle","5":"Side"}}],"functions":[{"filename":"libpkmnlib_ai","name":"pkmnlibai_C_GetLastException","parameters":[],"returns":"const char *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_C_GetLastExceptionStacktrace","parameters":[],"returns":"const char *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_PokemonAI_Delete","parameters":[{"name":"p","type":"PokemonAI *"}],"returns":"void"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_PokemonAI_GetChoice","parameters":[{"name":"out","type":"BaseTurnChoice * &"},{"name":"p","type":"PokemonAI *"},{"name":"battle","type":"Battle *"},{"name":"user","type":"Pokemon *"}],"returns":"unsigned char"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_RandomAI_Create","parameters":[],"returns":"RandomAI *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_NaiveAI_Create","parameters":[],"returns":"NaiveAI *"},{"filename":"libpkmnlib_ai","name":"pkmnlibai_DepthSearchAI_Create","parameters":[],"returns":"DepthSearchAI *"}]}

View File

@ -1,3 +1,4 @@
using System;
using System.Linq; using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using PkmnLibSharp.Battling; using PkmnLibSharp.Battling;
@ -12,19 +13,18 @@ namespace PkmnLibSharpTests.Battling
{ {
private static BattleLibrary _cache; private static BattleLibrary _cache;
private static readonly object Lock = new object(); private static readonly object Lock = new object();
public static BattleLibrary GetLibrary() public static BattleLibrary GetLibrary()
{ {
lock (Lock) lock (Lock)
{ {
if (_cache != null) if (_cache != null)
return _cache; return _cache;
TestContext.WriteLine("Building battle library"); TestContext.WriteLine("Building battle library");
var scriptLibrary = new AngelScriptResolver(); var scriptLibrary = new AngelScriptResolver();
_cache = new BattleLibrary(BuildStatic(), new StatCalculator(), new DamageLibrary(), _cache = new BattleLibrary(BuildStatic(), new StatCalculator(), new DamageLibrary(),
new ExperienceLibrary(), new ExperienceLibrary(), scriptLibrary, new MiscLibrary(GetTime));
scriptLibrary, new MiscLibrary(GetTime));
scriptLibrary.Initialize(_cache); scriptLibrary.Initialize(_cache);
return _cache; return _cache;
} }
@ -39,33 +39,42 @@ namespace PkmnLibSharpTests.Battling
{ {
var settings = new LibrarySettings(100, 4, 4096); var settings = new LibrarySettings(100, 4, 4096);
var species = new SpeciesLibrary(10); var species = new SpeciesLibrary(10);
species.Insert("testSpecies", new Species(1, "testSpecies", var abilities = new AbilityLibrary(10);
new Forme("default", 10f, 10f, 100, new byte[] {0, 1}, 100, var testAbility1 = new Ability("testAbility1", "", Array.Empty<EffectParameter>());
100, 100, 100, 100, 100, new[] {"testAbility", "testAbility2"}, var testAbility2 = new Ability("testAbility2", "", Array.Empty<EffectParameter>());
new[] {"testHiddenAbility"}, new LearnableMoves(100), new string[0]), 0.5f, "growthRate", var testHiddenAbility = new Ability("testHiddenAbility", "", Array.Empty<EffectParameter>());
20, 100, new[]{"testEggGroup"}, new string[0])); abilities.Insert("testAbility1", testAbility1);
abilities.Insert("testAbility2", testAbility2);
abilities.Insert("testHiddenAbility", testHiddenAbility);
species.Insert("testSpecies",
new Species(1, "testSpecies",
new Forme("default", 10f, 10f, 100, new byte[] { 0, 1 }, 100, 100, 100, 100, 100, 100,
new[] { testAbility1, testAbility2 }, new[] { testHiddenAbility }, new LearnableMoves(100),
new string[0]), 0.5f, "growthRate", 20, 100, new[] { "testEggGroup" }, new string[0]));
var moves = new MoveLibrary(10); var moves = new MoveLibrary(10);
moves.Insert("testMove", new MoveData("testMove", 0, MoveCategory.Physical, 100, moves.Insert("testMove",
100, 20, MoveTarget.Any, 0, 0f, "", new MoveData("testMove", 0, MoveCategory.Physical, 100, 100, 20, MoveTarget.Any, 0, 0f, "",
new EffectParameter[0], new string[0])); new EffectParameter[0], new string[0]));
moves.Insert("testMove2", new MoveData("testMove2", 0, MoveCategory.Physical, 100, moves.Insert("testMove2",
100, 20, MoveTarget.Any, 0, 0f, "", new MoveData("testMove2", 0, MoveCategory.Physical, 100, 100, 20, MoveTarget.Any, 0, 0f, "",
new EffectParameter[0], new string[0])); new EffectParameter[0], new string[0]));
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
items.Insert("testItem", new Item("testItem", ItemCategory.MiscItem, BattleItemCategory.None, items.Insert("testItem",
500, "", new EffectParameter[0], new string[] { }, 20)); new Item("testItem", ItemCategory.MiscItem, BattleItemCategory.None, 500, "", new EffectParameter[0],
new string[] { }, 20));
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
gr.AddGrowthRate("growthRate", gr.AddGrowthRate("growthRate",
new LookupGrowthRate( new LookupGrowthRate(Enumerable.Range(1, 100).Select(x => (uint)x * 100).ToArray()));
Enumerable.Range(1, 100).Select(x => (uint)x * 100).ToArray()));
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
types.RegisterType("normal"); types.RegisterType("normal");
types.RegisterType("fighting"); types.RegisterType("fighting");
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
natures.LoadNature("testNature", new Nature()); natures.LoadNature("testNature", new Nature());
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
return lib; return lib;
} }
} }

View File

@ -1,3 +1,4 @@
using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using PkmnLibSharp.Library; using PkmnLibSharp.Library;
using PkmnLibSharp.Utilities; using PkmnLibSharp.Utilities;
@ -51,7 +52,9 @@ namespace PkmnLibSharpTests.Library
{ {
var p = new EffectParameter(10); var p = new EffectParameter(10);
var ex = Assert.Throws<NativeException>(() => { p.AsString(); }); var ex = Assert.Throws<NativeException>(() => { p.AsString(); });
Assert.AreEqual("[CreatureLibLibrary] - '[CreatureLib_EffectParameter_AsString] [EffectParameter.hpp:50] Cast effect parameter to string, but was Int'", ex.Message); Assert.AreEqual(
"[CreatureLibLibrary] - '[CreatureLib_EffectParameter_AsString] [EffectParameter.hpp:53] \"Cast effect parameter to string, but was Int\"'",
ex.Message.Split('\n').First());
p.Dispose(); p.Dispose();
} }
} }

View File

@ -1,3 +1,4 @@
using System;
using NUnit.Framework; using NUnit.Framework;
using PkmnLibSharp.Library; using PkmnLibSharp.Library;
@ -8,16 +9,20 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void ConstructDestruct() public void ConstructDestruct()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
forme.Dispose(); forme.Dispose();
} }
[Test] [Test]
public void GetName() public void GetName()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual("foo", forme.Name); Assert.AreEqual("foo", forme.Name);
forme.Dispose(); forme.Dispose();
} }
@ -25,8 +30,10 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void GetHeight() public void GetHeight()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(1f, forme.Height); Assert.AreEqual(1f, forme.Height);
forme.Dispose(); forme.Dispose();
} }
@ -34,8 +41,10 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void GetWeight() public void GetWeight()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(2f, forme.Weight); Assert.AreEqual(2f, forme.Weight);
forme.Dispose(); forme.Dispose();
} }
@ -43,22 +52,26 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void GetBaseExperience() public void GetBaseExperience()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(100, forme.BaseExperience); Assert.AreEqual(100, forme.BaseExperience);
forme.Dispose(); forme.Dispose();
} }
[Test] [Test]
public void GetTypes() public void GetTypes()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(0, forme.GetPkmnType(0)); Assert.AreEqual(0, forme.GetPkmnType(0));
forme.Dispose(); forme.Dispose();
forme = new Forme("foo", 1, 2, 100, new byte[] {0, 1}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, forme = new Forme("foo", 1, 2, 100, new byte[] { 0, 1 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] {"bar"}, new LearnableMoves(100), new string[0]); new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(0, forme.GetPkmnType(0)); Assert.AreEqual(0, forme.GetPkmnType(0));
Assert.AreEqual(1, forme.GetPkmnType(1)); Assert.AreEqual(1, forme.GetPkmnType(1));
forme.Dispose(); forme.Dispose();
@ -67,8 +80,10 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void GetStats() public void GetStats()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 20, 30, 40, 50, 60, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 20, 30, 40, 50, 60, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual(10, forme.BaseHealth); Assert.AreEqual(10, forme.BaseHealth);
Assert.AreEqual(20, forme.BaseAttack); Assert.AreEqual(20, forme.BaseAttack);
Assert.AreEqual(30, forme.BaseDefense); Assert.AreEqual(30, forme.BaseDefense);
@ -81,20 +96,23 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void GetAbilities() public void GetAbilities()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
Assert.AreEqual("foo", forme.Abilities[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
forme.Dispose(); new[] { ability2 }, new LearnableMoves(100), Array.Empty<string>());
} Assert.AreEqual("foo", forme.Abilities[0].Name);
[Test]
public void GetHiddenAbilities()
{
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"},
new[] {"bar"}, new LearnableMoves(100), new string[0]);
Assert.AreEqual("bar", forme.HiddenAbilities[0]);
forme.Dispose(); forme.Dispose();
} }
[Test]
public void GetHiddenAbilities()
{
using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
Assert.AreEqual("bar", forme.HiddenAbilities[0].Name);
forme.Dispose();
}
} }
} }

View File

@ -17,9 +17,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
lib.Dispose(); lib.Dispose();
} }
@ -32,9 +33,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var s = lib.SpeciesLibrary; var s = lib.SpeciesLibrary;
Assert.AreEqual(species, s); Assert.AreEqual(species, s);
lib.Dispose(); lib.Dispose();
@ -49,9 +51,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var s = lib.Settings; var s = lib.Settings;
Assert.AreEqual(settings, s); Assert.AreEqual(settings, s);
lib.Dispose(); lib.Dispose();
@ -66,9 +69,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var m = lib.MoveLibrary; var m = lib.MoveLibrary;
Assert.AreEqual(moves, m); Assert.AreEqual(moves, m);
lib.Dispose(); lib.Dispose();
@ -83,9 +87,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var i = lib.ItemLibrary; var i = lib.ItemLibrary;
Assert.AreEqual(items, i); Assert.AreEqual(items, i);
lib.Dispose(); lib.Dispose();
@ -100,9 +105,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var g = lib.GrowthRateLibrary; var g = lib.GrowthRateLibrary;
Assert.AreEqual(gr, g); Assert.AreEqual(gr, g);
lib.Dispose(); lib.Dispose();
@ -117,9 +123,10 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var t = lib.TypeLibrary; var t = lib.TypeLibrary;
Assert.AreEqual(types, t); Assert.AreEqual(types, t);
lib.Dispose(); lib.Dispose();
@ -134,13 +141,32 @@ namespace PkmnLibSharpTests.Library
var items = new ItemLibrary(10); var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10); var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10); var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10); var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures); var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var n = lib.NatureLibrary; var n = lib.NatureLibrary;
Assert.AreEqual(natures, n); Assert.AreEqual(natures, n);
lib.Dispose(); lib.Dispose();
} }
[Test]
public void GetAbilityLibrary()
{
var settings = new LibrarySettings(100, 4, 4096);
var species = new SpeciesLibrary(10);
var moves = new MoveLibrary(10);
var items = new ItemLibrary(10);
var gr = new GrowthRateLibrary(10);
var types = new TypeLibrary(10);
var abilities = new AbilityLibrary(10);
var natures = new NatureLibrary(10);
var lib = new PokemonLibrary(settings, species, moves, items, gr, types, abilities, natures);
var a = lib.AbilityLibrary;
Assert.AreEqual(abilities, a);
lib.Dispose();
}
} }
} }

View File

@ -1,3 +1,4 @@
using System;
using NUnit.Framework; using NUnit.Framework;
using PkmnLibSharp.Library; using PkmnLibSharp.Library;
using PkmnLibSharp.Utilities; using PkmnLibSharp.Utilities;
@ -16,21 +17,28 @@ namespace PkmnLibSharpTests.Library
[Test] [Test]
public void Insert() public void Insert()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]);
var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
var library = new SpeciesLibrary(100); var library = new SpeciesLibrary(100);
library.Insert("foobar", species); library.Insert("foobar", species);
Assert.AreEqual(1, library.Count); Assert.AreEqual(1, library.Count);
library.Dispose(); library.Dispose();
} }
[Test] [Test]
public void Delete() public void Delete()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
var library = new SpeciesLibrary(100); var library = new SpeciesLibrary(100);
library.Insert("foobar", species); library.Insert("foobar", species);
Assert.AreEqual(1, library.Count); Assert.AreEqual(1, library.Count);
@ -38,31 +46,34 @@ namespace PkmnLibSharpTests.Library
Assert.AreEqual(0, library.Count); Assert.AreEqual(0, library.Count);
library.Dispose(); library.Dispose();
} }
[Test] [Test]
public void Get() public void Get()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
var library = new SpeciesLibrary(100); var library = new SpeciesLibrary(100);
library.Insert("foobar", species); library.Insert("foobar", species);
Assert.AreEqual(1, library.Count); Assert.AreEqual(1, library.Count);
var m = library.Get("foobar"); var m = library.Get("foobar");
Assert.AreEqual(m.Name, "testSpecies"); Assert.AreEqual(m.Name, "testSpecies");
Assert.Throws<NativeException>(() => Assert.Throws<NativeException>(() => { library.Get("barfoo"); });
{
library.Get("barfoo");
});
library.Dispose(); library.Dispose();
} }
[Test] [Test]
public void TryGet() public void TryGet()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
var library = new SpeciesLibrary(100); var library = new SpeciesLibrary(100);
library.Insert("foobar", species); library.Insert("foobar", species);
Assert.AreEqual(1, library.Count); Assert.AreEqual(1, library.Count);
@ -71,6 +82,5 @@ namespace PkmnLibSharpTests.Library
Assert.False(library.TryGet("barfoo", out species)); Assert.False(library.TryGet("barfoo", out species));
library.Dispose(); library.Dispose();
} }
} }
} }

View File

@ -1,113 +1,147 @@
using System;
using NUnit.Framework; using NUnit.Framework;
using PkmnLibSharp.Library; using PkmnLibSharp.Library;
using PkmnLibSharp.Utilities; using PkmnLibSharp.Utilities;
namespace PkmnLibSharpTests.Library namespace PkmnLibSharpTests.Library
{ {
public class SpeciesTests public class SpeciesTests
{ {
[Test] [Test]
public void ConstructDestruct() public void ConstructDestruct()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(0, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetId() public void GetId()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.AreEqual(10, species.Id); Assert.AreEqual(10, species.Id);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetGenderRate() public void GetGenderRate()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.AreEqual(0.5f, species.GenderRate); Assert.AreEqual(0.5f, species.GenderRate);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetCaptureRate() public void GetCaptureRate()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.AreEqual(100, species.CaptureRate); Assert.AreEqual(100, species.CaptureRate);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetName() public void GetName()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.AreEqual("testSpecies", species.Name); Assert.AreEqual("testSpecies", species.Name);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetGrowthRate() public void GetGrowthRate()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.AreEqual("exponential", species.GrowthRate); Assert.AreEqual("exponential", species.GrowthRate);
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void HasForme() public void HasForme()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.True(species.HasForme("default")); Assert.True(species.HasForme("default"));
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void SetForme() public void SetForme()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.True(species.HasForme("default")); Assert.True(species.HasForme("default"));
forme = new Forme("bar", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, forme = new Forme("bar", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] {"bar"}, new LearnableMoves(100), new string[0]); new[] { ability2 }, new LearnableMoves(100), new string[0]);
species.SetForme("bar", forme); species.SetForme("bar", forme);
Assert.True(species.HasForme("bar")); Assert.True(species.HasForme("bar"));
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void GetForme() public void GetForme()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
var f = species.GetForme("default"); var f = species.GetForme("default");
Assert.AreEqual(forme, f); Assert.AreEqual(forme, f);
Assert.Throws<NativeException>(() => Assert.Throws<NativeException>(() => { species.GetForme("non-existing"); });
{
species.GetForme("non-existing");
});
species.Dispose(); species.Dispose();
} }
[Test] [Test]
public void TrGetForme() public void TryGetForme()
{ {
var forme = new Forme("foo", 1, 2, 100, new byte[] {0}, 10, 10, 10, 10, 10, 10, new[] {"foo"}, using var ability1 = new Ability("foo", "foo", Array.Empty<EffectParameter>());
new[] {"bar"}, new LearnableMoves(100), new string[0]); using var ability2 = new Ability("bar", "bar", Array.Empty<EffectParameter>());
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[]{"testEggGroup"}, new string[0]); var forme = new Forme("foo", 1, 2, 100, new byte[] { 0 }, 10, 10, 10, 10, 10, 10, new[] { ability1 },
new[] { ability2 }, new LearnableMoves(100), new string[0]);
var species = new Species(10, "testSpecies", forme, 0.5f, "exponential", 100, 80, new[] { "testEggGroup" },
new string[0]);
Assert.True(species.TryGetForme("default", out var f)); Assert.True(species.TryGetForme("default", out var f));
Assert.AreEqual(forme, f); Assert.AreEqual(forme, f);
Assert.False(species.TryGetForme("non-existing", out f)); Assert.False(species.TryGetForme("non-existing", out f));
species.Dispose(); species.Dispose();
} }
} }
} }

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
@ -11,9 +11,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="nunit" Version="3.12.0" /> <PackageReference Include="nunit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" /> <PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
</ItemGroup> </ItemGroup>