/* 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, CustomerConfig}; use hurrycurry_protocol::{Character, PlayerClass}; use rand::random; pub struct Customers { customers: Vec>, spawn_cooldown: f32, chair_count: Option, scaling_factor: f32, } impl Customers { pub fn new(scaling_factor: f32) -> Result { Ok(Self { customers: Default::default(), spawn_cooldown: 0., chair_count: None, scaling_factor, }) } } impl Entity for Customers { fn tick(&mut self, c: EntityContext) -> Result<()> { let chairs = *self.chair_count.get_or_insert_with(|| { c.game .tiles .values() .filter(|t| c.game.data.tile_name(t.kind) == "chair") .count() }); let max_count = (self.scaling_factor * chairs as f32).max(1.) as usize; self.spawn_cooldown -= c.dt; self.spawn_cooldown = self.spawn_cooldown.max(0.); if self.customers.len() < max_count && self.spawn_cooldown <= 0. { self.spawn_cooldown = 10. + random::() * 10.; let bot = BotDriver::new( "".to_string(), Character { color: random(), hairstyle: random(), headwear: 0, }, PlayerClass::Customer, Customer::new(CustomerConfig { unknown_order: !c.serverdata.flags.disable_unknown_orders, }), ); self.customers.push(bot) } for bot in &mut self.customers { bot.tick(EntityContext { game: c.game, serverdata: c.serverdata, 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, replies: None, })?; } self.customers.retain(|c| !c.finished()); Ok(()) } }