Basic implementation of evolutions
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
use crate::static_data::{
|
||||
Ability, EffectParameter, Form, GrowthRate, Item, LearnableMoves, MoveData, Nature, SecondaryEffect, Species,
|
||||
Ability, Form, GrowthRate, Item, LearnableMoves, MoveData, Nature, Parameter, SecondaryEffect, Species,
|
||||
StaticStatisticSet, StatisticSet,
|
||||
};
|
||||
use anyhow::anyhow;
|
||||
@@ -60,7 +60,7 @@ impl<T> Default for FFIHandle<T> {
|
||||
#[allow(clippy::missing_docs_in_private_items)] // I'm not documenting these items.
|
||||
pub(super) enum FFIObject {
|
||||
Ability(Arc<dyn Ability>),
|
||||
EffectParameter(Arc<EffectParameter>),
|
||||
EffectParameter(Arc<Parameter>),
|
||||
StatisticSetU8(Arc<StatisticSet<u8>>),
|
||||
StatisticSetI8(Arc<StatisticSet<i8>>),
|
||||
StatisticSetU32(Arc<StatisticSet<u32>>),
|
||||
@@ -307,7 +307,7 @@ macro_rules! ffi_obj_conversions {
|
||||
}
|
||||
|
||||
ffi_obj_conversions!(Arc<dyn Ability>, Ability);
|
||||
ffi_obj_conversions!(Arc<EffectParameter>, EffectParameter);
|
||||
ffi_obj_conversions!(Arc<Parameter>, EffectParameter);
|
||||
ffi_obj_conversions!(Arc<StatisticSet<i8>>, StatisticSetI8);
|
||||
ffi_obj_conversions!(Arc<StatisticSet<u8>>, StatisticSetU8);
|
||||
ffi_obj_conversions!(Arc<StatisticSet<u32>>, StatisticSetU32);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::ffi::FFIHandle;
|
||||
use crate::ffi::FromFFIHandle;
|
||||
use crate::ffi::{FFIResult, OwnedPtrString};
|
||||
use crate::static_data::{Ability, AbilityImpl, EffectParameter};
|
||||
use crate::static_data::{Ability, AbilityImpl, Parameter};
|
||||
use crate::StringKey;
|
||||
use anyhow::anyhow;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
@@ -12,11 +12,11 @@ use std::sync::Arc;
|
||||
unsafe extern "C" fn ability_new(
|
||||
name: *const c_char,
|
||||
effect: *const c_char,
|
||||
parameters: *const FFIHandle<Arc<EffectParameter>>,
|
||||
parameters: *const FFIHandle<Arc<Parameter>>,
|
||||
parameters_length: usize,
|
||||
) -> FFIResult<FFIHandle<Arc<dyn Ability>>> {
|
||||
let parameters = std::slice::from_raw_parts(parameters, parameters_length);
|
||||
let mut parameters_vec: Vec<Arc<EffectParameter>> = Vec::with_capacity(parameters_length);
|
||||
let mut parameters_vec: Vec<Arc<Parameter>> = Vec::with_capacity(parameters_length);
|
||||
for parameter in parameters {
|
||||
parameters_vec.push(parameter.from_ffi_handle());
|
||||
}
|
||||
@@ -63,7 +63,7 @@ unsafe extern "C" fn ability_parameter_length(ptr: FFIHandle<Arc<dyn Ability>>)
|
||||
unsafe extern "C" fn ability_parameter_get(
|
||||
ptr: FFIHandle<Arc<dyn Ability>>,
|
||||
index: usize,
|
||||
) -> FFIHandle<Arc<EffectParameter>> {
|
||||
) -> FFIHandle<Arc<Parameter>> {
|
||||
if let Some(p) = ptr.from_ffi_handle().parameters().get(index) {
|
||||
FFIHandle::get_handle(p.clone().into())
|
||||
} else {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::ffi::ffi_handle::{FFIHandle, FFIObject, FromFFIHandle};
|
||||
use crate::ffi::{FFIResult, OwnedPtrString};
|
||||
use crate::static_data::EffectParameter;
|
||||
use crate::static_data::Parameter;
|
||||
use crate::{PkmnError, StringKey};
|
||||
use anyhow::anyhow;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
@@ -30,50 +30,50 @@ mod statistic_set;
|
||||
|
||||
/// Instantiates an effect parameter with a boolean.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_bool(value: u8) -> FFIHandle<Arc<EffectParameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(EffectParameter::from(value == 1))))
|
||||
extern "C" fn effect_parameter_new_bool(value: u8) -> FFIHandle<Arc<Parameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(Parameter::from(value == 1))))
|
||||
}
|
||||
|
||||
/// Instantiates an effect parameter with an integer.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_int(value: i64) -> FFIHandle<Arc<EffectParameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(EffectParameter::from(value))))
|
||||
extern "C" fn effect_parameter_new_int(value: i64) -> FFIHandle<Arc<Parameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(Parameter::from(value))))
|
||||
}
|
||||
|
||||
/// Instantiates an effect parameter with a float.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_float(value: f32) -> FFIHandle<Arc<EffectParameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(EffectParameter::from(value))))
|
||||
extern "C" fn effect_parameter_new_float(value: f32) -> FFIHandle<Arc<Parameter>> {
|
||||
FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(Parameter::from(value))))
|
||||
}
|
||||
|
||||
/// Instantiates an effect parameter with a string.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn effect_parameter_new_string(value: *const c_char) -> FFIResult<FFIHandle<Arc<EffectParameter>>> {
|
||||
unsafe extern "C" fn effect_parameter_new_string(value: *const c_char) -> FFIResult<FFIHandle<Arc<Parameter>>> {
|
||||
let sk: StringKey = match CStr::from_ptr(value).to_str() {
|
||||
Ok(sk) => sk.into(),
|
||||
Err(_) => return FFIResult::err(PkmnError::InvalidCString.into()),
|
||||
};
|
||||
FFIResult::ok(FFIHandle::get_handle(FFIObject::EffectParameter(Arc::new(
|
||||
EffectParameter::from(sk),
|
||||
Parameter::from(sk),
|
||||
))))
|
||||
}
|
||||
|
||||
/// Get the type of an effect parameter.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_type(ptr: FFIHandle<Arc<EffectParameter>>) -> u8 {
|
||||
extern "C" fn effect_parameter_get_type(ptr: FFIHandle<Arc<Parameter>>) -> u8 {
|
||||
match ptr.from_ffi_handle().deref() {
|
||||
EffectParameter::Bool(_) => 0,
|
||||
EffectParameter::Int(_) => 1,
|
||||
EffectParameter::Float(_) => 2,
|
||||
EffectParameter::String(_) => 3,
|
||||
Parameter::Bool(_) => 0,
|
||||
Parameter::Int(_) => 1,
|
||||
Parameter::Float(_) => 2,
|
||||
Parameter::String(_) => 3,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the boolean contained in the effect parameter, panics if the effect parameter is not a bool.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_bool(ptr: FFIHandle<Arc<EffectParameter>>) -> FFIResult<u8> {
|
||||
extern "C" fn effect_parameter_get_as_bool(ptr: FFIHandle<Arc<Parameter>>) -> FFIResult<u8> {
|
||||
let p = ptr.from_ffi_handle();
|
||||
if let EffectParameter::Bool(b) = p.deref() {
|
||||
if let Parameter::Bool(b) = p.deref() {
|
||||
FFIResult::ok(u8::from(*b))
|
||||
} else {
|
||||
FFIResult::err(anyhow!("Unexpected effect parameter. Expected bool, was: {}", p))
|
||||
@@ -82,9 +82,9 @@ extern "C" fn effect_parameter_get_as_bool(ptr: FFIHandle<Arc<EffectParameter>>)
|
||||
|
||||
/// Get the int contained in the effect parameter, panics if the effect parameter is not a int.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_int(ptr: FFIHandle<Arc<EffectParameter>>) -> FFIResult<i64> {
|
||||
extern "C" fn effect_parameter_get_as_int(ptr: FFIHandle<Arc<Parameter>>) -> FFIResult<i64> {
|
||||
let p = ptr.from_ffi_handle();
|
||||
if let EffectParameter::Int(b) = p.deref() {
|
||||
if let Parameter::Int(b) = p.deref() {
|
||||
FFIResult::ok(*b)
|
||||
} else {
|
||||
FFIResult::err(anyhow!("Unexpected effect parameter. Expected int, was: {}", p))
|
||||
@@ -93,9 +93,9 @@ extern "C" fn effect_parameter_get_as_int(ptr: FFIHandle<Arc<EffectParameter>>)
|
||||
|
||||
/// Get the float contained in the effect parameter, panics if the effect parameter is not a float.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_float(ptr: FFIHandle<Arc<EffectParameter>>) -> FFIResult<f32> {
|
||||
extern "C" fn effect_parameter_get_as_float(ptr: FFIHandle<Arc<Parameter>>) -> FFIResult<f32> {
|
||||
let p = ptr.from_ffi_handle();
|
||||
if let EffectParameter::Float(b) = p.deref() {
|
||||
if let Parameter::Float(b) = p.deref() {
|
||||
FFIResult::ok(*b)
|
||||
} else {
|
||||
FFIResult::err(anyhow!("Unexpected effect parameter. Expected float, was: {}", p))
|
||||
@@ -104,9 +104,9 @@ extern "C" fn effect_parameter_get_as_float(ptr: FFIHandle<Arc<EffectParameter>>
|
||||
|
||||
/// Get the string contained in the effect parameter, panics if the effect parameter is not a string.
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_string(ptr: FFIHandle<Arc<EffectParameter>>) -> FFIResult<OwnedPtrString> {
|
||||
extern "C" fn effect_parameter_get_as_string(ptr: FFIHandle<Arc<Parameter>>) -> FFIResult<OwnedPtrString> {
|
||||
let p = ptr.from_ffi_handle();
|
||||
if let EffectParameter::String(b) = p.deref() {
|
||||
if let Parameter::String(b) = p.deref() {
|
||||
match CString::new(b.str().to_string()) {
|
||||
Ok(cstr) => FFIResult::ok(OwnedPtrString(cstr.into_raw())),
|
||||
Err(_) => FFIResult::err(PkmnError::InvalidCString.into()),
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
use crate::ffi::ffi_handle::{FFIHandle, FromFFIHandle};
|
||||
use crate::ffi::{ffi_handle_arc_dyn_getter, FFIResult, NonOwnedPtrString, OwnedPtrString};
|
||||
use crate::static_data::{
|
||||
EffectParameter, MoveCategory, MoveData, MoveDataImpl, MoveTarget, SecondaryEffect, SecondaryEffectImpl,
|
||||
TypeIdentifier,
|
||||
MoveCategory, MoveData, MoveDataImpl, MoveTarget, Parameter, SecondaryEffect, SecondaryEffectImpl, TypeIdentifier,
|
||||
};
|
||||
use crate::StringKey;
|
||||
use anyhow::anyhow;
|
||||
@@ -100,7 +99,7 @@ unsafe extern "C" fn move_data_has_flag(ptr: FFIHandle<Arc<dyn MoveData>>, flag:
|
||||
unsafe extern "C" fn secondary_effect_new(
|
||||
chance: f32,
|
||||
effect_name: NonOwnedPtrString,
|
||||
parameters: *mut FFIHandle<Arc<EffectParameter>>,
|
||||
parameters: *mut FFIHandle<Arc<Parameter>>,
|
||||
parameters_length: usize,
|
||||
) -> FFIHandle<Box<dyn SecondaryEffect>> {
|
||||
let parameter_slice = std::slice::from_raw_parts(parameters, parameters_length);
|
||||
@@ -148,7 +147,7 @@ unsafe extern "C" fn secondary_effect_parameter_length(ptr: FFIHandle<Arc<dyn Se
|
||||
unsafe extern "C" fn secondary_effect_parameter_get(
|
||||
ptr: FFIHandle<Arc<dyn SecondaryEffect>>,
|
||||
index: usize,
|
||||
) -> FFIHandle<Arc<EffectParameter>> {
|
||||
) -> FFIHandle<Arc<Parameter>> {
|
||||
if let Some(v) = ptr.from_ffi_handle().parameters().get(index) {
|
||||
FFIHandle::get_handle(v.clone().into())
|
||||
} else {
|
||||
|
||||
@@ -50,8 +50,10 @@ unsafe extern "C" fn species_new(
|
||||
gender_rate,
|
||||
&growth_rate,
|
||||
capture_rate,
|
||||
120,
|
||||
default_form.clone(),
|
||||
flags_set,
|
||||
Vec::new(),
|
||||
));
|
||||
FFIResult::ok(FFIHandle::get_handle(a.into()))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user