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

43 lines
1.6 KiB
Rust

use crate::script_implementations::wasm::export_registry::wasm_result::get_value_arc;
use crate::script_implementations::wasm::export_registry::FunctionEnvMut;
use crate::script_implementations::wasm::export_registry::{register, try_wasm, wasm_ok, WasmResult};
use crate::script_implementations::wasm::extern_ref::ExternRef;
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
use crate::static_data::{Ability, Parameter};
use crate::StringKey;
register! {
fn ability_get_name(
env: FunctionEnvMut<WebAssemblyEnv>,
ability: ExternRef<dyn Ability>
) -> WasmResult<ExternRef<StringKey>> {
let ability = get_value_arc!(ability, env);
wasm_ok(ExternRef::func_new(&env, ability.name().clone().into()))
}
fn ability_get_effect(
env: FunctionEnvMut<WebAssemblyEnv>,
ability: ExternRef<dyn Ability>
) -> WasmResult<ExternRef<StringKey>> {
let ability = get_value_arc!(ability, env);
wasm_ok(ExternRef::func_new(&env, ability.effect().clone().into()))
}
fn ability_get_parameters(
env: FunctionEnvMut<WebAssemblyEnv>,
ability: ExternRef<dyn Ability>
) -> WasmResult<u64> {
let ability = get_value_arc!(ability, env);
let parameters = ability.parameters();
let mut vec : Vec<u32> = Vec::with_capacity(parameters.len());
for parameter in parameters {
vec.push(ExternRef::<Parameter>::func_new(&env, parameter.into()).index() as u32);
}
let wasm_ptr = try_wasm!(env.data().data().copy_value_vec_to_wasm(&vec), env);
let r: u64 = unsafe { std::mem::transmute((wasm_ptr, vec.len() as u32)) };
wasm_ok(r)
}
}