use bevy::prelude::*;
use super::DEFAULT_ACTUATION;
use crate::prelude::*;
#[derive(Component, Reflect, Debug, Clone, Copy)]
pub struct Release {
pub actuation: f32,
actuated: bool,
}
impl Release {
#[must_use]
pub const fn new(actuation: f32) -> Self {
Self {
actuation,
actuated: false,
}
}
}
impl Default for Release {
fn default() -> Self {
Self::new(DEFAULT_ACTUATION)
}
}
impl InputCondition for Release {
fn evaluate(
&mut self,
_actions: &ActionsQuery,
_time: &ContextTime,
value: ActionValue,
) -> ActionState {
let previously_actuated = self.actuated;
self.actuated = value.is_actuated(self.actuation);
if self.actuated {
ActionState::Ongoing
} else if previously_actuated {
ActionState::Fired
} else {
ActionState::None
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::context;
#[test]
fn release() {
let (world, mut state) = context::init_world();
let (time, actions) = state.get(&world);
let mut condition = Release::default();
assert_eq!(
condition.evaluate(&actions, &time, 0.0.into()),
ActionState::None
);
assert_eq!(
condition.evaluate(&actions, &time, 1.0.into()),
ActionState::Ongoing
);
assert_eq!(
condition.evaluate(&actions, &time, 0.0.into()),
ActionState::Fired
);
}
}