183 lines
6.3 KiB
Rust
Executable File
183 lines
6.3 KiB
Rust
Executable File
use crate::dynamic_data::{
|
|
Battle, BattleParty, BattleRandom, BattleResult, BattleSide, ChoiceQueue, DynamicLibrary, Pokemon, PokemonParty,
|
|
};
|
|
use crate::script_implementations::wasm::export_registry::wasm_result::{
|
|
get_value, get_value_arc, get_value_call_getter, try_wasm,
|
|
};
|
|
use crate::script_implementations::wasm::export_registry::{register, wasm_ok, WasmResult};
|
|
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
|
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> {
|
|
let value = get_value_call_getter!(battle.pokemon_per_side(), env);
|
|
wasm_ok(value)
|
|
}
|
|
|
|
fn battle_get_parties(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u64> {
|
|
let battle = get_value!(battle, env);
|
|
let parties = battle.parties();
|
|
let mut vec : Vec<u32> = Vec::with_capacity(parties.len());
|
|
for party in parties {
|
|
vec.push(ExternRef::<BattleParty>::func_new(&env, party.into()).index() as u32);
|
|
}
|
|
let wasm_ptr = try_wasm!(env.data().data().copy_value_vec_to_wasm(&vec), env);
|
|
let r: u64 = unsafe { std::mem::transmute((wasm_ptr, vec.len() as u32)) };
|
|
wasm_ok(r)
|
|
}
|
|
|
|
fn battle_get_choice_queue(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<ChoiceQueue>> {
|
|
let battle = get_value!(battle, env);
|
|
let value = battle.current_turn_queue();
|
|
let queue = value.read();
|
|
wasm_ok(if let Some(queue) = queue.as_ref() {
|
|
ExternRef::<ChoiceQueue>::func_new(&env, queue.into())
|
|
} else {
|
|
ExternRef::null()
|
|
})
|
|
}
|
|
|
|
fn battle_get_library(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<dyn DynamicLibrary>> {
|
|
let battle = get_value!(battle, env);
|
|
let value = battle.library();
|
|
wasm_ok(ExternRef::func_new(&env, value.into()))
|
|
}
|
|
|
|
fn battle_get_sides(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u64> {
|
|
let value = get_value!(battle, env);
|
|
let sides = value.sides();
|
|
let mut vec : Vec<u32> = Vec::with_capacity(sides.len());
|
|
for side in sides {
|
|
vec.push(ExternRef::<BattleSide>::func_new(&env, side.into()).index() as u32);
|
|
}
|
|
let wasm_ptr = try_wasm!(env.data().data().copy_value_vec_to_wasm(&vec), env);
|
|
let r: u64 = unsafe { std::mem::transmute((wasm_ptr, vec.len() as u32)) };
|
|
wasm_ok(r)
|
|
|
|
}
|
|
|
|
fn battle_get_random(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<BattleRandom>> {
|
|
let battle = get_value!(battle, env);
|
|
let random = battle.random();
|
|
wasm_ok(ExternRef::<BattleRandom>::func_new(&env, random.into()))
|
|
}
|
|
|
|
fn battle_get_weather_name(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<ExternRef<StringKey>> {
|
|
let weather = get_value_call_getter!(battle.weather_name(), env);
|
|
let weather = try_wasm!(weather, env);
|
|
wasm_ok(if let Some(weather) = weather {
|
|
ExternRef::<StringKey>::func_new(&env, weather.into())
|
|
} else {
|
|
ExternRef::null()
|
|
})
|
|
}
|
|
|
|
fn battle_find_party_for_pokemon(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
pokemon: ExternRef<Pokemon>
|
|
) -> WasmResult<ExternRef<BattleParty>> {
|
|
let battle = get_value!(battle, env);
|
|
let pokemon = get_value!(pokemon, env);
|
|
for party in battle.parties() {
|
|
if party.party().has_pokemon(&pokemon) {
|
|
return wasm_ok(ExternRef::<BattleParty>::func_new(&env, party.into()));
|
|
}
|
|
}
|
|
wasm_ok(ExternRef::<BattleParty>::null())
|
|
}
|
|
|
|
fn battle_get_pokemon(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
side: u8, index: u8
|
|
) -> WasmResult<ExternRef<Pokemon>> {
|
|
let battle = get_value!(battle, env);
|
|
let pokemon = battle.get_pokemon(side, index);
|
|
wasm_ok(if let Some(pokemon) = pokemon {
|
|
ExternRef::<Pokemon>::func_new(&env, (&pokemon).into())
|
|
} else {
|
|
ExternRef::null()
|
|
})
|
|
}
|
|
|
|
fn battle_get_can_flee(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
wasm_ok(if get_value_call_getter!(battle.can_flee(), env) { 1 } else { 0 })
|
|
}
|
|
|
|
fn battle_get_number_of_sides(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
wasm_ok(get_value_call_getter!(battle.number_of_sides(), env))
|
|
}
|
|
|
|
fn battle_get_has_ended(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
wasm_ok(if get_value_call_getter!(battle.has_ended(), env) { 1u8 } else { 0u8 })
|
|
}
|
|
|
|
fn battle_get_has_ended_conclusively(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
let value = get_value_call_getter!(battle.result(), env);
|
|
wasm_ok(if value.is_conclusive() { 1 } else { 0 })
|
|
}
|
|
|
|
fn battle_get_winning_side(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u8> {
|
|
let value = get_value_call_getter!(battle.result(), env);
|
|
wasm_ok(if let BattleResult::Conclusive(result) = value {
|
|
result
|
|
} else {
|
|
0
|
|
})
|
|
}
|
|
|
|
fn battle_get_current_turn(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle: ExternRef<Battle>,
|
|
) -> WasmResult<u32> {
|
|
wasm_ok(get_value_call_getter!(battle.current_turn(), env))
|
|
}
|
|
|
|
fn battle_party_get_party(
|
|
env: FunctionEnvMut<WebAssemblyEnv>,
|
|
battle_party: ExternRef<BattleParty>,
|
|
) -> WasmResult<ExternRef<PokemonParty>> {
|
|
let battle_party = get_value_arc!(battle_party, env);
|
|
wasm_ok(ExternRef::<PokemonParty>::func_new(&env, battle_party.party().into()))
|
|
}
|
|
}
|