aboutsummaryrefslogtreecommitdiff
path: root/server/tools/src/graph.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/src/graph.rs')
-rw-r--r--server/tools/src/graph.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/server/tools/src/graph.rs b/server/tools/src/graph.rs
new file mode 100644
index 00000000..53f70d99
--- /dev/null
+++ b/server/tools/src/graph.rs
@@ -0,0 +1,76 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright (C) 2025 Hurry Curry! Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+use anyhow::Result;
+use hurrycurry_protocol::{Demand, ItemIndex, Recipe, RecipeIndex};
+use hurrycurry_server::data::DataIndex;
+
+pub(crate) fn graph() -> Result<()> {
+ let mut index = DataIndex::default();
+ index.reload()?;
+
+ println!("digraph {{");
+
+ let (data, _, _) = index.generate("5star")?;
+ for i in 0..data.item_names.len() {
+ println!("i{i} [label=\"{}\"]", data.item_name(ItemIndex(i)))
+ }
+ for (RecipeIndex(ri), recipe) in data.recipes() {
+ let (kind, color) = match recipe {
+ Recipe::Passive { .. } => ("Passive", "#b5c42b"),
+ Recipe::Active { .. } => ("Active", "#47c42b"),
+ Recipe::Instant { .. } => ("Instant", "#5452d8"),
+ };
+ println!(
+ "r{ri} [label=\"{kind}\\non {}\" shape=box color={color:?} fillcolor={color:?} style=filled]",
+ if let Some(tile) = recipe.tile() {
+ data.tile_name(tile)
+ } else {
+ "anything"
+ }
+ );
+ for ItemIndex(input) in recipe.inputs() {
+ println!("i{input} -> r{ri}")
+ }
+ for ItemIndex(output) in recipe.outputs() {
+ println!("r{ri} -> i{output}")
+ }
+ }
+
+ for (
+ di,
+ Demand {
+ duration,
+ input: ItemIndex(input),
+ output,
+ points,
+ },
+ ) in data.demands.iter().enumerate()
+ {
+ let color = "#c4422b";
+ println!(
+ "d{di} [label=\"Demand\\ntakes {duration}s\\n{points} points\" shape=box color={color:?} fillcolor={color:?} style=filled]",
+ );
+ println!("i{input} -> d{di}");
+ if let Some(ItemIndex(output)) = output {
+ println!("d{di} -> i{output}");
+ }
+ }
+
+ println!("}}");
+ Ok(())
+}