public ModContentDiscTooltipLogic(Widget widget, Func<string> getText)
        {
            var discs = widget.Get<ContainerWidget>("DISCS");
            var template = discs.Get<LabelWidget>("DISC_TEMPLATE");
            discs.RemoveChildren();

            var desc = widget.Get<LabelWidget>("DESCRIPTION");

            var font = Game.Renderer.Fonts[template.Font];
            var discTitles = getText().Split('\n');

            var maxWidth = Game.Renderer.Fonts[desc.Font].Measure(desc.Text).X;
            var sideMargin = desc.Bounds.X;
            var bottomMargin = discs.Bounds.Height;
            foreach (var disc in discTitles)
            {
                var label = (LabelWidget)template.Clone();
                var title = disc;
                label.GetText = () => title;
                label.Bounds.Y = discs.Bounds.Height;
                label.Bounds.Width = font.Measure(disc).X;

                maxWidth = Math.Max(maxWidth, label.Bounds.Width + label.Bounds.X);
                discs.AddChild(label);
                discs.Bounds.Height += label.Bounds.Height;
            }

            widget.Bounds.Width = 2 * sideMargin + maxWidth;
            widget.Bounds.Height = discs.Bounds.Y + bottomMargin + discs.Bounds.Height;
        }
Beispiel #2
0
        public FactionTooltipLogic(Widget widget, ButtonWidget button)
        {
            var lines = button.GetTooltipText().Replace("\\n", "\n").Split('\n');

            var header = widget.Get<LabelWidget>("HEADER");
            var headerLine = lines[0];
            var headerFont = Game.Renderer.Fonts[header.Font];
            var headerSize = headerFont.Measure(headerLine);
            header.Bounds.Width += headerSize.X;
            header.Bounds.Height += headerSize.Y;
            header.GetText = () => headerLine;

            if (lines.Length > 1)
            {
                var description = widget.Get<LabelWidget>("DESCRIPTION");
                var descriptionLines = lines.Skip(1).ToArray();
                var descriptionFont = Game.Renderer.Fonts[description.Font];
                description.Bounds.Y += header.Bounds.Y + header.Bounds.Height;
                description.Bounds.Width += descriptionLines.Select(l => descriptionFont.Measure(l).X).Max();
                description.Bounds.Height += descriptionFont.Measure(descriptionLines.First()).Y * descriptionLines.Length;
                description.GetText = () => string.Join("\n", descriptionLines);

                widget.Bounds.Width = Math.Max(header.Bounds.X + header.Bounds.Width, description.Bounds.X + description.Bounds.Width);
                widget.Bounds.Height = description.Bounds.Y + description.Bounds.Height;
            }
            else
            {
                widget.Bounds.Width = header.Bounds.X + header.Bounds.Width;
                widget.Bounds.Height = header.Bounds.Y + header.Bounds.Height;
            }
        }
Beispiel #3
0
        public ColorPickerLogic(Widget widget, HSLColor initialColor, Action<HSLColor> onChange, WorldRenderer worldRenderer)
        {
            var hueSlider = widget.Get<SliderWidget>("HUE");
            var mixer = widget.Get<ColorMixerWidget>("MIXER");
            var randomButton = widget.GetOrNull<ButtonWidget>("RANDOM_BUTTON");

            hueSlider.OnChange += _ => mixer.Set(hueSlider.Value);
            mixer.OnChange += () =>	onChange(mixer.Color);

            if (randomButton != null)
                randomButton.OnClick = () =>
                {
                    // Avoid colors with low sat or lum
                    var hue = (byte)Game.CosmeticRandom.Next(255);
                    var sat = (byte)Game.CosmeticRandom.Next(70, 255);
                    var lum = (byte)Game.CosmeticRandom.Next(70, 255);

                    mixer.Set(new HSLColor(hue, sat, lum));
                    hueSlider.Value = hue / 255f;
                };

            // Set the initial state
            mixer.Set(initialColor);
            hueSlider.Value = initialColor.H / 255f;
            onChange(mixer.Color);
        }
        public ReplayBrowserLogic(Widget widget, Action onExit, Action onStart)
        {
            panel = widget;

            panel.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };

            var rl = panel.Get<ScrollPanelWidget>("REPLAY_LIST");
            var replayDir = Path.Combine(Platform.SupportDir, "Replays");

            var template = panel.Get<ScrollItemWidget>("REPLAY_TEMPLATE");

            rl.RemoveChildren();
            if (Directory.Exists(replayDir))
            {
                var files = Directory.GetFiles(replayDir, "*.rep").Reverse();
                foreach (var replayFile in files)
                    AddReplay(rl, replayFile, template);

                SelectReplay(files.FirstOrDefault());
            }

            var watch = panel.Get<ButtonWidget>("WATCH_BUTTON");
            watch.IsDisabled = () => currentReplay == null || currentMap == null || currentReplay.Duration == 0;
            watch.OnClick = () =>
            {
                if (currentReplay != null)
                {
                    Game.JoinReplay(currentReplay.Filename);
                    Ui.CloseWindow();
                    onStart();
                }
            };

            panel.Get("REPLAY_INFO").IsVisible = () => currentReplay != null;
        }
