aboutsummaryrefslogtreecommitdiff
path: root/server/client-lib/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-30 01:19:01 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-30 01:19:09 +0200
commit5033c326094edc1ff4234b994e95d987cb937fc4 (patch)
tree5fa426a77109722df163c15ce8d647170cd8fcea /server/client-lib/src
parent727752b87bbe7146adb0f9e9e27d6e64b785ec2f (diff)
downloadhurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar
hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.bz2
hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.zst
Implement tile placeable items for server-side (#433)
Diffstat (limited to 'server/client-lib/src')
-rw-r--r--server/client-lib/src/gamedata_index.rs45
-rw-r--r--server/client-lib/src/lib.rs6
2 files changed, 50 insertions, 1 deletions
diff --git a/server/client-lib/src/gamedata_index.rs b/server/client-lib/src/gamedata_index.rs
new file mode 100644
index 00000000..8aa5e4af
--- /dev/null
+++ b/server/client-lib/src/gamedata_index.rs
@@ -0,0 +1,45 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright (C) 2025 Hurry Curry! Contributors
+
+ 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 hurrycurry_protocol::{Gamedata, ItemIndex, Recipe, RecipeIndex, TileIndex};
+use std::collections::HashMap;
+
+#[derive(Debug, Default)]
+pub struct GamedataIndex {
+ pub tile_collide: Vec<bool>,
+ pub recipe_passive_by_input: HashMap<ItemIndex, Vec<RecipeIndex>>,
+}
+
+impl GamedataIndex {
+ pub fn update(&mut self, data: &Gamedata) {
+ self.recipe_passive_by_input.clear();
+ self.tile_collide.clear();
+
+ for tile in (0..data.tile_names.len()).map(TileIndex) {
+ self.tile_collide.push(!data.tile_walkable.contains(&tile));
+ }
+
+ for (ri, r) in data.recipes() {
+ if let Recipe::Passive { input, .. } = r {
+ self.recipe_passive_by_input
+ .entry(*input)
+ .or_default()
+ .push(ri);
+ }
+ }
+ }
+}
diff --git a/server/client-lib/src/lib.rs b/server/client-lib/src/lib.rs
index 23394cc4..76ef1e77 100644
--- a/server/client-lib/src/lib.rs
+++ b/server/client-lib/src/lib.rs
@@ -16,6 +16,7 @@
*/
#![feature(let_chains)]
+pub mod gamedata_index;
pub mod network;
pub mod spatial_index;
@@ -30,6 +31,8 @@ use std::{
time::Instant,
};
+use crate::gamedata_index::GamedataIndex;
+
#[derive(Debug, PartialEq)]
pub struct Involvement {
pub position: f32,
@@ -64,6 +67,7 @@ pub struct Player {
#[derive(Default)]
pub struct Game {
pub data: Arc<Gamedata>,
+ pub data_index: GamedataIndex,
pub tiles: HashMap<IVec2, Tile>,
pub walkable: HashSet<IVec2>,
pub players: HashMap<PlayerID, Player>,
@@ -161,7 +165,7 @@ impl Game {
} => {
if let Some(kind) = kind {
self.tiles.insert(tile, Tile { kind, item: None });
- if self.data.tile_collide[kind.0] {
+ if self.data_index.tile_collide[kind.0] {
self.walkable.remove(&tile);
} else {
self.walkable.insert(tile);