Exemple #1
0
        protected SingleHotkeyBaseLogic(Widget widget, string argName, string parentName, Dictionary <string, MiniYaml> logicArgs)
        {
            var      ks = Game.Settings.Keys;
            MiniYaml yaml;

            var namedKey = new NamedHotkey();

            if (logicArgs.TryGetValue(argName, out yaml))
            {
                namedKey = new NamedHotkey(yaml.Value, ks);
            }

            var keyhandler = widget.Get <LogicKeyListenerWidget>(parentName);

            keyhandler.AddHandler(e =>
            {
                if (e.Event == KeyInputEvent.Down)
                {
                    var key = Hotkey.FromKeyInput(e);
                    if (key == namedKey.GetValue())
                    {
                        return(OnHotkeyActivated(e));
                    }
                }

                return(false);
            });
        }
Exemple #2
0
        public MapEditorLogic(Widget widget, World world, WorldRenderer worldRenderer, Dictionary <string, MiniYaml> logicArgs)
        {
            MiniYaml yaml;
            var      changeZoomKey = new NamedHotkey();

            if (logicArgs.TryGetValue("ChangeZoomKey", out yaml))
            {
                changeZoomKey = new NamedHotkey(yaml.Value, Game.Settings.Keys);
            }

            var editorViewport = widget.Get <EditorViewportControllerWidget>("MAP_EDITOR");

            var gridButton           = widget.GetOrNull <ButtonWidget>("GRID_BUTTON");
            var terrainGeometryTrait = world.WorldActor.Trait <TerrainGeometryOverlay>();

            if (gridButton != null && terrainGeometryTrait != null)
            {
                gridButton.OnClick       = () => terrainGeometryTrait.Enabled ^= true;
                gridButton.IsHighlighted = () => terrainGeometryTrait.Enabled;
            }

            var zoomDropdown = widget.GetOrNull <DropDownButtonWidget>("ZOOM_BUTTON");

            if (zoomDropdown != null)
            {
                var selectedZoom = (Game.Settings.Graphics.PixelDouble ? 2f : 1f).ToString();

                zoomDropdown.SelectedItem = selectedZoom;
                Func <float, ScrollItemWidget, ScrollItemWidget> setupItem = (zoom, itemTemplate) =>
                {
                    var item = ScrollItemWidget.Setup(
                        itemTemplate,
                        () =>
                    {
                        return(float.Parse(zoomDropdown.SelectedItem) == zoom);
                    },
                        () =>
                    {
                        zoomDropdown.SelectedItem   = selectedZoom = zoom.ToString();
                        worldRenderer.Viewport.Zoom = float.Parse(selectedZoom);
                    });

                    var label = zoom.ToString();
                    item.Get <LabelWidget>("LABEL").GetText = () => label;

                    return(item);
                };

                var options = worldRenderer.Viewport.AvailableZoomSteps;
                zoomDropdown.OnMouseDown = _ => zoomDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem);
                zoomDropdown.GetText     = () => zoomDropdown.SelectedItem;
                zoomDropdown.OnKeyPress  = e =>
                {
                    var key = Hotkey.FromKeyInput(e);
                    if (key != changeZoomKey.GetValue())
                    {
                        return;
                    }

                    var selected = (options.IndexOf(float.Parse(selectedZoom)) + 1) % options.Length;
                    var zoom     = options[selected];
                    worldRenderer.Viewport.Zoom = zoom;
                    selectedZoom = zoom.ToString();
                    zoomDropdown.SelectedItem = zoom.ToString();
                };
            }

            var copypasteButton = widget.GetOrNull <ButtonWidget>("COPYPASTE_BUTTON");

            if (copypasteButton != null)
            {
                copypasteButton.OnClick       = () => editorViewport.SetBrush(new EditorCopyPasteBrush(editorViewport, worldRenderer));
                copypasteButton.IsHighlighted = () => editorViewport.CurrentBrush is EditorCopyPasteBrush;
            }

            var coordinateLabel = widget.GetOrNull <LabelWidget>("COORDINATE_LABEL");

            if (coordinateLabel != null)
            {
                coordinateLabel.GetText = () =>
                {
                    var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos);
                    var map  = worldRenderer.World.Map;
                    return(map.Height.Contains(cell) ?
                           "{0},{1} ({2})".F(cell, map.Height[cell], map.Tiles[cell].Type) : "");
                };
            }

            var cashLabel = widget.GetOrNull <LabelWidget>("CASH_LABEL");

            if (cashLabel != null)
            {
                var reslayer = worldRenderer.World.WorldActor.TraitsImplementing <EditorResourceLayer>().FirstOrDefault();
                if (reslayer != null)
                {
                    cashLabel.GetText = () => "$ {0}".F(reslayer.NetWorth);
                }
            }
        }
        public MenuButtonsChromeLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs)
        {
            this.world = world;

            worldRoot = Ui.Root.Get("WORLD_ROOT");
            menuRoot  = Ui.Root.Get("MENU_ROOT");

            MiniYaml yaml;
            var      ks = Game.Settings.Keys;

            string[] keyNames     = Enum.GetNames(typeof(ObserverStatsPanel));
            var      statsHotkeys = new NamedHotkey[keyNames.Length];

            for (var i = 0; i < keyNames.Length; i++)
            {
                statsHotkeys[i] = logicArgs.TryGetValue("Statistics" + keyNames[i] + "Key", out yaml) ? new NamedHotkey(yaml.Value, ks) : new NamedHotkey();
            }

            // System buttons
            var options = widget.GetOrNull <MenuButtonWidget>("OPTIONS_BUTTON");

            if (options != null)
            {
                var blinking = false;
                var lp       = world.LocalPlayer;
                options.IsDisabled = () => disableSystemButtons;
                options.OnClick    = () =>
                {
                    blinking = false;
                    OpenMenuPanel(options, new WidgetArgs()
                    {
                        { "activePanel", IngameInfoPanel.AutoSelect }
                    });
                };
                options.IsHighlighted = () => blinking && Game.LocalTick % 50 < 25;

                if (lp != null)
                {
                    Action <Player, bool> startBlinking = (player, inhibitAnnouncement) =>
                    {
                        if (!inhibitAnnouncement && player == world.LocalPlayer)
                        {
                            blinking = true;
                        }
                    };

                    var mo = lp.PlayerActor.TraitOrDefault <MissionObjectives>();

                    if (mo != null)
                    {
                        mo.ObjectiveAdded += startBlinking;
                    }
                }
            }

            var debug = widget.GetOrNull <MenuButtonWidget>("DEBUG_BUTTON");

            if (debug != null)
            {
                // Can't use DeveloperMode.Enabled because there is a hardcoded hack to *always*
                // enable developer mode for singleplayer games, but we only want to show the button
                // if it has been explicitly enabled
                var def     = world.Map.Rules.Actors["player"].TraitInfo <DeveloperModeInfo>().Enabled;
                var enabled = world.LobbyInfo.GlobalSettings.OptionOrDefault("cheats", def);
                debug.IsVisible  = () => enabled;
                debug.IsDisabled = () => disableSystemButtons;
                debug.OnClick    = () => OpenMenuPanel(debug, new WidgetArgs()
                {
                    { "activePanel", IngameInfoPanel.Debug }
                });
            }

            var stats = widget.GetOrNull <MenuButtonWidget>("OBSERVER_STATS_BUTTON");

            if (stats != null)
            {
                stats.IsDisabled = () => disableSystemButtons || world.Map.Visibility.HasFlag(MapVisibility.MissionSelector);
                stats.OnClick    = () => OpenMenuPanel(stats, new WidgetArgs()
                {
                    { "activePanel", ObserverStatsPanel.Basic }
                });
            }

            var keyListener = widget.GetOrNull <LogicKeyListenerWidget>("OBSERVER_KEY_LISTENER");

            if (keyListener != null)
            {
                keyListener.AddHandler(e =>
                {
                    if (e.Event == KeyInputEvent.Down && !e.IsRepeat)
                    {
                        var key = Hotkey.FromKeyInput(e);
                        for (var i = 0; i < statsHotkeys.Length; i++)
                        {
                            if (key == statsHotkeys[i].GetValue())
                            {
                                OpenMenuPanel(stats, new WidgetArgs()
                                {
                                    { "activePanel", i }
                                });
                                return(true);
                            }
                        }
                    }

                    return(false);
                });
            }
        }
