2022-09-21 18:19:45 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
2023-04-15 07:58:21 +00:00
|
|
|
using System.Diagnostics.CodeAnalysis;
|
2022-09-21 18:19:45 +00:00
|
|
|
using System.Linq;
|
2022-10-08 11:42:30 +00:00
|
|
|
using PkmnLibSharp.FFI;
|
2022-09-21 18:19:45 +00:00
|
|
|
using PkmnLibSharp.Utils;
|
|
|
|
using Interface = PkmnLibSharp.FFI.StaticData.Species;
|
|
|
|
|
|
|
|
namespace PkmnLibSharp.StaticData
|
|
|
|
{
|
|
|
|
public class Species : ExternPointer<Species.CacheData>
|
|
|
|
{
|
|
|
|
public class CacheData
|
|
|
|
{
|
|
|
|
public ushort? Id { get; internal set; }
|
|
|
|
public string? Name { get; internal set; }
|
|
|
|
public float? GenderRate { get; internal set; }
|
|
|
|
public string? GrowthRate { get; internal set; }
|
|
|
|
public byte? CaptureRate { get; internal set; }
|
|
|
|
public Dictionary<string, Form> Forms { get; } = new();
|
|
|
|
}
|
|
|
|
|
2023-01-03 15:53:58 +00:00
|
|
|
internal Species(IdentifiablePointer ptr) : base(ptr, true)
|
2022-09-23 16:45:56 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-09-21 18:19:45 +00:00
|
|
|
public Species(ushort id, string name, float genderRate, string growthRate, byte captureRate, Form defaultForm,
|
|
|
|
IReadOnlyCollection<string> flags)
|
|
|
|
{
|
|
|
|
var flagsPtrArray = flags.Select(x => x.ToPtr()).ToArray();
|
|
|
|
var ptr = Interface.species_new(id, name.ToPtr(), genderRate, growthRate.ToPtr(), captureRate,
|
2022-10-08 11:42:30 +00:00
|
|
|
defaultForm.Ptr, flagsPtrArray.ArrayPtr(), (ulong)flags.Count);
|
2022-09-21 18:19:45 +00:00
|
|
|
InitializePointer(ptr, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ushort Id => Cache.Id ??= Interface.species_id(Ptr);
|
|
|
|
public string Name => Cache.Name ??= Interface.species_name(Ptr).PtrString()!;
|
|
|
|
public float GenderRate => Cache.GenderRate ??= Interface.species_gender_rate(Ptr);
|
|
|
|
public string GrowthRate => Cache.GrowthRate ??= Interface.species_growth_rate(Ptr).PtrString()!;
|
|
|
|
public byte CaptureRate => Cache.CaptureRate ??= Interface.species_capture_rate(Ptr);
|
2023-04-15 07:58:21 +00:00
|
|
|
|
|
|
|
public Form DefaultForm
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
TryGetForm("default", out var form);
|
|
|
|
return form!;
|
|
|
|
}
|
|
|
|
}
|
2022-09-21 18:19:45 +00:00
|
|
|
|
2023-04-15 07:58:21 +00:00
|
|
|
public bool TryGetForm(string formName, [NotNullWhen(true)] out Form? form)
|
2022-09-21 18:19:45 +00:00
|
|
|
{
|
|
|
|
if (Cache.Forms.TryGetValue(formName, out form))
|
|
|
|
return true;
|
|
|
|
var formPtr = Interface.species_get_form(Ptr, formName.ToPtr());
|
2022-10-08 11:42:30 +00:00
|
|
|
if (formPtr.Ptr == IntPtr.Zero)
|
2022-09-21 18:19:45 +00:00
|
|
|
{
|
|
|
|
form = null;
|
|
|
|
return false;
|
|
|
|
}
|
2023-01-03 15:53:58 +00:00
|
|
|
|
|
|
|
form = new Form(formPtr);
|
2022-09-21 18:19:45 +00:00
|
|
|
Cache.Forms.Add(formName, form);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void AddForm(Form form) =>
|
|
|
|
Interface.species_add_form(Ptr, form.Name.ToPtr(), form.TakeOwnershipAndInvalidate());
|
|
|
|
|
2023-04-15 07:58:21 +00:00
|
|
|
public Gender GetRandomGender(ulong seed) => Interface.species_get_random_gender(Ptr, seed);
|
|
|
|
|
2022-09-21 18:19:45 +00:00
|
|
|
protected override CacheData CreateCache() => new CacheData();
|
|
|
|
protected override void Destructor() => Interface.species_drop(Ptr);
|
2022-10-01 13:39:33 +00:00
|
|
|
|
|
|
|
public override void InvalidateChildren()
|
|
|
|
{
|
|
|
|
base.InvalidateChildren();
|
|
|
|
foreach (var form in Cache.Forms)
|
|
|
|
{
|
|
|
|
form.Value.Invalidate();
|
|
|
|
}
|
|
|
|
}
|
2023-01-03 15:53:58 +00:00
|
|
|
|
2022-10-08 11:42:30 +00:00
|
|
|
~Species()
|
|
|
|
{
|
|
|
|
Dispose();
|
|
|
|
}
|
2022-09-21 18:19:45 +00:00
|
|
|
}
|
|
|
|
}
|