aboutsummaryrefslogtreecommitdiff
path: root/server/src/data.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-20 01:38:00 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-23 19:21:49 +0200
commit720bb2e4f53d4467832ba59f97c9b6b6786181e7 (patch)
tree10ea600436adf2c101d9a1ccbf64808414bbc354 /server/src/data.rs
parent6f7b995dd9fa3bea95be8c24e2452f015b410839 (diff)
downloadhurrycurry-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.rs65
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 {