diff options
Diffstat (limited to 'server/tools/src/recipe_diagram.rs')
-rw-r--r-- | server/tools/src/recipe_diagram.rs | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs index 958e5aa9..8e9c14b6 100644 --- a/server/tools/src/recipe_diagram.rs +++ b/server/tools/src/recipe_diagram.rs @@ -23,7 +23,10 @@ use hurrycurry_protocol::{ glam::Vec2, }; use hurrycurry_server::data::Serverdata; -use std::collections::{BTreeMap, BTreeSet, HashSet}; +use std::{ + cmp::Reverse, + collections::{BTreeMap, BTreeSet, HashSet}, +}; pub(crate) fn recipe_diagram( data: &Gamedata, @@ -94,6 +97,18 @@ pub(crate) fn recipe_diagram( for r in recipes { let index = diag.nodes.len(); let recipe = data.recipe(r.index); + + if matches!(recipe, Recipe::Instant { .. }) && r.outputs.len() == 1 { + for i in r.inputs { + diag.edges.push(DiagramEdge { + src: item_index[&i], + dst: item_index[&r.outputs[0]], + label: None, + }); + } + continue; + } + let (kind, style) = match recipe { Recipe::Passive { .. } => ("Passive", NodeStyle::ProcessPassive), Recipe::Active { .. } => ("Active", NodeStyle::ProcessActive), @@ -125,17 +140,17 @@ pub(crate) fn recipe_diagram( } } - remove_instant_intermediate(&mut diag); + merge_combine_clusters(&mut diag); Ok(diag) } -pub fn remove_instant_intermediate(diag: &mut Diagram) { +fn merge_combine_clusters(diag: &mut Diagram) { let instant_nodes = diag .nodes .iter() .enumerate() - .filter(|(_, n)| matches!(n.style, NodeStyle::ProcessInstant)) + .filter(|(_, n)| matches!(n.style, NodeStyle::IntermediateProduct)) .map(|(i, _)| i) .collect::<Vec<_>>(); @@ -155,20 +170,38 @@ pub fn remove_instant_intermediate(diag: &mut Diagram) { .map(|(i, e)| (i, e.dst)) .collect::<Vec<_>>(); - if inputs.len() == 1 && outputs.len() == 1 { - // order remove because index changes - if inputs[0].0 > outputs[0].0 { - diag.edges.remove(inputs[0].0); - diag.edges.remove(outputs[0].0); - } else { - diag.edges.remove(outputs[0].0); - diag.edges.remove(inputs[0].0); + if outputs + .iter() + .all(|&(_, i)| diag.nodes[i].style.is_procuct()) + && inputs + .iter() + .all(|&(_, i)| diag.nodes[i].style.is_procuct()) + { + let mut to_remove = inputs + .iter() + .map(|&(i, _)| i) + .chain(outputs.iter().map(|&(i, _)| i)) + .collect::<Vec<_>>(); + to_remove.sort_by_key(|x| Reverse(*x)); + for i in to_remove { + diag.edges.remove(i); + } + + for &input in &inputs { + for &output in &outputs { + if !diag + .edges + .iter() + .any(|e| e.src == input.1 && e.dst == output.1) + { + diag.edges.push(DiagramEdge { + src: input.1, + dst: output.1, + label: None, + }); + } + } } - diag.edges.push(DiagramEdge { - src: inputs[0].1, - dst: outputs[0].1, - label: None, - }); } } } |