PkmnLib_rs/src/script_implementations/wasm/export_registry/static_data/mod.rs

115 lines
4.5 KiB
Rust
Executable File

use std::mem::transmute;
use wasmer::{FunctionEnv, FunctionEnvMut, Imports, StoreMut};
use crate::defines::LevelInt;
use crate::script_implementations::wasm::export_registry::wasm_result::{
get_value, get_value_void, wasm_ok, WasmResult,
};
use crate::script_implementations::wasm::export_registry::{register, WasmVoidResult, WasmVoidResultExtension};
use crate::script_implementations::wasm::extern_ref::ExternRef;
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
use crate::static_data::{
ItemLibrary, LibrarySettings, MoveLibrary, SpeciesLibrary, StaticData, StaticStatisticSet, StatisticSet,
TypeLibrary,
};
use anyhow_ext::Context;
/// Ability data registration
mod ability;
/// Form data registration
mod form;
/// Item registration.
mod item;
/// Moves data registration
mod moves;
/// Nature data registration
mod nature;
/// Species data registration
mod species;
/// Types data registration
mod types;
register! {
fn static_data_get_move_library(env: FunctionEnvMut<WebAssemblyEnv>, data_library: ExternRef<dyn StaticData>) -> ExternRef<dyn MoveLibrary> {
ExternRef::func_new(&env, data_library.value_func_box(&env).unwrap().moves())
}
fn static_data_get_species_library(
env: FunctionEnvMut<WebAssemblyEnv>,
data_library: ExternRef<dyn StaticData>,
) -> ExternRef<dyn SpeciesLibrary> {
ExternRef::func_new(&env, data_library.value_func_box(&env).unwrap().species())
}
fn static_data_get_item_library(env: FunctionEnvMut<WebAssemblyEnv>, data_library: ExternRef<dyn StaticData>) -> ExternRef<dyn ItemLibrary> {
ExternRef::func_new(&env, data_library.value_func_box(&env).unwrap().items())
}
fn static_data_get_type_library(env: FunctionEnvMut<WebAssemblyEnv>, data_library: ExternRef<dyn StaticData>) -> ExternRef<dyn TypeLibrary> {
ExternRef::func_new(&env, data_library.value_func_box(&env).unwrap().types())
}
fn static_data_get_library_settings(
env: FunctionEnvMut<WebAssemblyEnv>,
data_library: ExternRef<dyn StaticData>,
) -> ExternRef<dyn LibrarySettings> {
ExternRef::func_new(&env, data_library.value_func_box(&env).unwrap().settings())
}
fn library_settings_get_maximum_level(env: FunctionEnvMut<WebAssemblyEnv>, data_library: ExternRef<dyn LibrarySettings>) -> LevelInt {
data_library.value_func_box(&env).unwrap().maximum_level()
}
fn static_statistics_set_get_stat(env: FunctionEnvMut<WebAssemblyEnv>, statistics_set: ExternRef<StaticStatisticSet<u16>>, stat: u8) -> u32 {
unsafe {
statistics_set.value_func(&env).unwrap().get_stat(transmute(stat)) as u32
}
}
fn statistic_set_get(env: FunctionEnvMut<WebAssemblyEnv>, statistics_set: ExternRef<StatisticSet<u32>>, stat: u8) -> WasmResult<i64> {
unsafe {
let statistics_set = get_value!(statistics_set, env);
wasm_ok(statistics_set.get_stat(transmute(stat)) as i64)
}
}
fn statistic_set_set(env: FunctionEnvMut<WebAssemblyEnv>, statistics_set: ExternRef<StatisticSet<u32>>, stat: u8, value: u64) -> WasmVoidResult {
unsafe {
let statistics_set = get_value_void!(statistics_set, env);
statistics_set.set_stat(transmute(stat), value as u32);
WasmVoidResult::ok()
}
}
fn statistic_set_increase_stat(env: FunctionEnvMut<WebAssemblyEnv>, statistics_set: ExternRef<StatisticSet<u32>>, stat: u8, value: u64) -> WasmVoidResult {
unsafe {
let statistics_set = get_value_void!(statistics_set, env);
statistics_set.increase_stat(transmute(stat), value as u32);
WasmVoidResult::ok()
}
}
fn statistic_set_decrease_stat(env: FunctionEnvMut<WebAssemblyEnv>, statistics_set: ExternRef<StatisticSet<u32>>, stat: u8, value: u64) -> WasmVoidResult {
unsafe {
let statistics_set = get_value_void!(statistics_set, env);
statistics_set.decrease_stat(transmute(stat), value as u32);
WasmVoidResult::ok()
}
}
manual manual_registration
}
/// Additional required manual registration.
fn manual_registration(imports: &mut Imports, store: &mut StoreMut, env: &FunctionEnv<WebAssemblyEnv>) {
moves::register(imports, store, env);
species::register(imports, store, env);
item::register(imports, store, env);
nature::register(imports, store, env);
form::register(imports, store, env);
ability::register(imports, store, env);
types::register(imports, store, env);
}