79 lines
2.1 KiB
Rust
79 lines
2.1 KiB
Rust
use crate::app_interface::Pokemon;
|
|
use crate::handling::cached_value::CachedValue;
|
|
use crate::handling::temporary::Temporary;
|
|
use crate::{cached_value, ExternRef, ExternalReferenceType};
|
|
use alloc::rc::Rc;
|
|
|
|
struct BaseTurnChoiceData {
|
|
reference: ExternRef<TurnChoice>,
|
|
user: CachedValue<Pokemon>,
|
|
}
|
|
|
|
struct MoveTurnChoiceDataInner {
|
|
base: BaseTurnChoiceData,
|
|
}
|
|
#[derive(Clone)]
|
|
struct MoveTurnChoiceDataTemporary {
|
|
inner: Rc<MoveTurnChoiceDataInner>,
|
|
}
|
|
pub struct MoveTurnChoiceData {
|
|
temp: Temporary<MoveTurnChoiceDataTemporary>,
|
|
}
|
|
|
|
pub enum TurnChoice {
|
|
Move(MoveTurnChoiceData),
|
|
Item(),
|
|
Switch(),
|
|
Flee,
|
|
Pass,
|
|
}
|
|
|
|
impl TurnChoice {
|
|
pub fn user(&self) -> Pokemon {
|
|
match self {
|
|
TurnChoice::Move(data) => data.temp.value().inner.base.user.value(),
|
|
_ => panic!("Unknown turn choice type"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ExternalReferenceType for TurnChoice {
|
|
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
|
let kind = unsafe { turn_choice_get_kind(reference) };
|
|
match kind {
|
|
0 => TurnChoice::Move(MoveTurnChoiceData {
|
|
temp: Temporary::from_reference(reference.cast()),
|
|
}),
|
|
_ => panic!("Unknown turn choice type"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ExternalReferenceType for MoveTurnChoiceDataTemporary {
|
|
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
|
Self {
|
|
inner: Rc::new(MoveTurnChoiceDataInner {
|
|
base: BaseTurnChoiceData {
|
|
reference: reference.cast(),
|
|
user: cached_value!({
|
|
turn_choice_get_user(reference.cast()).get_value().unwrap()
|
|
}),
|
|
},
|
|
}),
|
|
}
|
|
}
|
|
}
|
|
|
|
extern "wasm" {
|
|
fn turn_choice_get_kind(r: ExternRef<TurnChoice>) -> u8;
|
|
fn turn_choice_get_user(r: ExternRef<TurnChoice>) -> ExternRef<Pokemon>;
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "wasm" fn turn_choice_mark_deleted(r: ExternRef<TurnChoice>, kind: u8) {
|
|
match kind {
|
|
0 => Temporary::<MoveTurnChoiceDataTemporary>::mark_as_deleted(r.cast()),
|
|
_ => panic!("Unknown turn choice type"),
|
|
}
|
|
}
|