#state-machine #state #behavior-tree #ai #game #fsm

nightly beehave

A simple library for defining and evaluating a hierarchical state machine (behaviour tree)

4 releases

Uses old Rust 2015

0.0.4 Aug 29, 2016
0.0.3 Dec 20, 2015
0.0.2 Feb 15, 2015
0.0.1 Feb 12, 2015

#1921 in Algorithms

MIT license

14KB
268 lines

Beehave Build Status

A simple library for defining and evaluating a hierarchical state machine (behaviour tree).

Documentation

Compatibility

Because this library uses fn_traits and unboxed_closures it will only compile using rust nightly. See rust-lang/rust#29625 for the related issue around stabilization.

This was last tested against rustc 1.13.0-nightly (a23064af5 2016-08-27)

Example

Building a behaviour tree using the supplied macros:

let world_behaviour: Selector<World> = behaviour_selector!("World Root", [
    condition!("Ensure Can Shine",
        |world: &mut World| {
            world.can_shine()
        },
        action!("Cycle Day/Night", |world: &mut World| {
            world.toggle_sun()
        })
    ),
    condition!("Ensure Can Rain",
        |world: &mut World| {
            world.can_rain()
        },
        action!("Rain", |world: &mut World| {
            world.rain()
        })
    )
]);

let tree_behaviour: Selector<Tree> = behaviour_selector!("Tree Root", [
    behaviour_sequence!("Photosynthesise", [
        condition!("Ensure Can Make Energy",
            |tree: &mut Tree| {
                tree.can_make_energy()
            },
            action!("Make Energy", |tree: &mut Tree| {
                tree.make_energy()
            })
        ),
        condition!("Ensure Can Grow",
            |tree: &mut Tree| {
                tree.can_grow()
            },
            action!("Grow", |tree: &mut Tree| {
                tree.grow()
            })
        ),
        condition!("Ensure Can Emit Oxygen",
            |tree: &mut Tree| {
                tree.can_emit_oxygen()
            },
            action!("Emit Oxygen", |tree: &mut Tree| {
                tree.emit_oxygen()
            })
        )
    ]),
    condition!("Ensure Can Gather Sun",
        |tree: &mut Tree| {
            tree.can_gather_sun()
        },
        action!("Emit Oxygen", |tree: &mut Tree| {
            tree.gather_sun()
        })
    ),
    condition!("Ensure Can Gather Water",
        |tree: &mut Tree| {
            tree.can_gather_water()
        },
        action!("Emit Oxygen", |tree: &mut Tree| {
            tree.gather_water()
        })
    )
]);

Evaluating the behaviour tree against an actor:

tree_behaviour.evaluate(&mut tree);
world_behaviour.evaluate(&mut world);

For more information please see the full example.

You can run the example using:

cargo run --example main

Design Goals

  • Easily generate an immutable behaviour tree
  • Evaluate the behaviour tree on a mutable actor

See also

PistonDevelopers/ai_behavior

License

Beehave was created by Ryan Scott is distributed under the MIT license.

No runtime deps