From d7b3c0cd8db1b6cb79c5a0e1c1fe79185a5f3de3 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 2 Apr 2023 14:17:30 +0200 Subject: [PATCH] More FFI work --- src/dynamic_data/libraries/dynamic_library.rs | 25 +++++----- .../libraries/battle_stat_calculator.rs | 46 ++++++++++++++++++- .../dynamic_data/libraries/dynamic_library.rs | 38 ++++++++++++++- src/ffi/static_data/species.rs | 11 ++++- 4 files changed, 101 insertions(+), 19 deletions(-) diff --git a/src/dynamic_data/libraries/dynamic_library.rs b/src/dynamic_data/libraries/dynamic_library.rs index 0b7182c..063dea0 100755 --- a/src/dynamic_data/libraries/dynamic_library.rs +++ b/src/dynamic_data/libraries/dynamic_library.rs @@ -1,5 +1,4 @@ use std::fmt::Debug; -use std::ops::Deref; use std::sync::Arc; use crate::dynamic_data::libraries::battle_stat_calculator::BattleStatCalculator; @@ -19,12 +18,12 @@ pub trait DynamicLibrary: Debug + ValueIdentifiable { fn static_data(&self) -> &Box; /// The stat calculator deals with the calculation of flat and boosted stats, based on the /// Pokemons attributes. - fn stat_calculator(&self) -> &dyn BattleStatCalculator; + fn stat_calculator(&self) -> &Box; /// The damage calculator deals with the calculation of things relating to damage. - fn damage_calculator(&self) -> &dyn DamageLibrary; + fn damage_calculator(&self) -> &Box; /// The Misc Library holds minor functions that do not fall in any of the other libraries and /// calculators. - fn misc_library(&self) -> &dyn MiscLibrary; + fn misc_library(&self) -> &Box; /// Loads a standard script with a given unique combination of category and key. If no script /// can be created with this combination, returns None. @@ -88,17 +87,17 @@ impl DynamicLibrary for DynamicLibraryImpl { } /// The stat calculator deals with the calculation of flat and boosted stats, based on the /// Pokemons attributes. - fn stat_calculator(&self) -> &dyn BattleStatCalculator { - self.stat_calculator.deref() + fn stat_calculator(&self) -> &Box { + &self.stat_calculator } /// The damage calculator deals with the calculation of things relating to damage. - fn damage_calculator(&self) -> &dyn DamageLibrary { - self.damage_calculator.deref() + fn damage_calculator(&self) -> &Box { + &self.damage_calculator } /// The Misc Library holds minor functions that do not fall in any of the other libraries and /// calculators. - fn misc_library(&self) -> &dyn MiscLibrary { - self.misc_library.deref() + fn misc_library(&self) -> &Box { + &self.misc_library } /// Loads a standard script with a given unique combination of category and key. If no script @@ -138,9 +137,9 @@ pub mod test { pub DynamicLibrary{} impl DynamicLibrary for DynamicLibrary { fn static_data(&self) -> &Box; - fn stat_calculator(&self) -> &dyn BattleStatCalculator; - fn damage_calculator(&self) -> &dyn DamageLibrary; - fn misc_library(&self) -> &dyn MiscLibrary; + fn stat_calculator(&self) -> &Box; + fn damage_calculator(&self) -> &Box; + fn misc_library(&self) -> &Box; fn load_script( &self, owner: ScriptOwnerData, diff --git a/src/ffi/dynamic_data/libraries/battle_stat_calculator.rs b/src/ffi/dynamic_data/libraries/battle_stat_calculator.rs index 469ca27..7715c7f 100644 --- a/src/ffi/dynamic_data/libraries/battle_stat_calculator.rs +++ b/src/ffi/dynamic_data/libraries/battle_stat_calculator.rs @@ -1,6 +1,8 @@ -use crate::dynamic_data::{BattleStatCalculator, Gen7BattleStatCalculator}; -use crate::ffi::{IdentifiablePointer, OwnedPtr}; +use crate::dynamic_data::{BattleStatCalculator, Gen7BattleStatCalculator, Pokemon}; +use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr}; +use crate::static_data::{Statistic, StatisticSet}; use std::ptr::drop_in_place; +use std::sync::Arc; /// Creates a new Gen 7 battle stat calculator #[no_mangle] @@ -16,3 +18,43 @@ extern "C" fn gen_7_battle_stat_calculator_new() -> IdentifiablePointer>) { unsafe { drop_in_place(ptr) }; } + +/// Calculate all the flat stats of a Pokemon, disregarding stat boosts. +#[no_mangle] +extern "C" fn battle_stat_calculator_calculate_flat_stats( + ptr: ExternPointer>, + pokemon: ExternPointer>, + mut stats: ExternPointer>>, +) { + ptr.as_ref().calculate_flat_stats(pokemon.as_ref(), stats.as_mut()); +} + +/// Calculate a single flat stat of a Pokemon, disregarding stat boost +#[no_mangle] +extern "C" fn battle_stat_calculator_calculate_flat_stat( + ptr: ExternPointer>, + pokemon: ExternPointer>, + stat: Statistic, +) -> u32 { + ptr.as_ref().calculate_flat_stat(pokemon.as_ref(), stat) +} + +/// Calculate all the boosted stats of a Pokemon, including stat boosts. +#[no_mangle] +extern "C" fn battle_stat_calculator_calculate_boosted_stats( + ptr: ExternPointer>, + pokemon: ExternPointer>, + mut stats: ExternPointer>>, +) { + ptr.as_ref().calculate_boosted_stats(pokemon.as_ref(), stats.as_mut()); +} + +/// Calculate a single boosted stat of a Pokemon, including stat boosts. +#[no_mangle] +extern "C" fn battle_stat_calculator_calculate_boosted_stat( + ptr: ExternPointer>, + pokemon: ExternPointer>, + stat: Statistic, +) -> u32 { + ptr.as_ref().calculate_boosted_stat(pokemon.as_ref(), stat) +} diff --git a/src/ffi/dynamic_data/libraries/dynamic_library.rs b/src/ffi/dynamic_data/libraries/dynamic_library.rs index cd5c231..d6a168a 100644 --- a/src/ffi/dynamic_data/libraries/dynamic_library.rs +++ b/src/ffi/dynamic_data/libraries/dynamic_library.rs @@ -1,7 +1,7 @@ use crate::dynamic_data::{ BattleStatCalculator, DamageLibrary, DynamicLibrary, DynamicLibraryImpl, MiscLibrary, ScriptResolver, }; -use crate::ffi::{IdentifiablePointer, OwnedPtr}; +use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr}; use crate::static_data::StaticData; use std::ptr::drop_in_place; use std::sync::Arc; @@ -29,6 +29,40 @@ extern "C" fn dynamic_library_new( /// Drops a dynamic library. #[no_mangle] -extern "C" fn dynamic_library_drop(ptr: OwnedPtr>) { +extern "C" fn dynamic_library_drop(ptr: OwnedPtr>) { unsafe { drop_in_place(ptr) }; } + +/// The static data is the immutable storage data for this library. +#[no_mangle] +extern "C" fn dynamic_library_get_static_data( + ptr: ExternPointer>, +) -> IdentifiablePointer> { + ptr.as_ref().static_data().into() +} + +/// The stat calculator deals with the calculation of flat and boosted stats, based on the +/// Pokemons attributes. +#[no_mangle] +extern "C" fn dynamic_library_get_stat_calculator( + ptr: ExternPointer>, +) -> IdentifiablePointer> { + ptr.as_ref().stat_calculator().into() +} + +/// The damage calculator deals with the calculation of things relating to damage. +#[no_mangle] +extern "C" fn dynamic_library_get_damage_calculator( + ptr: ExternPointer>, +) -> IdentifiablePointer> { + ptr.as_ref().damage_calculator().into() +} + +/// The Misc Library holds minor functions that do not fall in any of the other libraries and +/// calculators. +#[no_mangle] +extern "C" fn dynamic_library_get_misc_library( + ptr: ExternPointer>, +) -> IdentifiablePointer> { + ptr.as_ref().misc_library().into() +} diff --git a/src/ffi/static_data/species.rs b/src/ffi/static_data/species.rs index c3339b7..daff7b6 100644 --- a/src/ffi/static_data/species.rs +++ b/src/ffi/static_data/species.rs @@ -1,8 +1,8 @@ use crate::ffi::{ ffi_arc_dyn_getter, ffi_arc_stringkey_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr, }; -use crate::static_data::{Form, Species, SpeciesImpl}; -use crate::StringKey; +use crate::static_data::{Form, Gender, Species, SpeciesImpl}; +use crate::{Random, StringKey}; use hashbrown::HashSet; use std::ffi::{c_char, CStr}; use std::ptr::drop_in_place; @@ -76,3 +76,10 @@ unsafe extern "C" fn species_get_form( IdentifiablePointer::none() } } + +/// Gets a form by name. +#[no_mangle] +unsafe extern "C" fn species_get_random_gender(species: ExternPointer>, seed: u64) -> Gender { + let mut rand = Random::new(seed as u128); + species.as_ref().get_random_gender(&mut rand) +}