Beispiel #5
0
		public TileSelectorLogic(Widget widget, WorldRenderer worldRenderer, Ruleset modRules)
		{
			var tileset = modRules.TileSets[worldRenderer.World.Map.Tileset];

			editor = widget.Parent.Get<EditorViewportControllerWidget>("MAP_EDITOR");
			panel = widget.Get<ScrollPanelWidget>("TILETEMPLATE_LIST");
			itemTemplate = panel.Get<ScrollItemWidget>("TILEPREVIEW_TEMPLATE");
			panel.Layout = new GridLayout(panel);

			var tileCategorySelector = widget.Get<DropDownButtonWidget>("TILE_CATEGORY");
			var categories = tileset.EditorTemplateOrder;
			Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
			{
				var item = ScrollItemWidget.Setup(template,
					() => tileCategorySelector.Text == option,
					() => { tileCategorySelector.Text = option; IntializeTilePreview(widget, worldRenderer, tileset, option); });

				item.Get<LabelWidget>("LABEL").GetText = () => option;
				return item;
			};

			tileCategorySelector.OnClick = () =>
				tileCategorySelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 270, categories, setupItem);

			tileCategorySelector.Text = categories.First();
			IntializeTilePreview(widget, worldRenderer, tileset, categories.First());
		}
        public GameInfoObjectivesLogic(Widget widget, World world)
        {
            var lp = world.LocalPlayer;

            var missionStatus = widget.Get<LabelWidget>("MISSION_STATUS");
            missionStatus.GetText = () => lp.WinState == WinState.Undefined ? "In progress" :
                lp.WinState == WinState.Won ? "Accomplished" : "Failed";
            missionStatus.GetColor = () => lp.WinState == WinState.Undefined ? Color.White :
                lp.WinState == WinState.Won ? Color.LimeGreen : Color.Red;

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

            var objectivesPanel = widget.Get<ScrollPanelWidget>("OBJECTIVES_PANEL");
            template = objectivesPanel.Get<ContainerWidget>("OBJECTIVE_TEMPLATE");

            PopulateObjectivesList(mo, objectivesPanel, template);

            Action<Player> redrawObjectives = player =>
            {
                if (player == lp)
                    PopulateObjectivesList(mo, objectivesPanel, template);
            };
            mo.ObjectiveAdded += redrawObjectives;
        }
Beispiel #7
0
        public SettingsLogic(Widget widget, Action onExit, WorldRenderer worldRenderer)
        {
            this.worldRenderer = worldRenderer;

            panelContainer = widget.Get("SETTINGS_PANEL");
            tabContainer = widget.Get("TAB_CONTAINER");

            RegisterSettingsPanel(PanelType.Display, InitDisplayPanel, ResetDisplayPanel, "DISPLAY_PANEL", "DISPLAY_TAB");
            RegisterSettingsPanel(PanelType.Audio, InitAudioPanel, ResetAudioPanel, "AUDIO_PANEL", "AUDIO_TAB");
            RegisterSettingsPanel(PanelType.Input, InitInputPanel, ResetInputPanel, "INPUT_PANEL", "INPUT_TAB");
            RegisterSettingsPanel(PanelType.Advanced, InitAdvancedPanel, ResetAdvancedPanel, "ADVANCED_PANEL", "ADVANCED_TAB");

            panelContainer.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
            {
                leavePanelActions[settingsPanel]();
                Game.Settings.Save();
                Ui.CloseWindow();
                onExit();
            };

            panelContainer.Get<ButtonWidget>("RESET_BUTTON").OnClick = () =>
            {
                resetPanelActions[settingsPanel]();
                Game.Settings.Save();
            };
        }
		public ReplayControlBarLogic(Widget widget, World world)
		{
			if (world.IsReplay)
			{
				var container = widget.Get("REPLAY_PLAYER");

				var background = widget.Parent.GetOrNull("OBSERVER_CONTROL_BG");
				if (background != null)
					background.Bounds.Height += container.Bounds.Height;

				container.Visible = true;

				var pauseButton = widget.Get<ButtonWidget>("BUTTON_PAUSE");
				pauseButton.IsHighlighted = () => world.Timestep == 0;
				pauseButton.OnClick = () => world.Timestep = 0;

				var slowButton = widget.Get<ButtonWidget>("BUTTON_SLOW");
				slowButton.IsHighlighted = () => world.Timestep > Game.Timestep;
				slowButton.OnClick = () => world.Timestep = Game.Timestep * 2;

				var normalSpeedButton = widget.Get<ButtonWidget>("BUTTON_NORMALSPEED");
				normalSpeedButton.IsHighlighted = () => world.Timestep == Game.Timestep;
				normalSpeedButton.OnClick = () => world.Timestep = Game.Timestep;

				var fastforwardButton = widget.Get<ButtonWidget>("BUTTON_FASTFORWARD");
				fastforwardButton.IsHighlighted = () => world.Timestep == 1;
				fastforwardButton.OnClick = () => world.Timestep = 1;
			}
		}
        public IngameRadarDisplayLogic(Widget widget, World world)
        {
            var radarEnabled = false;
            var cachedRadarEnabled = false;
            var blockColor = Color.Transparent;
            var radar = widget.Get<RadarWidget>("RADAR_MINIMAP");
            radar.IsEnabled = () => radarEnabled;
            var devMode = world.LocalPlayer.PlayerActor.Trait<DeveloperMode>();

            var ticker = widget.Get<LogicTickerWidget>("RADAR_TICKER");
            ticker.OnTick = () =>
            {
                radarEnabled = devMode.DisableShroud || world.ActorsHavingTrait<ProvidesRadar>(r => r.IsActive)
                    .Any(a => a.Owner == world.LocalPlayer);

                if (radarEnabled != cachedRadarEnabled)
                    Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", radarEnabled ? "RadarUp" : "RadarDown", null);
                cachedRadarEnabled = radarEnabled;
            };

            var block = widget.GetOrNull<ColorBlockWidget>("RADAR_FADETOBLACK");
            if (block != null)
            {
                radar.Animating = x => blockColor = Color.FromArgb((int)(255 * x), Color.Black);
                block.IsVisible = () => blockColor.A != 0;
                block.GetColor = () => blockColor;
            }
        }
		public SpawnSelectorTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, MapPreviewWidget preview)
		{
			widget.IsVisible = () => preview.TooltipSpawnIndex != -1;
			var label = widget.Get<LabelWidget>("LABEL");
			var flag = widget.Get<ImageWidget>("FLAG");
			var team = widget.Get<LabelWidget>("TEAM");
			var singleHeight = widget.Get("SINGLE_HEIGHT").Bounds.Height;
			var doubleHeight = widget.Get("DOUBLE_HEIGHT").Bounds.Height;
			var ownerFont = Game.Renderer.Fonts[label.Font];
			var teamFont = Game.Renderer.Fonts[team.Font];

			// Width specified in YAML is used as the margin between flag / label and label / border
			var labelMargin = widget.Bounds.Width;

			var cachedWidth = 0;
			var labelText = "";
			string playerFaction = null;
			var playerTeam = -1;

			tooltipContainer.BeforeRender = () =>
			{
				var occupant = preview.SpawnOccupants().Values.FirstOrDefault(c => c.SpawnPoint == preview.TooltipSpawnIndex);

				var teamWidth = 0;
				if (occupant == null)
				{
					labelText = "Available spawn";
					playerFaction = null;
					playerTeam = 0;
					widget.Bounds.Height = singleHeight;
				}
				else
				{
					labelText = occupant.PlayerName;
					playerFaction = occupant.Faction;
					playerTeam = occupant.Team;
					widget.Bounds.Height = playerTeam > 0 ? doubleHeight : singleHeight;
					teamWidth = teamFont.Measure(team.GetText()).X;
				}

				label.Bounds.X = playerFaction != null ? flag.Bounds.Right + labelMargin : labelMargin;

				var textWidth = ownerFont.Measure(labelText).X;
				if (textWidth != cachedWidth)
				{
					label.Bounds.Width = textWidth;
					widget.Bounds.Width = 2 * label.Bounds.X + textWidth;
				}

				widget.Bounds.Width = Math.Max(teamWidth + 2 * labelMargin, label.Bounds.Right + labelMargin);
				team.Bounds.Width = widget.Bounds.Width;
			};

			label.GetText = () => labelText;
			flag.IsVisible = () => playerFaction != null;
			flag.GetImageCollection = () => "flags";
			flag.GetImageName = () => playerFaction;
			team.GetText = () => "Team {0}".F(playerTeam);
			team.IsVisible = () => playerTeam > 0;
		}
