diff options
author | metamuffin <metamuffin@disroot.org> | 2024-09-02 00:13:04 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-09-02 00:37:54 +0200 |
commit | 5b14aab4341f099c9f5b59ad6aec08c4a58827c3 (patch) | |
tree | 5597105e74abcc5a562442b5922a6654bd5e93fe /server | |
parent | e864abcf6469c877087e53525de632b89546659d (diff) | |
download | hurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar hurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar.bz2 hurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar.zst |
campaign lobby map link entity
Diffstat (limited to 'server')
-rw-r--r-- | server/src/entity/campaign.rs | 41 | ||||
-rw-r--r-- | server/src/entity/customers.rs | 1 | ||||
-rw-r--r-- | server/src/entity/mod.rs | 13 | ||||
-rw-r--r-- | server/src/server.rs | 18 | ||||
-rw-r--r-- | server/src/state.rs | 6 |
5 files changed, 72 insertions, 7 deletions
diff --git a/server/src/entity/campaign.rs b/server/src/entity/campaign.rs new file mode 100644 index 00000000..c4c8ab52 --- /dev/null +++ b/server/src/entity/campaign.rs @@ -0,0 +1,41 @@ +/* + 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 <https://www.gnu.org/licenses/>. + +*/ +use super::{Entity, EntityContext}; +use anyhow::Result; +use hurrycurry_protocol::glam::Vec2; + +#[derive(Debug, Default, Clone)] +pub struct Map { + pub location: Vec2, + pub name: String, +} + +impl Entity for Map { + fn tick(&mut self, c: EntityContext) -> Result<()> { + let mut activate = false; + c.game + .players_spatial_index + .query(self.location, 0.5, |_, _| activate = true); + + if activate { + *c.load_map = Some(self.name.clone()); + } + + Ok(()) + } +} diff --git a/server/src/entity/customers.rs b/server/src/entity/customers.rs index 114ec440..d75f5b51 100644 --- a/server/src/entity/customers.rs +++ b/server/src/entity/customers.rs @@ -54,6 +54,7 @@ impl Entity for Customers { packet_in: c.packet_in, score_changed: c.score_changed, dt: c.dt, + load_map: c.load_map, })?; } self.customers.retain(|c| !c.left); diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index d8fa5654..7180d1a7 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -16,6 +16,7 @@ */ pub mod bot; +pub mod campaign; pub mod conveyor; pub mod customers; pub mod environment_effect; @@ -24,6 +25,7 @@ pub mod player_portal; use crate::data::ItemTileRegistry; use anyhow::{anyhow, Result}; +use campaign::Map; use conveyor::Conveyor; use customers::Customers; use environment_effect::{EnvironmentController, EnvironmentEffect, EnvironmentEffectController}; @@ -45,6 +47,7 @@ pub struct EntityContext<'a> { pub packet_out: &'a mut VecDeque<PacketC>, pub packet_in: &'a mut VecDeque<PacketS>, pub score_changed: &'a mut bool, + pub load_map: &'a mut Option<String>, pub dt: f32, } @@ -95,6 +98,10 @@ pub enum EntityDecl { to: Vec2, }, Customers {}, + Map { + name: String, + location: Option<Vec2>, + }, EnvironmentEffect(EnvironmentEffect), Environment(Vec<String>), } @@ -136,6 +143,12 @@ pub fn construct_entity( cooldown: 0., }) } + EntityDecl::Map { name, location } => Box::new(Map { + location: location + .or(pos.map(|p| p.as_vec2() + 0.5)) + .ok_or(anyhow!("no location"))?, + name, + }), EntityDecl::Customers {} => Box::new(Customers::new()?), EntityDecl::EnvironmentEffect(config) => Box::new(EnvironmentEffectController::new(config)), EntityDecl::Environment(names) => Box::new(EnvironmentController(names)), diff --git a/server/src/server.rs b/server/src/server.rs index cce99266..a5d1e1d8 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -259,6 +259,7 @@ impl Server<'_> { packet_in: &mut self.state.packet_loopback, score_changed: &mut self.state.score_changed, dt: 0., + load_map: &mut None, }); } self.state.data = serverdata.into(); @@ -480,7 +481,11 @@ impl Server<'_> { } /// Returns true if the game should end - pub fn tick(&mut self, dt: f32, packet_out: &mut VecDeque<PacketC>) -> bool { + pub fn tick( + &mut self, + dt: f32, + packet_out: &mut VecDeque<PacketC>, + ) -> Option<(String, Option<Duration>)> { if self.state.score_changed { self.state.score_changed = false; packet_out.push_back(PacketC::Score(self.game.score.clone())); @@ -610,9 +615,11 @@ impl Server<'_> { ); } + let mut load_map = None; for entity in self.state.entities.iter_mut() { if let Err(e) = entity.tick(EntityContext { game: self.game, + load_map: &mut load_map, packet_out, score_changed: &mut self.state.score_changed, packet_in: &mut self.state.packet_loopback, @@ -621,6 +628,9 @@ impl Server<'_> { warn!("entity tick failed: {e}") } } + if let Some(map) = load_map { + return Some((map, Some(Duration::from_secs(300)))); + } while let Some(p) = self.state.packet_loopback.pop_front() { if let Err(e) = self.packet_in(p, &mut vec![], packet_out) { @@ -642,12 +652,12 @@ impl Server<'_> { _ => 0, }; packet_out.push_back(PacketC::Menu(Menu::Score(self.game.score.clone()))); - true + Some(("lobby".to_string(), None)) } else { - false + None } } else { - false + None } } diff --git a/server/src/state.rs b/server/src/state.rs index 4be0fb5a..fe5f846e 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -117,10 +117,10 @@ impl State { game: &mut self.game, state: &mut self.server, }; - if server.tick(dt, &mut self.packet_out) { + if let Some((name, timer)) = server.tick(dt, &mut self.packet_out) { server.load( - self.index.generate("lobby").await?, - None, + self.index.generate(&name).await?, + timer, &mut self.packet_out, ); } |