1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use input::Button;
/// Describes a behavior.
///
/// This is used for more complex event logic.
/// Can also be used for game AI.
#[derive(Clone, Deserialize, Serialize, PartialEq)]
pub enum Behavior<A> {
/// Wait for a button to be pressed.
///
/// Returns `Success` when the button is pressed,
/// otherwise it returns `Running`.
WaitForPressed(Button),
/// Wait for a button to be released.
///
/// Returns `Success` when the button is released,
/// otherwise it returns `Running`.
WaitForReleased(Button),
/// Waits an amount of time before continuing.
///
/// f64: Time in seconds
Wait(f64),
/// Wait forever.
WaitForever,
/// A high level description of an action.
Action(A),
/// Converts `Success` into `Failure` and vice versa.
Fail(Box<Behavior<A>>),
/// Ignores failures and returns `Success`.
AlwaysSucceed(Box<Behavior<A>>),
/// Runs behaviors one by one until a behavior succeeds.
///
/// If a behavior fails it will try the next one.
/// Fails if the last behavior fails.
/// Can be thought of as a short-circuited logical OR gate.
Select(Vec<Behavior<A>>),
/// `If(condition, success, failure)`
If(Box<Behavior<A>>, Box<Behavior<A>>, Box<Behavior<A>>),
/// Runs behaviors one by one until all succeeded.
///
/// The sequence fails if a behavior fails.
/// The sequence succeeds if all the behavior succeeds.
/// Can be thought of as a short-circuited logical AND gate.
Sequence(Vec<Behavior<A>>),
/// Loops while conditional behavior is running.
///
/// Succeeds if the conditional behavior succeeds.
/// Fails if the conditional behavior fails,
/// or if any behavior in the loop body fails.
While(Box<Behavior<A>>, Vec<Behavior<A>>),
/// Runs all behaviors in parallel until all succeeded.
///
/// Succeeds if all behaviors succeed.
/// Fails is any behavior fails.
WhenAll(Vec<Behavior<A>>),
/// Runs all behaviors in parallel until one succeeds.
///
/// Succeeds if one behavior succeeds.
/// Fails if all behaviors failed.
WhenAny(Vec<Behavior<A>>),
/// Runs all behaviors in parallel until all succeeds in sequence.
///
/// Succeeds if all behaviors succeed, but only if succeeding in sequence.
/// Fails if one behavior fails.
After(Vec<Behavior<A>>),
}