use crate::dynamic_data::{Pokemon, PokemonParty}; use crate::ffi::ffi_handle::{FFIHandle, FromFFIHandle}; use crate::ffi::FFIResult; use std::sync::Arc; /// Instantiates a party with a set size. #[no_mangle] extern "C" fn pokemon_party_new(capacity: usize) -> FFIHandle> { FFIHandle::get_handle(Arc::new(PokemonParty::new(capacity)).into()) } /// Gets a Pokemon at an index in the party. #[no_mangle] extern "C" fn pokemon_party_at(ptr: FFIHandle>, index: usize) -> FFIHandle { if let Some(v) = ptr.from_ffi_handle().at(index) { FFIHandle::get_handle(v.into()) } else { FFIHandle::none() } } /// Gets a Pokemon at an index in the party. #[no_mangle] extern "C" fn pokemon_party_switch(ptr: FFIHandle>, a: usize, b: usize) { ptr.from_ffi_handle().switch(a, b); } /// Sets the Pokemon at an index to a Pokemon, returning the old Pokemon. #[no_mangle] extern "C" fn pokemon_party_swap_into( ptr: FFIHandle>, index: usize, pokemon: FFIHandle, ) -> FFIResult> { let pokemon = if pokemon.is_none() { None } else { Some(pokemon.from_ffi_handle()) }; match ptr.from_ffi_handle().swap_into(index, pokemon) { Ok(Some(v)) => FFIResult::ok(FFIHandle::get_handle(v.into())), Ok(None) => FFIResult::ok(FFIHandle::none()), Err(e) => FFIResult::err(e), } } /// Whether or not the party still has Pokemon that can be used in battle. #[no_mangle] extern "C" fn pokemon_party_has_usable_pokemon(ptr: FFIHandle>) -> u8 { u8::from(ptr.from_ffi_handle().has_usable_pokemon()) } /// Get the length of the underlying list of Pokemon. #[no_mangle] extern "C" fn pokemon_party_length(ptr: FFIHandle>) -> usize { ptr.from_ffi_handle().length() } /// Makes sure there are no empty spots in the party anymore, leaving the length the same. #[no_mangle] extern "C" fn pokemon_party_pack_party(ptr: FFIHandle>) -> FFIResult<()> { ptr.from_ffi_handle().pack_party().into() } /// Checks if the party contains a given pokemon. #[no_mangle] extern "C" fn pokemon_party_has_pokemon(ptr: FFIHandle>, pokemon: FFIHandle) -> u8 { u8::from(ptr.from_ffi_handle().has_pokemon(&pokemon.from_ffi_handle())) }