summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-09-02 00:13:04 +0200
committermetamuffin <metamuffin@disroot.org>2024-09-02 00:37:54 +0200
commit5b14aab4341f099c9f5b59ad6aec08c4a58827c3 (patch)
tree5597105e74abcc5a562442b5922a6654bd5e93fe
parente864abcf6469c877087e53525de632b89546659d (diff)
downloadhurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar
hurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar.bz2
hurrycurry-5b14aab4341f099c9f5b59ad6aec08c4a58827c3.tar.zst
campaign lobby map link entity
-rw-r--r--data/index.yaml1
-rw-r--r--data/maps/campaign/lobby.yaml14
-rw-r--r--server/src/entity/campaign.rs41
-rw-r--r--server/src/entity/customers.rs1
-rw-r--r--server/src/entity/mod.rs13
-rw-r--r--server/src/server.rs18
-rw-r--r--server/src/state.rs6
7 files changed, 80 insertions, 14 deletions
diff --git a/data/index.yaml b/data/index.yaml
index 199ed423..6524cd78 100644
--- a/data/index.yaml
+++ b/data/index.yaml
@@ -29,6 +29,7 @@ demands:
# 5 Unplayable
maps:
+ "campaign/lobby": { name: "Campaign Lobby", players: 1, difficulty: 0 }
sophomore: { name: "Sophomore", players: 1, difficulty: 1 }
junior: { name: "Junior", players: 3, difficulty: 1 }
senior: { name: "Senior", players: 4, difficulty: 1 }
diff --git a/data/maps/campaign/lobby.yaml b/data/maps/campaign/lobby.yaml
index 6090d96a..215832b5 100644
--- a/data/maps/campaign/lobby.yaml
+++ b/data/maps/campaign/lobby.yaml
@@ -19,9 +19,9 @@ map:
- "*'''''*'''*'''''"
- "'*''*''''*'*'*'*"
- "*''''''''''''*''"
- - "*''''''''''''**'"
- - "''''''''''''''''"
- - "''*''''''''''*'*"
+ - "*'''''''...''**'"
+ - "''''''''.1.'''''"
+ - "''*'''''...''*'*"
- "'*'''''~''''''''"
- "''''''''''''''*'"
- "'*'''''''''''*''"
@@ -39,18 +39,18 @@ tiles:
"c": chair
"~": floor
".": floor
+ "1": floor
"b": book
"'": grass
"*": tree
"█": wall
-items:
- "t": tomato-soup-plate
- "T": bread-slice-plate
-
chef_spawn: "~"
customer_spawn: "!"
+tile_entities:
+ "1": !map { name: "campaign/01" }
+
walkable:
- floor
- chair
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,
);
}