private void BuildBeltInserterInfo(ImGui gui, float amount, float buildingCount, ref bool closed) { var prefs = Project.current.preferences; var belt = prefs.defaultBelt; var inserter = prefs.defaultInserter; if (belt == null || inserter == null) { return; } var beltCount = amount / belt.beltItemsPerSecond; var buildingsPerHalfBelt = belt.beltItemsPerSecond * buildingCount / (amount * 2f); var click = false; using (gui.EnterRow()) { click |= gui.BuildFactorioObjectButton(belt); gui.BuildText(DataUtils.FormatAmount(beltCount, UnitOfMeasure.None)); if (buildingsPerHalfBelt > 0f) { gui.BuildText("(Buildings per half belt: " + DataUtils.FormatAmount(buildingsPerHalfBelt, UnitOfMeasure.None) + ")"); } } using (gui.EnterRow()) { var capacity = prefs.inserterCapacity; var inserterBase = inserter.inserterSwingTime * amount / capacity; click |= gui.BuildFactorioObjectButton(inserter); var text = DataUtils.FormatAmount(inserterBase, UnitOfMeasure.None); if (buildingCount > 1) { text += " (" + DataUtils.FormatAmount(inserterBase / buildingCount, UnitOfMeasure.None) + "/building)"; } gui.BuildText(text); if (capacity > 1) { var withBeltSwingTime = inserter.inserterSwingTime + 2f * (capacity - 1.5f) / belt.beltItemsPerSecond; var inserterToBelt = amount * withBeltSwingTime / capacity; click |= gui.BuildFactorioObjectButton(belt); gui.AllocateSpacing(-1.5f); click |= gui.BuildFactorioObjectButton(inserter); text = DataUtils.FormatAmount(inserterToBelt, UnitOfMeasure.None, "~"); if (buildingCount > 1) { text += " (" + DataUtils.FormatAmount(inserterToBelt / buildingCount, UnitOfMeasure.None) + "/b)"; } gui.BuildText(text); } } if (click) { PreferencesScreen.Show(); closed = true; } }
public override void Build(ImGui gui) { BuildHeader(gui, "Never Enough Items Explorer"); using (gui.EnterRow()) { if (recent.Count == 0) { gui.AllocateRect(0f, 3f); } for (var i = recent.Count - 1; i >= 0; i--) { var elem = recent[i]; if (gui.BuildFactorioObjectButton(elem, 3f)) { changing = elem; } } } using (gui.EnterGroup(new Padding(0.5f), RectAllocator.LeftRow)) { gui.spacing = 0.2f; gui.BuildFactorioObjectIcon(current, size: 3f); gui.BuildText(current.locName, Font.subheader); gui.allocator = RectAllocator.RightAlign; gui.BuildText(CostAnalysis.GetDisplayCost(current)); var amount = CostAnalysis.Instance.GetItemAmount(current); if (amount != null) { gui.BuildText(amount, wrap: true); } } if (gui.BuildFactorioObjectButton(gui.lastRect, current, SchemeColor.Grey)) { SelectObjectPanel.Select(Database.goods.all, "Select item", SetItem); } using (var split = gui.EnterHorizontalSplit(2)) { split.Next(); gui.BuildText("Production:", Font.subheader); productionList.Build(gui); split.Next(); gui.BuildText("Usages:", Font.subheader); usageList.Build(gui); } CheckChanging(); using (gui.EnterRow()) { gui.BuildText("Legend:"); gui.BuildText("This color is flow (Estimated fraction of item production/consumption)"); gui.DrawRectangle(gui.lastRect, SchemeColor.Primary); gui.BuildText("This color is estimated recipe efficiency"); gui.DrawRectangle(gui.lastRect, SchemeColor.Secondary); } }
public static void Build(ImGui gui, ref string name, FactorioObject icon, Action <FactorioObject> setIcon) { gui.BuildTextInput(name, out name, "Input name"); if (gui.BuildFactorioObjectButton(icon, 4f, MilestoneDisplay.None, SchemeColor.Grey)) { SelectObjectPanel.Select(Database.objects.all, "Select icon", setIcon); } if (icon == null && gui.isBuilding) { gui.DrawText(gui.lastRect, "And select icon", RectAlignment.Middle); } }
private void ElementDrawer(ImGui gui, FactorioObject element, int index) { if (element == null) { if (gui.BuildRedButton(Icon.Close) == ImGuiUtils.Event.Click) { CloseWithResult(null); } } else { if (gui.BuildFactorioObjectButton(element, display: MilestoneDisplay.Contained, extendHeader: extendHeader)) { CloseWithResult(element); } } }
private void BuildRecipeName(ImGui gui, RecipeRow recipe) { gui.spacing = 0.5f; if (gui.BuildFactorioObjectButton(recipe.recipe, 3f)) { gui.ShowDropDown(delegate(ImGui imgui, ref bool closed) { if (recipe.subgroup == null && imgui.BuildButton("Create nested table")) { recipe.RecordUndo().subgroup = new ProductionTable(recipe); closed = true; } if (recipe.subgroup != null && imgui.BuildButton("Unpack nested table")) { var evacuate = recipe.subgroup.recipes; recipe.subgroup.RecordUndo(); recipe.RecordUndo().subgroup = null; var index = recipe.owner.recipes.IndexOf(recipe); foreach (var evacRecipe in evacuate) { evacRecipe.SetOwner(recipe.owner); } recipe.owner.RecordUndo().recipes.InsertRange(index + 1, evacuate); closed = true; } if (recipe.subgroup != null && imgui.BuildRedButton("Remove nested table") == ImGuiUtils.Event.Click) { recipe.owner.RecordUndo().recipes.Remove(recipe); closed = true; } if (recipe.subgroup == null && imgui.BuildRedButton("Delete recipe") == ImGuiUtils.Event.Click) { recipe.owner.RecordUndo().recipes.Remove(recipe); closed = true; } }); } gui.BuildText(recipe.recipe.locName, wrap: true); }
private void DrawEntryFooter(ImGui gui, bool production) { if (!production && current.fuelFor.Length > 0) { using (gui.EnterGroup(new Padding(0.5f), RectAllocator.LeftAlign)) { gui.BuildText(current.fuelValue > 0f ? "Fuel value " + DataUtils.FormatAmount(current.fuelValue, UnitOfMeasure.Megajoule) + " can be used for:" : "Can be used to fuel:"); using (var grid = gui.EnterInlineGrid(3f)) { foreach (var fuelUsage in current.fuelFor) { grid.Next(); gui.BuildFactorioObjectButton(fuelUsage, 3f, MilestoneDisplay.Contained); } } } if (gui.isBuilding) { gui.DrawRectangle(gui.lastRect, SchemeColor.Primary); } } }
public void Build(ImGui gui) { var settings = Project.current.settings; using (var grid = gui.EnterInlineGrid(3f)) { foreach (var cur in settings.milestones) { grid.Next(); var unlocked = settings.Flags(cur).HasFlags(ProjectPerItemFlags.MilestoneUnlocked); if (gui.BuildFactorioObjectButton(cur, 3f, MilestoneDisplay.None, unlocked ? SchemeColor.Primary : SchemeColor.None)) { if (!unlocked) { var massUnlock = Milestones.Instance.milestoneResult[cur]; var subIndex = 0; settings.SetFlag(cur, ProjectPerItemFlags.MilestoneUnlocked, true); foreach (var milestone in settings.milestones) { subIndex++; if ((massUnlock & (1ul << subIndex)) != 0) { settings.SetFlag(milestone, ProjectPerItemFlags.MilestoneUnlocked, true); } } } else { settings.SetFlag(cur, ProjectPerItemFlags.MilestoneUnlocked, false); } } if (unlocked && gui.isBuilding) { gui.DrawIcon(gui.lastRect, Icon.Check, SchemeColor.Error); } } } }
private void DrawRecipeEntry(ImGui gui, RecipeEntry entry, bool production) { var textcolor = SchemeColor.BackgroundText; var bgColor = SchemeColor.Background; var isBuilding = gui.isBuilding; var recipe = entry.recipe; var waste = recipe.RecipeWaste(); if (isBuilding) { if (entry.entryStatus == EntryStatus.NotAccessible) { bgColor = SchemeColor.None; textcolor = SchemeColor.BackgroundTextFaint; } else if (entry.flow > 0f) { bgColor = SchemeColor.Secondary; textcolor = SchemeColor.SecondaryText; } else if (waste > 0.95f) { bgColor = SchemeColor.Error; textcolor = SchemeColor.ErrorText; } } using (gui.EnterGroup(new Padding(0.5f), production ? RectAllocator.LeftRow : RectAllocator.RightRow, textcolor)) { using (gui.EnterFixedPositioning(4f, 0f, default)) { gui.allocator = RectAllocator.Stretch; gui.spacing = 0f; gui.BuildFactorioObjectButton(entry.recipe, 4f, MilestoneDisplay.Contained); gui.BuildText(DataUtils.FormatAmount(recipe.Cost(), UnitOfMeasure.None, "¥"), align: RectAlignment.Middle); } gui.AllocateSpacing(); gui.allocator = production ? RectAllocator.LeftAlign : RectAllocator.RightAlign; gui.BuildText(recipe.locName, wrap: true); if (recipe.ingredients.Length + recipe.products.Length <= 8) { using (gui.EnterRow()) { DrawIngredients(gui, entry.recipe); gui.allocator = RectAllocator.RightRow; DrawProducts(gui, entry.recipe); if (recipe.products.Length < 3 && recipe.ingredients.Length < 5) { gui.AllocateSpacing((3 - entry.recipe.products.Length) * 3f); } else if (recipe.products.Length < 3) { gui.allocator = RectAllocator.RemainigRow; } gui.BuildIcon(Icon.ArrowRight, 3f); } } else { using (gui.EnterRow()) DrawIngredients(gui, entry.recipe); using (gui.EnterRow()) { gui.BuildIcon(Icon.ArrowDownRight, 3f); gui.allocator = RectAllocator.RightRow; DrawProducts(gui, entry.recipe); } } var importance = CostAnalysis.Instance.GetBuildingAmount(recipe, entry.recipeFlow); if (importance != null) { gui.BuildText(importance, wrap: true); } } if (isBuilding) { var rect = gui.lastRect; if (entry.flow > 0f) { var percentFlow = MathUtils.Clamp(entry.flow / currentFlow, 0f, 1f); rect.Width *= percentFlow; gui.DrawRectangle(rect, SchemeColor.Primary); } else if (waste <= 0f) { bgColor = SchemeColor.Secondary; } else { rect.Width *= (1f - entry.recipe.RecipeWaste()); gui.DrawRectangle(rect, SchemeColor.Secondary); } gui.DrawRectangle(gui.lastRect, bgColor); } }
private void BuildRecipeName(ImGui gui, RecipeRow recipe) { gui.spacing = 0.5f; if (gui.BuildFactorioObjectButton(recipe.recipe, 3f)) { gui.ShowDropDown(delegate(ImGui imgui, ref bool closed) { DrawRecipeTagSelect(imgui, recipe); if (recipe.subgroup == null && imgui.BuildButton("Create nested table")) { recipe.RecordUndo().subgroup = new ProductionTable(recipe); closed = true; } if (recipe.subgroup != null && imgui.BuildButton("Add nested desired product")) { AddDesiredProductAtLevel(recipe.subgroup); closed = true; } if (recipe.subgroup != null && imgui.BuildButton("Add raw recipe")) { SelectObjectPanel.Select(Database.recipes.all, "Select raw recipe", r => AddRecipe(recipe.subgroup, r)); closed = true; } if (recipe.subgroup != null && imgui.BuildButton("Unpack nested table")) { var evacuate = recipe.subgroup.recipes; recipe.subgroup.RecordUndo(); recipe.RecordUndo().subgroup = null; var index = recipe.owner.recipes.IndexOf(recipe); foreach (var evacRecipe in evacuate) { evacRecipe.SetOwner(recipe.owner); } recipe.owner.RecordUndo().recipes.InsertRange(index + 1, evacuate); closed = true; } if (recipe.subgroup != null && imgui.BuildButton("ShoppingList")) { BuildShoppngList(recipe); closed = true; } if (imgui.BuildCheckBox("Enabled", recipe.enabled, out var newEnabled)) { recipe.RecordUndo().enabled = newEnabled; } if (recipe.subgroup != null && imgui.BuildRedButton("Delete nested table") == ImGuiUtils.Event.Click) { recipe.owner.RecordUndo().recipes.Remove(recipe); closed = true; } if (recipe.subgroup == null && imgui.BuildRedButton("Delete recipe") == ImGuiUtils.Event.Click) { recipe.owner.RecordUndo().recipes.Remove(recipe); closed = true; } }); } gui.textColor = recipe.hierarchyEnabled ? SchemeColor.BackgroundText : SchemeColor.BackgroundTextFaint; gui.BuildText(recipe.recipe.locName, wrap: true); }
public override void Build(ImGui gui) { BuildHeader(gui, "Never Enough Items Explorer"); using (gui.EnterRow()) { if (recent.Count == 0) { gui.AllocateRect(0f, 3f); } for (var i = recent.Count - 1; i >= 0; i--) { var elem = recent[i]; if (gui.BuildFactorioObjectButton(elem, 3f)) { changing = elem; } } } using (gui.EnterGroup(new Padding(0.5f), RectAllocator.LeftRow)) { gui.spacing = 0.2f; gui.BuildFactorioObjectIcon(current, size: 3f); gui.BuildText(current.locName, Font.subheader); gui.allocator = RectAllocator.RightAlign; gui.BuildText(CostAnalysis.GetDisplayCost(current)); var amount = CostAnalysis.Instance.GetItemAmount(current); if (amount != null) { gui.BuildText(amount, wrap: true); } } if (gui.BuildFactorioObjectButton(gui.lastRect, current, SchemeColor.Grey)) { SelectObjectPanel.Select(Database.goods.all, "Select item", SetItem); } using (var split = gui.EnterHorizontalSplit(2)) { split.Next(); gui.BuildText("Production:", Font.subheader); productionList.Build(gui); split.Next(); gui.BuildText("Usages:", Font.subheader); usageList.Build(gui); } CheckChanging(); using (gui.EnterRow()) { if (gui.BuildLink("What do colored bars mean?")) { MessageBox.Show("How to read colored bars", "Blue bar means estimated production or comsumption of the thing you selected. Blue bar at 50% means that that recipe produces(consumes) 50% of the product.\n\n" + "Orange bar means estimated recipe efficiency. If it is not full, the recipe looks inefficient to YAFC.\n\n" + "It is possible for a recipe to be efficient but not useful - for example a recipe that produces something that is not useful.\n\n" + "YAFC only estimates things that are required for science recipes. So buildings, belts, weapons, fuel - are not shown in estimations.", "Ok"); } if (gui.BuildCheckBox("Current milestones info", atCurrentMilestones, out atCurrentMilestones, allocator: RectAllocator.RightRow)) { var item = current; current = null; SetItem(item); } } }
private void DrawRecipeEntry(ImGui gui, RecipeEntry entry, bool production) { var textcolor = SchemeColor.BackgroundText; var bgColor = SchemeColor.Background; var isBuilding = gui.isBuilding; var recipe = entry.recipe; var waste = recipe.RecipeWaste(atCurrentMilestones); if (isBuilding) { if (entry.entryStatus == EntryStatus.NotAccessible) { bgColor = SchemeColor.None; textcolor = SchemeColor.BackgroundTextFaint; } else if (entry.flow > 0f) { bgColor = SchemeColor.Secondary; textcolor = SchemeColor.SecondaryText; } } using (gui.EnterGroup(new Padding(0.5f), production ? RectAllocator.LeftRow : RectAllocator.RightRow, textcolor)) { using (gui.EnterFixedPositioning(4f, 0f, default)) { gui.allocator = RectAllocator.Stretch; gui.BuildFactorioObjectButton(entry.recipe, 4f, MilestoneDisplay.Contained); using (gui.EnterRow()) { gui.BuildIcon(Icon.Time); gui.BuildText(DataUtils.FormatAmount(entry.recipe.time, UnitOfMeasure.Second), align: RectAlignment.Middle); } var bh = CostAnalysis.Instance.GetBuildingHours(recipe, entry.recipeFlow); if (bh > 20) { gui.BuildText(DataUtils.FormatAmount(bh, UnitOfMeasure.None, suffix: "bh"), align: RectAlignment.Middle); if (gui.BuildButton(gui.lastRect, SchemeColor.None, SchemeColor.Grey) == ImGuiUtils.Event.MouseOver) { gui.ShowTooltip(g => g.BuildText("Building-hours.\nAmount of building-hours required for all researches", wrap: true)); } } } gui.AllocateSpacing(); gui.allocator = production ? RectAllocator.LeftAlign : RectAllocator.RightAlign; gui.BuildText(recipe.locName, wrap: true); if (recipe.ingredients.Length + recipe.products.Length <= 8) { using (gui.EnterRow()) { DrawIngredients(gui, entry.recipe); gui.allocator = RectAllocator.RightRow; DrawProducts(gui, entry.recipe); if (recipe.products.Length < 3 && recipe.ingredients.Length < 5) { gui.AllocateSpacing((3 - entry.recipe.products.Length) * 3f); } else if (recipe.products.Length < 3) { gui.allocator = RectAllocator.RemainigRow; } gui.BuildIcon(Icon.ArrowRight, 3f); } } else { using (gui.EnterRow()) DrawIngredients(gui, entry.recipe); using (gui.EnterRow()) { gui.BuildIcon(Icon.ArrowDownRight, 3f); gui.allocator = RectAllocator.RightRow; DrawProducts(gui, entry.recipe); } } } if (isBuilding) { var rect = gui.lastRect; if (entry.flow > 0f) { var percentFlow = MathUtils.Clamp(entry.flow / currentFlow, 0f, 1f); rect.Width *= percentFlow; gui.DrawRectangle(rect, SchemeColor.Primary); } else if (waste <= 0f) { bgColor = SchemeColor.Secondary; } else { rect.Width *= (1f - waste); gui.DrawRectangle(rect, SchemeColor.Secondary); } gui.DrawRectangle(gui.lastRect, bgColor); } }