Make SecondaryEffect a trait
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:
@@ -139,7 +139,7 @@ impl<T: ValueIdentifiable + ?Sized> From<Arc<T>> for IdentifiablePointer<Arc<T>>
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable> From<Option<Arc<T>>> for IdentifiablePointer<Arc<T>> {
|
||||
impl<T: ValueIdentifiable + ?Sized> From<Option<Arc<T>>> for IdentifiablePointer<Arc<T>> {
|
||||
fn from(v: Option<Arc<T>>) -> Self {
|
||||
if let Some(v) = v {
|
||||
let id = unsafe { transmute(v.value_identifier()) };
|
||||
@@ -153,6 +153,46 @@ impl<T: ValueIdentifiable> From<Option<Arc<T>>> for IdentifiablePointer<Arc<T>>
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable + ?Sized> From<Box<T>> for IdentifiablePointer<Box<T>> {
|
||||
fn from(v: Box<T>) -> Self {
|
||||
let id = unsafe { transmute(v.value_identifier()) };
|
||||
Self {
|
||||
ptr: Box::into_raw(Box::new(v)),
|
||||
id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable + ?Sized> From<Option<Box<T>>> for IdentifiablePointer<Box<T>> {
|
||||
fn from(v: Option<Box<T>>) -> Self {
|
||||
if let Some(v) = v {
|
||||
let id = unsafe { transmute(v.value_identifier()) };
|
||||
Self {
|
||||
ptr: Box::into_raw(Box::new(v)),
|
||||
id,
|
||||
}
|
||||
} else {
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable + ?Sized> From<&Option<Box<T>>> for IdentifiablePointer<Box<T>> {
|
||||
fn from(v: &Option<Box<T>>) -> Self {
|
||||
if let Some(v) = v {
|
||||
let id = unsafe { transmute(v.value_identifier()) };
|
||||
unsafe {
|
||||
Self {
|
||||
ptr: *Box::into_raw(Box::new(v as *const Box<T>)),
|
||||
id,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable> From<Box<T>> for IdentifiablePointer<T> {
|
||||
fn from(v: Box<T>) -> Self {
|
||||
let id = unsafe { transmute(v.value_identifier()) };
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
use crate::ffi::{ffi_arc_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{EffectParameter, MoveCategory, MoveData, MoveTarget, SecondaryEffect, TypeIdentifier};
|
||||
use crate::static_data::{
|
||||
EffectParameter, MoveCategory, MoveData, MoveTarget, SecondaryEffect, SecondaryEffectImpl, TypeIdentifier,
|
||||
};
|
||||
use crate::StringKey;
|
||||
use hashbrown::HashSet;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
@@ -17,7 +19,7 @@ unsafe extern "C" fn move_data_new(
|
||||
base_usages: u8,
|
||||
target: MoveTarget,
|
||||
priority: i8,
|
||||
secondary_effect: *mut SecondaryEffect,
|
||||
secondary_effect: *mut Box<dyn SecondaryEffect>,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> IdentifiablePointer<Arc<MoveData>> {
|
||||
@@ -72,13 +74,8 @@ ffi_arc_getter!(MoveData, priority, i8);
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_secondary_effect(
|
||||
ptr: ExternPointer<Arc<MoveData>>,
|
||||
) -> IdentifiablePointer<SecondaryEffect> {
|
||||
let effect = ptr.as_ref().secondary_effect();
|
||||
if let Some(v) = effect {
|
||||
(v as *const SecondaryEffect).into()
|
||||
} else {
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
) -> IdentifiablePointer<Box<dyn SecondaryEffect>> {
|
||||
ptr.as_ref().secondary_effect().into()
|
||||
}
|
||||
|
||||
/// Arbitrary flags that can be applied to the move.
|
||||
@@ -95,49 +92,49 @@ unsafe extern "C" fn secondary_effect_new(
|
||||
effect_name: BorrowedPtr<c_char>,
|
||||
parameters: *mut OwnedPtr<EffectParameter>,
|
||||
parameters_length: usize,
|
||||
) -> IdentifiablePointer<SecondaryEffect> {
|
||||
) -> IdentifiablePointer<Box<dyn SecondaryEffect>> {
|
||||
let parameter_slice = std::slice::from_raw_parts(parameters, parameters_length);
|
||||
let mut parameters = Vec::with_capacity(parameters_length);
|
||||
for parameter in parameter_slice {
|
||||
parameters.push(*Box::from_raw(*parameter))
|
||||
}
|
||||
|
||||
Box::new(SecondaryEffect::new(
|
||||
let b: Box<dyn SecondaryEffect> = Box::new(SecondaryEffectImpl::new(
|
||||
chance,
|
||||
CStr::from_ptr(effect_name).into(),
|
||||
parameters,
|
||||
))
|
||||
.into()
|
||||
));
|
||||
b.into()
|
||||
}
|
||||
|
||||
/// Drop a secondary effect.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_drop(ptr: OwnedPtr<SecondaryEffect>) {
|
||||
unsafe extern "C" fn secondary_effect_drop(ptr: OwnedPtr<Box<dyn SecondaryEffect>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
/// The chance the effect triggers.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_chance(ptr: ExternPointer<SecondaryEffect>) -> f32 {
|
||||
unsafe extern "C" fn secondary_effect_chance(ptr: ExternPointer<Box<dyn SecondaryEffect>>) -> f32 {
|
||||
ptr.as_ref().chance()
|
||||
}
|
||||
|
||||
/// The name of the effect.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_effect_name(ptr: ExternPointer<SecondaryEffect>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn secondary_effect_effect_name(ptr: ExternPointer<Box<dyn SecondaryEffect>>) -> OwnedPtr<c_char> {
|
||||
CString::new(ptr.as_ref().effect_name().str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
/// The length of parameters of the effect.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_parameter_length(ptr: ExternPointer<SecondaryEffect>) -> usize {
|
||||
unsafe extern "C" fn secondary_effect_parameter_length(ptr: ExternPointer<Box<dyn SecondaryEffect>>) -> usize {
|
||||
ptr.as_ref().parameters().len()
|
||||
}
|
||||
|
||||
/// Get a parameter of the effect.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_parameter_get(
|
||||
ptr: ExternPointer<SecondaryEffect>,
|
||||
ptr: ExternPointer<Box<dyn SecondaryEffect>>,
|
||||
index: usize,
|
||||
) -> IdentifiablePointer<EffectParameter> {
|
||||
if let Some(v) = ptr.as_ref().parameters().get(index) {
|
||||
|
||||
Reference in New Issue
Block a user