use crate::dynamic_data::{DynamicLibrary, ScriptOwnerData}; use crate::script_implementations::wasm::export_registry::register; use crate::script_implementations::wasm::extern_ref::ExternRef; use std::sync::atomic::Ordering; use wasmer::{FunctionEnv, FunctionEnvMut, Imports, StoreMut}; use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv; use crate::static_data::StaticData; /// The battle registration mod battle; /// Battle random registration mod battle_random; /// Battle side registration mod battle_side; /// Choice queue registration. mod choice_queue; /// The executing move registration/ mod executing_move; /// The hit data registration/ mod hit_data; /// Learned move registration mod learned_move; /// The party registration. mod party; /// Pokemon registration mod pokemon; /// Turn choice registration mod turn_choice; register! { fn dynamic_library_get_static_data( env: FunctionEnvMut, dynamic_lib: ExternRef, ) -> ExternRef { ExternRef::func_new(&env, dynamic_lib.value_func_arc(&env).unwrap().static_data()) } fn script_get_owner( env: FunctionEnvMut, script: u32, ) -> u32 { unsafe { let script = env.data().data().get_loaded_script(script); if let Some(script) = script { match script.get_owner() { ScriptOwnerData::Pokemon(p) => env.data().data().get_extern_ref_index::(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32, ScriptOwnerData::BattleSide(p) => env.data().data().get_extern_ref_index::(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32, ScriptOwnerData::Battle(p) => env.data().data().get_extern_ref_index::(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32, ScriptOwnerData::None => 0, } } else { 0 } } } fn script_get_owner_kind( env: FunctionEnvMut, script: u32, ) -> u8 { let script = env.data().data().get_loaded_script(script); if let Some(script) = script { match script.get_owner() { ScriptOwnerData::Pokemon(_) => 0, ScriptOwnerData::BattleSide(_) => 1, ScriptOwnerData::Battle(_) => 2, ScriptOwnerData::None => 3, } } else { 0 } } manual manual_register } /// Additional required manual registration fn manual_register(imports: &mut Imports, store: &mut StoreMut, env: &FunctionEnv) { battle::register(imports, store, env); turn_choice::register(imports, store, env); pokemon::register(imports, store, env); learned_move::register(imports, store, env); battle_side::register(imports, store, env); battle_random::register(imports, store, env); choice_queue::register(imports, store, env); party::register(imports, store, env); executing_move::register(imports, store, env); hit_data::register(imports, store, env); }