diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-20 01:38:00 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:21:49 +0200 |
commit | 720bb2e4f53d4467832ba59f97c9b6b6786181e7 (patch) | |
tree | 10ea600436adf2c101d9a1ccbf64808414bbc354 /server/src/data.rs | |
parent | 6f7b995dd9fa3bea95be8c24e2452f015b410839 (diff) | |
download | hurrycurry-720bb2e4f53d4467832ba59f97c9b6b6786181e7.tar hurrycurry-720bb2e4f53d4467832ba59f97c9b6b6786181e7.tar.bz2 hurrycurry-720bb2e4f53d4467832ba59f97c9b6b6786181e7.tar.zst |
type safe indecies
Diffstat (limited to 'server/src/data.rs')
-rw-r--r-- | server/src/data.rs | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/server/src/data.rs b/server/src/data.rs index e467fefa..51347c7c 100644 --- a/server/src/data.rs +++ b/server/src/data.rs @@ -1,4 +1,7 @@ -use crate::{interaction::Recipe, protocol::TileIndex}; +use crate::{ + interaction::Recipe, + protocol::{DemandIndex, ItemIndex, RecipeIndex, TileIndex}, +}; use glam::{IVec2, Vec2}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, sync::RwLock}; @@ -39,16 +42,16 @@ pub struct DemandDecl { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Demand { - pub from: usize, - pub to: usize, + pub from: ItemIndex, + pub to: ItemIndex, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct Gamedata { - pub recipes: Vec<Recipe>, + recipes: Vec<Recipe>, pub demands: Vec<Demand>, - pub item_names: Vec<String>, - pub tile_names: Vec<String>, + item_names: Vec<String>, + tile_names: Vec<String>, #[serde(skip)] pub initial_map: HashMap<IVec2, TileIndex>, pub chef_spawn: Vec2, @@ -67,9 +70,15 @@ pub fn build_gamedata( for r in recipes_in { let r2 = r.clone(); - let mut inputs = r.inputs.into_iter().map(|i| register(&item_names, i)); - let mut outputs = r.outputs.into_iter().map(|o| register(&item_names, o)); - let tile = r.tile.map(|t| register(&tile_names, t)); + let mut inputs = r + .inputs + .into_iter() + .map(|i| ItemIndex(register(&item_names, i))); + let mut outputs = r + .outputs + .into_iter() + .map(|o| ItemIndex(register(&item_names, o))); + let tile = r.tile.map(|t| TileIndex(register(&tile_names, t))); match r.action { Action::Never => {} Action::Passive(duration) => recipes.push(Recipe::Passive { @@ -98,8 +107,8 @@ pub fn build_gamedata( for d in demands_in { demands.push(Demand { - from: register(&item_names, d.from), - to: register(&item_names, d.to), + from: ItemIndex(register(&item_names, d.from)), + to: ItemIndex(register(&item_names, d.to)), }) } @@ -118,7 +127,7 @@ pub fn build_gamedata( customer_spawn = pos.as_vec2(); tilename = "floor".to_owned(); } - let tile = register(&tile_names, tilename); + let tile = TileIndex(register(&tile_names, tilename)); initial_map.insert(pos, tile); } } @@ -146,11 +155,35 @@ fn register(db: &RwLock<Vec<String>>, name: String) -> usize { } impl Gamedata { - pub fn get_tile(&self, name: &str) -> Option<TileIndex> { - self.tile_names.iter().position(|t| t == name) + pub fn tile_name(&self, index: TileIndex) -> &String { + &self.tile_names[index.0] } - pub fn get_item(&self, name: &str) -> Option<TileIndex> { - self.item_names.iter().position(|t| t == name) + pub fn item_name(&self, index: ItemIndex) -> &String { + &self.item_names[index.0] + } + pub fn recipe(&self, index: RecipeIndex) -> &Recipe { + &self.recipes[index.0] + } + pub fn demand(&self, index: DemandIndex) -> &Demand { + &self.demands[index.0] + } + pub fn get_tile_by_name(&self, name: &str) -> Option<TileIndex> { + self.tile_names + .iter() + .position(|t| t == name) + .map(TileIndex) + } + pub fn get_item_by_name(&self, name: &str) -> Option<ItemIndex> { + self.item_names + .iter() + .position(|t| t == name) + .map(ItemIndex) + } + pub fn recipes(&self) -> impl Iterator<Item = (RecipeIndex, &Recipe)> { + self.recipes + .iter() + .enumerate() + .map(|(i, e)| (RecipeIndex(i), e)) } } impl Action { |