Beispiel #11
0
        public ColorPickerLogic(Widget widget, HSLColor initialColor, Action<HSLColor> onChange, WorldRenderer worldRenderer)
        {
            var ticker = widget.GetOrNull<LogicTickerWidget>("ANIMATE_PREVIEW");
            if (ticker != null)
            {
                var preview = widget.Get<SpriteSequenceWidget>("PREVIEW");
                var anim = preview.GetAnimation();
                anim.PlayRepeating(anim.CurrentSequence.Name);
                ticker.OnTick = anim.Tick;
            }

            var hueSlider = widget.Get<SliderWidget>("HUE");
            var mixer = widget.Get<ColorMixerWidget>("MIXER");
            var randomButton = widget.GetOrNull<ButtonWidget>("RANDOM_BUTTON");

            hueSlider.OnChange += _ => mixer.Set(hueSlider.Value);
            mixer.OnChange += () => onChange(mixer.Color);

            if (randomButton != null)
                randomButton.OnClick = () =>
                {
                    // Avoid colors with low sat or lum
                    var hue = (byte)Game.CosmeticRandom.Next(255);
                    var sat = (byte)Game.CosmeticRandom.Next(70, 255);
                    var lum = (byte)Game.CosmeticRandom.Next(70, 255);

                    mixer.Set(new HSLColor(hue, sat, lum));
                    hueSlider.Value = hue / 255f;
                };

            // Set the initial state
            mixer.Set(initialColor);
            hueSlider.Value = initialColor.H / 255f;
            onChange(mixer.Color);
        }
