Support for Pokemon building.

This commit is contained in:
2020-07-19 12:33:22 +02:00
parent 049eb480c0
commit c143235495
23 changed files with 250 additions and 76 deletions

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using PkmnLibSharp.Library;
using PkmnLibSharp.Utilities;
@@ -9,19 +11,79 @@ namespace PkmnLibSharp.Battling
{
public class Pokemon : PointerWrapper
{
public Pokemon(BattleLibrary library, Species species, Forme forme, byte level, uint experience, uint uid,
Gender gender, byte coloring, Item heldItem, string nickname, bool hiddenAbility, byte abilityIndex,
IReadOnlyCollection<LearnedMove> moves, StatisticSet<byte> ivs, StatisticSet<byte> evs, Nature nature) :
base(Pkmnlib.Generated.Pokemon.Construct(library.Ptr, species.Ptr, forme.Ptr, level, experience,
uid, (Pkmnlib.Gender) gender, coloring, heldItem.Ptr, nickname.ToPtr(), hiddenAbility.ToNative(),
abilityIndex,
moves.Select(x => x.Ptr).ToArray().ArrayPtr(),
public Pokemon([NotNull] BattleLibrary library, [NotNull] Species species, [NotNull] Forme forme,
byte level, uint experience, uint uid,
Gender gender, byte coloring, [MaybeNull] Item heldItem, [MaybeNull] string nickname, bool hiddenAbility, byte abilityIndex,
[NotNull] IReadOnlyCollection<LearnedMove> moves, StatisticSet<byte> ivs, StatisticSet<byte> evs, [NotNull] Nature nature)
: base(Pkmnlib.Generated.Pokemon.Construct(
library.Ptr, species.Ptr, forme.Ptr, level, experience,
uid, (Pkmnlib.Gender) gender, coloring, heldItem?.Ptr ?? IntPtr.Zero, nickname.ToPtr(),
hiddenAbility.ToNative(), abilityIndex,
moves.Select(x => x?.Ptr ?? IntPtr.Zero).ToArray().ArrayPtr(),
(ulong) moves.Count,
ivs.HP, ivs.Attack, ivs.Defense, ivs.SpecialAttack,
ivs.SpecialDefense, ivs.Speed, evs.HP, evs.Attack, evs.Defense,
evs.SpecialAttack, evs.SpecialDefense, evs.Speed, nature.Ptr))
{}
public Species Species
{
get
{
if (_species != null) return _species;
var ptr = Creaturelibbattling.Generated.Creature.GetSpecies(Ptr);
if (TryResolvePointer(ptr, out _species))
return _species;
_species = new Species(ptr);
return _species;
}
}
public Forme Forme
{
get
{
if (_forme != null) return _forme;
var ptr = Creaturelibbattling.Generated.Creature.GetVariant(Ptr);
if (TryResolvePointer(ptr, out _forme))
return _forme;
_forme = new Forme(ptr);
return _forme;
}
}
public byte Level => Creaturelibbattling.Generated.Creature.GetLevel(Ptr);
public uint Experience => Creaturelibbattling.Generated.Creature.GetExperience(Ptr);
public Gender Gender => (Gender) Creaturelibbattling.Generated.Creature.GetGender(Ptr);
public byte Coloring => Creaturelibbattling.Generated.Creature.GetColoring(Ptr);
public bool IsShiny => Coloring == 1;
public string Nickname
{
get
{
if (_nickname != null) return _nickname;
_nickname = Creaturelibbattling.Generated.Creature.GetNickname(Ptr).PtrString();
return _nickname;
}
}
public void ChangeForme(Forme forme)
{
_forme = null;
Creaturelibbattling.Generated.Creature.ChangeVariant(Ptr, forme.Ptr);
}
public bool HasHeldItem(string itemName)
{
return Creaturelibbattling.Generated.Creature.HasHeldItem(Ptr, itemName.ToPtr()) == 1;
}
private Species _species;
private Forme _forme;
private string _nickname;
protected override void DeletePtr()
{
Pkmnlib.Generated.Pokemon.Destruct(Ptr);

View File

@@ -58,6 +58,12 @@ namespace PkmnLibSharp.Battling
return this;
}
public PokemonBuilder WithNickname(string nickname)
{
Nickname = nickname;
return this;
}
public PokemonBuilder LearnMove(string moveName, MoveLearnMethod moveLearnMethod)
{
if (LearnedMoves.Count > _library.StaticLibrary.Settings.MaximalMoves)
@@ -107,7 +113,7 @@ namespace PkmnLibSharp.Battling
}
}
byte abilityIndex = 0;
var abilityIndex = 0;
var isHiddenAbility = false;
if (string.IsNullOrEmpty(Ability))
{
@@ -115,10 +121,10 @@ namespace PkmnLibSharp.Battling
}
else
{
abilityIndex = (byte) forme.Abilities.IndexOf(Ability);
abilityIndex = forme.Abilities.IndexOf(Ability);
if (abilityIndex == -1)
{
abilityIndex = (byte) forme.HiddenAbilities.IndexOf(Ability);
abilityIndex = forme.HiddenAbilities.IndexOf(Ability);
if (abilityIndex == -1)
{
throw new Exception(
@@ -148,7 +154,7 @@ namespace PkmnLibSharp.Battling
var nature = _library.StaticLibrary.NatureLibrary.GetNature(Nature);
return new Pokemon(_library, species, forme, Level, experience, uid, Gender, coloring, heldItem, Nickname,
isHiddenAbility, abilityIndex, moves, IVs, EVs, nature);
isHiddenAbility, (byte) abilityIndex, moves, IVs, EVs, nature);
}
}
}

View File

@@ -0,0 +1,14 @@
// AUTOMATICALLY GENERATED, DO NOT EDIT
using System;
using System.Runtime.InteropServices;
namespace Arbutils.Generated
{
internal static class C
{
/// <returns>const char *</returns>
[DllImport("Arbutils", CallingConvention = CallingConvention.Cdecl, EntryPoint= "Arbutils_C_GetLastException")]
internal static extern IntPtr GetLastException();
}
}

View File

@@ -37,16 +37,18 @@ namespace Arbutils.Generated
/// <param name="p">Random *</param>
/// <param name="max">int</param>
/// <returns>int</returns>
/// <param name="out">int &</param>
/// <returns>unsigned char</returns>
[DllImport("Arbutils", CallingConvention = CallingConvention.Cdecl, EntryPoint= "Arbutils_Random_GetWithMax")]
internal static extern int GetWithMax(IntPtr p, int max);
internal static extern byte GetWithMax(IntPtr p, int max, ref int @out);
/// <param name="p">Random *</param>
/// <param name="min">int</param>
/// <param name="max">int</param>
/// <returns>int</returns>
/// <param name="out">int &</param>
/// <returns>unsigned char</returns>
[DllImport("Arbutils", CallingConvention = CallingConvention.Cdecl, EntryPoint= "Arbutils_Random_GetInLimits")]
internal static extern int GetInLimits(IntPtr p, int min, int max);
internal static extern byte GetInLimits(IntPtr p, int min, int max, ref int @out);
/// <param name="p">Random *</param>
/// <returns>unsigned int</returns>
@@ -55,16 +57,18 @@ namespace Arbutils.Generated
/// <param name="p">Random *</param>
/// <param name="max">unsigned int</param>
/// <returns>unsigned int</returns>
/// <param name="out">unsigned int &</param>
/// <returns>unsigned char</returns>
[DllImport("Arbutils", CallingConvention = CallingConvention.Cdecl, EntryPoint= "Arbutils_Random_GetUnsignedWithMax")]
internal static extern uint GetUnsignedWithMax(IntPtr p, uint max);
internal static extern byte GetUnsignedWithMax(IntPtr p, uint max, ref uint @out);
/// <param name="p">Random *</param>
/// <param name="min">unsigned int</param>
/// <param name="max">unsigned int</param>
/// <returns>unsigned int</returns>
/// <param name="out">unsigned int &</param>
/// <returns>unsigned char</returns>
[DllImport("Arbutils", CallingConvention = CallingConvention.Cdecl, EntryPoint= "Arbutils_Random_GetUnsignedInLimits")]
internal static extern uint GetUnsignedInLimits(IntPtr p, uint min, uint max);
internal static extern byte GetUnsignedInLimits(IntPtr p, uint min, uint max, ref uint @out);
/// <param name="p">Random *</param>
/// <returns>long unsigned int</returns>

View File

@@ -32,9 +32,10 @@ namespace Pkmnlib.Generated
/// <param name="p">NatureLibrary *</param>
/// <param name="rand">Random *</param>
/// <returns>const char *</returns>
/// <param name="out">const char * &</param>
/// <returns>unsigned char</returns>
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_NatureLibrary_GetRandomNatureName")]
internal static extern IntPtr GetRandomNatureName(IntPtr p, IntPtr rand);
internal static extern byte GetRandomNatureName(IntPtr p, IntPtr rand, ref IntPtr @out);
/// <param name="p">NatureLibrary *</param>
/// <param name="nature">const Nature *</param>

View File

@@ -120,10 +120,10 @@ namespace PkmnLibSharp.Library
var abilitiesConverted = abilities.Select(x => x.ToPtr()).ToArray();
var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.ToPtr()).ToArray();
var ab = abilitiesConverted.ArrayPtr();
var hab = abilitiesConverted.ArrayPtr();
var hab = hiddenAbilitiesConverted.ArrayPtr();
var ptr = SpeciesVariant.Construct(name.ToPtr(), height, weight, baseExperience, types.ArrayPtr(),
(ulong) types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack,
baseSpecialDefense, baseSpeed, (IntPtr) ab, (ulong) abilities.Length, (IntPtr) hab,
baseSpecialDefense, baseSpeed, (IntPtr) ab, (ulong) abilities.Length, hab,
(ulong) hiddenAbilities.Length, moves.Ptr);
var f = new Forme(ptr);
foreach (var intPtr in abilitiesConverted)

View File

@@ -57,7 +57,9 @@ namespace PkmnLibSharp.Library
public string GetRandomNatureName(Random random)
{
return Pkmnlib.Generated.NatureLibrary.GetRandomNatureName(Ptr, random.Ptr).PtrString();
IntPtr val = IntPtr.Zero;
Pkmnlib.Generated.NatureLibrary.GetRandomNatureName(Ptr, random.Ptr, ref val).Assert();
return val.PtrString();
}
protected override void DeletePtr()

View File

@@ -2,7 +2,7 @@ using System;
namespace PkmnLibSharp.Library
{
public class StatisticSet<T> where T : IComparable<T>
public struct StatisticSet<T> where T : IComparable<T>
{
public T HP { get; set; }
public T Attack { get; set; }

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

Binary file not shown.

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

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

Binary file not shown.

View File

@@ -2,23 +2,12 @@
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Configurations>Release;Debug</Configurations>
<Platforms>x86_64</Platforms>
</PropertyGroup>
<ItemGroup>
<Content Include="Native/*.so.*" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" Link="%(Filename)%(Extension)"></Content>
</ItemGroup>
<ItemGroup>
<Reference Include="System.Collections.Immutable, Version=1.2.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\..\usr\share\dotnet\packs\Microsoft.NETCore.App.Ref\3.1.0\ref\netcoreapp3.1\System.Collections.Immutable.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Collections.Immutable" Version="1.7.0" />
</ItemGroup>

View File

@@ -8,12 +8,14 @@ namespace PkmnLibSharp.Utilities
{
internal static IntPtr ToPtr(this string s)
{
return Marshal.StringToHGlobalAuto(s);
if (s == null) return IntPtr.Zero;
return Marshal.StringToHGlobalAnsi(s);
}
internal static string PtrString(this IntPtr i)
{
return Marshal.PtrToStringAuto(i);
if (i == IntPtr.Zero) return null;
return Marshal.PtrToStringAnsi(i);
}
internal static IntPtr ArrayPtr(this Array a)

View File

@@ -1,3 +1,5 @@
using System;
namespace PkmnLibSharp.Utilities
{
public class Random : PointerWrapper
@@ -27,12 +29,16 @@ namespace PkmnLibSharp.Utilities
public int Get(int max)
{
return Arbutils.Generated.Random.GetWithMax(Ptr, max);
int val = 0;
Arbutils.Generated.Random.GetWithMax(Ptr, max, ref val).Assert();
return val;
}
public int Get(int min, int max)
{
return Arbutils.Generated.Random.GetInLimits(Ptr, min, max);
int val = 0;
Arbutils.Generated.Random.GetInLimits(Ptr, min, max, ref val).Assert();
return val;
}
public uint GetUnsigned()
@@ -42,12 +48,16 @@ namespace PkmnLibSharp.Utilities
public uint GetUnsigned(uint max)
{
return Arbutils.Generated.Random.GetUnsignedWithMax(Ptr, max);
uint val = 0;
Arbutils.Generated.Random.GetUnsignedWithMax(Ptr, max, ref val).Assert();
return val;
}
public uint GetUnsigned(uint min, uint max)
{
return Arbutils.Generated.Random.GetUnsignedInLimits(Ptr, min, max);
uint val = 0;
Arbutils.Generated.Random.GetUnsignedInLimits(Ptr, min, max, ref val).Assert();
return val;
}

View File

@@ -6,14 +6,16 @@ namespace PkmnLibSharp.Utilities
{
internal static void Assert(this byte result)
{
if (result == 0) return;
if (result == 1)
switch (result)
{
throw new NativeException("CreatureLib", Creatureliblibrary.Generated.C.GetLastException().PtrString());
}
if (result == 2)
{
throw new NativeException("PkmnLib", Pkmnlib.Generated.C.GetLastException().PtrString());
case 0: return;
case 1:
throw new NativeException("CreatureLib",
Creatureliblibrary.Generated.C.GetLastException().PtrString());
case 2:
throw new NativeException("PkmnLib", Pkmnlib.Generated.C.GetLastException().PtrString());
case 3:
throw new NativeException("Arbutils", Arbutils.Generated.C.GetLastException().PtrString());
}
}
}

View File

@@ -1 +1 @@
{"enums":[],"functions":[{"filename":"Arbutils","name":"Arbutils_Random_Construct","parameters":[],"returns":"Random *"},{"filename":"Arbutils","name":"Arbutils_Random_ConstructWithSeed","parameters":[{"name":"seed","type":"long unsigned int"}],"returns":"Random *"},{"filename":"Arbutils","name":"Arbutils_Random_Destruct","parameters":[{"name":"p","type":"Random *"}],"returns":"void"},{"filename":"Arbutils","name":"Arbutils_Random_GetFloat","parameters":[{"name":"p","type":"Random *"}],"returns":"float"},{"filename":"Arbutils","name":"Arbutils_Random_GetDouble","parameters":[{"name":"p","type":"Random *"}],"returns":"double"},{"filename":"Arbutils","name":"Arbutils_Random_Get","parameters":[{"name":"p","type":"Random *"}],"returns":"int"},{"filename":"Arbutils","name":"Arbutils_Random_GetWithMax","parameters":[{"name":"p","type":"Random *"},{"name":"max","type":"int"}],"returns":"int"},{"filename":"Arbutils","name":"Arbutils_Random_GetInLimits","parameters":[{"name":"p","type":"Random *"},{"name":"min","type":"int"},{"name":"max","type":"int"}],"returns":"int"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsigned","parameters":[{"name":"p","type":"Random *"}],"returns":"unsigned int"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsignedWithMax","parameters":[{"name":"p","type":"Random *"},{"name":"max","type":"unsigned int"}],"returns":"unsigned int"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsignedInLimits","parameters":[{"name":"p","type":"Random *"},{"name":"min","type":"unsigned int"},{"name":"max","type":"unsigned int"}],"returns":"unsigned int"},{"filename":"Arbutils","name":"Arbutils_Random_GetSeed","parameters":[{"name":"p","type":"Random *"}],"returns":"long unsigned int"}]}
{"enums":[],"functions":[{"filename":"Arbutils","name":"Arbutils_C_GetLastException","parameters":[],"returns":"const char *"},{"filename":"Arbutils","name":"Arbutils_Random_Construct","parameters":[],"returns":"Random *"},{"filename":"Arbutils","name":"Arbutils_Random_ConstructWithSeed","parameters":[{"name":"seed","type":"long unsigned int"}],"returns":"Random *"},{"filename":"Arbutils","name":"Arbutils_Random_Destruct","parameters":[{"name":"p","type":"Random *"}],"returns":"void"},{"filename":"Arbutils","name":"Arbutils_Random_GetFloat","parameters":[{"name":"p","type":"Random *"}],"returns":"float"},{"filename":"Arbutils","name":"Arbutils_Random_GetDouble","parameters":[{"name":"p","type":"Random *"}],"returns":"double"},{"filename":"Arbutils","name":"Arbutils_Random_Get","parameters":[{"name":"p","type":"Random *"}],"returns":"int"},{"filename":"Arbutils","name":"Arbutils_Random_GetWithMax","parameters":[{"name":"p","type":"Random *"},{"name":"max","type":"int"},{"name":"out","type":"int &"}],"returns":"unsigned char"},{"filename":"Arbutils","name":"Arbutils_Random_GetInLimits","parameters":[{"name":"p","type":"Random *"},{"name":"min","type":"int"},{"name":"max","type":"int"},{"name":"out","type":"int &"}],"returns":"unsigned char"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsigned","parameters":[{"name":"p","type":"Random *"}],"returns":"unsigned int"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsignedWithMax","parameters":[{"name":"p","type":"Random *"},{"name":"max","type":"unsigned int"},{"name":"out","type":"unsigned int &"}],"returns":"unsigned char"},{"filename":"Arbutils","name":"Arbutils_Random_GetUnsignedInLimits","parameters":[{"name":"p","type":"Random *"},{"name":"min","type":"unsigned int"},{"name":"max","type":"unsigned int"},{"name":"out","type":"unsigned int &"}],"returns":"unsigned char"},{"filename":"Arbutils","name":"Arbutils_Random_GetSeed","parameters":[{"name":"p","type":"Random *"}],"returns":"long unsigned int"}]}

File diff suppressed because one or more lines are too long