aboutsummaryrefslogtreecommitdiff
path: root/server/src/recipes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/recipes.rs')
-rw-r--r--server/src/recipes.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/server/src/recipes.rs b/server/src/recipes.rs
new file mode 100644
index 00000000..25a4be98
--- /dev/null
+++ b/server/src/recipes.rs
@@ -0,0 +1,73 @@
+use crate::protocol::{ItemIndex, TileIndex};
+use serde::{Deserialize, Serialize};
+
+#[derive(Debug, Deserialize, Serialize, Clone, Copy)]
+#[serde(rename_all = "snake_case")]
+pub enum Action {
+ Passive(f32),
+ Active(f32),
+ Instant,
+ Never,
+}
+
+#[derive(Debug, Clone, Deserialize, Serialize)]
+pub struct Recipe<T = TileIndex, I = ItemIndex> {
+ pub tile: T,
+ #[serde(default)]
+ pub inputs: Vec<I>,
+ #[serde(default)]
+ pub outputs: Vec<I>,
+ pub action: Action,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Gamedata {
+ pub recipes: Vec<Recipe>,
+ pub item_names: Vec<String>,
+ pub tile_names: Vec<String>,
+}
+pub fn build_gamedata(recipes_in: Vec<Recipe<String, String>>) -> Gamedata {
+ let mut item_names = Vec::new();
+ let mut tile_names = Vec::new();
+ let mut recipes = Vec::new();
+
+ for r in recipes_in {
+ recipes.push(Recipe {
+ action: r.action,
+ tile: register(&mut tile_names, r.tile.clone()),
+ inputs: r
+ .inputs
+ .clone()
+ .into_iter()
+ .map(|e| register(&mut item_names, e))
+ .collect(),
+ outputs: r
+ .outputs
+ .clone()
+ .into_iter()
+ .map(|e| register(&mut item_names, e))
+ .collect(),
+ })
+ }
+
+ Gamedata {
+ recipes,
+ item_names,
+ tile_names,
+ }
+}
+fn register(db: &mut Vec<String>, name: String) -> usize {
+ if let Some(index) = db.iter().position(|e| e == &name) {
+ index
+ } else {
+ let index = db.len();
+ db.push(name);
+ index
+ }
+}
+
+impl Gamedata {
+ pub fn get_tile(&self, name: &str) -> Option<TileIndex> {
+ self.tile_names.iter().position(|t| t == name)
+ }
+}