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; ; 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) {