Beispiel #12
0
        public ConnectionFailedLogic(Widget widget, OrderManager orderManager, Action onAbort, Action<string> onRetry)
        {
            var panel = widget;
            var abortButton = panel.Get<ButtonWidget>("ABORT_BUTTON");
            var retryButton = panel.Get<ButtonWidget>("RETRY_BUTTON");

            abortButton.Visible = onAbort != null;
            abortButton.OnClick = () => { Ui.CloseWindow(); onAbort(); };

            retryButton.Visible = onRetry != null;
            retryButton.OnClick = () =>
            {
                var password = passwordField != null && passwordField.IsVisible() ? passwordField.Text : orderManager.Password;

                Ui.CloseWindow();
                onRetry(password);
            };

            widget.Get<LabelWidget>("CONNECTING_DESC").GetText = () =>
                "Could not connect to {0}:{1}".F(orderManager.Host, orderManager.Port);

            var connectionError = widget.Get<LabelWidget>("CONNECTION_ERROR");
            connectionError.GetText = () => orderManager.ServerError;

            passwordField = panel.GetOrNull<PasswordFieldWidget>("PASSWORD");
            if (passwordField != null)
            {
                passwordField.Text = orderManager.Password;
                passwordField.IsVisible = () => orderManager.AuthenticationFailed;
                var passwordLabel = widget.Get<LabelWidget>("PASSWORD_LABEL");
                passwordLabel.IsVisible = passwordField.IsVisible;
                passwordField.OnEnterKey = () => { retryButton.OnClick(); return true; };
                passwordField.OnEscKey = () => { abortButton.OnClick(); return true; };
            }

            passwordOffsetAdjusted = false;
            var connectionFailedTicker = panel.GetOrNull<LogicTickerWidget>("CONNECTION_FAILED_TICKER");
            if (connectionFailedTicker != null)
            {
                connectionFailedTicker.OnTick = () =>
                {
                    // Adjust the dialog once the AuthenticationError is parsed.
                    if (passwordField.IsVisible() && !passwordOffsetAdjusted)
                    {
                        var offset = passwordField.Bounds.Y - connectionError.Bounds.Y;
                        abortButton.Bounds.Y += offset;
                        retryButton.Bounds.Y += offset;
                        panel.Bounds.Height += offset;
                        panel.Bounds.Y -= offset / 2;

                        var background = panel.GetOrNull("CONNECTION_BACKGROUND");
                        if (background != null)
                            background.Bounds.Height += offset;

                        passwordOffsetAdjusted = true;
                    }
                };
            }
        }
		public SupportPowerTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, SupportPowersWidget palette, World world)
		{
			widget.IsVisible = () => palette.TooltipIcon != null;
			var nameLabel = widget.Get<LabelWidget>("NAME");
			var hotkeyLabel = widget.Get<LabelWidget>("HOTKEY");
			var timeLabel = widget.Get<LabelWidget>("TIME");
			var descLabel = widget.Get<LabelWidget>("DESC");
			var nameFont = Game.Renderer.Fonts[nameLabel.Font];
			var timeFont = Game.Renderer.Fonts[timeLabel.Font];
			var descFont = Game.Renderer.Fonts[descLabel.Font];
			var name = "";
			var time = "";
			var desc = "";
			var baseHeight = widget.Bounds.Height;
			var timeOffset = timeLabel.Bounds.X;

			SupportPowerInstance lastPower = null;
			tooltipContainer.BeforeRender = () =>
			{
				var icon = palette.TooltipIcon;

				if (icon == null)
					return;

				var sp = icon.Power;

				if (sp.Info == null)
					return;		// no instances actually exist (race with destroy)

				var remaining = WidgetUtils.FormatTime(sp.RemainingTime, world.Timestep);
				var total = WidgetUtils.FormatTime(sp.Info.ChargeTime * 25, world.Timestep);
				time = "{0} / {1}".F(remaining, total);

				if (sp == lastPower)
					return;

				name = sp.Info.Description;
				desc = sp.Info.LongDesc.Replace("\\n", "\n");

				var hotkey = icon.Hotkey;
				var hotkeyText = "({0})".F(hotkey.DisplayString());
				var hotkeyWidth = hotkey.IsValid() ? nameFont.Measure(hotkeyText).X + 2 * nameLabel.Bounds.X : 0;
				hotkeyLabel.GetText = () => hotkeyText;
				hotkeyLabel.Bounds.X = nameFont.Measure(name).X + 2 * nameLabel.Bounds.X;
				hotkeyLabel.Visible = hotkey.IsValid();

				var timeWidth = timeFont.Measure(time).X;
				var topWidth = nameFont.Measure(name).X + hotkeyWidth + timeWidth + timeOffset;
				var descSize = descFont.Measure(desc);
				widget.Bounds.Width = 2 * nameLabel.Bounds.X + Math.Max(topWidth, descSize.X);
				widget.Bounds.Height = baseHeight + descSize.Y;
				timeLabel.Bounds.X = widget.Bounds.Width - nameLabel.Bounds.X - timeWidth;
				lastPower = sp;
			};

			nameLabel.GetText = () => name;
			timeLabel.GetText = () => time;
			descLabel.GetText = () => desc;
		}
        public ProductionTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, ProductionPaletteWidget palette)
        {
            var pm = palette.world.LocalPlayer.PlayerActor.Trait<PowerManager>();
            var pr = palette.world.LocalPlayer.PlayerActor.Trait<PlayerResources>();

            widget.IsVisible = () => palette.TooltipActor != null;
            var nameLabel = widget.Get<LabelWidget>("NAME");
            var requiresLabel = widget.Get<LabelWidget>("REQUIRES");
            var powerLabel = widget.Get<LabelWidget>("POWER");
            var timeLabel = widget.Get<LabelWidget>("TIME");
            var costLabel = widget.Get<LabelWidget>("COST");

            var font = Game.Renderer.Fonts[nameLabel.Font];
            var requiresFont = Game.Renderer.Fonts[requiresLabel.Font];
            string lastActor = null;

            tooltipContainer.BeforeRender = () =>
            {
                var actor = palette.TooltipActor;
                if (actor == null || actor == lastActor)
                    return;

                var info = Rules.Info[actor];
                var tooltip = info.Traits.Get<TooltipInfo>();
                var buildable = info.Traits.Get<BuildableInfo>();
                var cost = info.Traits.Get<ValuedInfo>().Cost;
                var bi = info.Traits.GetOrDefault<BuildingInfo>();

                nameLabel.GetText = () => tooltip.Name;

                var prereqs = buildable.Prerequisites.Select(a => ActorName(a));
                var requiresString = prereqs.Any() ? "Requires {0}".F(prereqs.JoinWith(", ")) : "";
                requiresLabel.GetText = () => requiresString;

                var power = bi != null ? bi.Power : 0;
                var powerString = "P: {0}".F(power);
                powerLabel.GetText = () => powerString;
                powerLabel.GetColor = () => ((pm.PowerProvided - pm.PowerDrained) >= -power || power > 0)
                    ? Color.White : Color.Red;
                powerLabel.IsVisible = () => power != 0;

                var timeString = "T: {0}".F(WidgetUtils.FormatTime(palette.CurrentQueue.GetBuildTime(actor)));
                timeLabel.GetText = () => timeString;

                var costString = "$: {0}".F(cost);
                costLabel.GetText = () => costString;
                costLabel.GetColor = () => pr.DisplayCash + pr.DisplayOre >= cost
                    ? Color.White : Color.Red;

                var leftWidth = Math.Max(font.Measure(tooltip.Name).X, requiresFont.Measure(requiresString).X);
                var rightWidth = new [] {font.Measure(powerString).X, font.Measure(timeString).X, font.Measure(costString).X}.Aggregate(Math.Max);
                timeLabel.Bounds.X = powerLabel.Bounds.X = costLabel.Bounds.X = leftWidth + 2*nameLabel.Bounds.X;
                widget.Bounds.Width = leftWidth + rightWidth + 3*nameLabel.Bounds.X;

                widget.Bounds.Height = power != 0 ? 65 : 45;
                lastActor = actor;
            };
        }
