OpenRA.Mods.Common.Widgets.ObserverProductionIconsWidget.Draw C# (CSharp) Method

Draw() public method

public Draw ( ) : void
return void
        public override void Draw()
        {
            var player = GetPlayer();
            if (player == null)
                return;

            var queues = world.ActorsWithTrait<ProductionQueue>()
                .Where(a => a.Actor.Owner == player)
                .Select((a, i) => new { a.Trait, i });

            foreach (var queue in queues)
                if (!clocks.ContainsKey(queue.Trait))
                    clocks.Add(queue.Trait, new Animation(world, ClockAnimation));

            var iconSize = new float2(IconWidth, IconHeight);
            foreach (var queue in queues)
            {
                var current = queue.Trait.CurrentItem();
                if (current == null)
                    continue;

                var faction = queue.Trait.Actor.Owner.Faction.InternalName;
                var actor = queue.Trait.AllItems().FirstOrDefault(a => a.Name == current.Item);
                if (actor == null)
                    continue;

                var rsi = actor.TraitInfo<RenderSpritesInfo>();
                var icon = new Animation(world, rsi.GetImage(actor, world.Map.Rules.Sequences, faction));
                icon.Play(actor.TraitInfo<TooltipInfo>().Icon);
                var bi = actor.TraitInfo<BuildableInfo>();
                var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0);
                WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f);

                var pio = queue.Trait.Actor.Owner.PlayerActor.TraitsImplementing<IProductionIconOverlay>()
                    .FirstOrDefault(p => p.IsOverlayActive(actor));
                if (pio != null)
                    WidgetUtils.DrawSHPCentered(pio.Sprite, location + 0.5f * iconSize + pio.Offset(0.5f * iconSize),
                        worldRenderer.Palette(pio.Palette), 0.5f);

                var clock = clocks[queue.Trait];
                clock.PlayFetchIndex(ClockSequence,
                    () => current.TotalTime == 0 ? 0 : ((current.TotalTime - current.RemainingTime)
                    * (clock.CurrentSequence.Length - 1) / current.TotalTime));
                clock.Tick();
                WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer.Palette(ClockPalette), 0.5f);

                var tiny = Game.Renderer.Fonts["Tiny"];
                var text = GetOverlayForItem(current, timestep);
                tiny.DrawTextWithContrast(text,
                    location + new float2(16, 16) - new float2(tiny.Measure(text).X / 2, 0),
                    Color.White, Color.Black, 1);
            }
        }