use crate::dynamic_data::{ BattleStatCalculator, DamageLibrary, DynamicLibrary, DynamicLibraryImpl, MiscLibrary, ScriptResolver, }; use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr}; use crate::static_data::StaticData; use std::ptr::drop_in_place; use std::sync::Arc; /// Instantiates a new DynamicLibrary with given parameters. #[no_mangle] extern "C" fn dynamic_library_new( static_data: OwnedPtr>, stat_calculator: OwnedPtr>, damage_library: OwnedPtr>, misc_library: OwnedPtr>, script_resolver: OwnedPtr>, ) -> IdentifiablePointer> { unsafe { let a: Arc = Arc::new(DynamicLibraryImpl::new( *Box::from_raw(static_data), *Box::from_raw(stat_calculator), *Box::from_raw(damage_library), *Box::from_raw(misc_library), *Box::from_raw(script_resolver), )); a.into() } } /// Drops a dynamic library. #[no_mangle] 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() }