Loads of WASM type registry.
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2022-05-16 18:16:15 +02:00
parent 82bc816151
commit aac6c83bcf
21 changed files with 466 additions and 186 deletions

View File

@@ -2,38 +2,115 @@
#include <type_traits>
#include "../../../../Battling/Library/BattleLibrary.hpp"
#include "../../WebAssemblyScriptResolver.hpp"
#include "../WasmHelperFile.hpp"
#include "../WASMHelperFile.hpp"
#include "wasm.h"
wasm_func_t* MoveLibrary_GetMoveByHash(wasm_store_t* store) {
wasm_functype_t* type =
wasm_functype_new_2_1(wasm_valtype_new_i64(), wasm_valtype_new_i32(), wasm_valtype_new_i64());
auto* f = wasm_func_new(store, type, [](const wasm_val_vec_t* args, wasm_val_vec_t* returns) -> wasm_trap_t* {
auto moveLibrary = (PkmnLib::Library::MoveLibrary*)args->data[0].of.i64;
auto hash = (u32)args->data[1].of.i32;
auto opt = moveLibrary->TryGet(hash);
if (!opt.has_value()) {
returns->data[0] = WASM_I64_VAL(0);
} else{
returns->data[0] = WASM_I64_VAL(reinterpret_cast<i64>(moveLibrary->Get(hash).GetRaw()));
}
return nullptr;
});
wasm_functype_delete(type);
return f;
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); }});
}
void LibraryMethods::Register(wasm_store_t* store, ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
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("battling_battle_library_get_data_library", PkmnLib::Battling::BattleLibrary, GetStaticLib, store,
resolver);
REGISTER_GETTER("library_data_library_get_move_library", PkmnLib::Library::PokemonLibrary, GetMoveLibrary, store,
resolver);
externs.Insert("library_move_library_get_move_by_hash", MoveLibrary_GetMoveByHash(store));
REGISTER_GETTER("battle_library_get_data_library", PkmnLib::Battling::BattleLibrary, GetStaticLib, resolver)
REGISTER_GETTER("library_move_data_get_base_power", CreatureLib::Library::AttackData, GetBasePower, store,
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)
REGISTER_GETTER("library_move_data_get_name", CreatureLib::Library::AttackData, GetName, store,
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)
}

View File

@@ -6,7 +6,7 @@
class WebAssemblyScriptResolver;
class LibraryMethods {
public:
static void Register(wasm_store_t* store, ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
static void Register(ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
WebAssemblyScriptResolver* resolver);
};

View File

@@ -0,0 +1,29 @@
#include "WASMMoveDataRegistry.hpp"
#include <type_traits>
#include "../../../../Battling/Library/BattleLibrary.hpp"
#include "../../WebAssemblyScriptResolver.hpp"
#include "../WASMHelperFile.hpp"
#include "wasm.h"
using namespace CreatureLib::Library;
wasm_func_t* MoveData_HasFlagByHash(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<bool, AttackData*, u32>(
resolver, {[](WebAssemblyScriptResolver*, AttackData* move, u32 flag) -> bool {
return move->HasFlag(flag);
}});
}
void WASMMoveDataRegistry::Register(ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
WebAssemblyScriptResolver* resolver) {
REGISTER_GETTER("move_data_get_name", AttackData, GetName, resolver)
REGISTER_GETTER("move_data_get_type", AttackData, GetType, resolver)
REGISTER_GETTER("move_data_get_category", AttackData, GetCategory, resolver)
REGISTER_GETTER("move_data_get_base_power", AttackData, GetBasePower, resolver);
REGISTER_GETTER("move_data_get_accuracy", AttackData, GetAccuracy, resolver);
REGISTER_GETTER("move_data_get_base_usages", AttackData, GetBaseUsages, resolver);
REGISTER_GETTER("move_data_get_target", AttackData, GetTarget, resolver);
REGISTER_GETTER("move_data_get_priority", AttackData, GetPriority, resolver);
REGISTER_GETTER("move_data_has_secondary_effect", AttackData, HasSecondaryEffect, resolver);
externs.Insert("move_data_has_flag_by_hash", MoveData_HasFlagByHash(resolver));
}

View File

@@ -0,0 +1,14 @@
#ifndef PKMNLIB_WASMMOVEDATAREGISTRY_H
#define PKMNLIB_WASMMOVEDATAREGISTRY_H
#include <Arbutils/Collections/Dictionary.hpp>
#include <wasm.h>
class WebAssemblyScriptResolver;
class WASMMoveDataRegistry {
public:
static void Register(ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
WebAssemblyScriptResolver* resolver);
};
#endif // PKMNLIB_WASMMOVEDATAREGISTRY_H