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

92 lines
3.2 KiB
Rust
Executable File

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<WebAssemblyEnv>,
dynamic_lib: ExternRef<dyn DynamicLibrary>,
) -> ExternRef<dyn StaticData> {
ExternRef::func_new(&env, dynamic_lib.value_func_arc(&env).unwrap().static_data())
}
fn script_get_owner(
env: FunctionEnvMut<WebAssemblyEnv>,
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::<crate::dynamic_data::Pokemon>(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32,
ScriptOwnerData::BattleSide(p) => env.data().data().get_extern_ref_index::<crate::dynamic_data::BattleSide>(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32,
ScriptOwnerData::Battle(p) => env.data().data().get_extern_ref_index::<crate::dynamic_data::Battle>(p.load(Ordering::Relaxed).as_ref().unwrap()) as u32,
ScriptOwnerData::None => 0,
}
} else {
0
}
}
}
fn script_get_owner_kind(
env: FunctionEnvMut<WebAssemblyEnv>,
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<WebAssemblyEnv>) {
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);
}