Exemple #4
0
        public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget, Action onExit, ObserverStatsPanel activePanel, Dictionary <string, MiniYaml> logicArgs)
        {
            this.world         = world;
            this.worldRenderer = worldRenderer;

            MiniYaml yaml;
            var      ks = Game.Settings.Keys;

            string[] keyNames     = Enum.GetNames(typeof(ObserverStatsPanel));
            var      statsHotkeys = new NamedHotkey[keyNames.Length];

            for (var i = 0; i < keyNames.Length; i++)
            {
                statsHotkeys[i] = logicArgs.TryGetValue("Statistics" + keyNames[i] + "Key", out yaml) ? new NamedHotkey(yaml.Value, ks) : new NamedHotkey();
            }

            players = world.Players.Where(p => !p.NonCombatant);

            basicStatsHeaders            = widget.Get <ContainerWidget>("BASIC_STATS_HEADERS");
            economyStatsHeaders          = widget.Get <ContainerWidget>("ECONOMY_STATS_HEADERS");
            productionStatsHeaders       = widget.Get <ContainerWidget>("PRODUCTION_STATS_HEADERS");
            combatStatsHeaders           = widget.Get <ContainerWidget>("COMBAT_STATS_HEADERS");
            earnedThisMinuteGraphHeaders = widget.Get <ContainerWidget>("EARNED_THIS_MIN_GRAPH_HEADERS");

            playerStatsPanel        = widget.Get <ScrollPanelWidget>("PLAYER_STATS_PANEL");
            playerStatsPanel.Layout = new GridLayout(playerStatsPanel);

            basicPlayerTemplate           = playerStatsPanel.Get <ScrollItemWidget>("BASIC_PLAYER_TEMPLATE");
            economyPlayerTemplate         = playerStatsPanel.Get <ScrollItemWidget>("ECONOMY_PLAYER_TEMPLATE");
            productionPlayerTemplate      = playerStatsPanel.Get <ScrollItemWidget>("PRODUCTION_PLAYER_TEMPLATE");
            combatPlayerTemplate          = playerStatsPanel.Get <ScrollItemWidget>("COMBAT_PLAYER_TEMPLATE");
            earnedThisMinuteGraphTemplate = playerStatsPanel.Get <ContainerWidget>("EARNED_THIS_MIN_GRAPH_TEMPLATE");

            teamTemplate = playerStatsPanel.Get <ScrollItemWidget>("TEAM_TEMPLATE");

            var statsDropDown = widget.Get <DropDownButtonWidget>("STATS_DROPDOWN");
            Func <string, ContainerWidget, Action, StatsDropDownOption> createStatsOption = (title, headers, a) =>
            {
                return(new StatsDropDownOption
                {
                    Title = title,
                    IsSelected = () => headers.Visible,
                    OnClick = () =>
                    {
                        ClearStats();
                        statsDropDown.GetText = () => title;
                        a();
                    }
                });
            };

            var statsDropDownOptions = new StatsDropDownOption[]
            {
                createStatsOption("Basic", basicStatsHeaders, () => DisplayStats(BasicStats)),
                createStatsOption("Economy", economyStatsHeaders, () => DisplayStats(EconomyStats)),
                createStatsOption("Production", productionStatsHeaders, () => DisplayStats(ProductionStats)),
                createStatsOption("Combat", combatStatsHeaders, () => DisplayStats(CombatStats)),
                createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph())
            };

            Func <StatsDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
            {
                var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                item.Get <LabelWidget>("LABEL").GetText = () => option.Title;
                return(item);
            };

            statsDropDown.OnMouseDown = _ => statsDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, statsDropDownOptions, setupItem);
            statsDropDownOptions[(int)activePanel].OnClick();

            var close = widget.GetOrNull <ButtonWidget>("CLOSE");

            if (close != null)
            {
                close.OnClick = () =>
                {
                    Ui.CloseWindow();
                    Ui.Root.RemoveChild(widget);
                    onExit();
                }
            }
            ;

            var keyListener = statsDropDown.Get <LogicKeyListenerWidget>("STATS_DROPDOWN_KEYHANDLER");

            keyListener.AddHandler(e =>
            {
                if (e.Event == KeyInputEvent.Down && !e.IsRepeat)
                {
                    var key = Hotkey.FromKeyInput(e);
                    for (var i = 0; i < statsHotkeys.Length; i++)
                    {
                        if (key == statsHotkeys[i].GetValue())
                        {
                            statsDropDownOptions[i].OnClick();
                            return(true);
                        }
                    }
                }

                return(false);
            });
        }

        void ClearStats()
        {
            playerStatsPanel.Children.Clear();
            basicStatsHeaders.Visible            = false;
            economyStatsHeaders.Visible          = false;
            productionStatsHeaders.Visible       = false;
            combatStatsHeaders.Visible           = false;
            earnedThisMinuteGraphHeaders.Visible = false;
        }

        void EarnedThisMinuteGraph()
        {
            earnedThisMinuteGraphHeaders.Visible = true;
            var template = earnedThisMinuteGraphTemplate.Clone();

            var graph = template.Get <LineGraphWidget>("EARNED_THIS_MIN_GRAPH");

            graph.GetSeries = () =>
                              players.Select(p => new LineGraphSeries(
                                                 p.PlayerName,
                                                 p.Color.RGB,
                                                 (p.PlayerActor.TraitOrDefault <PlayerStatistics>() ?? new PlayerStatistics(p.PlayerActor)).EarnedSamples.Select(s => (float)s)));

            playerStatsPanel.AddChild(template);
            playerStatsPanel.ScrollToTop();
        }

        void DisplayStats(Func <Player, ScrollItemWidget> createItem)
        {
            var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key);

            foreach (var t in teams)
            {
                var team = t;
                var tt   = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
                tt.IgnoreMouseOver = true;
                tt.Get <LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key;
                playerStatsPanel.AddChild(tt);
                foreach (var p in team)
                {
                    var player = p;
                    playerStatsPanel.AddChild(createItem(player));
                }
            }
        }

        ScrollItemWidget CombatStats(Player player)
        {
            combatStatsHeaders.Visible = true;
            var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player);

            LobbyUtils.AddPlayerFlagAndName(template, player);

            var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>();

            if (stats == null)
            {
                return(template);
            }
            template.Get <LabelWidget>("ASSETS_DESTROYED").GetText = () => "$" + stats.KillsCost;
            template.Get <LabelWidget>("ASSETS_LOST").GetText      = () => "$" + stats.DeathsCost;
            template.Get <LabelWidget>("UNITS_KILLED").GetText     = () => stats.UnitsKilled.ToString();
            template.Get <LabelWidget>("UNITS_DEAD").GetText       = () => stats.UnitsDead.ToString();
            template.Get <LabelWidget>("BUILDINGS_KILLED").GetText = () => stats.BuildingsKilled.ToString();
            template.Get <LabelWidget>("BUILDINGS_DEAD").GetText   = () => stats.BuildingsDead.ToString();

            return(template);
        }

        ScrollItemWidget ProductionStats(Player player)
        {
            productionStatsHeaders.Visible = true;
            var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player);

            LobbyUtils.AddPlayerFlagAndName(template, player);

            template.Get <ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer      = () => player;
            template.Get <ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player;
            template.IgnoreChildMouseOver = false;

            return(template);
        }

        ScrollItemWidget EconomyStats(Player player)
        {
            economyStatsHeaders.Visible = true;
            var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player);

            LobbyUtils.AddPlayerFlagAndName(template, player);

            var res   = player.PlayerActor.Trait <PlayerResources>();
            var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>();

            if (stats == null)
            {
                return(template);
            }

            template.Get <LabelWidget>("CASH").GetText            = () => "$" + (res.Cash + res.Resources);
            template.Get <LabelWidget>("EARNED_MIN").GetText      = () => AverageEarnedPerMinute(res.Earned);
            template.Get <LabelWidget>("EARNED_THIS_MIN").GetText = () => "$" + stats.EarnedThisMinute;
            template.Get <LabelWidget>("EARNED").GetText          = () => "$" + res.Earned;
            template.Get <LabelWidget>("SPENT").GetText           = () => "$" + res.Spent;

            var assets = template.Get <LabelWidget>("ASSETS");

            assets.GetText = () => "$" + world.ActorsHavingTrait <Valued>()
                             .Where(a => a.Owner == player && !a.IsDead)
                             .Sum(a => a.Info.TraitInfos <ValuedInfo>().First().Cost);

            var harvesters = template.Get <LabelWidget>("HARVESTERS");

            harvesters.GetText = () => world.ActorsHavingTrait <Harvester>().Count(a => a.Owner == player && !a.IsDead).ToString();

            return(template);
        }

        ScrollItemWidget BasicStats(Player player)
        {
            basicStatsHeaders.Visible = true;
            var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player);

            LobbyUtils.AddPlayerFlagAndName(template, player);

            var res = player.PlayerActor.Trait <PlayerResources>();

            template.Get <LabelWidget>("CASH").GetText       = () => "$" + (res.Cash + res.Resources);
            template.Get <LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned);

            var powerRes = player.PlayerActor.Trait <PowerManager>();
            var power    = template.Get <LabelWidget>("POWER");

            power.GetText  = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided;
            power.GetColor = () => GetPowerColor(powerRes.PowerState);

            var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>();

            if (stats == null)
            {
                return(template);
            }
            template.Get <LabelWidget>("KILLS").GetText            = () => (stats.UnitsKilled + stats.BuildingsKilled).ToString();
            template.Get <LabelWidget>("DEATHS").GetText           = () => (stats.UnitsDead + stats.BuildingsDead).ToString();
            template.Get <LabelWidget>("ASSETS_DESTROYED").GetText = () => "$" + stats.KillsCost;
            template.Get <LabelWidget>("ASSETS_LOST").GetText      = () => "$" + stats.DeathsCost;
            template.Get <LabelWidget>("EXPERIENCE").GetText       = () => stats.Experience.ToString();
            template.Get <LabelWidget>("ACTIONS_MIN").GetText      = () => AverageOrdersPerMinute(stats.OrderCount);

            return(template);
        }

        ScrollItemWidget SetupPlayerScrollItemWidget(ScrollItemWidget template, Player player)
        {
            return(ScrollItemWidget.Setup(template, () => false, () =>
            {
                var playerBase = world.ActorsHavingTrait <BaseBuilding>().FirstOrDefault(a => !a.IsDead && a.Owner == player);
                if (playerBase != null)
                {
                    worldRenderer.Viewport.Center(playerBase.CenterPosition);
                }
            }));
        }
