Complete refactor of the FFI to use handles instead of pointers.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2023-06-24 14:44:23 +02:00
parent 4c222cb753
commit 78bb91093b
76 changed files with 1510 additions and 1952 deletions

View File

@@ -1,7 +1,7 @@
use crate::dynamic_data::choices::TurnChoice;
use crate::dynamic_data::script_handling::ScriptSource;
use crate::dynamic_data::Pokemon;
use crate::{script_hook, PkmnError, ValueIdentifiable, ValueIdentifier, VecExt};
use crate::{script_hook, PkmnError, VecExt};
use anyhow::Result;
use anyhow_ext::anyhow;
use parking_lot::lock_api::MappedRwLockReadGuard;
@@ -17,8 +17,6 @@ use std::sync::Arc;
/// moves in Pokemon actively mess with this order.
#[derive(Debug)]
pub struct ChoiceQueue {
/// A unique identifier so we know what value this is.
identifier: ValueIdentifier,
/// Our storage of turn choices. Starts out completely filled, then slowly empties as turns get
/// executed.
queue: RwLock<Vec<Option<Arc<TurnChoice>>>>,
@@ -31,7 +29,6 @@ impl ChoiceQueue {
pub(crate) fn new(mut queue: Vec<Option<Arc<TurnChoice>>>) -> Self {
queue.sort_unstable_by(|a, b| b.cmp(a));
Self {
identifier: Default::default(),
queue: RwLock::new(queue),
current: AtomicUsize::new(0),
}
@@ -107,7 +104,7 @@ impl ChoiceQueue {
// Find the index for the choice we want to move up.
for index in self.current.load(Ordering::Relaxed)..queue_lock.len() {
if let Some(Some(choice)) = &queue_lock.get(index) {
if pokemon.value_identifier() == choice.user().value_identifier() {
if pokemon.eq(choice.user()) {
desired_index = Some(index);
break;
}
@@ -158,12 +155,6 @@ impl ChoiceQueue {
}
}
impl ValueIdentifiable for ChoiceQueue {
fn value_identifier(&self) -> ValueIdentifier {
self.identifier
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
#[allow(clippy::indexing_slicing)]
@@ -253,10 +244,7 @@ mod tests {
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user2)))),
]);
let inner_queue = queue.get_queue().unwrap();
assert_eq!(
inner_queue[0].as_ref().unwrap().user().value_identifier(),
user1.value_identifier()
);
assert_eq!(inner_queue[0].as_ref().unwrap().user().clone(), user1);
}
#[test]
@@ -283,15 +271,9 @@ mod tests {
]);
user2.change_level_by(60).unwrap();
assert_eq!(
user1.value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user1, queue.peek().unwrap().unwrap().user().clone(),);
queue.resort().unwrap();
assert_eq!(
user2.value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user2, queue.peek().unwrap().unwrap().user().clone(),);
}
#[test]
@@ -303,20 +285,11 @@ mod tests {
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user1.clone())))),
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user2.clone())))),
]);
assert_eq!(
user1.value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user1, queue.peek().unwrap().unwrap().user().clone(),);
assert!(queue.move_pokemon_choice_next(&user2).unwrap());
assert_eq!(
user2.value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(
user1.value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user2, queue.dequeue().unwrap().unwrap().user().clone(),);
assert_eq!(user1, queue.dequeue().unwrap().unwrap().user().clone(),);
}
#[test]
@@ -328,16 +301,10 @@ mod tests {
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user1.clone())))),
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user2.clone())))),
]);
assert_eq!(
user2.value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user2, queue.dequeue().unwrap().unwrap().user().clone(),);
assert!(!queue.move_pokemon_choice_next(&user2).unwrap());
assert_eq!(
user1.value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user1, queue.dequeue().unwrap().unwrap().user().clone(),);
assert!(queue.peek().unwrap().is_none())
}
@@ -350,15 +317,9 @@ mod tests {
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user1.clone())))),
Some(Arc::new(TurnChoice::Pass(PassChoice::new(user2)))),
]);
assert_eq!(
user1.value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user1, queue.peek().unwrap().unwrap().user().clone(),);
assert!(queue.move_pokemon_choice_next(&user1).unwrap());
assert_eq!(
user1.value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(user1, queue.peek().unwrap().unwrap().user().clone(),);
}
#[test]
@@ -382,27 +343,15 @@ mod tests {
Some(Arc::new(TurnChoice::Pass(PassChoice::new(users[5].clone())))),
Some(Arc::new(TurnChoice::Pass(PassChoice::new(users[6].clone())))),
]);
assert_eq!(
users[0].value_identifier(),
queue.peek().unwrap().unwrap().user().value_identifier()
);
assert_eq!(users[0], queue.peek().unwrap().unwrap().user().clone(),);
assert!(queue.move_pokemon_choice_next(&users[4]).unwrap());
assert_eq!(
users[4].value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(users[4], queue.dequeue().unwrap().unwrap().user().clone(),);
for index in 0..4 {
assert_eq!(
users[index].value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(users[index], queue.dequeue().unwrap().unwrap().user().clone(),);
}
for index in 5..7 {
assert_eq!(
users[index].value_identifier(),
queue.dequeue().unwrap().unwrap().user().value_identifier()
);
assert_eq!(users[index], queue.dequeue().unwrap().unwrap().user().clone(),);
}
}
}