public override void Build(ImGui gui) { BuildHeader(gui, "Milestone editor"); milestoneList.Build(gui); gui.BuildText( "Hint: You can reorder milestones. When an object is locked behind a milestone, the first inaccessible milestone will be shown. Also when there is a choice between different milestones, first will be chosen", wrap: true, color: SchemeColor.BackgroundTextFaint); if (gui.BuildButton("Add milestone")) { if (Project.current.settings.milestones.Count >= 60) { MessageBox.Show(null, "Milestone limit reached", "60 milestones is the limit. You may delete some of the milestones you've already reached.", "Ok"); } else { SelectObjectPanel.Select(Database.objects.all, "Add new milestone", AddMilestone); } } }
private void BuildEntityMenu(ImGui gui, ref bool closed) { if (gui.BuildButton("Mass set assembler") && (closed = true)) { SelectObjectPanel.Select(Database.entities.all.Where(x => x.recipes.Count > 0), "Set assembler for all recipes", set => { DataUtils.FavouriteCrafter.AddToFavourite(set, 10); foreach (var recipe in GetRecipesRecursive()) { if (recipe.recipe.crafters.Contains(set)) { recipe.RecordUndo().entity = set; if (!set.energy.fuels.Contains(recipe.fuel)) { recipe.fuel = recipe.entity.energy.fuels.AutoSelect(DataUtils.FavouriteFuel); } } } }, DataUtils.FavouriteCrafter, false); } if (gui.BuildButton("Mass set fuel") && (closed = true)) { SelectObjectPanel.Select(Database.goods.all.Where(x => x.fuelValue > 0), "Set fuel for all recipes", set => { DataUtils.FavouriteFuel.AddToFavourite(set, 10); foreach (var recipe in GetRecipesRecursive()) { if (recipe.entity != null && recipe.entity.energy.fuels.Contains(set)) { recipe.RecordUndo().fuel = set; } } }, DataUtils.FavouriteFuel, false); } if (gui.BuildButton("Shopping list") && (closed = true)) { BuildShoppngList(null); } }
private void AddDesiredProductAtLevel(ProductionTable table) { SelectObjectPanel.Select(Database.goods.all, "Add desired product", product => { if (table.linkMap.TryGetValue(product, out var existing)) { if (existing.amount != 0) { return; } existing.RecordUndo().amount = 1f; } else { table.RecordUndo().links.Add(new ProductionLink(table, product) { amount = 1f }); } }); }
private void DrawRecipeModules(ImGui gui, EntityBeacon beacon, ref ModuleEffects effects) { var remainingModules = recipe.entity?.moduleSlots ?? 0; using (var grid = gui.EnterInlineGrid(3f, 1f)) { var list = beacon != null ? recipe.modules.beaconList : recipe.modules.list; foreach (var module in list) { grid.Next(); var evt = gui.BuildFactorioObjectWithEditableAmount(module.module, module.fixedCount, UnitOfMeasure.None, out var newAmount); if (evt == GoodsWithAmountEvent.ButtonClick) { SelectObjectPanel.Select(GetModules(beacon), "Select module", sel => { if (sel == null) { recipe.modules.RecordUndo().list.Remove(module); } else { module.RecordUndo().module = sel; } gui.Rebuild(); }, DataUtils.FavouriteModule, true); } else if (evt == GoodsWithAmountEvent.TextEditing) { var amountInt = MathUtils.Floor(newAmount); if (amountInt < 0) { amountInt = 0; } module.RecordUndo().fixedCount = amountInt; } if (beacon == null) { var count = Math.Min(remainingModules, module.fixedCount > 0 ? module.fixedCount : int.MaxValue); if (count > 0) { effects.AddModules(module.module.module, count); remainingModules -= count; } } else { effects.AddModules(module.module.module, module.fixedCount * beacon.beaconEfficiency); } } grid.Next(); if (gui.BuildButton(Icon.Plus, SchemeColor.Primary, SchemeColor.PrimalyAlt, size: 2.5f)) { gui.BuildObjectSelectDropDown(GetModules(beacon), DataUtils.FavouriteModule, sel => { recipe.modules.RecordUndo(); list.Add(new RecipeRowCustomModule(recipe.modules, sel)); gui.Rebuild(); }, "Select module"); } } }
protected override void BuildContent(ImGui gui) { if (model == null) { return; } var elementsPerRow = MathUtils.Floor((flatHierarchyBuilder.width - 2f) / 4f); gui.spacing = 1f; var pad = new Padding(1f, 0.2f); using (gui.EnterGroup(pad)) { gui.BuildText("Desired products and amounts:"); using (var grid = gui.EnterInlineGrid(3f, 1f, elementsPerRow)) { foreach (var link in model.links) { if (link.amount != 0f) { grid.Next(); DrawDesiredProduct(gui, link); } } grid.Next(); if (gui.BuildButton(Icon.Plus, SchemeColor.Primary, SchemeColor.PrimalyAlt, size: 2.5f)) { SelectObjectPanel.Select(Database.goods.all, "Add desired product", product => { if (model.linkMap.TryGetValue(product, out var existing)) { if (existing.amount != 0) { return; } existing.RecordUndo().amount = 1f; } else { model.RecordUndo().links.Add(new ProductionLink(model, product) { amount = 1f }); } }); } } } if (gui.isBuilding) { gui.DrawRectangle(gui.lastRect, SchemeColor.Background, RectangleBorder.Thin); } if (model.flow.Length > 0 && model.flow[0].amount < -1e-5f) { using (gui.EnterGroup(pad)) { gui.BuildText("Summary ingredients:"); var grid = gui.EnterInlineGrid(3f, 1f, elementsPerRow); BuildTableIngredients(gui, model, model, ref grid); grid.Dispose(); } if (gui.isBuilding) { gui.DrawRectangle(gui.lastRect, SchemeColor.Background, RectangleBorder.Thin); } } if (model.flow.Length > 0 && model.flow[model.flow.Length - 1].amount > 1e-5f) { using (gui.EnterGroup(pad)) { gui.BuildText("Extra products:"); var grid = gui.EnterInlineGrid(3f, 1f, elementsPerRow); BuildTableProducts(gui, model, model, ref grid); grid.Dispose(); } if (gui.isBuilding) { gui.DrawRectangle(gui.lastRect, SchemeColor.Background, RectangleBorder.Thin); } } gui.AllocateSpacing(); flatHierarchyBuilder.Build(gui); gui.SetMinWidth(flatHierarchyBuilder.width); }
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, "Module autofill parameters"); BuildSimple(gui, modules); if (gui.BuildCheckBox("Fill modules in miners", modules.fillMiners, out var newFill)) { modules.RecordUndo().fillMiners = newFill; } gui.AllocateSpacing(); gui.BuildText("Filler module:", Font.subheader); gui.BuildText("Use this module when aufofill doesn't add anything (for example when productivity modules doesn't fit)", wrap: true); if (gui.BuildFactorioObjectButtonWithText(modules.fillerModule)) { SelectObjectPanel.Select(Database.allModules, "Select filler module", select => { modules.RecordUndo().fillerModule = select; }, true); } gui.AllocateSpacing(); gui.BuildText("Beacons & beacon modules:", Font.subheader); if (gui.BuildFactorioObjectButtonWithText(modules.beacon)) { SelectObjectPanel.Select(Database.allBeacons, "Select beacon", select => { modules.RecordUndo(); modules.beacon = select; if (modules.beaconModule != null && (modules.beacon == null || !modules.beacon.CanAcceptModule(modules.beaconModule.module))) { modules.beaconModule = null; } gui.Rebuild(); }, true); } if (gui.BuildFactorioObjectButtonWithText(modules.beaconModule)) { SelectObjectPanel.Select(Database.allModules.Where(x => modules.beacon?.CanAcceptModule(x.module) ?? false), "Select module for beacon", select => { modules.RecordUndo().beaconModule = select; }, true); } using (gui.EnterRow()) { gui.BuildText("Beacons per building: "); if (gui.BuildTextInput(modules.beaconsPerBuilding.ToString(), out var newText, null, Icon.None, true, new Padding(0.5f, 0f)) && int.TryParse(newText, out var newAmount) && newAmount > 0) { modules.RecordUndo().beaconsPerBuilding = newAmount; } } gui.BuildText("Please note that beacons themself are not part of the calculation", wrap: true); using (gui.EnterRow()) { gui.BuildText("Mining productivity bonus (project-wide setting): "); if (gui.BuildTextInput(DataUtils.FormatAmount(Project.current.settings.miningProductivity, UnitOfMeasure.Percent), out var newText, null, Icon.None, true, new Padding(0.5f, 0f)) && DataUtils.TryParseAmount(newText, out var newAmount, UnitOfMeasure.Percent)) { Project.current.settings.RecordUndo().miningProductivity = newAmount; } } if (gui.BuildButton("Done")) { Close(); } }
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); } } }