Complete refactor of the FFI to use handles instead of pointers.
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,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(),);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user