Adds functions to get current time of day
continuous-integration/drone/push Build is failing Details

This commit is contained in:
Deukhoofd 2023-07-22 13:22:08 +02:00
parent c44621d1cb
commit 48ff2c4536
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
5 changed files with 93 additions and 3 deletions

View File

@ -1,8 +1,9 @@
use crate::app_interface::StaticData; use crate::app_interface::{MiscLibrary, StaticData};
use alloc::rc::Rc; use alloc::rc::Rc;
pub trait DynamicLibraryTrait { pub trait DynamicLibraryTrait {
fn data_library(&self) -> StaticData; fn data_library(&self) -> StaticData;
fn misc_library(&self) -> MiscLibrary;
} }
pub type DynamicLibrary = Rc<dyn DynamicLibraryTrait>; pub type DynamicLibrary = Rc<dyn DynamicLibraryTrait>;
@ -11,7 +12,7 @@ pub type DynamicLibrary = Rc<dyn DynamicLibraryTrait>;
mod implementation { mod implementation {
use super::*; use super::*;
use crate::app_interface::dynamic_data::dynamic_library::DynamicLibraryTrait; use crate::app_interface::dynamic_data::dynamic_library::DynamicLibraryTrait;
use crate::app_interface::StaticDataImpl; use crate::app_interface::{MiscLibraryImpl, StaticDataImpl};
use crate::cached_value; use crate::cached_value;
use crate::handling::cached_value::CachedValue; use crate::handling::cached_value::CachedValue;
use crate::handling::extern_ref::{ExternRef, ExternalReferenceType}; use crate::handling::extern_ref::{ExternRef, ExternalReferenceType};
@ -22,6 +23,7 @@ mod implementation {
struct DynamicLibraryInner { struct DynamicLibraryInner {
ptr: ExternRef<DynamicLibraryImpl>, ptr: ExternRef<DynamicLibraryImpl>,
static_data: CachedValue<StaticData>, static_data: CachedValue<StaticData>,
misc_library: CachedValue<MiscLibrary>,
} }
#[derive(Clone)] #[derive(Clone)]
@ -44,6 +46,14 @@ mod implementation {
.unwrap(), .unwrap(),
) )
}), }),
misc_library: cached_value!({
Rc::new(
dynamic_library_get_misc_library(ptr)
.unwrap()
.get_value()
.unwrap(),
)
}),
}), }),
}) })
} }
@ -53,6 +63,10 @@ mod implementation {
fn data_library(&self) -> StaticData { fn data_library(&self) -> StaticData {
self.inner.static_data.value() self.inner.static_data.value()
} }
fn misc_library(&self) -> MiscLibrary {
self.inner.misc_library.value()
}
} }
impl ExternalReferenceType for DynamicLibraryImpl { impl ExternalReferenceType for DynamicLibraryImpl {
@ -65,6 +79,9 @@ mod implementation {
fn dynamic_library_get_static_data( fn dynamic_library_get_static_data(
ptr: ExternRef<DynamicLibraryImpl>, ptr: ExternRef<DynamicLibraryImpl>,
) -> WasmResult<ExternRef<StaticDataImpl>>; ) -> WasmResult<ExternRef<StaticDataImpl>>;
fn dynamic_library_get_misc_library(
ptr: ExternRef<DynamicLibraryImpl>,
) -> WasmResult<ExternRef<MiscLibraryImpl>>;
} }
} }

View File

@ -0,0 +1,49 @@
use crate::app_interface::TimeOfDay;
use alloc::rc::Rc;
pub trait MiscLibraryTrait {
fn time_of_day(&self) -> PkmnResult<TimeOfDay>;
}
pub type MiscLibrary = Rc<dyn MiscLibraryTrait>;
#[cfg(not(feature = "mock_data"))]
mod implementation {
use super::*;
use crate::handling::extern_ref::{ExternRef, ExternalReferenceType};
use crate::handling::WasmResult;
#[derive(Clone)]
pub struct MiscLibraryImpl {
reference: ExternRef<Self>,
}
impl MiscLibraryImpl {
pub(crate) fn new(reference: ExternRef<Self>) -> Self {
Self { reference }
}
}
impl MiscLibraryTrait for MiscLibraryImpl {
fn time_of_day(&self) -> PkmnResult<TimeOfDay> {
unsafe {
let time_of_day = misc_library_get_time_of_day(self.reference).as_res()?;
Ok(core::mem::transmute::<u8, TimeOfDay>(time_of_day))
}
}
}
impl ExternalReferenceType for MiscLibraryImpl {
fn from_extern_value(reference: ExternRef<Self>) -> Self {
MiscLibraryImpl::new(reference)
}
}
extern "wasm" {
fn misc_library_get_time_of_day(ptr: ExternRef<MiscLibraryImpl>) -> WasmResult<u8>;
}
}
use crate::PkmnResult;
#[cfg(not(feature = "mock_data"))]
pub use implementation::*;

View File

@ -6,6 +6,7 @@ mod choice_queue;
mod dynamic_library; mod dynamic_library;
mod executing_move; mod executing_move;
mod learned_move; mod learned_move;
mod misc_library;
mod party; mod party;
mod pokemon; mod pokemon;
mod statistic_set; mod statistic_set;
@ -20,6 +21,7 @@ pub use choice_queue::*;
pub use dynamic_library::*; pub use dynamic_library::*;
pub use executing_move::*; pub use executing_move::*;
pub use learned_move::*; pub use learned_move::*;
pub use misc_library::*;
pub use party::*; pub use party::*;
pub use pokemon::*; pub use pokemon::*;
pub use statistic_set::*; pub use statistic_set::*;
@ -41,4 +43,4 @@ impl EventBatchId {
id: uuid::Uuid::from_u64_pair(a, b), id: uuid::Uuid::from_u64_pair(a, b),
} }
} }
} }

View File

@ -6,6 +6,7 @@ pub mod move_data;
mod nature; mod nature;
pub mod species; pub mod species;
pub mod statistics; pub mod statistics;
mod time_of_day;
pub use ability::*; pub use ability::*;
pub use data_libraries::*; pub use data_libraries::*;
@ -15,6 +16,7 @@ pub use move_data::*;
pub use nature::*; pub use nature::*;
pub use species::*; pub use species::*;
pub use statistics::*; pub use statistics::*;
pub use time_of_day::*;
pub type LevelInt = u8; pub type LevelInt = u8;

View File

@ -0,0 +1,20 @@
/// The time of day. These values are the 4 different groups of time of day in Pokemon games since
/// gen 5. The exact times these correspond to differ between games.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum TimeOfDay {
/// The morning.
Morning = 0,
/// The day.
Day = 1,
/// The evening.
Evening = 2,
/// The night.
Night = 3,
}
impl Default for TimeOfDay {
fn default() -> Self {
TimeOfDay::Day
}
}