PkmnLib_rs/src/script_implementations/wasm/export_registry/dynamic_data/battle_side.rs

159 lines
5.4 KiB
Rust
Raw Normal View History

use crate::dynamic_data::{Battle, BattleSide, Pokemon, VolatileScriptsOwner};
2023-04-23 08:10:06 +00:00
use crate::script_implementations::wasm::export_registry::{register, WasmResult};
use crate::script_implementations::wasm::extern_ref::ExternRef;
use crate::script_implementations::wasm::script::WebAssemblyScript;
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
2022-09-16 09:01:37 +00:00
use crate::ScriptCategory;
2023-04-23 08:10:06 +00:00
use anyhow::anyhow;
2022-09-16 09:01:37 +00:00
use std::ffi::CStr;
use wasmer::FunctionEnvMut;
register! {
fn battleside_has_fled_battle(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(u8::from(side.value_func(&env)?.has_fled_battle())).into()
}
fn battleside_is_defeated(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(u8::from(side.value_func(&env)?.is_defeated())).into()
}
fn battleside_get_side_index(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(side.value_func(&env)?.index()).into()
}
fn battleside_get_pokemon_per_side(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(side.value_func(&env)?.pokemon_per_side()).into()
}
fn battleside_get_battle(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<ExternRef<Battle>> {
Ok(ExternRef::func_new(&env, side.value_func(&env)?.battle()?)).into()
}
fn battleside_get_pokemon(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
index: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<ExternRef<Pokemon>> {
Ok(if let Some(Some(p)) = side.value_func(&env)?.pokemon().get(index as usize) {
ExternRef::func_new(&env, p.as_ref())
} else {
ExternRef::null()
2023-04-23 08:10:06 +00:00
}).into()
}
fn battle_side_get_has_fled_battle(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(if side.value_func(&env)?.has_fled_battle() { 1 } else { 0 }).into()
}
fn battle_side_get_is_defeated(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
Ok(if side.value_func(&env)?.is_defeated() { 1 } else { 0 }).into()
}
fn battleside_add_volatile_by_name(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
name_ptr: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<u32> {
unsafe {
2022-09-16 09:01:37 +00:00
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
2023-04-23 08:10:06 +00:00
let script = side.value_func(&env)?.add_volatile_script(&c_name.as_ref().into())?;
Ok(if let Some(script) = script {
let script = script.get_as::<WebAssemblyScript>()?;
script.get_wasm_pointer()
} else {
0
2023-04-23 08:10:06 +00:00
}).into()
}
}
fn battleside_add_volatile(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
script_ptr: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<u32> {
let side : &BattleSide = side.value_func(&env)?;
unsafe {
2022-09-16 09:01:37 +00:00
let env = env.data().data();
2023-04-23 08:10:06 +00:00
let name_ptr = match env
.script_function_cache()
.script_get_name(&env)?
.call(&mut env.store_mut(), script_ptr) {
Ok(name_ptr) => Ok(name_ptr),
Err(e) => Err(e.into())
}?;
2022-09-16 09:01:37 +00:00
let c_name: &CStr = CStr::from_ptr(env.get_raw_pointer(name_ptr));
2023-04-23 08:10:06 +00:00
let script = env.setup_script(script_ptr, ScriptCategory::Side, &c_name.as_ref().into(), side.into())?;
env.script_function_cache().dealloc_cstring(&env, name_ptr)?;
2022-09-16 09:01:37 +00:00
2023-04-23 08:10:06 +00:00
Ok(if let Some(script) = script {
let script = side.add_volatile_script_with_script(script)?;
let s = script.as_ref().ok_or(anyhow!("Couldn't get script"))?.get_as::<WebAssemblyScript>()?;
2022-09-16 09:01:37 +00:00
s.get_wasm_pointer()
} else {
0
2023-04-23 08:10:06 +00:00
}).into()
}
}
2022-09-16 09:01:37 +00:00
fn battleside_has_volatile(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
name_ptr: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<u8> {
2022-09-16 09:01:37 +00:00
unsafe {
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
2023-04-23 08:10:06 +00:00
Ok(u8::from(side.value_func(&env)?.has_volatile_script(&c_name.as_ref().into()))).into()
2022-09-16 09:01:37 +00:00
}
}
fn battleside_get_volatile(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
name_ptr: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<u32> {
unsafe {
2022-09-16 09:01:37 +00:00
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
2023-04-23 08:10:06 +00:00
let script = side.value_func(&env)?.get_volatile_script(&c_name.as_ref().into());
Ok(if let Some(script) = script {
let script = script.get_as::<WebAssemblyScript>()?;
script.get_wasm_pointer()
} else {
0
2023-04-23 08:10:06 +00:00
}).into()
}
}
fn battleside_remove_volatile(
env: FunctionEnvMut<WebAssemblyEnv>,
side: ExternRef<BattleSide>,
name_ptr: u32
2023-04-23 08:10:06 +00:00
) -> WasmResult<()> {
unsafe {
2022-09-16 09:01:37 +00:00
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
2023-04-23 08:10:06 +00:00
side.value_func(&env)?.remove_volatile_script(&c_name.as_ref().into()).into()
}
}
}