Beispiel #15
0
        internal MapChooserLogic(Widget widget, string initialMap, Action onExit, Action<Map> onSelect)
        {
            map = Game.modData.AvailableMaps[WidgetUtils.ChooseInitialMap(initialMap)];

            widget.Get<ButtonWidget>("BUTTON_OK").OnClick = () => { Ui.CloseWindow(); onSelect(map); };
            widget.Get<ButtonWidget>("BUTTON_CANCEL").OnClick = () => { Ui.CloseWindow(); onExit(); };

            scrollpanel = widget.Get<ScrollPanelWidget>("MAP_LIST");
            scrollpanel.ScrollVelocity = 40f;
            scrollpanel.Layout = new GridLayout(scrollpanel);

            itemTemplate = scrollpanel.Get<ScrollItemWidget>("MAP_TEMPLATE");

            var gameModeDropdown = widget.GetOrNull<DropDownButtonWidget>("GAMEMODE_FILTER");
            if (gameModeDropdown != null)
            {
                var selectableMaps = Game.modData.AvailableMaps.Where(m => m.Value.Selectable).ToList();
                var gameModes = selectableMaps
                    .GroupBy(m => m.Value.Type)
                    .Select(g => Pair.New(g.Key, g.Count())).ToList();

                // 'all game types' extra item
                gameModes.Insert(0, Pair.New(null as string, selectableMaps.Count()));

                Func<Pair<string, int>, string> showItem =
                    x => "{0} ({1})".F(x.First ?? "All Game Types", x.Second);

                Func<Pair<string, int>, ScrollItemWidget, ScrollItemWidget> setupItem = (ii, template) =>
                {
                    var item = ScrollItemWidget.Setup(template,
                        () => gameMode == ii.First,
                        () => { gameMode = ii.First; EnumerateMaps(onSelect); });
                    item.Get<LabelWidget>("LABEL").GetText = () => showItem(ii);
                    return item;
                };

                gameModeDropdown.OnClick = () =>
                    gameModeDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, gameModes, setupItem);

                gameModeDropdown.GetText = () => showItem(gameModes.First(m => m.First == gameMode));
            }

            var randomMapButton = widget.GetOrNull<ButtonWidget>("RANDOMMAP_BUTTON");
            if (randomMapButton != null)
            {
                randomMapButton.OnClick = () =>
                {
                    var kv = visibleMaps.Random(Game.CosmeticRandom);
                    map = kv.Value;
                    scrollpanel.ScrollToItem(kv.Key);
                };
                randomMapButton.IsDisabled = () => visibleMaps == null || visibleMaps.Count == 0;
            }

            EnumerateMaps(onSelect);
        }
Beispiel #16
0
        public MultiplayerLogic(Widget widget, ModData modData, Action onStart, Action onExit, string directConnectHost, int directConnectPort)
        {
            this.modData = modData;
            this.onStart = onStart;
            this.onExit = onExit;

            incompatibleVersionColor = ChromeMetrics.Get<Color>("IncompatibleVersionColor");
            incompatibleGameColor = ChromeMetrics.Get<Color>("IncompatibleGameColor");
            incompatibleProtectedGameColor = ChromeMetrics.Get<Color>("IncompatibleProtectedGameColor");
            protectedGameColor = ChromeMetrics.Get<Color>("ProtectedGameColor");
            waitingGameColor = ChromeMetrics.Get<Color>("WaitingGameColor");
            incompatibleWaitingGameColor = ChromeMetrics.Get<Color>("IncompatibleWaitingGameColor");
            gameStartedColor = ChromeMetrics.Get<Color>("GameStartedColor");
            incompatibleGameStartedColor = ChromeMetrics.Get<Color>("IncompatibleGameStartedColor");

            LoadBrowserPanel(widget);
            LoadDirectConnectPanel(widget);
            LoadCreateServerPanel(widget);

            // Filter and refresh buttons act on the browser panel,
            // but remain visible (disabled) on the other panels
            var refreshButton = widget.Get<ButtonWidget>("REFRESH_BUTTON");
            refreshButton.IsDisabled = () => searchStatus == SearchStatus.Fetching || panel != PanelType.Browser;

            var filtersButton = widget.Get<DropDownButtonWidget>("FILTERS_DROPDOWNBUTTON");
            filtersButton.IsDisabled = () => searchStatus == SearchStatus.Fetching || panel != PanelType.Browser;

            var browserTab = widget.Get<ButtonWidget>("BROWSER_TAB");
            browserTab.IsHighlighted = () => panel == PanelType.Browser;
            browserTab.OnClick = () => panel = PanelType.Browser;

            var directConnectTab = widget.Get<ButtonWidget>("DIRECTCONNECT_TAB");
            directConnectTab.IsHighlighted = () => panel == PanelType.DirectConnect;
            directConnectTab.OnClick = () => panel = PanelType.DirectConnect;

            var createServerTab = widget.Get<ButtonWidget>("CREATE_TAB");
            createServerTab.IsHighlighted = () => panel == PanelType.CreateServer;
            createServerTab.OnClick = () => panel = PanelType.CreateServer;

            widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };
            Game.LoadWidget(null, "GLOBALCHAT_PANEL", widget.Get("GLOBALCHAT_ROOT"), new WidgetArgs());

            RefreshServerList();

            if (directConnectHost != null)
            {
                // The connection window must be opened at the end of the tick for the widget hierarchy to
                // work out, but we also want to prevent the server browser from flashing visible for one tick.
                widget.Visible = false;
                Game.RunAfterTick(() =>
                {
                    ConnectionLogic.Connect(directConnectHost, directConnectPort, "", OpenLobby, DoNothing);
                    widget.Visible = true;
                });
            }
        }
