diff options
| -rw-r--r-- | server/bot/src/algos/simple.rs | 2 | ||||
| -rw-r--r-- | server/data/src/book/recipe_diagram.rs | 16 | ||||
| -rw-r--r-- | server/data/src/filter_demands.rs | 13 | ||||
| -rw-r--r-- | server/data/src/lib.rs | 2 | ||||
| -rw-r--r-- | server/protocol/src/helpers.rs | 28 | ||||
| -rw-r--r-- | server/src/entity/tutorial.rs | 2 | ||||
| -rw-r--r-- | server/tools/src/graph_summary.rs | 4 |
7 files changed, 28 insertions, 39 deletions
diff --git a/server/bot/src/algos/simple.rs b/server/bot/src/algos/simple.rs index 050c2081..ba617707 100644 --- a/server/bot/src/algos/simple.rs +++ b/server/bot/src/algos/simple.rs @@ -120,7 +120,7 @@ impl<S> Context<'_, S> { .recipes .iter() .enumerate() - .find(|(_, r)| r.outputs().contains(&item)) + .find(|(_, r)| r.outputs().any(|i| i == item)) .map(|(i, _)| RecipeIndex(i)) } pub fn find_item_on_map(&self, item: ItemIndex) -> Option<IVec2> { diff --git a/server/data/src/book/recipe_diagram.rs b/server/data/src/book/recipe_diagram.rs index b6639657..2c203f95 100644 --- a/server/data/src/book/recipe_diagram.rs +++ b/server/data/src/book/recipe_diagram.rs @@ -59,20 +59,10 @@ pub fn recipe_diagram( while let Some(item) = need.pop_first() { let mut found_recipe = false; for (ri, r) in data.recipes() { - if r.outputs().contains(&item) { + if r.outputs().any(|i| i == item) { let gr = GraphRecipe { - inputs: r - .inputs() - .iter() - .filter(|i| !ambient_items.contains(i)) - .copied() - .collect(), - outputs: r - .outputs() - .iter() - .filter(|i| !ambient_items.contains(i)) - .copied() - .collect(), + inputs: r.inputs().filter(|i| !ambient_items.contains(i)).collect(), + outputs: r.outputs().filter(|i| !ambient_items.contains(i)).collect(), index: ri, }; need.extend(gr.inputs.iter().filter(|i| !have.contains(i))); diff --git a/server/data/src/filter_demands.rs b/server/data/src/filter_demands.rs index 406c6b09..cb29a678 100644 --- a/server/data/src/filter_demands.rs +++ b/server/data/src/filter_demands.rs @@ -43,15 +43,10 @@ pub fn filter_demands_and_recipes( let prod_count = producable.len(); for r in &*recipes { - let output_count = r - .outputs() - .iter() - .filter(|o| !map_items.contains(o)) - .count(); + let output_count = r.outputs().filter(|o| !map_items.contains(o)).count(); let Some(ingred_cost) = r .inputs() - .iter() - .map(|i| producable.get(i).copied()) + .map(|i| producable.get(&i).copied()) .reduce(|a, b| { if let (Some(a), Some(b)) = (a, b) { Some(a + b) @@ -83,8 +78,8 @@ pub fn filter_demands_and_recipes( } recipes.retain(|r| { - r.inputs().iter().all(|o| producable.contains_key(o)) - && r.outputs().iter().all(|o| producable.contains_key(o)) + r.inputs().all(|o| producable.contains_key(&o)) + && r.outputs().all(|o| producable.contains_key(&o)) }); demands.retain_mut(|d| { if let Some(&cost) = producable.get(&d.input) { diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs index d4764f7d..ef0f9bb6 100644 --- a/server/data/src/lib.rs +++ b/server/data/src/lib.rs @@ -267,7 +267,7 @@ fn build_data( .collect(); let int_empty = recipes .iter() - .any(|r| r.tile() == Some(tile) && r.inputs().is_empty()); + .any(|r| r.tile() == Some(tile) && r.inputs().next().is_none()); tile_placeable_items.insert(tile, whitelist); if int_empty { tile_interactable_empty.insert(tile); diff --git a/server/protocol/src/helpers.rs b/server/protocol/src/helpers.rs index 90dfd6ff..679e6301 100644 --- a/server/protocol/src/helpers.rs +++ b/server/protocol/src/helpers.rs @@ -74,19 +74,23 @@ impl Recipe { _ => false, } } - pub fn inputs(&self) -> Vec<ItemIndex> { - match self { - Recipe::Passive { input, .. } => vec![*input], - Recipe::Active { input, .. } => vec![*input], - Recipe::Instant { inputs, .. } => inputs.iter().flat_map(|e| e.to_owned()).collect(), - } + pub fn inputs(&self) -> impl Iterator<Item = ItemIndex> { + let (a, b) = match self { + Recipe::Passive { input, .. } | Recipe::Active { input, .. } => (Some(input), None), + Recipe::Instant { inputs, .. } => (inputs[0].as_ref(), inputs[1].as_ref()), + }; + + a.into_iter().chain(b).copied() } - pub fn outputs(&self) -> Vec<ItemIndex> { - match self { - Recipe::Passive { output, .. } => output.iter().copied().collect(), - Recipe::Active { outputs, .. } => outputs.iter().flat_map(|e| e.to_owned()).collect(), - Recipe::Instant { outputs, .. } => outputs.iter().flat_map(|e| e.to_owned()).collect(), - } + pub fn outputs(&self) -> impl Iterator<Item = ItemIndex> { + let (a, b) = match self { + Recipe::Passive { output, .. } => (output, &None), + Recipe::Active { outputs, .. } | Recipe::Instant { outputs, .. } => { + (&outputs[0], &outputs[1]) + } + }; + + a.iter().chain(b.iter()).copied() } pub fn supports_tile(&self, tile: Option<TileIndex>) -> bool { if let Some(tile_constraint) = self.tile() { diff --git a/server/src/entity/tutorial.rs b/server/src/entity/tutorial.rs index 46b2a0db..d1390b20 100644 --- a/server/src/entity/tutorial.rs +++ b/server/src/entity/tutorial.rs @@ -155,7 +155,7 @@ impl StepContext<'_> { .recipes .iter() .enumerate() - .find(|(_, r)| r.outputs().contains(&item)) + .find(|(_, r)| r.outputs().any(|i| i == item)) .map(|(i, _)| RecipeIndex(i)) } fn find_item_on_map(&self, item: ItemIndex) -> Option<IVec2> { diff --git a/server/tools/src/graph_summary.rs b/server/tools/src/graph_summary.rs index c6db2678..3b5c577c 100644 --- a/server/tools/src/graph_summary.rs +++ b/server/tools/src/graph_summary.rs @@ -46,8 +46,8 @@ pub(crate) fn graph_summary() -> Result<()> { let mut nodes = Vec::new(); for r in &data.recipes { nodes.push(Node { - inputs: r.inputs(), - outputs: r.outputs(), + inputs: r.inputs().collect(), + outputs: r.outputs().collect(), tool_item: None, tool_tile: r.tile(), instant: matches!(r, Recipe::Instant { .. }), |