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, StringKey}; use std::ffi::CString; use wasmer::{FunctionEnvMut, Value}; register! { fn battleside_has_fled_battle( env: FunctionEnvMut, side: ExternRef, ) -> u8 { if side.value_func(&env).unwrap().has_fled_battle() { 1 } else { 0 } } fn battleside_is_defeated( env: FunctionEnvMut, side: ExternRef, ) -> u8 { if side.value_func(&env).unwrap().is_defeated() { 1 } else { 0 } } fn battleside_get_side_index( env: FunctionEnvMut, side: ExternRef, ) -> u8 { side.value_func(&env).unwrap().index() } fn battleside_get_pokemon_per_side( env: FunctionEnvMut, side: ExternRef, ) -> u8 { side.value_func(&env).unwrap().pokemon_per_side() } fn battleside_get_battle( env: FunctionEnvMut, side: ExternRef, ) -> ExternRef { ExternRef::func_new(&env, side.value_func(&env).unwrap().battle()) } fn battleside_get_pokemon( env: FunctionEnvMut, side: ExternRef, index: u32 ) -> ExternRef { 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, side: ExternRef, name_ptr: u32 ) -> u32 { unsafe { let c_name = CString::from_raw(env.data().data().get_raw_pointer(name_ptr)); let script = side.value_func(&env).unwrap().add_volatile_script(&c_name.into()).unwrap(); if let Some(script) = script { let script = script.get_as::(); script.get_wasm_pointer() } else { 0 } } } fn battleside_add_volatile( env: FunctionEnvMut, side: ExternRef, script_ptr: u32 ) -> u32 { let side = side.value_func(&env).unwrap(); let name_ptr = env.data().data().exported_functions().get(&StringKey::new("script_get_name")).unwrap().call(&mut env.data().data().store_mut(), &[Value::I32(script_ptr as i32)]).unwrap().get(0).unwrap().i32().unwrap() as u32; unsafe{ let name_ptr: CString = CString::from_raw(env.data().data().get_raw_pointer(name_ptr)); let script = env.data().data().setup_script(script_ptr, ScriptCategory::Side, &name_ptr.into(), side.into()).unwrap(); if let Some(script) = script { let script = side.add_volatile_script_with_script(script); script.unwrap().unwrap().get_as::().get_wasm_pointer() } else { 0 } } } fn battleside_get_volatile( env: FunctionEnvMut, side: ExternRef, name_ptr: u32 ) -> u32 { unsafe { let c_name = CString::from_raw(env.data().data().get_raw_pointer(name_ptr)); let script = side.value_func(&env).unwrap().get_volatile_script(&c_name.into()); if let Some(script) = script { let script = script.get_as::(); script.get_wasm_pointer() } else { 0 } } } fn battleside_remove_volatile( env: FunctionEnvMut, side: ExternRef, name_ptr: u32 ) { unsafe { let c_name = CString::from_raw(env.data().data().get_raw_pointer(name_ptr)); side.value_func(&env).unwrap().remove_volatile_script(&c_name.into()); } } }