public override void Tick() { buildableItems = Queue.BuildableItems().ToArray(); visibleIcons = Math.Min((Game.Renderer.Resolution.Height - RenderBounds.Top) / ButtonWidget.Size, buildableItems.Length); Bounds.Height = visibleIcons * ButtonWidget.Size; if (visibleIcons < buildableItems.Length) { visibleIcons = (Game.Renderer.Resolution.Height - RenderBounds.Top - ButtonWidget.Size / 2) / ButtonWidget.Size; Bounds.Height = visibleIcons * ButtonWidget.Size + ButtonWidget.Size / 2; } scrollOffset = Math.Max(0, Math.Min(scrollOffset, buildableItems.Length - visibleIcons)); var oldButtons = Children.Where(c => c is ProductionItemButtonWidget && buildableItems.All(b => b.Name != ((ProductionItemButtonWidget)c).Item)).ToArray(); foreach (var oldButton in oldButtons) { Children.Remove(oldButton); } for (var i = 0; i < buildableItems.Length; i++) { var buildableItem = buildableItems[i]; var button = Children.FirstOrDefault(c => { var widget = c as ProductionItemButtonWidget; return(widget != null && widget.Item == buildableItem.Name); }); if (button == null) { Func <bool> isActive = () => { if (Queue is SelfConstructingProductionQueue) { var pbog = sidebar.IngameUi.World.OrderGenerator == null ? null : sidebar.IngameUi.World.OrderGenerator as PlaceSpecificBuildingOrderGenerator; return(pbog != null && pbog.Name == buildableItem.Name); } return(Queue.AllQueued().Any(item => item.Item.Equals(buildableItem.Name))); }; var valued = buildableItem.TraitInfoOrDefault <ValuedInfo>(); var buildTime = WidgetUtils.FormatTime(buildableItem.TraitInfo <BuildableInfo>().BuildDuration, false, sidebar.IngameUi.World.Timestep); var description = buildableItem.TraitInfoOrDefault <TooltipDescriptionInfo>(); var icon = buildableItem.TraitInfo <RenderSpritesInfo>(); button = new ProductionItemButtonWidget(sidebar) { Item = buildableItem.Name, Icon = icon.Image ?? buildableItem.Name, Progress = () => { if (Queue is SelfConstructingProductionQueue) { return(-1); } var queued = Queue.AllQueued().FirstOrDefault(q => q.Item == buildableItem.Name); return(queued == null ? -1 : (queued.TotalTime - queued.RemainingTime) * 100 / queued.TotalTime); }, Amount = () => { var queued = Queue.AllQueued().Where(q => q.Item == buildableItem.Name).ToArray(); return(queued.Length > 0 && queued.First().Infinite ? -1 : queued.Length); }, ClickedLeft = mi => { var count = mi.Modifiers.HasModifier(Modifiers.Shift) ? 5 : mi.Modifiers.HasModifier(Modifiers.Ctrl) ? 11 : 1; var actor = sidebar.IngameUi.World.Map.Rules.Actors[buildableItem.Name]; if (actor.HasTraitInfo <BuildingInfo>()) { if (isActive()) { sidebar.IngameUi.World.CancelInputMode(); } else { sidebar.IngameUi.World.OrderGenerator = new PlaceSpecificBuildingOrderGenerator(Queue, buildableItem.Name, sidebar.IngameUi.WorldRenderer); } } else { sidebar.IngameUi.World.IssueOrder(Order.StartProduction(Queue.Actor, buildableItem.Name, count)); } }, ClickedRight = mi => { var count = mi.Modifiers.HasModifier(Modifiers.Shift) ? 5 : mi.Modifiers.HasModifier(Modifiers.Ctrl) ? 11 : 1; sidebar.IngameUi.World.IssueOrder(Order.CancelProduction(Queue.Actor, buildableItem.Name, count)); }, IsActive = isActive, IsFocused = () => Parent.Children.Count > 1 && IsFocused, TooltipTitle = buildableItem.TraitInfo <TooltipInfo>().Name, TooltipText = (valued == null ? "" : "Cost: " + valued.Cost + "\n") + "Time: " + buildTime + (description != null ? "\n" + description.Description : null) }; AddChild(button); } if (i < scrollOffset || i >= scrollOffset + visibleIcons) { button.Visible = false; } else { button.Visible = true; button.Bounds.Y = (i - scrollOffset) * ButtonWidget.Size; } } }
public override void Tick() { this.buildableItems = this.Queue.BuildableItems().ToArray(); this.visibleIcons = Math.Min((Game.Renderer.Resolution.Height - this.RenderBounds.Top) / SidebarButtonWidget.Size, this.buildableItems.Length); this.Bounds.Height = this.visibleIcons * SidebarButtonWidget.Size; if (this.visibleIcons < this.buildableItems.Length) { this.visibleIcons = (Game.Renderer.Resolution.Height - this.RenderBounds.Top - SidebarButtonWidget.Size / 2) / SidebarButtonWidget.Size; this.Bounds.Height = this.visibleIcons * SidebarButtonWidget.Size + SidebarButtonWidget.Size / 2; } this.scrollOffset = Math.Max(0, Math.Min(this.scrollOffset, this.buildableItems.Length - this.visibleIcons)); var oldButtons = this.Children .Where(c => c is ProductionItemButtonWidget && this.buildableItems.All(b => b.Name != ((ProductionItemButtonWidget)c).Item)) .ToArray(); foreach (var oldButton in oldButtons) { this.Children.Remove(oldButton); } for (var i = 0; i < this.buildableItems.Length; i++) { var buildableItem = this.buildableItems[i]; var button = this.Children.FirstOrDefault(c => c is ProductionItemButtonWidget widget && widget.Item == buildableItem.Name); if (button == null) { bool IsActive() { if (this.Queue is not SelfConstructingProductionQueue) { return(this.Queue.AllQueued().Any(item => item.Item.Equals(buildableItem.Name))); } return(this.sidebar.IngameUi.World.OrderGenerator is PlaceSpecificBuildingOrderGenerator pbog && pbog.Name == buildableItem.Name); } var valued = buildableItem.TraitInfoOrDefault <ValuedInfo>(); var buildTime = WidgetUtils.FormatTime( buildableItem.TraitInfoOrDefault <BuildableInfo>().BuildDuration, false, this.sidebar.IngameUi.World.Timestep ); var description = buildableItem.TraitInfoOrDefault <TooltipDescriptionInfo>(); var icon = buildableItem.TraitInfoOrDefault <RenderSpritesInfo>(); button = new ProductionItemButtonWidget(this.sidebar) { Item = buildableItem.Name, Icon = icon.Image ?? buildableItem.Name, Progress = () => { if (this.Queue is SelfConstructingProductionQueue) { return(-1); } var queued = this.Queue.AllQueued().FirstOrDefault(q => q.Item == buildableItem.Name); return(queued == null ? -1 : (queued.TotalTime - queued.RemainingTime) * 100 / queued.TotalTime); }, Amount = () => { var queued = this.Queue.AllQueued().Where(q => q.Item == buildableItem.Name).ToArray(); return(queued.FirstOrDefault()?.Infinite ?? false ? -1 : queued.Length); }, ClickedLeft = mi => { var count = mi.Modifiers.HasModifier(Modifiers.Shift) ? 5 : mi.Modifiers.HasModifier(Modifiers.Ctrl) ? 11 : 1; var actor = this.sidebar.IngameUi.World.Map.Rules.Actors[buildableItem.Name]; if (actor.HasTraitInfo <BuildingInfo>()) { if (IsActive()) { this.sidebar.IngameUi.World.CancelInputMode(); } else { this.sidebar.IngameUi.World.OrderGenerator = new PlaceSpecificBuildingOrderGenerator( this.Queue, buildableItem.Name, this.sidebar.IngameUi.WorldRenderer ); } } else { this.sidebar.IngameUi.World.IssueOrder(Order.StartProduction(this.Queue.Actor, buildableItem.Name, count)); } }, ClickedRight = mi => { var count = mi.Modifiers.HasModifier(Modifiers.Shift) ? 5 : mi.Modifiers.HasModifier(Modifiers.Ctrl) ? 11 : 1; this.sidebar.IngameUi.World.IssueOrder(Order.CancelProduction(this.Queue.Actor, buildableItem.Name, count)); }, IsActive = IsActive, IsFocused = () => this.Parent.Children.Count > 1 && this.IsFocused, TooltipTitle = buildableItem.TraitInfoOrDefault <TooltipInfo>().Name, TooltipText = $"{(valued == null ? "" : $"Cost: {valued.Cost}\n")}Time: {buildTime}{(description != null ? $"\n{description.Description}" : null)}" }; this.AddChild(button); } if (i < this.scrollOffset || i >= this.scrollOffset + this.visibleIcons) { button.Visible = false; } else { button.Visible = true; button.Bounds.Y = (i - this.scrollOffset) * SidebarButtonWidget.Size; } } }