# Beehave [![Build Status](https://travis-ci.org/Archytaus/beehave.svg)](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.
