From 3d9c14e373f63bbb1bc171b305245698b47412c0 Mon Sep 17 00:00:00 2001 From: Dale McCoy <21223975+DaleStan@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:29:17 -0500 Subject: [PATCH 1/2] Treat bot-placeable entities as accessible. This makes script-replaced entities accessible, such as the underground pipes from Advanced Fluid Handling (meh) and the rod/plate/gear casters from IR (also makes the recipes tied those casters accessible). --- Yafc.Parser/Data/FactorioDataDeserializer.cs | 2 +- Yafc.Parser/Data/FactorioDataDeserializer_Context.cs | 10 ++++++---- Yafc.Parser/Data/FactorioDataDeserializer_Entity.cs | 9 +++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Yafc.Parser/Data/FactorioDataDeserializer.cs b/Yafc.Parser/Data/FactorioDataDeserializer.cs index 630bb8b0..57abc513 100644 --- a/Yafc.Parser/Data/FactorioDataDeserializer.cs +++ b/Yafc.Parser/Data/FactorioDataDeserializer.cs @@ -305,7 +305,7 @@ private void DeserializeItem(LuaTable table) { var item = DeserializeCommon(table, "item"); if (table.Get("place_result", out string placeResult) && !string.IsNullOrEmpty(placeResult)) { - placeResults[item] = placeResult; + placeResults[item] = [placeResult]; } item.stackSize = table.Get("stack_size", 1); diff --git a/Yafc.Parser/Data/FactorioDataDeserializer_Context.cs b/Yafc.Parser/Data/FactorioDataDeserializer_Context.cs index b23dcf3a..18d9f9b5 100644 --- a/Yafc.Parser/Data/FactorioDataDeserializer_Context.cs +++ b/Yafc.Parser/Data/FactorioDataDeserializer_Context.cs @@ -13,7 +13,7 @@ internal partial class FactorioDataDeserializer { private readonly DataBucket recipeCategories = new DataBucket(); private readonly DataBucket recipeCrafters = new DataBucket(); private readonly DataBucket recipeModules = new DataBucket(); - private readonly Dictionary placeResults = []; + private readonly Dictionary> placeResults = []; private readonly List universalModules = []; private Item[] allModules; private readonly HashSet sciencePacks = []; @@ -243,9 +243,11 @@ private void CalculateMaps() { break; case Item item: - if (placeResults.TryGetValue(item, out string placeResultStr)) { - item.placeResult = GetObject(placeResultStr); - entityPlacers.Add(item.placeResult, item); + if (placeResults.TryGetValue(item, out var placeResultNames)) { + item.placeResult = GetObject(placeResultNames[0]); + foreach (string name in placeResultNames) { + entityPlacers.Add(GetObject(name), item); + } } if (item.fuelResult != null) { miscSources.Add(item.fuelResult, item); diff --git a/Yafc.Parser/Data/FactorioDataDeserializer_Entity.cs b/Yafc.Parser/Data/FactorioDataDeserializer_Entity.cs index c3e91ba7..e7d9847c 100644 --- a/Yafc.Parser/Data/FactorioDataDeserializer_Entity.cs +++ b/Yafc.Parser/Data/FactorioDataDeserializer_Entity.cs @@ -162,6 +162,15 @@ private void DeserializeEntity(LuaTable table) { string name = table.Get("name", ""); string usesPower; float defaultDrain = 0f; + + if (table.Get("placeable_by", out LuaTable placeableBy) && placeableBy.Get("item", out string itemName)) { + var item = GetObject(itemName); + if (!placeResults.TryGetValue(item, out var resultNames)) { + resultNames = placeResults[item] = []; + } + resultNames.Add(name); + } + switch (factorioType) { case "transport-belt": GetObject(name).beltItemsPerSecond = table.Get("speed", 0f) * 480f; ; From 8d0fb994216dc123ce310d01634623918299c031 Mon Sep 17 00:00:00 2001 From: Dale McCoy <21223975+DaleStan@users.noreply.github.com> Date: Sun, 8 Jan 2023 20:00:28 -0500 Subject: [PATCH 2/2] Update the shopping list to show the items that build the entities, instead of the entities. --- Yafc/Workspace/ProductionTable/ProductionTableView.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Yafc/Workspace/ProductionTable/ProductionTableView.cs b/Yafc/Workspace/ProductionTable/ProductionTableView.cs index 536223d8..3e2642e4 100644 --- a/Yafc/Workspace/ProductionTable/ProductionTableView.cs +++ b/Yafc/Workspace/ProductionTable/ProductionTableView.cs @@ -954,9 +954,10 @@ private void BuildShoppingList(RecipeRow recipeRoot) { var recipes = recipeRoot == null ? GetRecipesRecursive() : GetRecipesRecursive(recipeRoot); foreach (var recipe in recipes) { if (recipe.entity != null) { - _ = shopList.TryGetValue(recipe.entity, out int prev); + FactorioObject shopItem = recipe.entity.itemsToPlace?.FirstOrDefault() ?? (FactorioObject)recipe.entity; + _ = shopList.TryGetValue(shopItem, out int prev); int count = MathUtils.Ceil(recipe.builtBuildings ?? recipe.buildingCount); - shopList[recipe.entity] = prev + count; + shopList[shopItem] = prev + count; if (recipe.parameters.modules.modules != null) { foreach (var module in recipe.parameters.modules.modules) { if (!module.beacon) {