117 lines
7.0 KiB
C++
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)
|
|
}
|