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
use input::Button; /// Describes a behavior. /// /// This is used for more complex event logic. /// Can also be used for game AI. #[derive(Clone, RustcDecodable, RustcEncodable, PartialEq)] pub enum Behavior<A> { /// A button was pressed. Pressed(Button), /// A button was released. Released(Button), /// 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>>), /// Waits an amount of time before continuing. /// /// f64: Time in seconds Wait(f64), /// Wait forever. WaitForever, /// `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>>), }