use crate::app_interface::{BattleParty, BattleRandom, BattleSide, ChoiceQueue, 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, library: CachedValue, parties: CachedValue>, sides: CachedValue>, random: CachedValue, choice_queue: CachedValue, } #[derive(Clone)] pub struct Battle { inner: Rc, } impl Battle { #[cfg(not(feature = "mock_data"))] pub fn new(reference: ExternRef) -> 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() }), choice_queue: cached_value!({ battle_get_choice_queue(reference).get_value().unwrap() }), }), }) } cached_value_getters! { pub fn library(&self) -> DynamicLibrary; pub fn parties(&self) -> ImmutableList; pub fn sides(&self) -> ImmutableList; pub fn random(&self) -> BattleRandom; pub fn choice_queue(&self) -> ChoiceQueue; } #[cfg(not(feature = "mock_data"))] pub fn get_pokemon(&self, side: u8, index: u8) -> Option { unsafe { battle_get_pokemon(self.inner.reference, side, index).get_value() } } pub fn find_party_for_pokemon(&self, pokemon: &Pokemon) -> Option { unsafe { battle_find_party_for_pokemon(self.inner.reference, pokemon.reference()).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); #[cfg(not(feature = "mock_data"))] impl ExternalReferenceType for Battle { fn from_extern_value(reference: ExternRef) -> Self { Self::new(reference) } } #[cfg(not(feature = "mock_data"))] extern "wasm" { fn battle_get_library(r: ExternRef) -> ExternRef; fn battle_get_parties(r: ExternRef) -> VecExternRef; fn battle_get_sides(r: ExternRef) -> VecExternRef; fn battle_get_random(r: ExternRef) -> ExternRef; fn battle_get_choice_queue(r: ExternRef) -> ExternRef; fn battle_get_pokemon(r: ExternRef, side: u8, index: u8) -> ExternRef; fn battle_find_party_for_pokemon( r: ExternRef, mon: ExternRef, ) -> ExternRef; }