138 lines
4.7 KiB
Rust
Executable File
138 lines
4.7 KiB
Rust
Executable File
use crate::dynamic_data::{Battle, BattleSide, Pokemon, VolatileScriptsOwner};
|
|
use crate::script_implementations::wasm::export_registry::register;
|
|
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
|
use crate::script_implementations::wasm::script::WebAssemblyScript;
|
|
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
|
use crate::ScriptCategory;
|
|
use std::ffi::CStr;
|
|
use wasmer::FunctionEnvMut;
|
|
|
|
register! {
|
|
fn battleside_has_fled_battle(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
) -> u8 {
|
|
if side.value_func(&env).unwrap().has_fled_battle() { 1 } else { 0 }
|
|
}
|
|
|
|
fn battleside_is_defeated(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
) -> u8 {
|
|
if side.value_func(&env).unwrap().is_defeated() { 1 } else { 0 }
|
|
}
|
|
|
|
fn battleside_get_side_index(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
) -> u8 {
|
|
side.value_func(&env).unwrap().index()
|
|
}
|
|
|
|
fn battleside_get_pokemon_per_side(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
) -> u8 {
|
|
side.value_func(&env).unwrap().pokemon_per_side()
|
|
}
|
|
|
|
fn battleside_get_battle(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
) -> ExternRef<Battle> {
|
|
ExternRef::func_new(&env, side.value_func(&env).unwrap().battle())
|
|
}
|
|
|
|
fn battleside_get_pokemon(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
index: u32
|
|
) -> ExternRef<Pokemon> {
|
|
if let Some(Some(p)) = side.value_func(&env).unwrap().pokemon().get(index as usize) {
|
|
ExternRef::func_new(&env, p.as_ref())
|
|
} else {
|
|
ExternRef::null()
|
|
}
|
|
}
|
|
|
|
fn battleside_add_volatile_by_name(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
name_ptr: u32
|
|
) -> u32 {
|
|
unsafe {
|
|
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
|
let script = side.value_func(&env).unwrap().add_volatile_script(&c_name.as_ref().into()).unwrap();
|
|
if let Some(script) = script {
|
|
let script = script.get_as::<WebAssemblyScript>();
|
|
script.get_wasm_pointer()
|
|
} else {
|
|
0
|
|
}
|
|
}
|
|
}
|
|
|
|
fn battleside_add_volatile(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
script_ptr: u32
|
|
) -> u32 {
|
|
let side = side.value_func(&env).unwrap();
|
|
unsafe{
|
|
let env = env.data().data();
|
|
let name_ptr = env.script_function_cache().script_get_name(&env).unwrap().call(&mut env.store_mut(), script_ptr).unwrap();
|
|
let c_name: &CStr = CStr::from_ptr(env.get_raw_pointer(name_ptr));
|
|
let script = env.setup_script(script_ptr, ScriptCategory::Side, &c_name.as_ref().into(), side.into()).unwrap();
|
|
env.script_function_cache().dealloc_cstring(&env).unwrap().call(&mut env.store_mut(), name_ptr).unwrap();
|
|
|
|
if let Some(script) = script {
|
|
let script = side.add_volatile_script_with_script(script);
|
|
let s = script.as_ref().unwrap().as_ref().unwrap().get_as::<WebAssemblyScript>();
|
|
s.get_wasm_pointer()
|
|
} else {
|
|
0
|
|
}
|
|
}
|
|
}
|
|
|
|
fn battleside_has_volatile(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
name_ptr: u32
|
|
) -> u8 {
|
|
unsafe {
|
|
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
|
if side.value_func(&env).unwrap().has_volatile_script(&c_name.as_ref().into()) { 1 } else { 0 }
|
|
}
|
|
}
|
|
|
|
fn battleside_get_volatile(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
name_ptr: u32
|
|
) -> u32 {
|
|
unsafe {
|
|
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
|
let script = side.value_func(&env).unwrap().get_volatile_script(&c_name.as_ref().into());
|
|
if let Some(script) = script {
|
|
let script = script.get_as::<WebAssemblyScript>();
|
|
script.get_wasm_pointer()
|
|
} else {
|
|
0
|
|
}
|
|
}
|
|
}
|
|
|
|
fn battleside_remove_volatile(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
side: ExternRef<BattleSide>,
|
|
name_ptr: u32
|
|
) {
|
|
unsafe {
|
|
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
|
side.value_func(&env).unwrap().remove_volatile_script(&c_name.as_ref().into());
|
|
}
|
|
}
|
|
|
|
}
|