Exemple #5
0
        public MusicHotkeyLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs)
        {
            musicPlaylist = world.WorldActor.Trait <MusicPlaylist>();

            var      ks = Game.Settings.Keys;
            MiniYaml yaml;

            var stopKey = new NamedHotkey();

            if (logicArgs.TryGetValue("StopMusicKey", out yaml))
            {
                stopKey = new NamedHotkey(yaml.Value, ks);
            }

            var pauseKey = new NamedHotkey();

            if (logicArgs.TryGetValue("PauseMusicKey", out yaml))
            {
                pauseKey = new NamedHotkey(yaml.Value, ks);
            }

            var prevKey = new NamedHotkey();

            if (logicArgs.TryGetValue("PrevMusicKey", out yaml))
            {
                prevKey = new NamedHotkey(yaml.Value, ks);
            }

            var nextKey = new NamedHotkey();

            if (logicArgs.TryGetValue("NextMusicKey", out yaml))
            {
                nextKey = new NamedHotkey(yaml.Value, ks);
            }

            var keyhandler = widget.Get <LogicKeyListenerWidget>("GLOBAL_KEYHANDLER");

            keyhandler.AddHandler(e =>
            {
                if (e.Event == KeyInputEvent.Down)
                {
                    var key = Hotkey.FromKeyInput(e);

                    if (key == nextKey.GetValue())
                    {
                        musicPlaylist.Play(musicPlaylist.GetNextSong());
                    }
                    else if (key == prevKey.GetValue())
                    {
                        musicPlaylist.Play(musicPlaylist.GetPrevSong());
                    }
                    else if (key == stopKey.GetValue())
                    {
                        StopMusic();
                    }
                    else if (key == pauseKey.GetValue())
                    {
                        PauseOrResumeMusic();
                    }
                }

                return(false);
            });
        }
