/* Hurry Curry! - a game about cooking Copyright (C) 2025 Hurry Curry! Contributors 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::{Entity, EntityContext, bot::BotDriver}; use crate::random_float; use anyhow::Result; use hurrycurry_bot::algos::Customer; use hurrycurry_locale::TrError; use hurrycurry_protocol::{Character, PlayerClass}; use std::random::random; pub struct Customers { customers: Vec>, spawn_cooldown: f32, chair_count: Option, scaling_factor: f32, } impl Customers { pub fn new(scaling_factor: f32) -> Self { Self { customers: Default::default(), spawn_cooldown: 0., chair_count: None, scaling_factor, } } } impl Entity for Customers { fn tick(&mut self, mut c: EntityContext) -> Result<(), TrError> { 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 = 5. + random_float() * 5.; let bot = BotDriver::new( "".to_string(), Character { color: random(..), hairstyle: random(..), headwear: 0, }, PlayerClass::Customer, Customer::new, ); self.customers.push(bot) } for bot in &mut self.customers { bot.tick(c.dup())?; } self.customers.retain(|c| !c.finished()); Ok(()) } fn destructor(&mut self, mut c: EntityContext<'_>) { for mut e in self.customers.drain(..) { e.destructor(c.dup()); } } }