PkmnLib/src/ScriptResolving/WASM/InterfaceMethods/Library/LibraryMethods.cpp

117 lines
7.0 KiB
C++

#include "LibraryMethods.hpp"
#include <type_traits>
#include "../../../../Battling/Library/BattleLibrary.hpp"
#include "../../WebAssemblyScriptResolver.hpp"
#include "../WASMHelperFile.hpp"
#include "wasm.h"
using namespace PkmnLib::Library;
#define BASELIBRARY_GET_VALUE_FUNC(type, value_type) \
wasm_func_t* type##Library_Get##type##ByHash(WebAssemblyScriptResolver* resolver) { \
return WasmHelpers::CreateFunc<const value_type*, type##Library*, u32>( \
resolver, {[](WebAssemblyScriptResolver*, type##Library* lib, u32 hash) -> const value_type* { \
auto opt = lib->TryGetByHash(hash); \
if (!opt.has_value()) { \
return nullptr; \
} \
return opt.value(); \
}}); \
}
BASELIBRARY_GET_VALUE_FUNC(Species, PokemonSpecies)
BASELIBRARY_GET_VALUE_FUNC(Move, MoveData)
BASELIBRARY_GET_VALUE_FUNC(Item, CreatureLib::Library::Item)
#define REGISTER_BASE_LIB_FUNCS(typeName, type) \
externs.Insert(typeName "_library_get_" typeName "_by_hash", type##Library_Get##type##ByHash(resolver))
wasm_func_t* GrowthRates_CalculateLevelWithHash(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<level_int_t, CreatureLib::Library::GrowthRateLibrary*, u32, u32>(
resolver, {[](WebAssemblyScriptResolver*, CreatureLib::Library::GrowthRateLibrary* lib, u32 hash,
u32 experience) -> level_int_t { return lib->CalculateLevel(hash, experience); }});
}
wasm_func_t* GrowthRates_CalculateExperienceWithHash(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<u32, CreatureLib::Library::GrowthRateLibrary*, u32, level_int_t>(
resolver, {[](WebAssemblyScriptResolver*, CreatureLib::Library::GrowthRateLibrary* lib, u32 hash,
level_int_t level) -> u32 { return lib->CalculateExperience(hash, level); }});
}
wasm_func_t* TypeLibrary_GetTypeIdFromHash(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<u8, CreatureLib::Library::TypeLibrary*, u32>(
resolver, {[](WebAssemblyScriptResolver*, CreatureLib::Library::TypeLibrary* lib, u32 hash) -> u8 {
return lib->GetTypeIdByHash(hash);
}});
}
wasm_func_t* TypeLibrary_GetSingleEffectiveness(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<float, CreatureLib::Library::TypeLibrary*, u8, u8>(
resolver, {[](WebAssemblyScriptResolver*, CreatureLib::Library::TypeLibrary* lib, u8 attacking,
u8 defensive) -> float { return lib->GetSingleEffectiveness(attacking, defensive); }});
}
wasm_func_t* TypeLibrary_GetTypeName(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<const ArbUt::StringView*, CreatureLib::Library::TypeLibrary*, u8>(
resolver, {[](WebAssemblyScriptResolver*, CreatureLib::Library::TypeLibrary* lib,
u8 type) -> const ArbUt::StringView* { return &lib->GetTypeName(type); }});
}
wasm_func_t* NatureLibrary_GetNatureByHash(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<const Nature*, NatureLibrary*, u32>(
resolver, {[](WebAssemblyScriptResolver*, NatureLibrary* lib, u32 hash) -> const Nature* {
return lib->GetNatureByHash(hash);
}});
}
wasm_func_t* NatureLibrary_GetNatureName(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<const ArbUt::StringView*, NatureLibrary*, const Nature*>(
resolver, {[](WebAssemblyScriptResolver*, NatureLibrary* lib,
const Nature* nature) -> const ArbUt::StringView* { return &lib->GetNatureName(nature); }});
}
void LibraryMethods::Register(ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
WebAssemblyScriptResolver* resolver) {
REGISTER_GETTER("battle_library_get_data_library", PkmnLib::Battling::BattleLibrary, GetStaticLib, resolver)
// Data Library
REGISTER_GETTER("data_library_get_settings", PokemonLibrary, GetSettings, resolver)
REGISTER_GETTER("data_library_get_species_library", PokemonLibrary, GetSpeciesLibrary, resolver)
REGISTER_GETTER("data_library_get_move_library", PokemonLibrary, GetMoveLibrary, resolver)
REGISTER_GETTER("data_library_get_item_library", PokemonLibrary, GetItemLibrary, resolver)
REGISTER_GETTER("data_library_get_growth_rates", CreatureLib::Library::DataLibrary, GetGrowthRates, resolver)
REGISTER_GETTER("data_library_get_type_library", CreatureLib::Library::DataLibrary, GetTypeLibrary, resolver)
REGISTER_GETTER("data_library_get_talent_library", CreatureLib::Library::DataLibrary, GetTalentLibrary, resolver)
REGISTER_GETTER("data_library_get_nature_library", PokemonLibrary, GetNatureLibrary, resolver)
// Library Settings
REGISTER_GETTER("settings_get_max_level", CreatureLib::Library::LibrarySettings, GetMaximalLevel, resolver)
REGISTER_GETTER("settings_get_max_moves", CreatureLib::Library::LibrarySettings, GetMaximalAttacks, resolver)
REGISTER_GETTER("settings_get_shiny_rate", LibrarySettings, GetShinyRate, resolver)
// Base libraries
REGISTER_BASE_LIB_FUNCS("species", Species);
REGISTER_BASE_LIB_FUNCS("move", Move);
REGISTER_BASE_LIB_FUNCS("item", Item);
// Growth Rates
externs.Insert("growthrate_library_calculate_level_by_hash", GrowthRates_CalculateLevelWithHash(resolver));
externs.Insert("growthrate_library_calculate_experience_by_hash",
GrowthRates_CalculateExperienceWithHash(resolver));
// Type Library
externs.Insert("type_library_get_type_id_by_hash", TypeLibrary_GetTypeIdFromHash(resolver));
externs.Insert("type_library_get_single_effectiveness", TypeLibrary_GetSingleEffectiveness(resolver));
externs.Insert("type_library_get_type_name", TypeLibrary_GetTypeName(resolver));
// Nature Library
externs.Insert("nature_library_get_nature_by_hash", NatureLibrary_GetNatureByHash(resolver));
externs.Insert("nature_library_get_nature_name", NatureLibrary_GetNatureName(resolver));
// Natures
REGISTER_GETTER("nature_get_increased_modifier", Nature, GetIncreaseModifier, resolver)
REGISTER_GETTER("nature_get_decreased_modifier", Nature, GetDecreaseModifier, resolver)
REGISTER_GETTER("nature_get_increased_stat", Nature, GetIncreasedStat, resolver)
REGISTER_GETTER("nature_get_decreased_stat", Nature, GetDecreasedStat, resolver)
}