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