diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-18 15:42:11 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-18 15:42:11 +0200 |
commit | 5f883c80e7fc63c97910d003c44aea814ab8a5d6 (patch) | |
tree | b73a8c8f78db103671128e686136f08aa276923a /server/src/game.rs | |
parent | efc29c03f7be043ae8d037a93efce8cfa7c384cc (diff) | |
download | hurrycurry-5f883c80e7fc63c97910d003c44aea814ab8a5d6.tar hurrycurry-5f883c80e7fc63c97910d003c44aea814ab8a5d6.tar.bz2 hurrycurry-5f883c80e7fc63c97910d003c44aea814ab8a5d6.tar.zst |
reimplement customers as entity
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 105 |
1 files changed, 45 insertions, 60 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index b3b23ce0..370c2e8f 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -16,7 +16,6 @@ */ use crate::{ - customer::DemandState, data::Gamedata, entity::{Entity, EntityT}, interaction::{interact, tick_slot, InteractEffect, TickEffect}, @@ -32,7 +31,7 @@ use hurrycurry_protocol::{ use log::{info, warn}; use std::{ collections::{HashMap, HashSet, VecDeque}, - sync::Arc, + sync::{Arc, RwLock}, time::{Duration, Instant}, }; @@ -62,37 +61,44 @@ pub struct Player { pub communicate_persist: Option<Message>, movement: MovementBase, - direction: Vec2, - boost: bool, - last_position_update: Instant, + pub direction: Vec2, + pub boost: bool, + pub last_position_update: Instant, } pub struct Game { pub data: Arc<Gamedata>, - tiles: HashMap<IVec2, Tile>, - walkable: HashSet<IVec2>, + pub tiles: HashMap<IVec2, Tile>, + pub walkable: HashSet<IVec2>, pub players: HashMap<PlayerID, Player>, players_spatial_index: SpatialIndex<PlayerID>, - packet_out: VecDeque<PacketC>, - demand: Option<DemandState>, - pub points: i64, - entities: Vec<Entity>, + pub packet_out: VecDeque<PacketC>, + entities: Arc<RwLock<Vec<Entity>>>, end: Option<Instant>, + pub lobby: bool, + + pub score_changed: bool, + pub points: i64, + pub demands_failed: usize, + pub demands_completed: usize, } impl Game { pub fn new() -> Self { Self { + lobby: false, data: Gamedata::default().into(), packet_out: Default::default(), players: HashMap::new(), tiles: HashMap::new(), walkable: HashSet::new(), - demand: None, end: None, - entities: vec![], + entities: Arc::new(RwLock::new(vec![])), players_spatial_index: SpatialIndex::default(), points: 0, + demands_failed: 0, + demands_completed: 0, + score_changed: false, } } @@ -111,7 +117,7 @@ impl Game { neighbors: [None, None, None, None], }) } - self.demand = None; + self.walkable.clear(); } pub fn load(&mut self, gamedata: Gamedata, timer: Option<Duration>) { let players = self @@ -126,7 +132,7 @@ impl Game { self.data = gamedata.into(); self.points = 0; self.end = timer.map(|dur| Instant::now() + dur); - self.entities = self.data.entities.clone(); + self.entities = Arc::new(RwLock::new(self.data.entities.clone())); for (&p, (tile, item)) in &self.data.initial_map { self.tiles.insert( @@ -150,7 +156,11 @@ impl Game { item: None, character, movement: MovementBase { - position: self.data.chef_spawn, + position: if character < 0 { + self.data.customer_spawn + } else { + self.data.chef_spawn + }, facing: Vec2::X, rotation: 0., velocity: Vec2::ZERO, @@ -167,17 +177,9 @@ impl Game { ); } - if !self.data.demands.is_empty() { - self.demand = Some(DemandState::new(self.data.clone(), &self.tiles)) - } - self.packet_out.extend(self.prime_client()); } - pub fn tiles(&self) -> &HashMap<IVec2, Tile> { - &self.tiles - } - pub fn packet_out(&mut self) -> Option<PacketC> { self.packet_out.pop_front() } @@ -249,7 +251,7 @@ impl Game { out.push(self.score()); out.push(PacketC::SetIngame { state: true, - lobby: self.demand.is_none(), + lobby: self.lobby, }); out } @@ -258,12 +260,8 @@ impl Game { PacketC::Score { time_remaining: self.end.map(|t| (t - Instant::now()).as_secs_f32()), points: self.points, - demands_failed: self.demand.as_ref().map(|d| d.failed).unwrap_or_default(), - demands_completed: self - .demand - .as_ref() - .map(|d| d.completed) - .unwrap_or_default(), + demands_failed: self.demands_failed, + demands_completed: self.demands_completed, } } pub fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<()> { @@ -285,7 +283,11 @@ impl Game { item: None, character, movement: MovementBase { - position: self.data.chef_spawn, + position: if character < 0 { + self.data.customer_spawn + } else { + self.data.chef_spawn + }, facing: Vec2::X, rotation: 0., velocity: Vec2::ZERO, @@ -471,26 +473,9 @@ impl Game { /// Returns true if the game should end pub fn tick(&mut self, dt: f32) -> bool { - if let Some(demand) = &mut self.demand { - let mut packet_out = Vec::new(); - if let Err(err) = demand.tick( - &mut packet_out, - &mut self.tiles, - &self.data, - dt, - &mut self.points, - ) { - warn!("demand tick {err}"); - } - if demand.score_changed { - demand.score_changed = false; - self.packet_out.push_back(self.score()); - } - for (player, packet) in packet_out { - if let Err(err) = self.packet_in(player, packet) { - warn!("demand packet {err}"); - } - } + if self.score_changed { + self.score_changed = false; + self.packet_out.push_back(self.score()); } for (&pos, tile) in &mut self.tiles { @@ -583,14 +568,8 @@ impl Game { let _ = self.packet_in(pid, PacketS::Interact { pos: None }); } - for entity in &mut self.entities { - if let Err(e) = entity.tick( - &self.data, - &mut self.points, - &mut self.packet_out, - &mut self.tiles, - dt, - ) { + for entity in self.entities.clone().write().unwrap().iter_mut() { + if let Err(e) = entity.tick(self, dt) { warn!("entity tick failed: {e}") } } @@ -686,3 +665,9 @@ pub fn interact_effect( } } } + +impl Player { + pub fn position(&self) -> Vec2 { + self.movement.position + } +} |