PkmnLibRSharp/PkmnLibRSharp/Utils/Resolver.cs

106 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using PkmnLibSharp.DynamicData;
using PkmnLibSharp.DynamicData.Libraries;
using PkmnLibSharp.FFI;
using PkmnLibSharp.StaticData;
using PkmnLibSharp.StaticData.Libraries;
namespace PkmnLibSharp.Utils
{
public class Resolver
{
public static Resolver Instance { get; set; } = new();
private static readonly Dictionary<FFIHandle, object> Instances = new();
protected static T GetOrCreateInstance<T>(FFIHandle handle)
{
if (!Instances.TryGetValue(handle, out var instance))
{
instance = typeof(T)
.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null,
new[] { typeof(FFIHandle) }, null)
?.Invoke(new object[] { handle });
Instances.Add(handle, instance!);
}
return (T)instance!;
}
public virtual EffectParameter ResolveEffectParameter(FFIHandle handle) =>
GetOrCreateInstance<EffectParameter>(handle);
public virtual Ability ResolveAbility(FFIHandle handle) => GetOrCreateInstance<Ability>(handle);
public virtual Form ResolveForm(FFIHandle handle) => GetOrCreateInstance<Form>(handle);
public virtual StaticStatisticSet<T> ResolveStaticStatisticSet<T>(FFIHandle handle)
where T : struct, IConvertible =>
GetOrCreateInstance<StaticStatisticSet<T>>(handle);
public virtual StatisticSet<T> ResolveStatisticSet<T>(FFIHandle handle) where T : struct, IConvertible =>
GetOrCreateInstance<StatisticSet<T>>(handle);
public virtual LearnableMoves ResolveLearnableMoves(FFIHandle handle) =>
GetOrCreateInstance<LearnableMoves>(handle);
public virtual Item ResolveItem(FFIHandle handle) => GetOrCreateInstance<Item>(handle);
public virtual SecondaryEffect ResolveSecondaryEffect(FFIHandle handle) =>
GetOrCreateInstance<SecondaryEffect>(handle);
public virtual MoveData ResolveMoveData(FFIHandle handle) => GetOrCreateInstance<MoveData>(handle);
public virtual Nature ResolveNature(FFIHandle handle) => GetOrCreateInstance<Nature>(handle);
public virtual Species ResolveSpecies(FFIHandle handle) => GetOrCreateInstance<Species>(handle);
public virtual AbilityLibrary ResolveAbilityLibrary(FFIHandle handle) =>
GetOrCreateInstance<AbilityLibrary>(handle);
public virtual ItemLibrary ResolveItemLibrary(FFIHandle handle) => GetOrCreateInstance<ItemLibrary>(handle);
public virtual LookupGrowthRate ResolveLookupGrowthRate(FFIHandle ptr) =>
GetOrCreateInstance<LookupGrowthRate>(ptr);
public virtual GrowthRateLibrary ResolveGrowthRateLibrary(FFIHandle handle) =>
GetOrCreateInstance<GrowthRateLibrary>(handle);
public virtual MoveLibrary ResolveMoveLibrary(FFIHandle handle) => GetOrCreateInstance<MoveLibrary>(handle);
public virtual NatureLibrary ResolveNatureLibrary(FFIHandle handle) =>
GetOrCreateInstance<NatureLibrary>(handle);
public virtual SpeciesLibrary ResolveSpeciesLibrary(FFIHandle handle) =>
GetOrCreateInstance<SpeciesLibrary>(handle);
public virtual LibrarySettings ResolveLibrarySettings(FFIHandle handle) =>
GetOrCreateInstance<LibrarySettings>(handle);
public virtual TypeLibrary ResolveTypeLibrary(FFIHandle handle) => GetOrCreateInstance<TypeLibrary>(handle);
public virtual StaticData.Libraries.StaticData ResolveStaticData(FFIHandle handle) =>
GetOrCreateInstance<StaticData.Libraries.StaticData>(handle);
public virtual LearnedMove ResolveLearnedMove(FFIHandle resolve) => GetOrCreateInstance<LearnedMove>(resolve);
public virtual Gen7BattleStatCalculator ResolveGen7BattleStatCalculator(FFIHandle handle) =>
GetOrCreateInstance<Gen7BattleStatCalculator>(handle);
public virtual Gen7DamageLibrary ResolveGen7DamageLibrary(FFIHandle handle) =>
GetOrCreateInstance<Gen7DamageLibrary>(handle);
public virtual Gen7MiscLibrary ResolveGen7MiscLibrary(FFIHandle handle) =>
GetOrCreateInstance<Gen7MiscLibrary>(handle);
public virtual EmptyScriptResolver ResolveEmptyScriptResolver(FFIHandle handle) =>
GetOrCreateInstance<EmptyScriptResolver>(handle);
#if WASM
public virtual WasmScriptResolver ResolveWasmScriptResolver(FFIHandle handle) =>
GetOrCreateInstance<WasmScriptResolver>(handle);
#endif
public DynamicLibrary ResolveDynamicLibrary(FFIHandle resolve) => GetOrCreateInstance<DynamicLibrary>(resolve);
public Pokemon ResolvePokemon(FFIHandle resolve) => GetOrCreateInstance<Pokemon>(resolve);
}
}