PkmnLibSharp/PkmnLibSharp/Library/Species.cs

109 lines
3.4 KiB
C#
Raw Normal View History

2020-05-03 14:26:14 +00:00
using System;
2020-05-04 19:16:42 +00:00
using System.Collections.Generic;
using Creatureliblibrary.Generated;
2020-07-18 14:49:11 +00:00
using Pkmnlib;
2020-05-02 17:54: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 Gender = PkmnLibSharp.Battling.Gender;
using Random = PkmnLibSharp.Utilities.Random;
2020-05-02 17:54:07 +00:00
namespace PkmnLibSharp.Library
{
public class Species : PointerWrapper
{
2020-05-04 19:16:42 +00:00
private string _name;
private string _growthRate;
private readonly Dictionary<string, Forme> _formes =
new Dictionary<string, Forme>(StringComparer.InvariantCultureIgnoreCase);
public ushort Id => CreatureSpecies.GetId(Ptr);
public float GenderRate => CreatureSpecies.GetGenderRate(Ptr);
public byte CaptureRate => CreatureSpecies.GetCaptureRate(Ptr);
public string Name => _name ??= CreatureSpecies.GetName(Ptr).PtrString();
public string GrowthRate => _growthRate ??= CreatureSpecies.GetGrowthRate(Ptr).PtrString();
public bool HasForme(string s)
{
return CreatureSpecies.HasVariant(Ptr, s.ToPtr()) == MarshalHelper.True;
}
public bool TryGetForme(string s, out Forme forme)
{
if (_formes.TryGetValue(s, out forme))
return true;
var ptr = IntPtr.Zero;
if (CreatureSpecies.TryGetVariant(Ptr, s.ToPtr(), ref ptr) == MarshalHelper.True)
{
if (TryResolvePointer(ptr, out forme))
{
_formes.Add(s, forme);
return true;
}
forme = new Forme(ptr);
_formes.Add(s, forme);
return true;
}
return false;
}
public Forme GetForme(string s)
{
if (_formes.TryGetValue(s, out var forme))
return forme;
var ptr = IntPtr.Zero;
CreatureSpecies.GetVariant(ref ptr, Ptr, s.ToPtr()).Assert();
if (TryResolvePointer(ptr, out forme))
{
_formes.Add(s, forme);
return forme;
}
forme = new Forme(ptr);
_formes.Add(s, forme);
return forme;
}
public void SetForme(string s, Forme forme)
{
_formes.Add(s, forme);
CreatureSpecies.SetVariant(Ptr, s.ToPtr(), forme.Ptr).Assert();
}
2020-07-18 14:49:11 +00:00
public Gender GetRandomGender(Random random)
{
return (Gender) CreatureSpecies.GetRandomGender(Ptr, random.Ptr);
}
2020-05-04 19:16:42 +00:00
internal Species(IntPtr ptr) : base(ptr)
2020-05-02 17:54:07 +00:00
{
}
2020-05-03 14:26:14 +00:00
public static Species Create(ushort id, string name, Forme defaultForme, float genderRatio, string growthRate,
byte captureRate, byte baseHappiness)
{
var ptr = IntPtr.Zero;
PokemonSpecies.Construct(ref ptr, id, name.ToPtr(), defaultForme.Ptr, genderRatio,
growthRate.ToPtr(), captureRate, baseHappiness).Assert();
2020-05-04 19:16:42 +00:00
var s = new Species(ptr);
s._formes.Add("default", defaultForme);
return s;
2020-05-03 14:26:14 +00:00
}
protected internal override void MarkAsDeleted()
{
base.MarkAsDeleted();
foreach (var forme in _formes)
{
forme.Value.MarkAsDeleted();
}
}
protected override void DeletePtr()
2020-05-02 17:54:07 +00:00
{
2020-05-03 14:26:14 +00:00
PokemonSpecies.Destruct(Ptr);
2020-05-02 17:54:07 +00:00
}
}
}