Exemple #6
0
        public ObserverShroudSelectorLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs)
        {
            MiniYaml yaml;
            var      ks = Game.Settings.Keys;

            if (logicArgs.TryGetValue("CombinedViewKey", out yaml))
            {
                combinedViewKey = new NamedHotkey(yaml.Value, ks);
            }

            if (logicArgs.TryGetValue("WorldViewKey", out yaml))
            {
                worldViewKey = new NamedHotkey(yaml.Value, ks);
            }

            limitViews = world.Map.Visibility.HasFlag(MapVisibility.MissionSelector);

            var groups = new Dictionary <string, IEnumerable <CameraOption> >();

            combined      = new CameraOption(this, world, "All Players", world.Players.First(p => p.InternalName == "Everyone"));
            disableShroud = new CameraOption(this, world, "Disable Shroud", null);
            if (!limitViews)
            {
                groups.Add("Other", new List <CameraOption>()
                {
                    combined, disableShroud
                });
            }

            teams = world.Players.Where(p => !p.NonCombatant && p.Playable)
                    .Select(p => new CameraOption(this, p))
                    .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.Player.ClientIndex) ?? new Session.Client()).Team)
                    .OrderBy(g => g.Key);

            var noTeams = teams.Count() == 1;

            foreach (var t in teams)
            {
                var label = noTeams ? "Players" : t.Key == 0 ? "No Team" : "Team {0}".F(t.Key);
                groups.Add(label, t);
            }

            var shroudSelector = widget.Get <DropDownButtonWidget>("SHROUD_SELECTOR");

            shroudSelector.OnMouseDown = _ =>
            {
                Func <CameraOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                {
                    var item     = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
                    var showFlag = option.Faction != null;

                    var label = item.Get <LabelWidget>("LABEL");
                    label.IsVisible = () => showFlag;
                    label.GetText   = () => option.Label;
                    label.GetColor  = () => option.Color;

                    var flag = item.Get <ImageWidget>("FLAG");
                    flag.IsVisible          = () => showFlag;
                    flag.GetImageCollection = () => "flags";
                    flag.GetImageName       = () => option.Faction;

                    var labelAlt = item.Get <LabelWidget>("NOFLAG_LABEL");
                    labelAlt.IsVisible = () => !showFlag;
                    labelAlt.GetText   = () => option.Label;
                    labelAlt.GetColor  = () => option.Color;

                    return(item);
                };

                shroudSelector.ShowDropDown("SPECTATOR_DROPDOWN_TEMPLATE", 400, groups, setupItem);
            };

            var shroudLabel = shroudSelector.Get <LabelWidget>("LABEL");

            shroudLabel.IsVisible = () => selected.Faction != null;
            shroudLabel.GetText   = () => selected.Label;
            shroudLabel.GetColor  = () => selected.Color;

            var shroudFlag = shroudSelector.Get <ImageWidget>("FLAG");

            shroudFlag.IsVisible          = () => selected.Faction != null;
            shroudFlag.GetImageCollection = () => "flags";
            shroudFlag.GetImageName       = () => selected.Faction;

            var shroudLabelAlt = shroudSelector.Get <LabelWidget>("NOFLAG_LABEL");

            shroudLabelAlt.IsVisible = () => selected.Faction == null;
            shroudLabelAlt.GetText   = () => selected.Label;
            shroudLabelAlt.GetColor  = () => selected.Color;

            var keyhandler = shroudSelector.Get <LogicKeyListenerWidget>("SHROUD_KEYHANDLER");

            keyhandler.AddHandler(HandleKeyPress);

            selected = limitViews ? groups.First().Value.First() : world.WorldActor.Owner.Shroud.ExploreMapEnabled ? combined : disableShroud;
            selected.OnClick();
        }