Beispiel #17
0
		public CncMainMenuLogic(Widget widget, World world)
			: base(widget, world)
		{
			var shellmapDecorations = widget.Get("SHELLMAP_DECORATIONS");
			shellmapDecorations.IsVisible = () => menuType != MenuType.None && Game.Settings.Game.ShowShellmap;
			shellmapDecorations.Get<ImageWidget>("RECBLOCK").IsVisible = () => world.WorldTick / 25 % 2 == 0;

			var shellmapDisabledDecorations = widget.Get("SHELLMAP_DISABLED_DECORATIONS");
			shellmapDisabledDecorations.IsVisible = () => !Game.Settings.Game.ShowShellmap;
		}
Beispiel #18
0
        public WorldTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, CncWorldInteractionControllerWidget wic)
        {
            widget.IsVisible = () => wic.TooltipType != WorldTooltipType.None;
            var label = widget.Get<LabelWidget>("LABEL");
            var flag = widget.Get<ImageWidget>("FLAG");
            var owner = widget.Get<LabelWidget>("OWNER");

            var font = Game.Renderer.Fonts[label.Font];
            var ownerFont = Game.Renderer.Fonts[owner.Font];
            var cachedWidth = 0;
            var labelText = "";
            var showOwner = false;
            var flagRace = "";
            var ownerName = "";
            var ownerColor = Color.White;
            var doubleHeight = 45;
            var singleHeight = 25;

            tooltipContainer.BeforeRender = () =>
            {
                if (wic == null || wic.TooltipType == WorldTooltipType.None)
                    return;

                labelText = wic.TooltipType == WorldTooltipType.Unexplored ? "Unexplored Terrain" :
                    wic.ActorTooltip.Name();
                var textWidth = font.Measure(labelText).X;
                if (textWidth != cachedWidth)
                {
                    label.Bounds.Width = textWidth;
                    widget.Bounds.Width = 2*label.Bounds.X + textWidth;
                }
                var o = wic.ActorTooltip != null ? wic.ActorTooltip.Owner() : null;
                showOwner = wic.TooltipType == WorldTooltipType.Actor && o != null && !o.NonCombatant;

                if (showOwner)
                {
                    flagRace = o.Country.Race;
                    ownerName = o.PlayerName;
                    ownerColor = o.Color.RGB;
                    widget.Bounds.Height = doubleHeight;
                    widget.Bounds.Width = Math.Max(widget.Bounds.Width,
                        owner.Bounds.X + ownerFont.Measure(ownerName).X + 5);
                }
                else
                    widget.Bounds.Height = singleHeight;
            };

            label.GetText = () => labelText;
            flag.IsVisible = () => showOwner;
            flag.GetImageCollection = () => "flags";
            flag.GetImageName = () => flagRace;
            owner.IsVisible = () => showOwner;
            owner.GetText = () => ownerName;
            owner.GetColor = () => ownerColor;
        }
        public IngameChromeLogic(World world)
        {
            Game.AddChatLine += AddChatLine;
            Game.BeforeGameStart += UnregisterEvents;

            var r = Ui.Root;
            gameRoot = r.Get("INGAME_ROOT");
            var optionsBG = gameRoot.Get("INGAME_OPTIONS_BG");

            r.Get<ButtonWidget>("INGAME_OPTIONS_BUTTON").OnClick = () =>
                optionsBG.Visible = !optionsBG.Visible;

            var cheatsButton = gameRoot.Get<ButtonWidget>("CHEATS_BUTTON");
            cheatsButton.OnClick = () =>
            {
                Game.OpenWindow("CHEATS_PANEL", new WidgetArgs() {{"onExit", () => {} }});
            };
            cheatsButton.IsVisible = () => world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats;

            optionsBG.Get<ButtonWidget>("DISCONNECT").OnClick = () => LeaveGame(optionsBG);

            optionsBG.Get<ButtonWidget>("SETTINGS").OnClick = () => Ui.OpenWindow("SETTINGS_MENU");
            optionsBG.Get<ButtonWidget>("MUSIC").OnClick = () => Ui.OpenWindow("MUSIC_MENU");
            optionsBG.Get<ButtonWidget>("RESUME").OnClick = () => optionsBG.Visible = false;

            optionsBG.Get<ButtonWidget>("SURRENDER").OnClick = () =>
            {
                optionsBG.Visible = false;
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
            };

            optionsBG.Get("SURRENDER").IsVisible = () => (world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined);

            var postgameBG = gameRoot.Get("POSTGAME_BG");
            var postgameText = postgameBG.Get<LabelWidget>("TEXT");
            var postGameObserve = postgameBG.Get<ButtonWidget>("POSTGAME_OBSERVE");

            var postgameQuit = postgameBG.Get<ButtonWidget>("POSTGAME_QUIT");
            postgameQuit.OnClick = () => LeaveGame(postgameQuit);

            postGameObserve.OnClick = () => postgameQuit.Visible = false;
            postGameObserve.IsVisible = () => world.LocalPlayer.WinState != WinState.Won;

            postgameBG.IsVisible = () =>
            {
                return postgameQuit.Visible && world.LocalPlayer != null && world.LocalPlayer.WinState != WinState.Undefined;
            };

            postgameText.GetText = () =>
            {
                var state = world.LocalPlayer.WinState;
                return state == WinState.Undefined ? "" :
                                (state == WinState.Lost ? "YOU ARE DEFEATED" : "YOU ARE VICTORIOUS");
            };
        }
        public D2kDownloadPackagesLogic(Widget widget, Dictionary<string,string> installData, Action afterInstall)
        {
            this.installData = installData;
            this.afterInstall = afterInstall;

            panel = widget.Get("INSTALL_DOWNLOAD_PANEL");
            progressBar = panel.Get<ProgressBarWidget>("PROGRESS_BAR");
            statusLabel = panel.Get<LabelWidget>("STATUS_LABEL");

            ShowDownloadDialog();
        }
        public DownloadPackagesLogic(Widget widget, Action afterInstall, string mirrorListUrl)
        {
            this.mirrorListUrl = mirrorListUrl;
            this.afterInstall = afterInstall;

            panel = widget.Get("INSTALL_DOWNLOAD_PANEL");
            progressBar = panel.Get<ProgressBarWidget>("PROGRESS_BAR");
            statusLabel = panel.Get<LabelWidget>("STATUS_LABEL");

            ShowDownloadDialog();
        }
        public IngamePowerCounterLogic(Widget widget, World world)
        {
            var powerManager = world.LocalPlayer.PlayerActor.Trait<PowerManager>();
            var power = widget.Get<LabelWithTooltipWidget>("POWER");
            var powerIcon = widget.Get<ImageWidget>("POWER_ICON");

            powerIcon.GetImageName = () => powerManager.ExcessPower < 0 ? "power-critical" : "power-normal";
            power.GetColor = () => powerManager.ExcessPower < 0 ? Color.Red : Color.White;
            power.GetText = () => powerManager.PowerProvided == 1000000 ? "inf" : powerManager.ExcessPower.ToString();
            power.GetTooltipText = () => "Power Usage: " + powerManager.PowerDrained.ToString() + (powerManager.PowerProvided != 1000000 ? "/" + powerManager.PowerProvided.ToString() : "");
        }
