aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/bot/src/algos/simple.rs2
-rw-r--r--server/data/src/book/recipe_diagram.rs16
-rw-r--r--server/data/src/filter_demands.rs13
-rw-r--r--server/data/src/lib.rs2
-rw-r--r--server/protocol/src/helpers.rs28
-rw-r--r--server/src/entity/tutorial.rs2
-rw-r--r--server/tools/src/graph_summary.rs4
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 { .. }),