Implements first few actual move effects.
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
use crate::app_interface::{DataLibrary, Item};
|
||||
use crate::{ExternRef, ExternalReferenceType, StringKey};
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::rc::Rc;
|
||||
use spin::rwlock::RwLock;
|
||||
|
||||
struct ItemLibraryInner {
|
||||
ptr: ExternRef<ItemLibrary>,
|
||||
cache: RwLock<BTreeMap<u32, Item>>,
|
||||
cache: RwLock<hashbrown::HashMap<u32, Item>>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -27,7 +26,7 @@ impl ItemLibrary {
|
||||
}
|
||||
|
||||
impl DataLibrary<Item> for ItemLibrary {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<BTreeMap<u32, Item>> {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<hashbrown::HashMap<u32, Item>> {
|
||||
&self.inner.cache
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use crate::{cached_value, cached_value_getters, ExternRef, ExternalReferenceType, StringKey};
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::rc::Rc;
|
||||
use move_library::MoveLibrary;
|
||||
use spin::rwlock::RwLock;
|
||||
@@ -51,6 +50,11 @@ impl StaticData {
|
||||
type_library: cached_value!({
|
||||
static_data_get_type_library(reference).get_value().unwrap()
|
||||
}),
|
||||
settings: cached_value!({
|
||||
static_data_get_library_settings(reference)
|
||||
.get_value()
|
||||
.unwrap()
|
||||
}),
|
||||
}),
|
||||
})
|
||||
}
|
||||
@@ -88,7 +92,7 @@ crate::handling::cacheable::cacheable!(StaticData);
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
impl ExternalReferenceType for StaticData {
|
||||
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
||||
StaticData::mock(reference)
|
||||
StaticData::new(reference)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,12 +129,20 @@ impl LibrarySettings {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
impl ExternalReferenceType for LibrarySettings {
|
||||
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
||||
LibrarySettings::new(reference)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
extern "wasm" {
|
||||
fn static_data_get_move_library(ptr: ExternRef<StaticData>) -> ExternRef<MoveLibrary>;
|
||||
fn static_data_get_item_library(ptr: ExternRef<StaticData>) -> ExternRef<ItemLibrary>;
|
||||
fn static_data_get_species_library(ptr: ExternRef<StaticData>) -> ExternRef<SpeciesLibrary>;
|
||||
fn static_data_get_type_library(ptr: ExternRef<StaticData>) -> ExternRef<TypeLibrary>;
|
||||
fn static_data_get_library_settings(ptr: ExternRef<StaticData>) -> ExternRef<LibrarySettings>;
|
||||
|
||||
fn library_settings_get_maximum_level(ptr: ExternRef<LibrarySettings>) -> LevelInt;
|
||||
}
|
||||
@@ -141,7 +153,7 @@ where
|
||||
T: ExternalReferenceType,
|
||||
T: Clone,
|
||||
{
|
||||
fn get_cache(&self) -> &RwLock<BTreeMap<u32, T>>;
|
||||
fn get_cache(&self) -> &RwLock<hashbrown::HashMap<u32, T>>;
|
||||
fn get_self_ref(&self) -> ExternRef<Self>
|
||||
where
|
||||
Self: Sized;
|
||||
@@ -188,7 +200,7 @@ pub trait DataLibrary<T>: Cacheable
|
||||
where
|
||||
T: Clone,
|
||||
{
|
||||
fn get_cache(&self) -> &RwLock<BTreeMap<u32, T>>;
|
||||
fn get_cache(&self) -> &RwLock<hashbrown::HashMap<u32, T>>;
|
||||
fn get_self_ref(&self) -> ExternRef<Self>
|
||||
where
|
||||
Self: Sized;
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
use crate::app_interface::data_libraries::DataLibrary;
|
||||
use crate::app_interface::{MoveData, StringKey};
|
||||
use crate::{ExternRef, ExternalReferenceType};
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::rc::Rc;
|
||||
use spin::RwLock;
|
||||
|
||||
struct MoveLibraryInner {
|
||||
ptr: ExternRef<MoveLibrary>,
|
||||
cache: RwLock<BTreeMap<u32, MoveData>>,
|
||||
cache: RwLock<hashbrown::HashMap<u32, MoveData>>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -38,7 +37,7 @@ impl MoveLibrary {
|
||||
}
|
||||
|
||||
impl DataLibrary<MoveData> for MoveLibrary {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<BTreeMap<u32, MoveData>> {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<hashbrown::HashMap<u32, MoveData>> {
|
||||
&self.inner.cache
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
use crate::app_interface::{DataLibrary, Species};
|
||||
use crate::{ExternRef, ExternalReferenceType, StringKey};
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::rc::Rc;
|
||||
use spin::RwLock;
|
||||
|
||||
struct SpeciesLibraryInner {
|
||||
ptr: ExternRef<SpeciesLibrary>,
|
||||
cache: RwLock<BTreeMap<u32, Species>>,
|
||||
cache: RwLock<hashbrown::HashMap<u32, Species>>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -37,7 +36,7 @@ impl SpeciesLibrary {
|
||||
}
|
||||
|
||||
impl DataLibrary<Species> for SpeciesLibrary {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<BTreeMap<u32, Species>> {
|
||||
fn get_cache(&self) -> &spin::rwlock::RwLock<hashbrown::HashMap<u32, Species>> {
|
||||
&self.inner.cache
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use crate::{ExternRef, ExternalReferenceType};
|
||||
use alloc::collections::BTreeMap;
|
||||
use crate::{ExternRef, ExternalReferenceType, TypeIdentifier};
|
||||
use alloc::rc::Rc;
|
||||
use alloc::string::{String, ToString};
|
||||
use cstr_core::{c_char, CString};
|
||||
@@ -7,8 +6,8 @@ use spin::RwLock;
|
||||
|
||||
struct TypeLibraryInner {
|
||||
reference: ExternRef<TypeLibrary>,
|
||||
name_to_type_cache: RwLock<BTreeMap<String, u8>>,
|
||||
effectiveness_cache: RwLock<BTreeMap<(u8, u8), f32>>,
|
||||
name_to_type_cache: RwLock<hashbrown::HashMap<String, TypeIdentifier>>,
|
||||
effectiveness_cache: RwLock<hashbrown::HashMap<(TypeIdentifier, TypeIdentifier), f32>>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -39,7 +38,7 @@ impl TypeLibrary {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn get_type_from_name(&self, name: &str) -> Option<u8> {
|
||||
pub fn get_type_from_name(&self, name: &str) -> Option<TypeIdentifier> {
|
||||
if let Some(cached) = self.inner.name_to_type_cache.read().get(name) {
|
||||
return Some(*cached);
|
||||
}
|
||||
@@ -48,6 +47,7 @@ impl TypeLibrary {
|
||||
if v == 255 {
|
||||
return None;
|
||||
}
|
||||
let v = v.into();
|
||||
self.inner
|
||||
.name_to_type_cache
|
||||
.write()
|
||||
@@ -56,7 +56,11 @@ impl TypeLibrary {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn get_single_effectiveness(&self, attacking_type: u8, defending_type: u8) -> f32 {
|
||||
pub fn get_single_effectiveness(
|
||||
&self,
|
||||
attacking_type: TypeIdentifier,
|
||||
defending_type: TypeIdentifier,
|
||||
) -> f32 {
|
||||
if let Some(cached) = self
|
||||
.inner
|
||||
.effectiveness_cache
|
||||
@@ -68,8 +72,8 @@ impl TypeLibrary {
|
||||
let effectiveness = unsafe {
|
||||
type_library_get_single_effectiveness(
|
||||
self.inner.reference,
|
||||
attacking_type,
|
||||
defending_type,
|
||||
attacking_type.into(),
|
||||
defending_type.into(),
|
||||
)
|
||||
};
|
||||
self.inner
|
||||
@@ -80,7 +84,11 @@ impl TypeLibrary {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn get_effectiveness(&self, attacking_type: u8, defending_types: &[u8]) -> f32 {
|
||||
pub fn get_effectiveness(
|
||||
&self,
|
||||
attacking_type: TypeIdentifier,
|
||||
defending_types: &[TypeIdentifier],
|
||||
) -> f32 {
|
||||
let mut f = 1.0;
|
||||
for defending_type in defending_types {
|
||||
f *= self.get_single_effectiveness(attacking_type, *defending_type);
|
||||
|
||||
@@ -96,7 +96,7 @@ crate::handling::cacheable::cacheable!(Item);
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
impl ExternalReferenceType for Item {
|
||||
fn from_extern_value(reference: ExternRef<Self>) -> Self {
|
||||
Item::mock(reference)
|
||||
Item::new(reference)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,3 +14,23 @@ pub use nature::*;
|
||||
pub use species::*;
|
||||
|
||||
pub type LevelInt = u8;
|
||||
|
||||
/// A unique key that can be used to store a reference to a type. Opaque reference to a byte
|
||||
/// internally.
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Default, Hash)]
|
||||
pub struct TypeIdentifier {
|
||||
/// The unique internal value.
|
||||
val: u8,
|
||||
}
|
||||
|
||||
impl From<u8> for TypeIdentifier {
|
||||
fn from(val: u8) -> Self {
|
||||
Self { val }
|
||||
}
|
||||
}
|
||||
|
||||
impl From<TypeIdentifier> for u8 {
|
||||
fn from(id: TypeIdentifier) -> Self {
|
||||
id.val
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::app_interface::{get_hash_const, StringKey};
|
||||
use crate::app_interface::{get_hash, StringKey};
|
||||
use crate::handling::cached_value::CachedValue;
|
||||
use crate::handling::Cacheable;
|
||||
use crate::{cached_value, cached_value_getters, ExternRef, ExternalReferenceType};
|
||||
@@ -104,8 +104,8 @@ impl MoveData {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn has_flag<const N: usize>(&self, flag: &[u8; N]) -> bool {
|
||||
let hash = get_hash_const(flag);
|
||||
pub fn has_flag(&self, flag: &str) -> bool {
|
||||
let hash = get_hash(flag);
|
||||
unsafe { move_data_has_flag_by_hash(self.inner.ptr, hash) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
use crate::app_interface::get_hash_const;
|
||||
use crate::app_interface::get_hash;
|
||||
use crate::handling::cached_value::CachedValue;
|
||||
use crate::handling::Cacheable;
|
||||
use crate::{
|
||||
cached_value, cached_value_getters, ExternRef, ExternalReferenceType, FFIArray, ImmutableList,
|
||||
StringKey, VecExternRef,
|
||||
};
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::rc::Rc;
|
||||
use alloc::vec::Vec;
|
||||
use spin::RwLock;
|
||||
@@ -147,8 +146,8 @@ impl Form {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn has_flag<const N: usize>(&self, flag: &[u8; N]) -> bool {
|
||||
let hash = get_hash_const(flag);
|
||||
pub fn has_flag(&self, flag: &str) -> bool {
|
||||
let hash = get_hash(flag);
|
||||
unsafe { form_has_flag_by_hash(self.inner.reference, hash) }
|
||||
}
|
||||
}
|
||||
@@ -160,7 +159,7 @@ pub struct SpeciesInner {
|
||||
gender_rate: CachedValue<f32>,
|
||||
growth_rate: CachedValue<StringKey>,
|
||||
capture_rate: CachedValue<u8>,
|
||||
forms: RwLock<BTreeMap<u32, Option<Form>>>,
|
||||
forms: RwLock<hashbrown::HashMap<u32, Option<Form>>>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -205,8 +204,8 @@ impl Species {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn get_form<const N: usize>(&self, form_name: &[u8; N]) -> Option<Form> {
|
||||
let hash = get_hash_const(form_name);
|
||||
pub fn get_form(&self, form_name: &str) -> Option<Form> {
|
||||
let hash = get_hash(form_name);
|
||||
unsafe {
|
||||
if let Some(v) = self.inner.forms.read().get(&hash) {
|
||||
v.clone()
|
||||
@@ -220,8 +219,8 @@ impl Species {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "mock_data"))]
|
||||
pub fn has_flag<const N: usize>(&self, flag: &[u8; N]) -> bool {
|
||||
let hash = get_hash_const(flag);
|
||||
pub fn has_flag(&self, flag: &str) -> bool {
|
||||
let hash = get_hash(flag);
|
||||
unsafe { species_has_flag_by_hash(self.inner.reference, hash) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user