use rand::{thread_rng, Rng};
use std::time::Instant;
use tokyo::{
self,
analyzer::Analyzer,
behavior::{Behavior, Chase, FireAt, Sequence, Target},
models::*,
Handler,
};
#[derive(Default)]
struct Player {
analyzer: Analyzer,
current_behavior: Box<Behavior>,
}
fn chase() -> Box<Behavior> {
let chase = Chase { target: Target::HighestScore, distance: 200.0 };
let fire = FireAt::with_times(Target::HighestScore, 2);
Box::new(Sequence::with_slice(&[&chase, &fire]))
}
impl Handler for Player {
fn tick(&mut self, state: &ClientState) -> Option<GameCommand> {
self.analyzer.push_state(state, Instant::now());
if let Some(command) = self.current_behavior.next_command(&self.analyzer) {
Some(command)
} else {
self.current_behavior = chase();
self.current_behavior.next_command(&self.analyzer)
}
}
}
fn main() {
let mut rng = thread_rng();
let api_key = &rng.gen::<u64>().to_string();
let team_name = &format!("CHASER {}", rng.gen::<u8>());
println!("starting up...");
tokyo::run(api_key, team_name, Player::default()).unwrap();
}