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(())      }  }  |