Major rework of extern ref system for WASM, fixes most possible panics in WASM handling
All checks were successful
continuous-integration/drone Build is passing
All checks were successful
continuous-integration/drone Build is passing
This commit is contained in:
@@ -5,10 +5,9 @@ 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, VecExternRef};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::StringKey;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -23,19 +22,27 @@ register! {
|
||||
fn battle_get_parties(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
battle: ExternRef<Battle>,
|
||||
) -> WasmResult<VecExternRef<BattleParty>> {
|
||||
let parties = get_value_call_getter!(battle.parties(), env);
|
||||
wasm_ok(VecExternRef::new(env.data().data().as_ref(), parties))
|
||||
) -> 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 value = get_value_call_getter!(battle.current_turn_queue(), env);
|
||||
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)
|
||||
ExternRef::<ChoiceQueue>::func_new(&env, queue.into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
@@ -45,24 +52,34 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
battle: ExternRef<Battle>,
|
||||
) -> WasmResult<ExternRef<dyn DynamicLibrary>> {
|
||||
let value = get_value_call_getter!(battle.library(), env);
|
||||
wasm_ok(ExternRef::<dyn DynamicLibrary>::func_new(&env, &value.clone()))
|
||||
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<VecExternRef<BattleSide>> {
|
||||
let value = get_value_arc!(battle, env);
|
||||
wasm_ok(VecExternRef::new(env.data().data().as_ref(), value.sides()))
|
||||
) -> 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 random = get_value_call_getter!(battle.random(), env);
|
||||
wasm_ok(ExternRef::<BattleRandom>::func_new(&env, random))
|
||||
let battle = get_value!(battle, env);
|
||||
let random = battle.random();
|
||||
wasm_ok(ExternRef::<BattleRandom>::func_new(&env, random.into()))
|
||||
}
|
||||
|
||||
fn battle_get_weather_name(
|
||||
@@ -72,7 +89,7 @@ register! {
|
||||
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)
|
||||
ExternRef::<StringKey>::func_new(&env, weather.into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
@@ -86,8 +103,8 @@ register! {
|
||||
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));
|
||||
if party.party().has_pokemon(&pokemon) {
|
||||
return wasm_ok(ExternRef::<BattleParty>::func_new(&env, party.into()));
|
||||
}
|
||||
}
|
||||
wasm_ok(ExternRef::<BattleParty>::null())
|
||||
@@ -101,7 +118,7 @@ register! {
|
||||
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)
|
||||
ExternRef::<Pokemon>::func_new(&env, (&pokemon).into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
@@ -159,7 +176,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
battle_party: ExternRef<BattleParty>,
|
||||
) -> WasmResult<ExternRef<PokemonParty>> {
|
||||
let value = get_value_call_getter!(battle_party.party(), env);
|
||||
wasm_ok(ExternRef::<PokemonParty>::func_new(&env, value.as_ref()))
|
||||
let battle_party = get_value_arc!(battle_party, env);
|
||||
wasm_ok(ExternRef::<PokemonParty>::func_new(&env, battle_party.party().into()))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
use crate::dynamic_data::BattleRandom;
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{
|
||||
get_value, get_value_call_getter, try_wasm, wasm_ok,
|
||||
};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{get_value_arc, try_wasm, wasm_ok};
|
||||
use crate::script_implementations::wasm::export_registry::{register, WasmResult};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow_ext::Context;
|
||||
|
||||
register! {
|
||||
fn battle_random_get(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
battle_random: ExternRef<BattleRandom>,
|
||||
) -> WasmResult<i32> {
|
||||
let v = get_value_call_getter!(battle_random.get(), env);
|
||||
let v = try_wasm!(v, env);
|
||||
let v = get_value_arc!(battle_random, env);
|
||||
let v = try_wasm!(v.get(), env);
|
||||
wasm_ok(v)
|
||||
}
|
||||
fn battle_random_get_max(
|
||||
@@ -23,7 +20,7 @@ register! {
|
||||
battle_random: ExternRef<BattleRandom>,
|
||||
max: i32
|
||||
) -> WasmResult<i32> {
|
||||
let battle_random = get_value!(battle_random, env);
|
||||
let battle_random = get_value_arc!(battle_random, env);
|
||||
let v = try_wasm!(battle_random.get_max(max), env);
|
||||
wasm_ok(v)
|
||||
}
|
||||
@@ -33,7 +30,7 @@ register! {
|
||||
min: i32,
|
||||
max: i32
|
||||
) -> WasmResult<i32> {
|
||||
let battle_random = get_value!(battle_random, env);
|
||||
let battle_random = get_value_arc!(battle_random, env);
|
||||
let v = try_wasm!(battle_random.get_between(min, max), env);
|
||||
wasm_ok(v)
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script::WebAssemblyScript;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow::anyhow;
|
||||
use anyhow_ext::Context;
|
||||
use std::ffi::CStr;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
@@ -46,7 +45,7 @@ register! {
|
||||
) -> WasmResult<ExternRef<Battle>> {
|
||||
let value = get_value_call_getter!(side.battle(), env);
|
||||
let value = try_wasm!(value, env);
|
||||
wasm_ok(ExternRef::func_new(&env, &value))
|
||||
wasm_ok(ExternRef::func_new(&env, (&value).into()))
|
||||
}
|
||||
|
||||
fn battleside_get_pokemon(
|
||||
@@ -55,11 +54,11 @@ register! {
|
||||
index: u32
|
||||
) -> WasmResult<ExternRef<Pokemon>> {
|
||||
let side = get_value!(side, env);
|
||||
wasm_ok(if let Some(Some(p)) = side.pokemon().get(index as usize) {
|
||||
ExternRef::<Pokemon>::func_new(&env, p.as_ref())
|
||||
let x = wasm_ok(if let Some(Some(p)) = side.pokemon().get(index as usize) {
|
||||
ExternRef::<Pokemon>::func_new(&env, p.into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
}); x
|
||||
}
|
||||
|
||||
fn battle_side_get_has_fled_battle(
|
||||
@@ -99,13 +98,13 @@ register! {
|
||||
side: ExternRef<BattleSide>,
|
||||
script_ptr: u32
|
||||
) -> WasmResult<u32> {
|
||||
let side : &BattleSide = get_value!(side, env);
|
||||
let side = get_value!(side, env);
|
||||
unsafe {
|
||||
let e = env.data().data();
|
||||
let name_func = try_wasm!(e.script_function_cache().script_get_name(&e), env);
|
||||
let name_ptr = try_wasm!(name_func.call(&mut e.store_mut(), script_ptr), env);
|
||||
let c_name: &CStr = CStr::from_ptr(e.get_raw_pointer(name_ptr));
|
||||
let script = try_wasm!(e.setup_script(script_ptr, ScriptCategory::Side, &c_name.as_ref().into(), side.into()), env);
|
||||
let script = try_wasm!(e.setup_script(script_ptr, ScriptCategory::Side, &c_name.as_ref().into(), (&side).into()), env);
|
||||
try_wasm!(e.script_function_cache().dealloc_cstring(&e, name_ptr), env);
|
||||
|
||||
if let Some(script) = script {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use crate::dynamic_data::{ChoiceQueue, Pokemon};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::get_value_arc;
|
||||
use crate::script_implementations::wasm::export_registry::{get_value, register, try_wasm, wasm_ok, WasmResult};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -11,9 +11,9 @@ register! {
|
||||
battle_random: ExternRef<ChoiceQueue>,
|
||||
pokemon: ExternRef<Pokemon>
|
||||
) -> WasmResult<u8> {
|
||||
let battle_random = get_value!(battle_random, env);
|
||||
let battle_random = get_value_arc!(battle_random, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let res = try_wasm!(battle_random.move_pokemon_choice_next(pokemon), env);
|
||||
let res = try_wasm!(battle_random.move_pokemon_choice_next(&pokemon), env);
|
||||
wasm_ok(u8::from(res))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
use crate::dynamic_data::{ExecutingMove, HitData, LearnedMove, Pokemon};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::get_value_arc;
|
||||
use crate::script_implementations::wasm::export_registry::{
|
||||
get_value, get_value_call_getter, register, try_wasm, wasm_ok, WasmResult,
|
||||
};
|
||||
use crate::script_implementations::wasm::export_registry::{get_value, register, try_wasm, wasm_ok, WasmResult};
|
||||
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::static_data::MoveData;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -15,31 +12,32 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<ExternRef<Pokemon>> {
|
||||
let user = get_value_call_getter!(executing_move.user(), env);
|
||||
wasm_ok(ExternRef::<Pokemon>::func_new(&env, user.as_ref()))
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
wasm_ok(ExternRef::<Pokemon>::func_new(&env, executing_move.user().into()))
|
||||
}
|
||||
|
||||
fn executing_move_get_use_move(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<ExternRef<dyn MoveData>> {
|
||||
let use_move = get_value_call_getter!(executing_move.use_move(), env);
|
||||
wasm_ok(ExternRef::<dyn MoveData>::func_new(&env, use_move))
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
wasm_ok(ExternRef::<dyn MoveData>::func_new(&env, executing_move.use_move().into()))
|
||||
}
|
||||
|
||||
fn executing_move_get_chosen_move(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<ExternRef<LearnedMove>> {
|
||||
let chosen_move = get_value_call_getter!(executing_move.chosen_move(), env);
|
||||
wasm_ok(ExternRef::<LearnedMove>::func_new(&env, chosen_move.as_ref()))
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
wasm_ok(ExternRef::<LearnedMove>::func_new(&env, executing_move.chosen_move().into()))
|
||||
}
|
||||
|
||||
fn executing_move_get_number_of_hits(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<u8> {
|
||||
wasm_ok(get_value_call_getter!(executing_move.number_of_hits(), env))
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
wasm_ok(executing_move.number_of_hits())
|
||||
}
|
||||
|
||||
fn executing_move_get_hit_data(
|
||||
@@ -48,17 +46,18 @@ register! {
|
||||
target: ExternRef<Pokemon>,
|
||||
hit: u8
|
||||
) -> WasmResult<ExternRef<HitData>> {
|
||||
let executing_move = get_value!(executing_move, env);
|
||||
let target = get_value_arc!(target, env);
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
let target = get_value!(target, env);
|
||||
let hit_data = try_wasm!(executing_move.get_hit_data(&target, hit), env);
|
||||
wasm_ok(ExternRef::<HitData>::func_new(&env, hit_data))
|
||||
wasm_ok(ExternRef::<HitData>::func_new(&env, hit_data.into()))
|
||||
}
|
||||
|
||||
fn executing_move_get_number_of_targets(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<u32> {
|
||||
wasm_ok(get_value_call_getter!(executing_move.target_count(), env) as u32)
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
wasm_ok(executing_move.target_count() as u32)
|
||||
}
|
||||
|
||||
fn executing_move_is_pokemon_target(
|
||||
@@ -66,8 +65,8 @@ register! {
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
pokemon: ExternRef<Pokemon>
|
||||
) -> WasmResult<u8> {
|
||||
let executing_move = get_value!(executing_move, env);
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if executing_move.is_pokemon_target(&pokemon) { 1 } else { 0 })
|
||||
}
|
||||
|
||||
@@ -77,7 +76,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
executing_move: ExternRef<ExecutingMove>,
|
||||
) -> WasmResult<u32> {
|
||||
let executing_move = get_value!(executing_move, env);
|
||||
let executing_move = get_value_arc!(executing_move, env);
|
||||
let script = executing_move.script();
|
||||
if script.is_any() {
|
||||
let script = try_wasm!(script.get_as::<WebAssemblyScript>(), env);
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
use crate::dynamic_data::HitData;
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{
|
||||
get_value_call_getter, get_value_void, wasm_ok, WasmVoidResultExtension,
|
||||
get_value_arc, get_value_arc_void, wasm_ok, WasmVoidResultExtension,
|
||||
};
|
||||
use crate::script_implementations::wasm::export_registry::{register, WasmResult, WasmVoidResult};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -13,22 +12,23 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmResult<u32> {
|
||||
wasm_ok(get_value_call_getter!(hit.damage(), env))
|
||||
let hit = get_value_arc!(hit, env);
|
||||
wasm_ok(hit.damage())
|
||||
}
|
||||
|
||||
fn hit_data_is_critical(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmResult<u8> {
|
||||
let is_critical = get_value_call_getter!(hit.is_critical(), env);
|
||||
wasm_ok(u8::from(is_critical))
|
||||
let hit = get_value_arc!(hit, env);
|
||||
wasm_ok(u8::from(hit.is_critical()))
|
||||
}
|
||||
|
||||
fn hit_data_fail(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmVoidResult {
|
||||
let hit = get_value_void!(hit, env);
|
||||
let hit = get_value_arc_void!(hit, env);
|
||||
hit.fail();
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -37,21 +37,24 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmResult<u8> {
|
||||
wasm_ok(get_value_call_getter!(hit.base_power(), env))
|
||||
let hit = get_value_arc!(hit, env);
|
||||
wasm_ok(hit.base_power())
|
||||
}
|
||||
|
||||
fn hit_data_get_effectiveness(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmResult<f32> {
|
||||
wasm_ok(get_value_call_getter!(hit.effectiveness(), env))
|
||||
let hit = get_value_arc!(hit, env);
|
||||
wasm_ok(hit.effectiveness())
|
||||
}
|
||||
|
||||
fn hit_data_get_move_type(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
hit: ExternRef<HitData>,
|
||||
) -> WasmResult<u8> {
|
||||
wasm_ok(get_value_call_getter!(hit.move_type(), env).into())
|
||||
let hit = get_value_arc!(hit, env);
|
||||
wasm_ok(hit.move_type().into())
|
||||
}
|
||||
|
||||
fn hit_data_set_critical(
|
||||
@@ -59,7 +62,7 @@ register! {
|
||||
hit: ExternRef<HitData>,
|
||||
value: u8
|
||||
) -> WasmVoidResult {
|
||||
let hit = get_value_void!(hit, env);
|
||||
let hit = get_value_arc_void!(hit, env);
|
||||
hit.set_critical(value == 1);
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -69,7 +72,7 @@ register! {
|
||||
hit: ExternRef<HitData>,
|
||||
effectiveness: f32
|
||||
) -> WasmVoidResult {
|
||||
let hit = get_value_void!(hit, env);
|
||||
let hit = get_value_arc_void!(hit, env);
|
||||
hit.set_effectiveness(effectiveness);
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -79,7 +82,7 @@ register! {
|
||||
hit: ExternRef<HitData>,
|
||||
damage: u32
|
||||
) -> WasmVoidResult {
|
||||
let hit = get_value_void!(hit, env);
|
||||
let hit = get_value_arc_void!(hit, env);
|
||||
hit.set_damage(damage);
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -89,7 +92,7 @@ register! {
|
||||
hit: ExternRef<HitData>,
|
||||
move_type: u8
|
||||
) -> WasmVoidResult {
|
||||
let hit = get_value_void!(hit, env);
|
||||
let hit = get_value_arc_void!(hit, env);
|
||||
hit.set_move_type(move_type.into());
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
|
||||
@@ -2,13 +2,12 @@ use std::intrinsics::transmute;
|
||||
|
||||
use crate::dynamic_data::{LearnedMove, MoveLearnMethod};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{
|
||||
get_value_call_getter, get_value_void, wasm_ok, WasmVoidResult, WasmVoidResultExtension,
|
||||
get_value_arc, get_value_arc_void, wasm_ok, WasmVoidResult, WasmVoidResultExtension,
|
||||
};
|
||||
use crate::script_implementations::wasm::export_registry::{register, WasmResult};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::static_data::MoveData;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -17,8 +16,8 @@ register! {
|
||||
turn_choice: ExternRef<LearnedMove>,
|
||||
) -> WasmResult<u8> {
|
||||
unsafe {
|
||||
let learn_method = get_value_call_getter!(turn_choice.learn_method(), &env);
|
||||
wasm_ok(transmute::<MoveLearnMethod, u8>(learn_method))
|
||||
let learned_move = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(transmute::<MoveLearnMethod, u8>(learned_move.learn_method()))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,15 +25,15 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<LearnedMove>,
|
||||
) -> WasmResult<ExternRef<dyn MoveData>> {
|
||||
let move_data = get_value_call_getter!(turn_choice.move_data(), &env);
|
||||
wasm_ok(ExternRef::<dyn MoveData>::func_new(&env, move_data))
|
||||
let turn_choice = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(ExternRef::func_new(&env, turn_choice.move_data().into()))
|
||||
}
|
||||
|
||||
fn learned_move_restore_all_uses(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<LearnedMove>,
|
||||
) -> WasmVoidResult {
|
||||
let turn_choice = get_value_void!(turn_choice, env);
|
||||
let turn_choice = get_value_arc_void!(turn_choice, env);
|
||||
turn_choice.restore_all_uses();
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -44,7 +43,7 @@ register! {
|
||||
turn_choice: ExternRef<LearnedMove>,
|
||||
amount: u8,
|
||||
) -> WasmVoidResult {
|
||||
let turn_choice = get_value_void!(turn_choice, env);
|
||||
let turn_choice = get_value_arc_void!(turn_choice, env);
|
||||
turn_choice.restore_uses(amount);
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
|
||||
@@ -2,12 +2,10 @@ use crate::dynamic_data::{DynamicLibrary, ScriptOwnerData};
|
||||
use crate::script_implementations::wasm::export_registry::register;
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{try_wasm, wasm_ok, WasmResult};
|
||||
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;
|
||||
use anyhow_ext::Context;
|
||||
|
||||
/// The battle registration
|
||||
mod battle;
|
||||
@@ -37,25 +35,23 @@ register! {
|
||||
) -> WasmResult<ExternRef<dyn StaticData>> {
|
||||
let dynamic_lib = try_wasm!(dynamic_lib.value_func_arc(&env), env);
|
||||
let static_data = dynamic_lib.static_data();
|
||||
wasm_ok(ExternRef::<dyn StaticData>::func_new(&env, static_data))
|
||||
wasm_ok(ExternRef::<dyn StaticData>::func_new(&env, static_data.into()))
|
||||
}
|
||||
|
||||
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
|
||||
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.into()) as u32,
|
||||
ScriptOwnerData::BattleSide(p) => env.data().data().get_extern_ref_index(p.into()) as u32,
|
||||
ScriptOwnerData::Battle(p) => env.data().data().get_extern_ref_index(p.into()) as u32,
|
||||
ScriptOwnerData::None => 0,
|
||||
}
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
use crate::dynamic_data::{Pokemon, PokemonParty};
|
||||
use crate::script_implementations::wasm::export_registry::register;
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{get_value, wasm_ok, WasmResult};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{get_value_arc, wasm_ok, WasmResult};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow_ext::Context;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -12,20 +11,20 @@ register! {
|
||||
party: ExternRef<PokemonParty>,
|
||||
index: u32
|
||||
) -> WasmResult<ExternRef<Pokemon>> {
|
||||
let party = get_value!(party, env);
|
||||
wasm_ok(
|
||||
let party = get_value_arc!(party, env);
|
||||
let x = wasm_ok(
|
||||
if let Some(Some(v)) = &party.pokemon().get(index as usize) {
|
||||
ExternRef::func_new(&env, v.as_ref())
|
||||
ExternRef::func_new(&env, v.into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
}); x
|
||||
}
|
||||
|
||||
fn party_get_length(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
party: ExternRef<PokemonParty>,
|
||||
) -> WasmResult<u32> {
|
||||
let party = get_value!(party, env);
|
||||
let party = get_value_arc!(party, env);
|
||||
wasm_ok(party.length() as u32)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ use std::mem::transmute;
|
||||
use crate::defines::LevelInt;
|
||||
use crate::dynamic_data::{Battle, DynamicLibrary, LearnedMove, Pokemon, VolatileScriptsOwner};
|
||||
use crate::script_implementations::wasm::export_registry::{
|
||||
get_value_arc, get_value_arc_void, get_value_call_getter, get_value_void, register, try_wasm, wasm_err, wasm_ok,
|
||||
WasmResult, WasmVoidResult, WasmVoidResultExtension,
|
||||
get_value, get_value_arc, get_value_arc_void, get_value_call_getter, get_value_void, register, try_wasm, wasm_err,
|
||||
wasm_ok, WasmResult, WasmVoidResult, WasmVoidResultExtension,
|
||||
};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script::WebAssemblyScript;
|
||||
@@ -13,7 +13,6 @@ use crate::static_data::{Ability, ClampedStatisticSet, Form, Nature, Species};
|
||||
use crate::static_data::{Item, StatisticSet};
|
||||
use crate::{ScriptCategory, VecExt};
|
||||
use anyhow::anyhow;
|
||||
use anyhow_ext::Context;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
@@ -22,56 +21,62 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn DynamicLibrary>> {
|
||||
let lib = get_value_call_getter!(pokemon.library(), env).clone();
|
||||
wasm_ok(ExternRef::<dyn DynamicLibrary>::func_new(&env, &lib))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let lib = pokemon.library();
|
||||
wasm_ok(ExternRef::<dyn DynamicLibrary>::func_new(&env, lib.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_boosted_stats(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<StatisticSet<u32>>> {
|
||||
let statistic_set = get_value_call_getter!(pokemon.boosted_stats(), env).clone();
|
||||
wasm_ok(ExternRef::<StatisticSet<u32>>::func_new(&env, statistic_set))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let statistic_set = pokemon.boosted_stats();
|
||||
wasm_ok(ExternRef::<StatisticSet<u32>>::func_new(&env, statistic_set.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_flat_stats(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<StatisticSet<u32>>> {
|
||||
let statistic_set = get_value_call_getter!(pokemon.flat_stats(), env).clone();
|
||||
wasm_ok(ExternRef::<StatisticSet<u32>>::func_new(&env, statistic_set))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let statistic_set = pokemon.flat_stats();
|
||||
wasm_ok(ExternRef::<StatisticSet<u32>>::func_new(&env, statistic_set.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_stat_boosts(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<ClampedStatisticSet<i8, -6, 6>>> {
|
||||
let statistic_set = get_value_call_getter!(pokemon.stat_boosts(), env).clone();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<i8, -6, 6>>::func_new(&env, statistic_set))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let statistic_set = pokemon.stat_boosts();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<i8, -6, 6>>::func_new(&env, statistic_set.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_individual_values(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<ClampedStatisticSet<u8, 0, 31>>> {
|
||||
let statistic_set = get_value_call_getter!(pokemon.individual_values(), env).clone();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<u8, 0, 31>>::func_new(&env, statistic_set))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let statistic_set = pokemon.individual_values();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<u8, 0, 31>>::func_new(&env, statistic_set.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_effort_values(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<ClampedStatisticSet<u8, 0, 252>>> {
|
||||
let statistic_set = get_value_call_getter!(pokemon.effort_values(), env).clone();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<u8, 0, 252>>::func_new(&env, statistic_set))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let statistic_set = pokemon.effort_values();
|
||||
wasm_ok(ExternRef::<ClampedStatisticSet<u8, 0, 252>>::func_new(&env, statistic_set.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_species(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Species>> {
|
||||
let species = get_value_call_getter!(pokemon.species(), env).clone();
|
||||
wasm_ok(ExternRef::<dyn Species>::func_new(&env, &species))
|
||||
let species = get_value_call_getter!(pokemon.species(), env);
|
||||
wasm_ok(ExternRef::<dyn Species>::func_new(&env, (&species).into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_weight(
|
||||
@@ -134,11 +139,11 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
index: u32
|
||||
) -> WasmResult<ExternRef<LearnedMove>> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let read_lock = pokemon.learned_moves().read();
|
||||
let mv = read_lock.get(index as usize);
|
||||
wasm_ok(if let Some(Some(mv)) = mv {
|
||||
ExternRef::<LearnedMove>::func_new(&env, mv)
|
||||
ExternRef::<LearnedMove>::func_new(&env, mv.into())
|
||||
}
|
||||
else{
|
||||
ExternRef::<LearnedMove>::null()
|
||||
@@ -153,7 +158,7 @@ register! {
|
||||
self_inflicted: u8
|
||||
) -> WasmResult<u8> {
|
||||
unsafe{
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let res = try_wasm!(pokemon.change_stat_boost(transmute(stat), amount, self_inflicted == 1), env);
|
||||
wasm_ok(u8::from(res))
|
||||
}
|
||||
@@ -163,11 +168,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<Battle>> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if let Some(battle) = pokemon.get_battle() {
|
||||
let r = ExternRef::func_new(&env, &battle);
|
||||
std::mem::forget(battle);
|
||||
r
|
||||
ExternRef::func_new(&env, (&battle).into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
@@ -177,7 +180,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if let Some(i) = pokemon.get_battle_index() {
|
||||
i
|
||||
} else {
|
||||
@@ -189,7 +192,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if let Some(i) = pokemon.get_battle_side_index() {
|
||||
i
|
||||
} else {
|
||||
@@ -201,10 +204,10 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Item>> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let read_lock = pokemon.held_item().read();
|
||||
wasm_ok(if let Some(item) = read_lock.as_ref() {
|
||||
ExternRef::<dyn Item>::func_new(&env, item.as_ref())
|
||||
ExternRef::<dyn Item>::func_new(&env, item.into())
|
||||
} else {
|
||||
ExternRef::<dyn Item>::null()
|
||||
})
|
||||
@@ -217,7 +220,7 @@ register! {
|
||||
) -> WasmResult<u8> {
|
||||
let name : *mut c_char = env.data().data().get_raw_pointer(name);
|
||||
let name = unsafe { CStr::from_ptr(name) };
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(u8::from(pokemon.has_held_item(&name.into())))
|
||||
}
|
||||
|
||||
@@ -227,7 +230,7 @@ register! {
|
||||
amount: u32,
|
||||
allow_revive: u8
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(u8::from(pokemon.heal(amount, allow_revive == 1)))
|
||||
}
|
||||
|
||||
@@ -248,14 +251,16 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Ability>> {
|
||||
let active_ability = get_value_call_getter!(pokemon.active_ability(), env);
|
||||
wasm_ok(ExternRef::<dyn Ability>::func_new(&env, &active_ability))
|
||||
let active_ability = try_wasm!(active_ability, env);
|
||||
wasm_ok(ExternRef::<dyn Ability>::func_new(&env, (&active_ability).into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_real_ability(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u16> {
|
||||
let index = get_value_call_getter!(pokemon.real_ability(), env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let index = pokemon.real_ability();
|
||||
let t: (u8, u8) = (if index.hidden { 1 } else { 0 }, index.index);
|
||||
let r: u16 = unsafe { transmute(t) };
|
||||
wasm_ok(r)
|
||||
@@ -265,7 +270,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if pokemon.is_ability_overriden() { 1 } else { 0 })
|
||||
}
|
||||
|
||||
@@ -273,7 +278,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if pokemon.allowed_experience_gain() { 1 } else { 0 })
|
||||
}
|
||||
|
||||
@@ -281,7 +286,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if pokemon.is_usable() { 1 } else { 0 })
|
||||
}
|
||||
|
||||
@@ -292,10 +297,10 @@ register! {
|
||||
item: ExternRef<dyn Item>
|
||||
) -> WasmResult<ExternRef<dyn Item>> {
|
||||
let item = get_value_arc!(item, env);
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let old_item = pokemon.set_held_item(&item);
|
||||
wasm_ok(if let Some(old_item) = old_item {
|
||||
ExternRef::<dyn Item>::func_new(&env, &old_item)
|
||||
ExternRef::<dyn Item>::func_new(&env, (&old_item).into())
|
||||
} else {
|
||||
ExternRef::null()
|
||||
})
|
||||
@@ -305,10 +310,10 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Item>> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let old_item = pokemon.remove_held_item();
|
||||
wasm_ok(if let Some(old_item) = old_item {
|
||||
ExternRef::<dyn Item>::func_new(&env, &old_item)
|
||||
ExternRef::<dyn Item>::func_new(&env, (&old_item).into())
|
||||
} else {
|
||||
ExternRef::<dyn Item>::null()
|
||||
})
|
||||
@@ -318,7 +323,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let res = try_wasm!(pokemon.consume_held_item(), env);
|
||||
wasm_ok(if res { 1 } else { 0 })
|
||||
}
|
||||
@@ -327,7 +332,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>
|
||||
) -> WasmResult<u32> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let len = pokemon.types().len();
|
||||
wasm_ok(len as u32)
|
||||
}
|
||||
@@ -337,7 +342,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
index: u32
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let types = pokemon.types();
|
||||
let type_v = types.get_res(index as usize);
|
||||
match type_v {
|
||||
@@ -351,7 +356,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
t: u8
|
||||
) -> WasmResult<u8> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(if pokemon.types().contains(&t.into()) { 1 } else { 0 })
|
||||
}
|
||||
|
||||
@@ -398,8 +403,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Nature>> {
|
||||
let nature = get_value_call_getter!(pokemon.nature(), env);
|
||||
wasm_ok(ExternRef::<dyn Nature>::func_new(&env, nature))
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let nature = pokemon.nature();
|
||||
wasm_ok(ExternRef::<dyn Nature>::func_new(&env, nature.into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_form(
|
||||
@@ -407,7 +413,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Form>> {
|
||||
let form = get_value_call_getter!(pokemon.form(), env);
|
||||
wasm_ok(ExternRef::<dyn Form>::func_new(&env, &form))
|
||||
wasm_ok(ExternRef::<dyn Form>::func_new(&env, (&form).into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_display_species(
|
||||
@@ -415,7 +421,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Species>> {
|
||||
let display_species = get_value_call_getter!(pokemon.display_species(), env);
|
||||
wasm_ok(ExternRef::<dyn Species>::func_new(&env, &display_species))
|
||||
wasm_ok(ExternRef::<dyn Species>::func_new(&env, (&display_species).into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_display_form(
|
||||
@@ -423,7 +429,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<ExternRef<dyn Form>> {
|
||||
let display_form = get_value_call_getter!(pokemon.display_form(), env);
|
||||
wasm_ok(ExternRef::<dyn Form>::func_new(&env, &display_form))
|
||||
wasm_ok(ExternRef::<dyn Form>::func_new(&env, (&display_form).into()))
|
||||
}
|
||||
|
||||
fn pokemon_get_level(
|
||||
@@ -458,7 +464,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u32> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let nickname = pokemon.nickname();
|
||||
if let Some(nickname) = nickname {
|
||||
let nickname: CString = match CString::new(nickname.as_str()) {
|
||||
@@ -482,7 +488,7 @@ register! {
|
||||
name_ptr: u32
|
||||
) -> WasmResult<u32> {
|
||||
unsafe {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
||||
let script = try_wasm!(pokemon.add_volatile_script(&c_name.as_ref().into()), env);
|
||||
if let Some(script) = script {
|
||||
@@ -499,7 +505,7 @@ register! {
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
script_ptr: u32
|
||||
) -> WasmResult<u32> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
unsafe{
|
||||
let env_data = env.data().data();
|
||||
let name_ptr = match try_wasm!(env_data.script_function_cache().script_get_name(&env_data), env).call(&mut env_data.store_mut(), script_ptr){
|
||||
@@ -507,14 +513,14 @@ register! {
|
||||
Err(e) => return wasm_err::<u32>(e.into(), &env)
|
||||
};
|
||||
let c_name: &CStr = CStr::from_ptr(env_data.get_raw_pointer(name_ptr));
|
||||
let script = try_wasm!(env_data.setup_script(script_ptr, ScriptCategory::Pokemon, &c_name.as_ref().into(), pokemon.as_ref().into()), env);
|
||||
let script = try_wasm!(env_data.setup_script(script_ptr, ScriptCategory::Pokemon, &c_name.as_ref().into(), (&pokemon).into()), env);
|
||||
try_wasm!(env_data.script_function_cache().dealloc_cstring(&env_data, name_ptr), env);
|
||||
|
||||
if let Some(script) = script {
|
||||
let script = try_wasm!(pokemon.add_volatile_script_with_script(script), env);
|
||||
let s = match script.as_ref() {
|
||||
Some(s) => s,
|
||||
None => return wasm_err::<u32>(anyhow!("Unable to get script").into(), &env)
|
||||
None => return wasm_err::<u32>(anyhow!("Unable to get script"), &env)
|
||||
};
|
||||
let s = try_wasm!(s.get_as::<WebAssemblyScript>(), env);
|
||||
wasm_ok(s.get_wasm_pointer())
|
||||
@@ -531,7 +537,7 @@ register! {
|
||||
) -> WasmResult<u8> {
|
||||
unsafe {
|
||||
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
wasm_ok(u8::from(pokemon.has_volatile_script(&c_name.as_ref().into())))
|
||||
}
|
||||
}
|
||||
@@ -543,7 +549,7 @@ register! {
|
||||
) -> WasmResult<u32> {
|
||||
unsafe {
|
||||
let c_name = CStr::from_ptr(env.data().data().get_raw_pointer(name_ptr));
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let script = pokemon.get_volatile_script(&c_name.as_ref().into());
|
||||
wasm_ok(if let Some(script) = script {
|
||||
let script = try_wasm!(script.get_as::<WebAssemblyScript>(), env);
|
||||
@@ -564,7 +570,7 @@ register! {
|
||||
let pokemon = get_value_void!(pokemon, env);
|
||||
match pokemon.remove_volatile_script(&c_name.as_ref().into()) {
|
||||
Ok(_) => WasmVoidResult::ok(),
|
||||
Err(e) => WasmVoidResult::err(e.into(), &env)
|
||||
Err(e) => WasmVoidResult::err(e, &env)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -573,7 +579,7 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
pokemon: ExternRef<Pokemon>,
|
||||
) -> WasmResult<u32> {
|
||||
let pokemon = get_value_arc!(pokemon, env);
|
||||
let pokemon = get_value!(pokemon, env);
|
||||
let script = pokemon.ability_script();
|
||||
if script.is_any() {
|
||||
let script = try_wasm!(script.get_as::<WebAssemblyScript>(), env);
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
use crate::dynamic_data::{LearnedMove, Pokemon, TurnChoice};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{
|
||||
get_value, get_value_call_getter, get_value_void, wasm_err,
|
||||
};
|
||||
use crate::script_implementations::wasm::export_registry::wasm_result::{get_value_arc, get_value_arc_void, wasm_err};
|
||||
use crate::script_implementations::wasm::export_registry::{
|
||||
register, wasm_ok, WasmResult, WasmVoidResult, WasmVoidResultExtension,
|
||||
};
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script::WebAssemblyScript;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use anyhow_ext::Context;
|
||||
use std::ops::Deref;
|
||||
use wasmer::FunctionEnvMut;
|
||||
|
||||
register! {
|
||||
@@ -17,16 +15,16 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<ExternRef<Pokemon>> {
|
||||
let user = get_value_call_getter!(turn_choice.user(), &env);
|
||||
wasm_ok(ExternRef::func_new(&env, user))
|
||||
let turn_choice = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(ExternRef::func_new(&env, turn_choice.user().into()))
|
||||
}
|
||||
|
||||
fn turn_choice_get_kind(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u8> {
|
||||
let turn_choice = get_value!(turn_choice, env);
|
||||
wasm_ok(match turn_choice {
|
||||
let turn_choice = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(match turn_choice.deref() {
|
||||
TurnChoice::Move(_) => 0,
|
||||
TurnChoice::Item(_) => 1,
|
||||
TurnChoice::Switch(_) => 2,
|
||||
@@ -39,21 +37,23 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u32> {
|
||||
wasm_ok(get_value_call_getter!(turn_choice.speed(), &env))
|
||||
let turn_choice = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(turn_choice.speed())
|
||||
}
|
||||
|
||||
fn turn_choice_has_failed(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u8> {
|
||||
wasm_ok(if get_value_call_getter!(turn_choice.has_failed(), &env) { 1 } else { 0 })
|
||||
let turn_choice = get_value_arc!(turn_choice, env);
|
||||
wasm_ok(if turn_choice.has_failed() { 1 } else { 0 })
|
||||
}
|
||||
|
||||
fn turn_choice_fail(
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmVoidResult {
|
||||
let turn_choice = get_value_void!(turn_choice, env);
|
||||
let turn_choice = get_value_arc_void!(turn_choice, env);
|
||||
turn_choice.fail();
|
||||
WasmVoidResult::ok()
|
||||
}
|
||||
@@ -63,9 +63,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<i8> {
|
||||
return match turn_choice.value_func(&env) {
|
||||
return match turn_choice.value_func_arc(&env) {
|
||||
Ok(v) => {
|
||||
match v {
|
||||
match v.deref() {
|
||||
TurnChoice::Move(m) => wasm_ok(m.priority()),
|
||||
_ => wasm_err::<i8>(anyhow_ext::anyhow!("Invalid turn choice"), &env)
|
||||
}
|
||||
@@ -78,10 +78,10 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<ExternRef<LearnedMove>> {
|
||||
return match turn_choice.value_func(&env) {
|
||||
return match turn_choice.value_func_arc(&env) {
|
||||
Ok(v) => {
|
||||
match v {
|
||||
TurnChoice::Move(m) => wasm_ok(ExternRef::<LearnedMove>::func_new(&env, m.used_move())),
|
||||
match v.deref() {
|
||||
TurnChoice::Move(m) => wasm_ok(ExternRef::func_new(&env, m.used_move().into())),
|
||||
_ => wasm_err::<ExternRef<LearnedMove>>(anyhow_ext::anyhow!("Invalid turn choice"), &env)
|
||||
}
|
||||
},
|
||||
@@ -93,9 +93,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u8> {
|
||||
return match turn_choice.value_func(&env) {
|
||||
return match turn_choice.value_func_arc(&env) {
|
||||
Ok(v) => {
|
||||
match v {
|
||||
match v.deref() {
|
||||
TurnChoice::Move(m) => wasm_ok(m.target_side()),
|
||||
_ => wasm_err::<u8>(anyhow_ext::anyhow!("Invalid turn choice"), &env)
|
||||
}
|
||||
@@ -108,9 +108,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u8> {
|
||||
return match turn_choice.value_func(&env) {
|
||||
return match turn_choice.value_func_arc(&env) {
|
||||
Ok(v) => {
|
||||
match v {
|
||||
match v.deref() {
|
||||
TurnChoice::Move(m) => wasm_ok(m.target_index()),
|
||||
_ => wasm_err::<u8>(anyhow_ext::anyhow!("Invalid turn choice"), &env)
|
||||
}
|
||||
@@ -123,9 +123,9 @@ register! {
|
||||
env: FunctionEnvMut<WebAssemblyEnv>,
|
||||
turn_choice: ExternRef<TurnChoice>,
|
||||
) -> WasmResult<u32> {
|
||||
return match turn_choice.value_func(&env) {
|
||||
return match turn_choice.value_func_arc(&env) {
|
||||
Ok(v) => {
|
||||
match v {
|
||||
match v.deref() {
|
||||
TurnChoice::Move(d) => {
|
||||
if let Some(script) = d.script().get() {
|
||||
let read_lock = script.read();
|
||||
|
||||
Reference in New Issue
Block a user