# Beehave [](https://travis-ci.org/Archytaus/beehave)
A simple library for defining and evaluating a hierarchical state machine (behaviour tree).
[Documentation](https://docs.rs/beehave/)
## 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:
```rust
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:
```rust
tree_behaviour.evaluate(&mut tree);
world_behaviour.evaluate(&mut world);
```
For more information please see the [full example](./examples).
You can run the example using:
```sh
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](https://github.com/PistonDevelopers/ai_behavior)
## License
Beehave was created by [Ryan Scott](http://github.com/archytaus) is distributed under the [MIT](http://ryanscott.mit-license.org) license.