Beispiel #23
0
        public ServerCreationLogic(Widget widget, Action onExit, Action openLobby)
        {
            panel = widget;
            onCreate = openLobby;
            this.onExit = onExit;

            var settings = Game.Settings;
            preview = Game.ModData.MapCache[WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map)];

            panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };
            panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin;

            var mapButton = panel.GetOrNull<ButtonWidget>("MAP_BUTTON");
            if (mapButton != null)
            {
                panel.Get<ButtonWidget>("MAP_BUTTON").OnClick = () =>
                {
                    Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
                    {
                        { "initialMap", preview.Uid },
                        { "initialTab", MapClassification.System },
                        { "onExit", () => { } },
                        { "onSelect", (Action<string>)(uid => preview = Game.ModData.MapCache[uid]) },
                        { "filter", MapVisibility.Lobby },
                        { "onStart", () => { } }
                    });
                };

                panel.Get<MapPreviewWidget>("MAP_PREVIEW").Preview = () => preview;
                panel.Get<LabelWidget>("MAP_NAME").GetText = () => preview.Title;
            }

            panel.Get<TextFieldWidget>("SERVER_NAME").Text = settings.Server.Name ?? "";
            panel.Get<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();
            advertiseOnline = Game.Settings.Server.AdvertiseOnline;

            var externalPort = panel.Get<TextFieldWidget>("EXTERNAL_PORT");
            externalPort.Text = settings.Server.ExternalPort.ToString();
            externalPort.IsDisabled = () => !advertiseOnline;

            var advertiseCheckbox = panel.Get<CheckboxWidget>("ADVERTISE_CHECKBOX");
            advertiseCheckbox.IsChecked = () => advertiseOnline;
            advertiseCheckbox.OnClick = () => advertiseOnline ^= true;

            allowPortForward = Game.Settings.Server.AllowPortForward;
            var checkboxUPnP = panel.Get<CheckboxWidget>("UPNP_CHECKBOX");
            checkboxUPnP.IsChecked = () => allowPortForward;
            checkboxUPnP.OnClick = () => allowPortForward ^= true;
            checkboxUPnP.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable;

            var passwordField = panel.GetOrNull<PasswordFieldWidget>("PASSWORD");
            if (passwordField != null)
                passwordField.Text = Game.Settings.Server.Password;
        }
Beispiel #24
0
        public GameInfoStatsLogic(Widget widget, World world)
        {
            var lp = world.LocalPlayer;

            var checkbox = widget.Get<CheckboxWidget>("STATS_CHECKBOX");
            checkbox.IsChecked = () => lp.WinState != WinState.Undefined;
            checkbox.GetCheckType = () => lp.WinState == WinState.Won ?
                "checked" : "crossed";

            var statusLabel = widget.Get<LabelWidget>("STATS_STATUS");

            statusLabel.GetText = () => lp.WinState == WinState.Won ? "Accomplished" :
                lp.WinState == WinState.Lost ? "Failed" : "In progress";
            statusLabel.GetColor = () => lp.WinState == WinState.Won ? Color.LimeGreen :
                lp.WinState == WinState.Lost ? Color.Red : Color.White;

            var playerPanel = widget.Get<ScrollPanelWidget>("PLAYER_LIST");
            var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE");
            playerPanel.RemoveChildren();

            foreach (var p in world.Players.Where(a => !a.NonCombatant))
            {
                var pp = p;
                var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex);
                var item = playerTemplate.Clone();
                var nameLabel = item.Get<LabelWidget>("NAME");
                nameLabel.GetText = () =>
                {
                    if (client != null && client.State == Network.Session.ClientState.Disconnected)
                        return pp.PlayerName + " (Gone)";
                    return pp.PlayerName + (pp.WinState == WinState.Undefined ? "" : " (" + pp.WinState + ")");
                };
                nameLabel.GetColor = () => pp.Color.RGB;

                var flag = item.Get<ImageWidget>("FACTIONFLAG");
                flag.GetImageName = () => pp.Country.Race;
                flag.GetImageCollection = () => "flags";
                item.Get<LabelWidget>("FACTION").GetText = () => pp.Country.Name;

                var team = item.Get<LabelWidget>("TEAM");
                var teamNumber = (client == null) ? 0 : client.Team;
                team.GetText = () => (teamNumber == 0) ? "-" : teamNumber.ToString();
                playerPanel.AddChild(item);

                var stats = pp.PlayerActor.TraitOrDefault<PlayerStatistics>();
                if (stats == null)
                    break;
                var totalKills = stats.UnitsKilled + stats.BuildingsKilled;
                var totalDeaths = stats.UnitsDead + stats.BuildingsDead;
                item.Get<LabelWidget>("KILLS").GetText = () => totalKills.ToString();
                item.Get<LabelWidget>("DEATHS").GetText = () => totalDeaths.ToString();
            }
        }
