diff --git a/Yafc.Model/Data/DataClasses.cs b/Yafc.Model/Data/DataClasses.cs index 292b9ca3..fe4c7782 100644 --- a/Yafc.Model/Data/DataClasses.cs +++ b/Yafc.Model/Data/DataClasses.cs @@ -83,6 +83,8 @@ public enum RecipeFlags { UsesMiningProductivity = 1 << 0, UsesFluidTemperature = 1 << 2, ScaleProductionWithPower = 1 << 3, + /// Set when the technology has a research trigger to craft an item + HasResearchTriggerCraft = 1 << 4, } public abstract class RecipeOrTechnology : FactorioObject { diff --git a/Yafc.Parser/Data/FactorioDataDeserializer_RecipeAndTechnology.cs b/Yafc.Parser/Data/FactorioDataDeserializer_RecipeAndTechnology.cs index 52256252..36014170 100644 --- a/Yafc.Parser/Data/FactorioDataDeserializer_RecipeAndTechnology.cs +++ b/Yafc.Parser/Data/FactorioDataDeserializer_RecipeAndTechnology.cs @@ -100,13 +100,13 @@ private void LoadTechnologyData(Technology technology, LuaTable table, ErrorColl technology.ingredients = LoadResearchIngredientList(unit, technology.typeDotName, errorCollector); recipeCategories.Add(SpecialNames.Labs, technology); } - else if (table.Get("research_trigger", out LuaTable? researchTrigger)) { - technology.ingredients = []; + else if (table.Get("research_trigger", out LuaTable? researchTriggerTable)) { + LoadResearchTrigger(researchTriggerTable, ref technology, errorCollector); + technology.ingredients ??= []; recipeCategories.Add(SpecialNames.TechnologyTrigger, technology); - errorCollector.Error($"Research trigger not yet supported for {technology.name}", ErrorSeverity.MinorDataLoss); } else { - errorCollector.Error($"Could not get science packs for {technology.name}.", ErrorSeverity.AnalysisWarning); + errorCollector.Error($"Could not get requirement(s) to unlock {technology.name}.", ErrorSeverity.AnalysisWarning); } DeserializeFlags(table, technology); @@ -229,6 +229,29 @@ private Ingredient[] LoadResearchIngredientList(LuaTable table, string typeDotNa }).Where(x => x is not null).ToArray() ?? []; } + private void LoadResearchTrigger(LuaTable researchTriggerTable, ref Technology technology, ErrorCollector errorCollector) { + if (!researchTriggerTable.Get("type", out string? type)) { + errorCollector.Error($"Research trigger of {technology.typeDotName} does not have a type field", ErrorSeverity.MinorDataLoss); + return; + } + + switch (type) { + case "craft-item": + if (!researchTriggerTable.Get("item", out string? craftItemName)) { + errorCollector.Error($"Research trigger craft-item of {technology.typeDotName} does not have a item field", ErrorSeverity.MinorDataLoss); + break; + } + float craftCount = researchTriggerTable.Get("count", 1); + technology.ingredients = [new Ingredient(GetObject(craftItemName), craftCount)]; + technology.flags = RecipeFlags.HasResearchTriggerCraft; + + break; + default: + errorCollector.Error($"Research trigger of {technology.typeDotName} has an unsupported type {type}", ErrorSeverity.MinorDataLoss); + break; + } + } + private void LoadRecipeData(Recipe recipe, LuaTable table, ErrorCollector errorCollector) { recipe.ingredients = LoadIngredientList(table, recipe.typeDotName, errorCollector); recipe.products = LoadProductList(table, recipe.typeDotName, allowSimpleSyntax: false); diff --git a/Yafc/Widgets/ObjectTooltip.cs b/Yafc/Widgets/ObjectTooltip.cs index f4f458d5..623d33d2 100644 --- a/Yafc/Widgets/ObjectTooltip.cs +++ b/Yafc/Widgets/ObjectTooltip.cs @@ -500,7 +500,15 @@ private void BuildRecipe(RecipeOrTechnology recipe, ImGui gui) { } private void BuildTechnology(Technology technology, ImGui gui) { - BuildRecipe(technology, gui); + bool isResearchTriggerCraft = (technology.flags & RecipeFlags.HasResearchTriggerCraft) == RecipeFlags.HasResearchTriggerCraft; + if (isResearchTriggerCraft) { + BuildCommon(technology, gui); + + } + else { + BuildRecipe(technology, gui); + } + if (technology.hidden && !technology.enabled) { using (gui.EnterGroup(contentPadding)) { gui.BuildText("This technology is hidden from the list and cannot be researched.", TextBlockDisplayStyle.WrappedText); @@ -514,6 +522,15 @@ private void BuildTechnology(Technology technology, ImGui gui) { } } + if (isResearchTriggerCraft) { + BuildSubHeader(gui, "Item crafting required"); + using (gui.EnterGroup(contentPadding)) { + using var grid = gui.EnterInlineGrid(3f); + grid.Next(); + _ = gui.BuildFactorioObjectWithAmount(technology.ingredients[0].goods, technology.ingredients[0].amount, ButtonDisplayStyle.ProductionTableUnscaled); + } + } + if (technology.unlockRecipes.Length > 0) { BuildSubHeader(gui, "Unlocks recipes"); using (gui.EnterGroup(contentPadding)) {