Пример #1
0
        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;
                }
            }
        }