PkmnLibSharp/PkmnLibSharp/Library/Species/Forme.cs

162 lines
5.9 KiB
C#
Raw Normal View History

2020-05-02 17:54:07 +00:00
using System;
using System.Collections.Generic;
2020-05-02 17:54:07 +00:00
using System.Linq;
using System.Runtime.InteropServices;
using Creaturelib.Generated;
2020-08-17 16:51:07 +00:00
using Pkmnlib.Generated;
2020-05-02 20:58:08 +00:00
using PkmnLibSharp.Utilities;
2020-07-18 14:49:11 +00:00
using Random = PkmnLibSharp.Utilities.Random;
2020-05-02 17:54:07 +00:00
namespace PkmnLibSharp.Library
{
public class Forme : PointerWrapper
{
private ReadOnlyArray<string>? _abilities;
private ReadOnlyArray<string>? _hiddenAbilities;
private LearnableMoves? _moves;
private string? _name;
private ReadOnlyArray<byte>? _types;
2020-08-09 09:01:43 +00:00
public Forme(string name, float height, float weight, uint baseExperience, byte[] types,
ushort baseHealth, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack,
ushort baseSpecialDefense, ushort baseSpeed, IReadOnlyCollection<string> abilities,
2020-08-10 17:13:17 +00:00
IReadOnlyCollection<string> hiddenAbilities, LearnableMoves moves, IReadOnlyCollection<string> tags)
2020-08-09 09:01:43 +00:00
{
var abilitiesConverted = abilities.Select(x => x.ToPtr()).ToArray();
var hiddenAbilitiesConverted = hiddenAbilities.Select(x => x.ToPtr()).ToArray();
2020-08-10 17:13:17 +00:00
var tagsConverted = tags.Select(x => x.ToPtr()).ToArray();
2020-08-09 09:01:43 +00:00
var ab = abilitiesConverted.ArrayPtr();
var hab = hiddenAbilitiesConverted.ArrayPtr();
2020-08-10 17:13:17 +00:00
var tagsPtr = tagsConverted.ArrayPtr();
2020-08-17 16:51:07 +00:00
var ptr = PokemonForme.Construct(name.ToPtr(), height, weight, baseExperience, types.ArrayPtr(),
2020-08-09 09:01:43 +00:00
(ulong) types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack,
baseSpecialDefense, baseSpeed, ab, (ulong) abilities.Count, hab,
2020-08-10 17:13:17 +00:00
(ulong) hiddenAbilities.Count, moves.Ptr, tagsPtr, (ulong) tags.Count);
2020-08-09 09:01:43 +00:00
foreach (var intPtr in abilitiesConverted)
Marshal.FreeHGlobal(intPtr);
foreach (var intPtr in hiddenAbilitiesConverted)
Marshal.FreeHGlobal(intPtr);
Initialize(ptr);
}
public string Name => _name ??= SpeciesVariant.GetName(Ptr).PtrString()!;
2020-05-02 17:54:07 +00:00
public float Height => SpeciesVariant.GetHeight(Ptr);
public float Weight => SpeciesVariant.GetWeight(Ptr);
public float BaseExperience => SpeciesVariant.GetBaseExperience(Ptr);
public ReadOnlyArray<byte> Types
2020-05-02 17:54:07 +00:00
{
get
{
if (_types != null)
return _types;
var typesCount = SpeciesVariant.GetTypeCount(Ptr);
var types = new byte[typesCount];
2020-07-18 14:49:11 +00:00
for (ulong i = 0; i < typesCount; i++) types[i] = SpeciesVariant.GetType(Ptr, i);
2020-05-02 17:54:07 +00:00
_types = types.ToReadOnly();
2020-05-02 17:54:07 +00:00
return _types;
}
}
public uint BaseHealth => SpeciesVariant.GetStatistic(Ptr, (byte) Statistic.Health);
public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Attack);
public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Defense);
public uint BaseSpecialAttack =>
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.SpecialAttack);
public uint BaseSpecialDefense =>
SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.SpecialDefense);
public uint BaseSpeed => SpeciesVariant.GetStatistic(Ptr, (Creaturelib.Statistic) Statistic.Speed);
2020-05-02 17:54:07 +00:00
public ReadOnlyArray<string> Abilities
2020-05-02 20:58:08 +00:00
{
get
{
if (_abilities != null)
return _abilities;
var abilityCount = SpeciesVariant.GetTalentCount(Ptr);
var abilities = new string[abilityCount];
for (byte i = 0; i < abilityCount; i++)
{
2020-07-18 14:49:11 +00:00
var s = IntPtr.Zero;
2020-05-03 09:38:49 +00:00
SpeciesVariant.GetTalent(Ptr, MarshalHelper.False, i, ref s).Assert();
abilities[i] = s.PtrString()!;
2020-05-02 20:58:08 +00:00
}
_abilities = abilities.ToReadOnly();
2020-05-02 20:58:08 +00:00
return _abilities;
}
}
public ReadOnlyArray<string> HiddenAbilities
2020-05-02 20:58:08 +00:00
{
get
{
if (_hiddenAbilities != null)
return _hiddenAbilities;
var abilityCount = SpeciesVariant.GetSecretTalentCount(Ptr);
var abilities = new string[abilityCount];
for (byte i = 0; i < abilityCount; i++)
{
2020-07-18 14:49:11 +00:00
var s = IntPtr.Zero;
2020-05-03 09:38:49 +00:00
SpeciesVariant.GetTalent(Ptr, MarshalHelper.True, i, ref s).Assert();
abilities[i] = s.PtrString()!;
2020-05-02 20:58:08 +00:00
}
_hiddenAbilities = abilities.ToReadOnly();
2020-05-02 20:58:08 +00:00
return _hiddenAbilities;
}
}
public LearnableMoves Moves
{
get
{
if (_moves != null) return _moves;
var movesPtr = SpeciesVariant.GetLearnableAttacks(Ptr);
if (!TryResolvePointer(movesPtr, out _moves))
_moves = Constructor.Active.ConstructLearnableMoves(movesPtr);
return _moves!;
}
}
2020-05-02 17:54:07 +00:00
2020-08-10 17:13:17 +00:00
public byte GetPkmnType(int index)
2020-05-02 17:54:07 +00:00
{
return Types[index];
}
2020-08-09 09:01:43 +00:00
2020-07-18 14:49:11 +00:00
public byte GetRandomAbility(Random rand)
2020-05-02 17:54:07 +00:00
{
2020-07-18 14:49:11 +00:00
return SpeciesVariant.GetRandomTalent(Ptr, rand.Ptr);
2020-05-02 17:54:07 +00:00
}
2020-08-10 17:13:17 +00:00
public bool HasFlag(string flag)
{
return SpeciesVariant.HasFlag(Ptr, flag.ToPtr()) == 1;
}
public override string ToString()
{
return base.ToString() + $": {Name}";
}
protected internal override void MarkAsDeleted()
{
base.MarkAsDeleted();
_moves?.MarkAsDeleted();
}
protected override void DeletePtr()
2020-05-02 17:54:07 +00:00
{
SpeciesVariant.Destruct(Ptr);
}
}
}