64 lines
1.9 KiB
Rust
64 lines
1.9 KiB
Rust
use crate::app_interface::{Battle, Pokemon};
|
|
use crate::handling::cached_value::CachedValue;
|
|
use crate::handling::Cacheable;
|
|
use crate::{
|
|
cached_value, cached_value_getters, wasm_value_getters, ExternRef, ExternalReferenceType,
|
|
};
|
|
use alloc::rc::Rc;
|
|
|
|
struct BattleSideInner {
|
|
reference: ExternRef<BattleSide>,
|
|
side_index: CachedValue<u8>,
|
|
pokemon_per_side: CachedValue<u8>,
|
|
battle: CachedValue<Battle>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct BattleSide {
|
|
inner: Rc<BattleSideInner>,
|
|
}
|
|
|
|
impl BattleSide {
|
|
pub fn new(reference: ExternRef<Self>) -> Self {
|
|
Self::from_ref(reference, &|reference| Self {
|
|
inner: Rc::new(BattleSideInner {
|
|
reference,
|
|
side_index: cached_value!({ battleside_get_side_index(reference) }),
|
|
pokemon_per_side: cached_value!({ battleside_get_pokemon_per_side(reference) }),
|
|
battle: cached_value!({ battleside_get_battle(reference).get_value().unwrap() }),
|
|
}),
|
|
})
|
|
}
|
|
|
|
cached_value_getters! {
|
|
pub fn side_index(&self) -> u8;
|
|
pub fn pokemon_per_side(&self) -> u8;
|
|
pub fn battle(&self) -> Battle;
|
|
}
|
|
|
|
pub fn get_pokemon(&self, index: usize) -> Option<Pokemon> {
|
|
unsafe { battleside_get_pokemon(self.inner.reference, index).get_value() }
|
|
}
|
|
}
|
|
|
|
wasm_value_getters! {
|
|
BattleSide,
|
|
pub fn has_fled_battle(&self) -> bool;
|
|
pub fn is_defeated(&self) -> bool;
|
|
}
|
|
|
|
crate::handling::cacheable::cacheable!(BattleSide);
|
|
|
|
impl ExternalReferenceType for BattleSide {
|
|
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
|
Self::new(reference)
|
|
}
|
|
}
|
|
|
|
extern "wasm" {
|
|
fn battleside_get_side_index(r: ExternRef<BattleSide>) -> u8;
|
|
fn battleside_get_pokemon_per_side(r: ExternRef<BattleSide>) -> u8;
|
|
fn battleside_get_battle(r: ExternRef<BattleSide>) -> ExternRef<Battle>;
|
|
fn battleside_get_pokemon(r: ExternRef<BattleSide>, index: usize) -> ExternRef<Pokemon>;
|
|
}
|