use crate::prelude::*;
use beet_core::prelude::*;
#[action(succeed_times)]
#[derive(Debug, Default, Clone, PartialEq, Eq, Component, Reflect)]
#[reflect(Default, Component)]
pub struct SucceedTimes {
pub max_times: u32,
pub times: u32,
}
impl SucceedTimes {
pub fn new(max_times: u32) -> Self {
Self {
max_times,
times: 0,
}
}
}
fn succeed_times(
ev: On<GetOutcome>,
mut commands: Commands,
mut query: Query<&mut SucceedTimes>,
) -> Result {
let target = ev.target();
let mut action = query.get_mut(target)?;
if action.times < action.max_times {
action.times += 1;
commands.entity(target).trigger_target(Outcome::Pass);
} else {
commands.entity(target).trigger_target(Outcome::Fail);
}
Ok(())
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use beet_core::prelude::*;
#[test]
fn works() {
let mut world = ControlFlowPlugin::world();
let on_result = collect_on_result(&mut world);
let entity =
world.spawn((Name::new("root"), SucceedTimes::new(2))).id();
world.entity_mut(entity).trigger_target(GetOutcome).flush();
on_result
.get()
.xpect_eq(vec![("root".to_string(), Outcome::Pass)]);
world.entity_mut(entity).trigger_target(GetOutcome).flush();
world.entity_mut(entity).trigger_target(GetOutcome).flush();
world.entity_mut(entity).trigger_target(GetOutcome).flush();
world.entity_mut(entity).trigger_target(GetOutcome).flush();
world
.query::<&SucceedTimes>()
.single(&world)
.unwrap()
.times
.xpect_eq(2);
}
}