/* Hurry Curry! - a game about cooking Copyright 2024 metamuffin This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License only. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ use super::{bot::BotDriver, Entity, EntityContext}; use anyhow::Result; use hurrycurry_bot::algos::Customer; use rand::random; pub struct Customers { customers: Vec>, spawn_cooldown: f32, } impl Customers { pub fn new() -> Result { Ok(Self { customers: Default::default(), spawn_cooldown: 0., }) } } impl Entity for Customers { fn tick(&mut self, c: EntityContext) -> Result<()> { self.spawn_cooldown -= c.dt; self.spawn_cooldown = self.spawn_cooldown.max(0.); if self.customers.len() < 5 && self.spawn_cooldown <= 0. { self.spawn_cooldown = 10. + random::() * 10.; let bot = BotDriver::new( "".to_string(), -1 - (random::() as i32), Customer::default(), ); self.customers.push(bot) } for bot in &mut self.customers { bot.tick(EntityContext { game: c.game, packet_out: c.packet_out, packet_in: c.packet_in, score_changed: c.score_changed, dt: c.dt, scoreboard: c.scoreboard, load_map: c.load_map, })?; } self.customers.retain(|c| !c.finished()); Ok(()) } }