Beispiel #25
0
        public PerfDebugLogic(Widget widget)
        {
            var perfGraph = widget.Get("GRAPH_BG");
            perfGraph.IsVisible = () => Game.Settings.Debug.PerfGraph;

            var perfText = widget.Get<LabelWidget>("PERF_TEXT");
            perfText.IsVisible = () => Game.Settings.Debug.PerfText;
            perfText.GetText = () =>
                "Tick {0} @ {1:F1} ms\nRender {2} @ {3:F1} ms\nBatches: {4}".F(
                    Game.LocalTick, PerfHistory.items["tick_time"].Average(Game.Settings.Debug.Samples),
                    Game.RenderFrame, PerfHistory.items["render"].Average(Game.Settings.Debug.Samples),
                    PerfHistory.items["batches"].LastValue);
        }
        public MainMenuButtonsLogic(Widget widget)
        {
            rootMenu = widget;

            Game.modData.WidgetLoader.LoadWidget( new WidgetArgs(), Ui.Root, "PERF_BG" );
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_JOIN").OnClick = () => OpenGamePanel("JOINSERVER_BG");
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_CREATE").OnClick = () => OpenGamePanel("CREATESERVER_BG");
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_DIRECTCONNECT").OnClick = () => OpenGamePanel("DIRECTCONNECT_BG");
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_SETTINGS").OnClick = () => Ui.OpenWindow("SETTINGS_MENU");
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_MUSIC").OnClick = () => Ui.OpenWindow("MUSIC_MENU");

            widget.Get<ButtonWidget>("MAINMENU_BUTTON_MODS").OnClick = () =>
                Ui.OpenWindow("MODS_PANEL", new WidgetArgs()
                {
                    { "onExit", () => {} },
                    { "onSwitch", RemoveShellmapUI }
                });

            widget.Get<ButtonWidget>("MAINMENU_BUTTON_REPLAY_VIEWER").OnClick = () =>
                Ui.OpenWindow("REPLAYBROWSER_BG", new WidgetArgs()
                {
                    { "onExit", () => {} },
                    { "onStart", RemoveShellmapUI }
                });
            widget.Get<ButtonWidget>("MAINMENU_BUTTON_QUIT").OnClick = () => Game.Exit();
        }
		public GameInfoBriefingLogic(Widget widget, World world)
		{
			var previewWidget = widget.Get<MapPreviewWidget>("MAP_PREVIEW");
			previewWidget.Preview = () => Game.ModData.MapCache[world.Map.Uid];

			var mapDescriptionPanel = widget.Get<ScrollPanelWidget>("MAP_DESCRIPTION_PANEL");
			var mapDescription = widget.Get<LabelWidget>("MAP_DESCRIPTION");
			var mapFont = Game.Renderer.Fonts[mapDescription.Font];
			var text = world.Map.Description != null ? world.Map.Description.Replace("\\n", "\n") : "";
			text = WidgetUtils.WrapText(text, mapDescription.Bounds.Width, mapFont);
			mapDescription.Text = text;
			mapDescription.Bounds.Height = mapFont.Measure(text).Y;
			mapDescriptionPanel.ScrollToTop();
			mapDescriptionPanel.Layout.AdjustChildren();
		}
Beispiel #28
0
        public DownloadPackagesLogic(Widget widget, Action afterInstall, string mirrorListUrl, string modId)
        {
            this.mirrorListUrl = mirrorListUrl;
            this.afterInstall = afterInstall;
            this.modId = modId;

            panel = widget.Get("INSTALL_DOWNLOAD_PANEL");
            progressBar = panel.Get<ProgressBarWidget>("PROGRESS_BAR");
            statusLabel = panel.Get<LabelWidget>("STATUS_LABEL");

            var text = "Downloading {0} assets...".F(ModMetadata.AllMods[modId].Title);
            panel.Get<LabelWidget>("TITLE").Text = text;

            ShowDownloadDialog();
        }
Beispiel #29
0
        public RAInstallLogic(Widget widget, Dictionary<string,string> installData, Action continueLoading)
        {
            var panel = widget.Get("INSTALL_PANEL");
            var args = new WidgetArgs()
            {
                { "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } },
                { "installData", installData },
                { "continueLoading", continueLoading }
            };

            panel.Get<ButtonWidget>("DOWNLOAD_BUTTON").OnClick = () =>
                Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", args);

            panel.Get<ButtonWidget>("INSTALL_BUTTON").OnClick = () =>
                Ui.OpenWindow("INSTALL_FROMCD_PANEL", args);

            panel.Get<ButtonWidget>("QUIT_BUTTON").OnClick = Game.Exit;

            panel.Get<ButtonWidget>("MODS_BUTTON").OnClick = () =>
            {
                Ui.OpenWindow("MODS_PANEL", new WidgetArgs()
                              {
                    { "onExit", () => {} },
                    // Close this panel
                    { "onSwitch", Ui.CloseWindow },
                });
            };
        }
Beispiel #30
0
		public KickSpectatorsLogic(Widget widget, string clientCount, Action okPressed, Action cancelPressed)
		{
			widget.Get<LabelWidget>("TEXT").GetText = () => "Are you sure you want to kick {0} spectators?".F(clientCount);

			widget.Get<ButtonWidget>("OK_BUTTON").OnClick = () =>
			{
				widget.Parent.RemoveChild(widget);
				okPressed();
			};

			widget.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () =>
			{
				widget.Parent.RemoveChild(widget);
				cancelPressed();
			};
		}