2022-08-14 11:37:17 +00:00
|
|
|
use crate::app_interface::{BattleParty, BattleRandom, BattleSide, Pokemon};
|
|
|
|
use crate::handling::cached_value::CachedValue;
|
|
|
|
use crate::handling::Cacheable;
|
|
|
|
use crate::{
|
|
|
|
cached_value, cached_value_getters, wasm_value_getters, DynamicLibrary, ExternRef,
|
|
|
|
ExternalReferenceType, ImmutableList, VecExternRef,
|
|
|
|
};
|
|
|
|
use alloc::rc::Rc;
|
|
|
|
|
|
|
|
struct BattleInner {
|
|
|
|
reference: ExternRef<Battle>,
|
|
|
|
library: CachedValue<DynamicLibrary>,
|
|
|
|
parties: CachedValue<ImmutableList<BattleParty>>,
|
|
|
|
sides: CachedValue<ImmutableList<BattleSide>>,
|
|
|
|
random: CachedValue<BattleRandom>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct Battle {
|
|
|
|
inner: Rc<BattleInner>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Battle {
|
2022-08-17 16:05:38 +00:00
|
|
|
#[cfg(not(feature = "mock_data"))]
|
2022-08-14 11:37:17 +00:00
|
|
|
pub fn new(reference: ExternRef<Battle>) -> Self {
|
|
|
|
Self::from_ref(reference, &|reference| Self {
|
|
|
|
inner: Rc::new(BattleInner {
|
|
|
|
reference,
|
|
|
|
library: cached_value!({ battle_get_library(reference).get_value().unwrap() }),
|
|
|
|
parties: cached_value!({ battle_get_parties(reference).get_immutable_list() }),
|
|
|
|
sides: cached_value!({ battle_get_sides(reference).get_immutable_list() }),
|
|
|
|
random: cached_value!({ battle_get_random(reference).get_value().unwrap() }),
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
cached_value_getters! {
|
|
|
|
pub fn library(&self) -> DynamicLibrary;
|
|
|
|
pub fn parties(&self) -> ImmutableList<BattleParty>;
|
|
|
|
pub fn sides(&self) -> ImmutableList<BattleSide>;
|
|
|
|
}
|
|
|
|
|
2022-08-17 16:05:38 +00:00
|
|
|
#[cfg(not(feature = "mock_data"))]
|
2022-08-14 11:37:17 +00:00
|
|
|
pub fn get_pokemon(&self, side: u8, index: u8) -> Option<Pokemon> {
|
|
|
|
unsafe { battle_get_pokemon(self.inner.reference, side, index).get_value() }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
wasm_value_getters! {
|
|
|
|
Battle,
|
|
|
|
pub fn can_flee(&self) -> bool;
|
|
|
|
pub fn number_of_sides(&self) -> u8;
|
|
|
|
pub fn pokemon_per_side(&self) -> u8;
|
|
|
|
pub fn has_ended(&self) -> bool;
|
|
|
|
pub fn has_ended_conclusively(&self) -> bool;
|
|
|
|
pub fn winning_side(&self) -> u8;
|
|
|
|
pub fn current_turn(&self) -> u32;
|
|
|
|
}
|
|
|
|
|
|
|
|
crate::handling::cacheable::cacheable!(Battle);
|
|
|
|
|
2022-08-17 16:05:38 +00:00
|
|
|
#[cfg(not(feature = "mock_data"))]
|
2022-08-14 11:37:17 +00:00
|
|
|
impl ExternalReferenceType for Battle {
|
|
|
|
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
|
|
|
Self::new(reference)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-17 16:05:38 +00:00
|
|
|
#[cfg(not(feature = "mock_data"))]
|
2022-08-14 11:37:17 +00:00
|
|
|
extern "wasm" {
|
|
|
|
fn battle_get_library(r: ExternRef<Battle>) -> ExternRef<DynamicLibrary>;
|
|
|
|
fn battle_get_parties(r: ExternRef<Battle>) -> VecExternRef<BattleParty>;
|
|
|
|
fn battle_get_sides(r: ExternRef<Battle>) -> VecExternRef<BattleSide>;
|
|
|
|
fn battle_get_random(r: ExternRef<Battle>) -> ExternRef<BattleRandom>;
|
|
|
|
fn battle_get_pokemon(r: ExternRef<Battle>, side: u8, index: u8) -> ExternRef<Pokemon>;
|
|
|
|
}
|