diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-30 01:19:01 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-30 01:19:09 +0200 |
commit | 5033c326094edc1ff4234b994e95d987cb937fc4 (patch) | |
tree | 5fa426a77109722df163c15ce8d647170cd8fcea /server/client-lib | |
parent | 727752b87bbe7146adb0f9e9e27d6e64b785ec2f (diff) | |
download | hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.bz2 hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.zst |
Implement tile placeable items for server-side (#433)
Diffstat (limited to 'server/client-lib')
-rw-r--r-- | server/client-lib/src/gamedata_index.rs | 45 | ||||
-rw-r--r-- | server/client-lib/src/lib.rs | 6 |
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); |