diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-10 15:27:17 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-10 15:27:17 +0200 |
| commit | d13b63d21a35318d6a756b70f6423750268a3831 (patch) | |
| tree | 2e2cd5af6d8b9c826db1aaee87b5d95de83073f6 /server/data/src/lib.rs | |
| parent | 7fde38f7eb4f3a1320080e8ce2a455deea8b24ef (diff) | |
| download | hurrycurry-d13b63d21a35318d6a756b70f6423750268a3831.tar hurrycurry-d13b63d21a35318d6a756b70f6423750268a3831.tar.bz2 hurrycurry-d13b63d21a35318d6a756b70f6423750268a3831.tar.zst | |
Filter unused items and tiles from gamedata (close #449)
Diffstat (limited to 'server/data/src/lib.rs')
| -rw-r--r-- | server/data/src/lib.rs | 103 |
1 files changed, 38 insertions, 65 deletions
diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs index d316d0b7..a5e8ac68 100644 --- a/server/data/src/lib.rs +++ b/server/data/src/lib.rs @@ -20,6 +20,7 @@ pub mod book; pub mod entities; pub mod filter_demands; pub mod index; +pub mod registry; use anyhow::{Result, anyhow, bail}; use clap::Parser; @@ -33,11 +34,13 @@ use log::debug; use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, BTreeSet, HashMap, HashSet}, - sync::RwLock, time::Duration, }; -use crate::entities::EntityDecl; +use crate::{ + entities::EntityDecl, + registry::{ItemTileRegistry, filter_unused_tiles_and_items}, +}; #[derive(Debug, Deserialize, Serialize, Clone, Copy, Default)] #[serde(rename_all = "snake_case")] @@ -241,13 +244,7 @@ fn build_data( } } - let item_names = reg.items.into_inner().unwrap(); - let tile_names = reg.tiles.into_inner().unwrap(); - debug!( - "{} items and {} tiles registered", - item_names.len(), - tile_names.len() - ); + let (item_names, tile_names) = reg.finish(); let default_timer = if map_name.ends_with("lobby") { None @@ -255,37 +252,38 @@ fn build_data( Some(Duration::from_secs(map_in.default_timer.unwrap_or(420))) }; - Ok(( - Gamedata { - current_map: map_name, - maps, - tile_walkable, - tile_placeable_items, - tile_interactable_empty, - recipes, - item_names, - demands, - tile_names, - bot_algos: vec![ - "waiter".to_string(), - "simple".to_string(), - "dishwasher".to_string(), - "frank".to_string(), - ], - hand_count: map_in.hand_count.unwrap_or(1), - }, - Serverdata { - initial_map, - chef_spawn, - flags: map_in.flags, - customer_spawn, - default_timer, - book: Book::default(), - score_baseline: map_in.score_baseline, - entity_decls: entities, - recipe_groups, - }, - )) + let mut data = Gamedata { + current_map: map_name, + maps, + tile_walkable, + tile_placeable_items, + tile_interactable_empty, + recipes, + item_names, + demands, + tile_names, + bot_algos: vec![ + "waiter".to_string(), + "simple".to_string(), + "dishwasher".to_string(), + "frank".to_string(), + ], + hand_count: map_in.hand_count.unwrap_or(1), + }; + let mut serverdata = Serverdata { + initial_map, + chef_spawn, + flags: map_in.flags, + customer_spawn, + default_timer, + book: Book::default(), + score_baseline: map_in.score_baseline, + entity_decls: entities, + recipe_groups, + }; + filter_unused_tiles_and_items(&mut data, &mut serverdata); + + Ok((data, serverdata)) } fn load_recipes( @@ -362,28 +360,3 @@ fn load_recipes( Ok((recipes, demands, recipe_groups)) } - -#[derive(Default)] -pub(crate) struct ItemTileRegistry { - tiles: RwLock<Vec<String>>, - items: RwLock<Vec<String>>, -} - -impl ItemTileRegistry { - pub fn register_tile(&self, name: String) -> TileIndex { - TileIndex(Self::register(&self.tiles, name)) - } - pub fn register_item(&self, name: String) -> ItemIndex { - ItemIndex(Self::register(&self.items, name)) - } - fn register(db: &RwLock<Vec<String>>, name: String) -> usize { - let mut db = db.write().unwrap(); - if let Some(index) = db.iter().position(|e| e == &name) { - index - } else { - let index = db.len(); - db.push(name); - index - } - } -} |