From 48ff2c4536c576cfe7584c0db257a44cbbfcaffb Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 22 Jul 2023 13:22:08 +0200 Subject: [PATCH] Adds functions to get current time of day --- .../dynamic_data/dynamic_library.rs | 21 +++++++- .../dynamic_data/misc_library.rs | 49 +++++++++++++++++++ .../src/app_interface/dynamic_data/mod.rs | 4 +- .../src/app_interface/static_data/mod.rs | 2 + .../app_interface/static_data/time_of_day.rs | 20 ++++++++ 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 pkmn_lib_interface/src/app_interface/dynamic_data/misc_library.rs create mode 100644 pkmn_lib_interface/src/app_interface/static_data/time_of_day.rs diff --git a/pkmn_lib_interface/src/app_interface/dynamic_data/dynamic_library.rs b/pkmn_lib_interface/src/app_interface/dynamic_data/dynamic_library.rs index c3c7adb..075e2c4 100755 --- a/pkmn_lib_interface/src/app_interface/dynamic_data/dynamic_library.rs +++ b/pkmn_lib_interface/src/app_interface/dynamic_data/dynamic_library.rs @@ -1,8 +1,9 @@ -use crate::app_interface::StaticData; +use crate::app_interface::{MiscLibrary, StaticData}; use alloc::rc::Rc; pub trait DynamicLibraryTrait { fn data_library(&self) -> StaticData; + fn misc_library(&self) -> MiscLibrary; } pub type DynamicLibrary = Rc; @@ -11,7 +12,7 @@ pub type DynamicLibrary = Rc; mod implementation { use super::*; 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::handling::cached_value::CachedValue; use crate::handling::extern_ref::{ExternRef, ExternalReferenceType}; @@ -22,6 +23,7 @@ mod implementation { struct DynamicLibraryInner { ptr: ExternRef, static_data: CachedValue, + misc_library: CachedValue, } #[derive(Clone)] @@ -44,6 +46,14 @@ mod implementation { .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 { self.inner.static_data.value() } + + fn misc_library(&self) -> MiscLibrary { + self.inner.misc_library.value() + } } impl ExternalReferenceType for DynamicLibraryImpl { @@ -65,6 +79,9 @@ mod implementation { fn dynamic_library_get_static_data( ptr: ExternRef, ) -> WasmResult>; + fn dynamic_library_get_misc_library( + ptr: ExternRef, + ) -> WasmResult>; } } diff --git a/pkmn_lib_interface/src/app_interface/dynamic_data/misc_library.rs b/pkmn_lib_interface/src/app_interface/dynamic_data/misc_library.rs new file mode 100644 index 0000000..0bcbf1b --- /dev/null +++ b/pkmn_lib_interface/src/app_interface/dynamic_data/misc_library.rs @@ -0,0 +1,49 @@ +use crate::app_interface::TimeOfDay; +use alloc::rc::Rc; + +pub trait MiscLibraryTrait { + fn time_of_day(&self) -> PkmnResult; +} + +pub type MiscLibrary = Rc; + +#[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, + } + + impl MiscLibraryImpl { + pub(crate) fn new(reference: ExternRef) -> Self { + Self { reference } + } + } + + impl MiscLibraryTrait for MiscLibraryImpl { + fn time_of_day(&self) -> PkmnResult { + unsafe { + let time_of_day = misc_library_get_time_of_day(self.reference).as_res()?; + Ok(core::mem::transmute::(time_of_day)) + } + } + } + + impl ExternalReferenceType for MiscLibraryImpl { + fn from_extern_value(reference: ExternRef) -> Self { + MiscLibraryImpl::new(reference) + } + } + + extern "wasm" { + fn misc_library_get_time_of_day(ptr: ExternRef) -> WasmResult; + } +} + +use crate::PkmnResult; +#[cfg(not(feature = "mock_data"))] +pub use implementation::*; diff --git a/pkmn_lib_interface/src/app_interface/dynamic_data/mod.rs b/pkmn_lib_interface/src/app_interface/dynamic_data/mod.rs index 84f16d7..994cb51 100755 --- a/pkmn_lib_interface/src/app_interface/dynamic_data/mod.rs +++ b/pkmn_lib_interface/src/app_interface/dynamic_data/mod.rs @@ -6,6 +6,7 @@ mod choice_queue; mod dynamic_library; mod executing_move; mod learned_move; +mod misc_library; mod party; mod pokemon; mod statistic_set; @@ -20,6 +21,7 @@ pub use choice_queue::*; pub use dynamic_library::*; pub use executing_move::*; pub use learned_move::*; +pub use misc_library::*; pub use party::*; pub use pokemon::*; pub use statistic_set::*; @@ -41,4 +43,4 @@ impl EventBatchId { id: uuid::Uuid::from_u64_pair(a, b), } } -} \ No newline at end of file +} diff --git a/pkmn_lib_interface/src/app_interface/static_data/mod.rs b/pkmn_lib_interface/src/app_interface/static_data/mod.rs index cd2799d..a83d3c4 100755 --- a/pkmn_lib_interface/src/app_interface/static_data/mod.rs +++ b/pkmn_lib_interface/src/app_interface/static_data/mod.rs @@ -6,6 +6,7 @@ pub mod move_data; mod nature; pub mod species; pub mod statistics; +mod time_of_day; pub use ability::*; pub use data_libraries::*; @@ -15,6 +16,7 @@ pub use move_data::*; pub use nature::*; pub use species::*; pub use statistics::*; +pub use time_of_day::*; pub type LevelInt = u8; diff --git a/pkmn_lib_interface/src/app_interface/static_data/time_of_day.rs b/pkmn_lib_interface/src/app_interface/static_data/time_of_day.rs new file mode 100644 index 0000000..0903b7a --- /dev/null +++ b/pkmn_lib_interface/src/app_interface/static_data/time_of_day.rs @@ -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 + } +}