aboutsummaryrefslogtreecommitdiff
path: root/server/data/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/data/src/lib.rs')
-rw-r--r--server/data/src/lib.rs103
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
- }
- }
-}