152 lines
5.0 KiB
Rust
Executable File
152 lines
5.0 KiB
Rust
Executable File
use crate::dynamic_data::{
|
|
Battle, BattleParty, BattleRandom, BattleResult, BattleSide, ChoiceQueue, DynamicLibrary, Pokemon, PokemonParty,
|
|
};
|
|
use crate::script_implementations::wasm::export_registry::{register, WasmResult};
|
|
use crate::script_implementations::wasm::extern_ref::{ExternRef, VecExternRef};
|
|
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
|
use crate::StringKey;
|
|
use wasmer::FunctionEnvMut;
|
|
|
|
register! {
|
|
fn battle_get_pokemon_per_side(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(battle.value_func(&env)?.pokemon_per_side()).into()
|
|
}
|
|
|
|
fn battle_get_parties(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<VecExternRef<BattleParty>> {
|
|
Ok(VecExternRef::new(env.data().data().as_ref(), battle.value_func(&env)?.parties())).into()
|
|
}
|
|
|
|
fn battle_get_choice_queue(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<ChoiceQueue>> {
|
|
let queue = battle.value_func(&env)?.current_turn_queue().read();
|
|
Ok(if let Some(queue) = queue.as_ref() {
|
|
ExternRef::func_new(&env, queue)
|
|
} else {
|
|
ExternRef::null()
|
|
}).into()
|
|
}
|
|
|
|
fn battle_get_library(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<dyn DynamicLibrary>> {
|
|
Ok(ExternRef::func_new(&env, &battle.value_func(&env)?.library().clone())).into()
|
|
}
|
|
|
|
fn battle_get_sides(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<VecExternRef<BattleSide>> {
|
|
Ok(VecExternRef::new(env.data().data().as_ref(), battle.value_func(&env)?.sides())).into()
|
|
}
|
|
|
|
fn battle_get_random(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<BattleRandom>> {
|
|
Ok(ExternRef::func_new(&env, battle.value_func(&env)?.random())).into()
|
|
}
|
|
|
|
fn battle_get_weather_name(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<StringKey>> {
|
|
let weather = battle.value_func(&env)?.weather_name()?;
|
|
Ok(if let Some(weather) = weather {
|
|
ExternRef::func_new(&env, &weather)
|
|
} else {
|
|
ExternRef::null()
|
|
}).into()
|
|
}
|
|
|
|
fn battle_find_party_for_pokemon(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
pokemon: ExternRef<Pokemon>
|
|
) -> WasmResult<ExternRef<BattleParty>> {
|
|
let battle = battle.value_func(&env)?;
|
|
let pokemon = pokemon.value_func(&env)?;
|
|
for party in battle.parties() {
|
|
if party.party().has_pokemon(pokemon) {
|
|
return Ok(ExternRef::func_new(&env, party)).into();
|
|
}
|
|
}
|
|
Ok(ExternRef::null()).into()
|
|
}
|
|
|
|
fn battle_get_pokemon(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
side: u8, index: u8
|
|
) -> WasmResult<ExternRef<Pokemon>> {
|
|
let battle = battle.value_func(&env)?;
|
|
let pokemon = battle.get_pokemon(side, index);
|
|
Ok(if let Some(pokemon) = pokemon {
|
|
ExternRef::func_new(&env, &pokemon)
|
|
} else {
|
|
ExternRef::null()
|
|
}).into()
|
|
}
|
|
|
|
fn battle_get_can_flee(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(if battle.value_func(&env)?.can_flee() { 1 } else { 0 }).into()
|
|
}
|
|
|
|
fn battle_get_number_of_sides(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(battle.value_func(&env)?.number_of_sides()).into()
|
|
}
|
|
|
|
fn battle_get_has_ended(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(if battle.value_func(&env)?.has_ended() { 1 } else { 0 }).into()
|
|
}
|
|
|
|
fn battle_get_has_ended_conclusively(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(if battle.value_func(&env)?.result().is_conclusive() { 1 } else { 0 }).into()
|
|
}
|
|
|
|
fn battle_get_winning_side(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
Ok(if let BattleResult::Conclusive(result) = battle.value_func(&env)?.result() {
|
|
result
|
|
} else {
|
|
0
|
|
}).into()
|
|
}
|
|
|
|
fn battle_get_current_turn(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u32> {
|
|
Ok(battle.value_func(&env)?.current_turn()).into()
|
|
}
|
|
|
|
fn battle_party_get_party(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle_party: ExternRef<BattleParty>,
|
|
) -> WasmResult<ExternRef<PokemonParty>> {
|
|
Ok(ExternRef::func_new(&env, battle_party.value_func(&env)?.party().as_ref())).into()
|
|
}
|
|
}
|