diff options
Diffstat (limited to 'server/src/entity/customers')
-rw-r--r-- | server/src/entity/customers/mod.rs | 368 |
1 files changed, 184 insertions, 184 deletions
diff --git a/server/src/entity/customers/mod.rs b/server/src/entity/customers/mod.rs index 221351a5..85da2c07 100644 --- a/server/src/entity/customers/mod.rs +++ b/server/src/entity/customers/mod.rs @@ -18,8 +18,8 @@ pub mod demands; mod pathfinding; -use super::EntityT; -use crate::{data::Demand, game::Game}; +use super::{EntityContext, EntityT}; +use crate::{data::Demand, server::Server}; use anyhow::{anyhow, bail, Result}; use fake::{faker, Fake}; use hurrycurry_protocol::{glam::IVec2, DemandIndex, Message, PacketC, PacketS, PlayerID}; @@ -75,190 +75,190 @@ impl Customers { } impl EntityT for Customers { - fn tick(&mut self, game: &mut Game, packet_out: &mut VecDeque<PacketC>, dt: f32) -> Result<()> { - self.spawn_cooldown -= dt; - self.spawn_cooldown = self.spawn_cooldown.max(0.); - if self.customers.len() < 5 && self.spawn_cooldown <= 0. { - self.spawn_cooldown = 10. + random::<f32>() * 10.; - let id = game.join_player( - faker::name::fr_fr::Name().fake(), - -1 - (random::<u16>() as i32), - packet_out, - ); + fn tick(&mut self, c: EntityContext) -> Result<()> { + // self.spawn_cooldown -= dt; + // self.spawn_cooldown = self.spawn_cooldown.max(0.); + // if self.customers.len() < 5 && self.spawn_cooldown <= 0. { + // self.spawn_cooldown = 10. + random::<f32>() * 10.; + // let id = game.join_player( + // faker::name::fr_fr::Name().fake(), + // -1 - (random::<u16>() as i32), + // packet_out, + // ); - let chair = self.select_chair().ok_or(anyhow!("no free chair found"))?; - let from = game.data.customer_spawn.as_ivec2(); - let path = find_path(&game.walkable, from, chair) - .ok_or(anyhow!("no path from {from} to {chair}"))?; - info!("{id:?} -> entering"); - self.customers - .insert(id, CustomerState::Entering { path, chair }); - } - let mut customers_to_remove = Vec::new(); - for (&player, state) in &mut self.customers { - let Some(playerdata) = game.players.get_mut(&player) else { - continue; - }; + // let chair = self.select_chair().ok_or(anyhow!("no free chair found"))?; + // let from = game.data.customer_spawn.as_ivec2(); + // let path = find_path(&game.walkable, from, chair) + // .ok_or(anyhow!("no path from {from} to {chair}"))?; + // info!("{id:?} -> entering"); + // self.customers + // .insert(id, CustomerState::Entering { path, chair }); + // } + // let mut customers_to_remove = Vec::new(); + // for (&player, state) in &mut self.customers { + // let Some(playerdata) = game.players.get_mut(&player) else { + // continue; + // }; - match state { - CustomerState::Entering { path, chair } => { - playerdata - .movement - .input(path.next_direction(playerdata.position()), false); - if path.is_done() { - let demand = DemandIndex(random::<u32>() as usize % self.demands.len()); - self.cpackets.push_back(PacketS::Communicate { - message: Some(Message::Item(self.demands[demand.0].from)), - persist: true, - player, - }); - info!("{player:?} -> waiting"); - *state = CustomerState::Waiting { - chair: *chair, - timeout: 90. + random::<f32>() * 60., - demand, - }; - } - } - CustomerState::Waiting { - chair, - demand, - timeout, - } => { - playerdata - .movement - .input((chair.as_vec2() + 0.5) - playerdata.position(), false); - *timeout -= dt; - if *timeout <= 0. { - self.cpackets.push_back(PacketS::Communicate { - message: None, - persist: true, - player, - }); - self.cpackets.push_back(PacketS::Communicate { - message: Some(Message::Effect("angry".to_string())), - persist: false, - player, - }); - let path = find_path( - &game.walkable, - playerdata.position().as_ivec2(), - game.data.customer_spawn.as_ivec2(), - ) - .expect("no path to exit"); - *self.chairs.get_mut(chair).unwrap() = true; - game.score.demands_failed += 1; - game.score.points -= 1; - game.score_changed = true; - info!("{player:?} -> exiting"); - *state = CustomerState::Exiting { path } - } else { - let demand_data = &self.demands[demand.0]; - let demand_pos = [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y] - .into_iter() - .find_map(|off| { - let pos = *chair + off; - if game - .tiles - .get(&pos) - .map(|t| { - t.item - .as_ref() - .map(|i| i.kind == demand_data.from) - .unwrap_or_default() - }) - .unwrap_or_default() - { - Some(pos) - } else { - None - } - }); - if let Some(pos) = demand_pos { - self.cpackets.push_back(PacketS::Communicate { - persist: true, - message: None, - player, - }); - self.cpackets.push_back(PacketS::Communicate { - message: Some(Message::Effect("satisfied".to_string())), - persist: false, - player, - }); - self.cpackets.push_back(PacketS::Interact { - pos: Some(pos), - player, - }); - self.cpackets - .push_back(PacketS::Interact { pos: None, player }); - info!("{player:?} -> eating"); - *state = CustomerState::Eating { - demand: *demand, - target: pos, - progress: 0., - chair: *chair, - } - } - } - } - CustomerState::Eating { - demand, - target, - progress, - chair, - } => { - playerdata - .movement - .input((chair.as_vec2() + 0.5) - playerdata.position(), false); - let demand = &self.demands[demand.0]; - *progress += dt / demand.duration; - if *progress >= 1. { - self.cpackets.push_back(PacketS::ReplaceHand { - player, - item: demand.to, - }); - if demand.to.is_some() { - self.cpackets.push_back(PacketS::Interact { - player, - pos: Some(*target), - }); - self.cpackets - .push_back(PacketS::Interact { player, pos: None }); - } - let path = find_path( - &game.walkable, - playerdata.position().as_ivec2(), - game.data.customer_spawn.as_ivec2(), - ) - .ok_or(anyhow!("no path to exit"))?; - *self.chairs.get_mut(chair).unwrap() = true; - game.score.demands_completed += 1; - game.score.points += demand.points; - game.score_changed = true; - info!("{player:?} -> exiting"); - *state = CustomerState::Exiting { path } - } - } - CustomerState::Exiting { path } => { - playerdata - .movement - .input(path.next_direction(playerdata.position()), false); - if path.is_done() { - info!("{player:?} -> leave"); - self.cpackets.push_back(PacketS::Leave { player }); - customers_to_remove.push(player); - } - } - } - } - for c in customers_to_remove { - self.customers.remove(&c).unwrap(); - } - for packet in self.cpackets.drain(..) { - if let Err(err) = game.packet_in(packet, &mut vec![], packet_out) { - warn!("demand packet {err}"); - } - } + // match state { + // CustomerState::Entering { path, chair } => { + // playerdata + // .movement + // .input(path.next_direction(playerdata.position()), false); + // if path.is_done() { + // let demand = DemandIndex(random::<u32>() as usize % self.demands.len()); + // self.cpackets.push_back(PacketS::Communicate { + // message: Some(Message::Item(self.demands[demand.0].from)), + // persist: true, + // player, + // }); + // info!("{player:?} -> waiting"); + // *state = CustomerState::Waiting { + // chair: *chair, + // timeout: 90. + random::<f32>() * 60., + // demand, + // }; + // } + // } + // CustomerState::Waiting { + // chair, + // demand, + // timeout, + // } => { + // playerdata + // .movement + // .input((chair.as_vec2() + 0.5) - playerdata.position(), false); + // *timeout -= dt; + // if *timeout <= 0. { + // self.cpackets.push_back(PacketS::Communicate { + // message: None, + // persist: true, + // player, + // }); + // self.cpackets.push_back(PacketS::Communicate { + // message: Some(Message::Effect("angry".to_string())), + // persist: false, + // player, + // }); + // let path = find_path( + // &game.walkable, + // playerdata.position().as_ivec2(), + // game.data.customer_spawn.as_ivec2(), + // ) + // .expect("no path to exit"); + // *self.chairs.get_mut(chair).unwrap() = true; + // game.score.demands_failed += 1; + // game.score.points -= 1; + // game.score_changed = true; + // info!("{player:?} -> exiting"); + // *state = CustomerState::Exiting { path } + // } else { + // let demand_data = &self.demands[demand.0]; + // let demand_pos = [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y] + // .into_iter() + // .find_map(|off| { + // let pos = *chair + off; + // if game + // .tiles + // .get(&pos) + // .map(|t| { + // t.item + // .as_ref() + // .map(|i| i.kind == demand_data.from) + // .unwrap_or_default() + // }) + // .unwrap_or_default() + // { + // Some(pos) + // } else { + // None + // } + // }); + // if let Some(pos) = demand_pos { + // self.cpackets.push_back(PacketS::Communicate { + // persist: true, + // message: None, + // player, + // }); + // self.cpackets.push_back(PacketS::Communicate { + // message: Some(Message::Effect("satisfied".to_string())), + // persist: false, + // player, + // }); + // self.cpackets.push_back(PacketS::Interact { + // pos: Some(pos), + // player, + // }); + // self.cpackets + // .push_back(PacketS::Interact { pos: None, player }); + // info!("{player:?} -> eating"); + // *state = CustomerState::Eating { + // demand: *demand, + // target: pos, + // progress: 0., + // chair: *chair, + // } + // } + // } + // } + // CustomerState::Eating { + // demand, + // target, + // progress, + // chair, + // } => { + // playerdata + // .movement + // .input((chair.as_vec2() + 0.5) - playerdata.position(), false); + // let demand = &self.demands[demand.0]; + // *progress += dt / demand.duration; + // if *progress >= 1. { + // self.cpackets.push_back(PacketS::ReplaceHand { + // player, + // item: demand.to, + // }); + // if demand.to.is_some() { + // self.cpackets.push_back(PacketS::Interact { + // player, + // pos: Some(*target), + // }); + // self.cpackets + // .push_back(PacketS::Interact { player, pos: None }); + // } + // let path = find_path( + // &game.walkable, + // playerdata.position().as_ivec2(), + // game.data.customer_spawn.as_ivec2(), + // ) + // .ok_or(anyhow!("no path to exit"))?; + // *self.chairs.get_mut(chair).unwrap() = true; + // game.score.demands_completed += 1; + // game.score.points += demand.points; + // game.score_changed = true; + // info!("{player:?} -> exiting"); + // *state = CustomerState::Exiting { path } + // } + // } + // CustomerState::Exiting { path } => { + // playerdata + // .movement + // .input(path.next_direction(playerdata.position()), false); + // if path.is_done() { + // info!("{player:?} -> leave"); + // self.cpackets.push_back(PacketS::Leave { player }); + // customers_to_remove.push(player); + // } + // } + // } + // } + // for c in customers_to_remove { + // self.customers.remove(&c).unwrap(); + // } + // for packet in self.cpackets.drain(..) { + // if let Err(err) = game.packet_in(packet, &mut vec![], packet_out) { + // warn!("demand packet {err}"); + // } + // } Ok(()) } } |