public GameTimerLogic(Widget widget, OrderManager orderManager, World world) { var timer = widget.GetOrNull<LabelWidget>("GAME_TIMER"); if (timer != null) timer.GetText = () => WidgetUtils.FormatTime(world.WorldTick); var status = widget.GetOrNull<LabelWidget>("GAME_TIMER_STATUS"); if (status != null) { var startTick = Ui.LastTickTime; // Blink the status line status.IsVisible = () => (world.Paused || world.Timestep != Game.Timestep) && (Ui.LastTickTime - startTick) / 1000 % 2 == 0; status.GetText = () => { if (world.Paused || world.Timestep == 0) return "Paused"; if (world.Timestep == 1) return "Max Speed"; return "{0:F1}x Speed".F(Game.Timestep * 1f / world.Timestep); }; } }
public ServerBrowserLogic(Widget widget, Action onStart, Action onExit) { panel = widget; this.onStart = onStart; serverList = panel.Get<ScrollPanelWidget>("SERVER_LIST"); serverTemplate = serverList.Get<ScrollItemWidget>("SERVER_TEMPLATE"); // Menu buttons var refreshButton = panel.Get<ButtonWidget>("REFRESH_BUTTON"); refreshButton.IsDisabled = () => searchStatus == SearchStatus.Fetching; refreshButton.GetText = () => searchStatus == SearchStatus.Fetching ? "Refreshing..." : "Refresh"; refreshButton.OnClick = RefreshServerList; panel.Get<ButtonWidget>("DIRECTCONNECT_BUTTON").OnClick = OpenDirectConnectPanel; panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = OpenCreateServerPanel; var join = panel.Get<ButtonWidget>("JOIN_BUTTON"); join.IsDisabled = () => currentServer == null || !currentServer.CanJoin(); join.OnClick = () => Join(currentServer); panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; // Display the progress label over the server list // The text is only visible when the list is empty var progressText = panel.Get<LabelWidget>("PROGRESS_LABEL"); progressText.IsVisible = () => searchStatus != SearchStatus.Hidden; progressText.GetText = ProgressLabelText; var showWaitingCheckbox = panel.GetOrNull<CheckboxWidget>("WAITING_FOR_PLAYERS"); if (showWaitingCheckbox != null) { showWaitingCheckbox.IsChecked = () => showWaiting; showWaitingCheckbox.OnClick = () => { showWaiting ^= true; RefreshServerList(); }; } var showEmptyCheckbox = panel.GetOrNull<CheckboxWidget>("EMPTY"); if (showEmptyCheckbox != null) { showEmptyCheckbox.IsChecked = () => showEmpty; showEmptyCheckbox.OnClick = () => { showEmpty ^= true; RefreshServerList(); }; } var showAlreadyStartedCheckbox = panel.GetOrNull<CheckboxWidget>("ALREADY_STARTED"); if (showAlreadyStartedCheckbox != null) { showAlreadyStartedCheckbox.IsChecked = () => showStarted; showAlreadyStartedCheckbox.OnClick = () => { showStarted ^= true; RefreshServerList(); }; } var showIncompatibleCheckbox = panel.GetOrNull<CheckboxWidget>("INCOMPATIBLE_VERSION"); if (showIncompatibleCheckbox != null) { showIncompatibleCheckbox.IsChecked = () => showIncompatible; showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; RefreshServerList(); }; } // Game.LoadWidget(null, "SERVERBROWSER_IRC", panel.Get("IRC_ROOT"), new WidgetArgs()); RefreshServerList(); }
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); }
public GameTimerLogic(Widget widget, OrderManager orderManager, World world) { var timer = widget.GetOrNull<LabelWidget>("GAME_TIMER"); var status = widget.GetOrNull<LabelWidget>("GAME_TIMER_STATUS"); var startTick = Ui.LastTickTime; Func<bool> shouldShowStatus = () => (world.Paused || world.Timestep != world.LobbyInfo.GlobalSettings.Timestep) && (Ui.LastTickTime - startTick) / 1000 % 2 == 0; Func<string> statusText = () => { if (world.Paused || world.Timestep == 0) return "Paused"; if (world.Timestep == 1) return "Max Speed"; return "{0}% Speed".F(world.LobbyInfo.GlobalSettings.Timestep * 100 / world.Timestep); }; if (timer != null) { // Timers in replays should be synced to the effective game time, not the playback time. var timestep = world.Timestep; if (world.IsReplay) { GameSpeed speed; var gameSpeeds = Game.ModData.Manifest.Get<GameSpeeds>(); if (gameSpeeds.Speeds.TryGetValue(world.LobbyInfo.GlobalSettings.GameSpeedType, out speed)) timestep = speed.Timestep; } timer.GetText = () => { if (status == null && shouldShowStatus()) return statusText(); return WidgetUtils.FormatTime(world.WorldTick, timestep); }; } if (status != null) { // Blink the status line status.IsVisible = shouldShowStatus; status.GetText = statusText; } var percentage = widget.GetOrNull<LabelWidget>("GAME_TIMER_PERCENTAGE"); if (percentage != null) { var connection = orderManager.Connection as ReplayConnection; if (connection != null && connection.TickCount != 0) percentage.GetText = () => "({0}%)".F(orderManager.NetFrameNumber * 100 / connection.TickCount); else if (timer != null) timer.Bounds.Width += percentage.Bounds.Width; } }
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); }
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; }
public GameTimerLogic(Widget widget, OrderManager orderManager, World world) { var timer = widget.GetOrNull<LabelWidget>("GAME_TIMER"); var status = widget.GetOrNull<LabelWidget>("GAME_TIMER_STATUS"); var startTick = Ui.LastTickTime; Func<bool> shouldShowStatus = () => (world.Paused || world.Timestep != world.LobbyInfo.GlobalSettings.Timestep) && (Ui.LastTickTime - startTick) / 1000 % 2 == 0; Func<string> statusText = () => { if (world.Paused || world.Timestep == 0) return "Paused"; if (world.Timestep == 1) return "Max Speed"; return "{0}% Speed".F(world.LobbyInfo.GlobalSettings.Timestep * 100 / world.Timestep); }; if (timer != null) { // Timers in replays should be synced to the effective game time, not the playback time. var timestep = world.Timestep; if (world.IsReplay) timestep = world.WorldActor.Trait<MapOptions>().GameSpeed.Timestep; timer.GetText = () => { if (status == null && shouldShowStatus()) return statusText(); return WidgetUtils.FormatTime(world.WorldTick, timestep); }; } if (status != null) { // Blink the status line status.IsVisible = shouldShowStatus; status.GetText = statusText; } var timerTooltip = timer as LabelWithTooltipWidget; if (timerTooltip != null) { var connection = orderManager.Connection as ReplayConnection; if (connection != null && connection.TickCount != 0) timerTooltip.GetTooltipText = () => "{0}% complete".F(orderManager.NetFrameNumber * 100 / connection.TickCount); else timerTooltip.GetTooltipText = null; } }
public SupportPowerBinLogic(Widget widget, World world) { var palette = widget.Get<SupportPowersWidget>("SUPPORT_PALETTE"); var background = widget.GetOrNull("PALETTE_BACKGROUND"); var foreground = widget.GetOrNull("PALETTE_FOREGROUND"); if (background != null || foreground != null) { Widget backgroundTemplate = null; Widget foregroundTemplate = null; if (background != null) backgroundTemplate = background.Get("ICON_TEMPLATE"); if (foreground != null) foregroundTemplate = foreground.Get("ICON_TEMPLATE"); Action<int, int> updateBackground = (_, icons) => { var rowHeight = palette.IconSize.Y + palette.IconMargin; if (background != null) { background.RemoveChildren(); for (var i = 0; i < icons; i++) { var row = backgroundTemplate.Clone(); row.Bounds.Y += i * rowHeight; background.AddChild(row); } } if (foreground != null) { foreground.RemoveChildren(); for (var i = 0; i < icons; i++) { var row = foregroundTemplate.Clone(); row.Bounds.Y += i * rowHeight; foreground.AddChild(row); } } }; palette.OnIconCountChanged += updateBackground; // Set the initial palette state updateBackground(0, 0); } }
public ReplayBrowserLogic(Widget widget, Action onExit, Action onStart) { panel = widget; this.onStart = onStart; playerList = panel.Get<ScrollPanelWidget>("PLAYER_LIST"); playerHeader = playerList.Get<ScrollItemWidget>("HEADER"); playerTemplate = playerList.Get<ScrollItemWidget>("TEMPLATE"); playerList.RemoveChildren(); panel.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () => { cancelLoadingReplays = true; Ui.CloseWindow(); onExit(); }; replayList = panel.Get<ScrollPanelWidget>("REPLAY_LIST"); var template = panel.Get<ScrollItemWidget>("REPLAY_TEMPLATE"); var mod = Game.ModData.Manifest.Mod; var dir = Platform.ResolvePath("^", "Replays", mod.Id, mod.Version); if (Directory.Exists(dir)) ThreadPool.QueueUserWorkItem(_ => LoadReplays(dir, template)); var watch = panel.Get<ButtonWidget>("WATCH_BUTTON"); watch.IsDisabled = () => selectedReplay == null || selectedReplay.GameInfo.MapPreview.Status != MapStatus.Available; watch.OnClick = () => { WatchReplay(); }; panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null; var preview = panel.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.SpawnOccupants = () => selectedSpawns; preview.Preview = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview : null; var titleLabel = panel.GetOrNull<LabelWidget>("MAP_TITLE"); if (titleLabel != null) { titleLabel.IsVisible = () => selectedReplay != null; var font = Game.Renderer.Fonts[titleLabel.Font]; var title = new CachedTransform<MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font)); titleLabel.GetText = () => title.Update(selectedReplay.GameInfo.MapPreview); } var type = panel.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => selectedReplay.GameInfo.MapPreview.Type; panel.Get<LabelWidget>("DURATION").GetText = () => WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds); SetupFilters(); SetupManagement(); }
public GameTimerLogic(Widget widget, OrderManager orderManager, World world) { var timer = widget.GetOrNull<LabelWidget>("GAME_TIMER"); var status = widget.GetOrNull<LabelWidget>("GAME_TIMER_STATUS"); var startTick = Ui.LastTickTime; Func<bool> shouldShowStatus = () => (world.Paused || world.Timestep != Game.Timestep) && (Ui.LastTickTime - startTick) / 1000 % 2 == 0; Func<string> statusText = () => { if (world.Paused || world.Timestep == 0) return "Paused"; if (world.Timestep == 1) return "Max Speed"; return "{0}% Speed".F(Game.Timestep * 100 / world.Timestep); }; if (timer != null) { timer.GetText = () => { if (status == null && shouldShowStatus()) return statusText(); return WidgetUtils.FormatTime(world.WorldTick); }; } if (status != null) { // Blink the status line status.IsVisible = shouldShowStatus; status.GetText = statusText; } var percentage = widget.GetOrNull<LabelWidget>("GAME_TIMER_PERCENTAGE"); if (percentage != null) { var connection = orderManager.Connection as ReplayConnection; if (connection != null && connection.TickCount != 0) percentage.GetText = () => "({0}%)".F(orderManager.NetFrameNumber * 100 / connection.TickCount); else timer.Bounds.Width += percentage.Bounds.Width; } }
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 CncInstallMusicLogic(Widget widget, Ruleset modRules, Action onExit) { var installButton = widget.GetOrNull<ButtonWidget>("INSTALL_BUTTON"); if (installButton != null) { Action afterInstall = () => { try { var path = new string[] { Platform.SupportDir, "Content", Game.modData.Manifest.Mod.Id }.Aggregate(Path.Combine); GlobalFileSystem.Mount(Path.Combine(path, "scores.mix")); GlobalFileSystem.Mount(Path.Combine(path, "transit.mix")); modRules.Music.Do(m => m.Value.Reload()); var musicPlayerLogic = (MusicPlayerLogic)installButton.Parent.LogicObject; musicPlayerLogic.BuildMusicTable(); } catch (Exception e) { Log.Write("debug", "Mounting the new mixfile and rebuild of scores list failed:\n{0}", e); } }; installButton.OnClick = () => Ui.OpenWindow("INSTALL_MUSIC_PANEL", new WidgetArgs() { { "afterInstall", afterInstall }, { "filesToCopy", new[] { "SCORES.MIX" } }, { "filesToExtract", new[] { "transit.mix" } }, }); installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length < 3; // HACK around music being split between transit.mix and scores.mix } }
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 MapEditorLogic(Widget widget, World world, WorldRenderer worldRenderer) { 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; var selectedLabel = selectedZoom.ToString(); Func<float, ScrollItemWidget, ScrollItemWidget> setupItem = (zoom, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => selectedZoom == zoom, () => { worldRenderer.Viewport.Zoom = selectedZoom = zoom; selectedLabel = zoom.ToString(); }); var label = zoom.ToString(); item.Get<LabelWidget>("LABEL").GetText = () => label; return item; }; var options = new[] { 2f, 1f, 0.5f, 0.25f }; zoomDropdown.OnMouseDown = _ => zoomDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem); zoomDropdown.GetText = () => selectedLabel; zoomDropdown.GetKey = _ => Game.Settings.Keys.TogglePixelDoubleKey; zoomDropdown.OnKeyPress = e => { var key = Hotkey.FromKeyInput(e); if (key != Game.Settings.Keys.TogglePixelDoubleKey) return; var selected = (options.IndexOf(selectedZoom) + 1) % options.Length; worldRenderer.Viewport.Zoom = selectedZoom = options[selected]; selectedLabel = selectedZoom.ToString(); }; } }
public ColorPickerLogic(Widget widget, ModData modData, World world, HSLColor initialColor, Action<HSLColor> onChange, WorldRenderer worldRenderer) { string actorType; if (!ChromeMetrics.TryGet("ColorPickerActorType", out actorType)) actorType = "mcv"; var preview = widget.GetOrNull<ActorPreviewWidget>("PREVIEW"); var actor = world.Map.Rules.Actors[actorType]; var td = new TypeDictionary(); td.Add(new HideBibPreviewInit()); td.Add(new OwnerInit(world.WorldActor.Owner)); td.Add(new FactionInit(world.WorldActor.Owner.PlayerReference.Faction)); if (preview != null) preview.SetPreview(actor, td); 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 var validator = modData.Manifest.Get<ColorValidator>(); mixer.SetPaletteRange(validator.HsvSaturationRange[0], validator.HsvSaturationRange[1], validator.HsvValueRange[0], validator.HsvValueRange[1]); mixer.Set(initialColor); hueSlider.Value = initialColor.H / 255f; onChange(mixer.Color); }
public ServerCreationLogic(Widget widget, Action onExit, Action openLobby) { panel = widget; onCreate = openLobby; this.onExit = onExit; var settings = Game.Settings; panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = CreateAndJoin; map = Game.modData.AvailableMaps[ WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map) ]; var mapButton = panel.GetOrNull<ButtonWidget>("MAP_BUTTON"); if (mapButton != null) { panel.Get<ButtonWidget>("MAP_BUTTON").OnClick = () => { Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs() { { "initialMap", map.Uid }, { "onExit", () => {} }, { "onSelect", (Action<Map>)(m => map = m) } }); }; panel.Get<MapPreviewWidget>("MAP_PREVIEW").Map = () => map; panel.Get<LabelWidget>("MAP_NAME").GetText = () => map.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 UPnPCheckbox = panel.Get<CheckboxWidget>("UPNP_CHECKBOX"); UPnPCheckbox.IsChecked = () => allowPortForward; UPnPCheckbox.OnClick = () => allowPortForward ^= true; UPnPCheckbox.IsDisabled = () => !Game.Settings.Server.NatDeviceAvailable; }
public DiplomacyLogic(Widget widget, Action onExit, World world) { this.world = world; diplomacyPanel = widget.Get<ScrollPanelWidget>("DIPLOMACY_PANEL"); LayoutPlayers(); var close = widget.GetOrNull<ButtonWidget>("CLOSE"); if (close != null) close.OnClick = () => { Ui.CloseWindow(); Ui.Root.RemoveChild(widget); onExit(); }; }
public ReplayBrowserLogic(Widget widget, Action onExit, Action onStart) { panel = widget; playerList = panel.Get<ScrollPanelWidget>("PLAYER_LIST"); playerHeader = playerList.Get<ScrollItemWidget>("HEADER"); playerTemplate = playerList.Get<ScrollItemWidget>("TEMPLATE"); playerList.RemoveChildren(); panel.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; replayList = panel.Get<ScrollPanelWidget>("REPLAY_LIST"); var template = panel.Get<ScrollItemWidget>("REPLAY_TEMPLATE"); var mod = Game.modData.Manifest.Mod; var dir = Platform.ResolvePath("^", "Replays", mod.Id, mod.Version); replayList.RemoveChildren(); if (Directory.Exists(dir)) { using (new Support.PerfTimer("Load replays")) { replays = Directory .GetFiles(dir, "*.rep") .Select(ReplayMetadata.Read) .Where(r => r != null) .OrderByDescending(r => r.GameInfo.StartTimeUtc) .ToList(); } foreach (var replay in replays) AddReplay(replay, template); ApplyFilter(); } else replays = new List<ReplayMetadata>(); var watch = panel.Get<ButtonWidget>("WATCH_BUTTON"); watch.IsDisabled = () => selectedReplay == null || selectedReplay.GameInfo.MapPreview.Status != MapStatus.Available; watch.OnClick = () => { WatchReplay(); onStart(); }; panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null; var preview = panel.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.SpawnOccupants = () => selectedSpawns; preview.Preview = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview : null; var title = panel.GetOrNull<LabelWidget>("MAP_TITLE"); if (title != null) title.GetText = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview.Title : null; var type = panel.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => selectedReplay.GameInfo.MapPreview.Type; panel.Get<LabelWidget>("DURATION").GetText = () => WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds); SetupFilters(); SetupManagement(); }
public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel activePanel) { var resumeDisabled = false; menu = widget.Get("INGAME_MENU"); var mpe = world.WorldActor.TraitOrDefault<MenuPaletteEffect>(); if (mpe != null) mpe.Fade(mpe.Info.MenuEffect); menu.Get<LabelWidget>("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version; var hideMenu = false; menu.Get("MENU_BUTTONS").IsVisible = () => !hideMenu; // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions Action onQuit = () => { Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Country.Race); resumeDisabled = true; var exitDelay = 1200; if (mpe != null) { Game.RunAfterDelay(exitDelay, () => mpe.Fade(MenuPaletteEffect.EffectType.Black)); exitDelay += 40 * mpe.Info.FadeLength; } Game.RunAfterDelay(exitDelay, () => { Game.Disconnect(); Ui.ResetAll(); Game.LoadShellMap(); }); }; Action closeMenu = () => { Ui.CloseWindow(); if (mpe != null) mpe.Fade(MenuPaletteEffect.EffectType.None); onExit(); }; Action showMenu = () => hideMenu = false; menu.Get<ButtonWidget>("ABORT_MISSION").OnClick = () => { hideMenu = true; ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, showMenu); }; Action onSurrender = () => { world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); closeMenu(); }; var surrenderButton = menu.Get<ButtonWidget>("SURRENDER"); surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined); surrenderButton.OnClick = () => { hideMenu = true; ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, showMenu); }; surrenderButton.IsDisabled = () => world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined; menu.Get<ButtonWidget>("MUSIC").OnClick = () => { hideMenu = true; Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs() { { "onExit", () => hideMenu = false }, { "world", world } }); }; var settingsButton = widget.Get<ButtonWidget>("SETTINGS"); settingsButton.OnClick = () => { hideMenu = true; Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() { { "world", world }, { "worldRenderer", worldRenderer }, { "onExit", () => hideMenu = false }, }); }; var resumeButton = menu.Get<ButtonWidget>("RESUME"); resumeButton.IsDisabled = () => resumeDisabled; resumeButton.OnClick = closeMenu; var panelRoot = widget.GetOrNull("PANEL_ROOT"); if (panelRoot != null) { var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs() { { "activePanel", activePanel } }); gameInfoPanel.IsVisible = () => !hideMenu; } }
public static void SetupSlotWidget(Widget parent, Session.Slot s, Session.Client c) { var name = parent.Get<LabelWidget>("NAME"); name.IsVisible = () => true; name.GetText = () => c != null ? c.Name : s.Closed ? "Closed" : "Open"; // Ensure Slot selector (if present) is hidden var slot = parent.GetOrNull("SLOT_OPTIONS"); if (slot != null) slot.IsVisible = () => false; }
public MainMenuLogic(Widget widget, World world) { rootMenu = widget; rootMenu.Get<LabelWidget>("VERSION_LABEL").Text = Game.ModData.Manifest.Mod.Version; // Menu buttons var mainMenu = widget.Get("MAIN_MENU"); mainMenu.IsVisible = () => menuType == MenuType.Main; mainMenu.Get<ButtonWidget>("SINGLEPLAYER_BUTTON").OnClick = () => menuType = MenuType.Singleplayer; mainMenu.Get<ButtonWidget>("MULTIPLAYER_BUTTON").OnClick = () => { menuType = MenuType.None; Ui.OpenWindow("SERVERBROWSER_PANEL", new WidgetArgs { { "onStart", RemoveShellmapUI }, { "onExit", () => menuType = MenuType.Main }, { "directConnectHost", null }, { "directConnectPort", 0 }, }); }; mainMenu.Get<ButtonWidget>("MODS_BUTTON").OnClick = () => { Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; Game.InitializeMod("modchooser", null); }; mainMenu.Get<ButtonWidget>("SETTINGS_BUTTON").OnClick = () => { menuType = MenuType.None; Game.OpenWindow("SETTINGS_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Main } }); }; mainMenu.Get<ButtonWidget>("EXTRAS_BUTTON").OnClick = () => menuType = MenuType.Extras; mainMenu.Get<ButtonWidget>("QUIT_BUTTON").OnClick = Game.Exit; // Singleplayer menu var singleplayerMenu = widget.Get("SINGLEPLAYER_MENU"); singleplayerMenu.IsVisible = () => menuType == MenuType.Singleplayer; var missionsButton = singleplayerMenu.Get<ButtonWidget>("MISSIONS_BUTTON"); missionsButton.OnClick = () => { menuType = MenuType.None; Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Singleplayer }, { "onStart", RemoveShellmapUI } }); }; var hasCampaign = Game.ModData.Manifest.Missions.Any(); var hasMissions = Game.ModData.MapCache .Any(p => p.Status == MapStatus.Available && p.Map.Visibility.HasFlag(MapVisibility.MissionSelector)); missionsButton.Disabled = !hasCampaign && !hasMissions; singleplayerMenu.Get<ButtonWidget>("SKIRMISH_BUTTON").OnClick = StartSkirmishGame; singleplayerMenu.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => menuType = MenuType.Main; // Extras menu var extrasMenu = widget.Get("EXTRAS_MENU"); extrasMenu.IsVisible = () => menuType == MenuType.Extras; extrasMenu.Get<ButtonWidget>("REPLAYS_BUTTON").OnClick = () => { menuType = MenuType.None; Ui.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Extras }, { "onStart", RemoveShellmapUI } }); }; extrasMenu.Get<ButtonWidget>("MUSIC_BUTTON").OnClick = () => { menuType = MenuType.None; Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Extras }, { "world", world } }); }; extrasMenu.Get<ButtonWidget>("MAP_EDITOR_BUTTON").OnClick = () => menuType = MenuType.MapEditor; var assetBrowserButton = extrasMenu.GetOrNull<ButtonWidget>("ASSETBROWSER_BUTTON"); if (assetBrowserButton != null) assetBrowserButton.OnClick = () => { menuType = MenuType.None; Game.OpenWindow("ASSETBROWSER_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Extras }, }); }; extrasMenu.Get<ButtonWidget>("CREDITS_BUTTON").OnClick = () => { menuType = MenuType.None; Ui.OpenWindow("CREDITS_PANEL", new WidgetArgs { { "onExit", () => menuType = MenuType.Extras }, }); }; extrasMenu.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => menuType = MenuType.Main; // Map editor menu var mapEditorMenu = widget.Get("MAP_EDITOR_MENU"); mapEditorMenu.IsVisible = () => menuType == MenuType.MapEditor; var onSelect = new Action<string>(uid => { RemoveShellmapUI(); LoadMapIntoEditor(Game.ModData.MapCache[uid].Map); }); var newMapButton = widget.Get<ButtonWidget>("NEW_MAP_BUTTON"); newMapButton.OnClick = () => { menuType = MenuType.None; Game.OpenWindow("NEW_MAP_BG", new WidgetArgs() { { "onSelect", onSelect }, { "onExit", () => menuType = MenuType.MapEditor } }); }; var loadMapButton = widget.Get<ButtonWidget>("LOAD_MAP_BUTTON"); loadMapButton.OnClick = () => { menuType = MenuType.None; Game.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs() { { "initialMap", null }, { "initialTab", MapClassification.User }, { "onExit", () => menuType = MenuType.MapEditor }, { "onSelect", onSelect }, { "filter", MapVisibility.Lobby | MapVisibility.Shellmap | MapVisibility.MissionSelector }, }); }; mapEditorMenu.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => menuType = MenuType.Extras; var newsBG = widget.GetOrNull("NEWS_BG"); if (newsBG != null) { newsBG.IsVisible = () => Game.Settings.Game.FetchNews && menuType != MenuType.None; newsPanel = Ui.LoadWidget<ScrollPanelWidget>("NEWS_PANEL", null, new WidgetArgs()); newsTemplate = newsPanel.Get("NEWS_ITEM_TEMPLATE"); newsPanel.RemoveChild(newsTemplate); newsStatus = newsPanel.Get<LabelWidget>("NEWS_STATUS"); SetNewsStatus("Loading news"); var cacheFile = Platform.ResolvePath("^", "news.yaml"); var currentNews = ParseNews(cacheFile); if (currentNews != null) DisplayNews(currentNews); // Only query for new stories once per day var cacheValid = currentNews != null && DateTime.Today.ToUniversalTime() <= Game.Settings.Game.NewsFetchedDate; if (!cacheValid) new Download(Game.Settings.Game.NewsUrl, cacheFile, e => { }, (e, c) => NewsDownloadComplete(e, c, cacheFile, currentNews)); var newsButton = newsBG.GetOrNull<DropDownButtonWidget>("NEWS_BUTTON"); newsButton.OnClick = () => { newsButton.AttachPanel(newsPanel); newsHighlighted = false; }; newsButton.IsHighlighted = () => newsHighlighted && Game.LocalTick % 50 < 25; } Game.OnRemoteDirectConnect += (host, port) => { menuType = MenuType.None; Ui.OpenWindow("SERVERBROWSER_PANEL", new WidgetArgs { { "onStart", RemoveShellmapUI }, { "onExit", () => menuType = MenuType.Main }, { "directConnectHost", host }, { "directConnectPort", port }, }); }; }
public static void SetupClientWidget(Widget parent, Session.Client c, OrderManager orderManager, bool visible) { var adminIndicator = parent.GetOrNull("ADMIN_INDICATOR"); if (adminIndicator != null) adminIndicator.IsVisible = () => c != null && c.IsAdmin; var block = parent.GetOrNull("LATENCY"); if (block != null) { block.IsVisible = () => visible; if (visible) block.Get<ColorBlockWidget>("LATENCY_COLOR").GetColor = () => LatencyColor( orderManager.LobbyInfo.PingFromClient(c)); } var tooltip = parent.Get<ClientTooltipRegionWidget>("CLIENT_REGION"); tooltip.IsVisible = () => c != null && visible; if (c != null) tooltip.Bind(orderManager, c.Index); }
public static void SetupEditableSlotWidget(LobbyLogic logic, Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager) { var slot = parent.Get<DropDownButtonWidget>("SLOT_OPTIONS"); slot.IsVisible = () => true; slot.IsDisabled = () => orderManager.LocalClient.IsReady; slot.GetText = () => c != null ? c.Name : s.Closed ? "Closed" : "Open"; slot.OnMouseDown = _ => ShowSlotDropDown(logic, slot, s, c, orderManager); // Ensure Name selector (if present) is hidden var name = parent.GetOrNull("NAME"); if (name != null) name.IsVisible = () => false; }
public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget, Action onExit) { this.world = world; this.worldRenderer = worldRenderer; 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"); statsDropDown = widget.Get<DropDownButtonWidget>("STATS_DROPDOWN"); statsDropDown.GetText = () => "Basic"; statsDropDown.OnMouseDown = _ => { var options = new List<StatsDropDownOption> { new StatsDropDownOption { Title = "Basic", IsSelected = () => basicStatsHeaders.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => "Basic"; DisplayStats(BasicStats); } }, new StatsDropDownOption { Title = "Economy", IsSelected = () => economyStatsHeaders.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => "Economy"; DisplayStats(EconomyStats); } }, new StatsDropDownOption { Title = "Production", IsSelected = () => productionStatsHeaders.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => "Production"; DisplayStats(ProductionStats); } }, new StatsDropDownOption { Title = "Combat", IsSelected = () => combatStatsHeaders.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => "Combat"; DisplayStats(CombatStats); } }, new StatsDropDownOption { Title = "Earnings (graph)", IsSelected = () => earnedThisMinuteGraphHeaders.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => "Earnings (graph)"; 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.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem); }; ClearStats(); DisplayStats(BasicStats); var close = widget.GetOrNull<ButtonWidget>("CLOSE"); if (close != null) close.OnClick = () => { Ui.CloseWindow(); Ui.Root.RemoveChild(widget); onExit(); }; }
public MusicPlayerLogic(Widget widget, Ruleset modRules, World world, Action onExit) { var panel = widget.Get("MUSIC_PANEL"); musicList = panel.Get<ScrollPanelWidget>("MUSIC_LIST"); itemTemplate = musicList.Get<ScrollItemWidget>("MUSIC_TEMPLATE"); musicPlaylist = world.WorldActor.Trait<MusicPlaylist>(); BuildMusicTable(); Func<bool> noMusic = () => !musicPlaylist.IsMusicAvailable; panel.Get("NO_MUSIC_LABEL").IsVisible = noMusic; var playButton = panel.Get<ButtonWidget>("BUTTON_PLAY"); playButton.OnClick = Play; playButton.IsDisabled = noMusic; playButton.IsVisible = () => !Sound.MusicPlaying; var pauseButton = panel.Get<ButtonWidget>("BUTTON_PAUSE"); pauseButton.OnClick = Sound.PauseMusic; pauseButton.IsDisabled = noMusic; pauseButton.IsVisible = () => Sound.MusicPlaying; var stopButton = panel.Get<ButtonWidget>("BUTTON_STOP"); stopButton.OnClick = () => { musicPlaylist.Stop(); }; stopButton.IsDisabled = noMusic; var nextButton = panel.Get<ButtonWidget>("BUTTON_NEXT"); nextButton.OnClick = () => { currentSong = musicPlaylist.GetNextSong(); Play(); }; nextButton.IsDisabled = noMusic; var prevButton = panel.Get<ButtonWidget>("BUTTON_PREV"); prevButton.OnClick = () => { currentSong = musicPlaylist.GetPrevSong(); Play(); }; prevButton.IsDisabled = noMusic; var shuffleCheckbox = panel.Get<CheckboxWidget>("SHUFFLE"); shuffleCheckbox.IsChecked = () => Game.Settings.Sound.Shuffle; shuffleCheckbox.OnClick = () => Game.Settings.Sound.Shuffle ^= true; var repeatCheckbox = panel.Get<CheckboxWidget>("REPEAT"); repeatCheckbox.IsChecked = () => Game.Settings.Sound.Repeat; repeatCheckbox.OnClick = () => Game.Settings.Sound.Repeat ^= true; panel.Get<LabelWidget>("TIME_LABEL").GetText = () => (currentSong == null) ? "" : "{0:D2}:{1:D2} / {2:D2}:{3:D2}".F((int)Sound.MusicSeekPosition / 60, (int)Sound.MusicSeekPosition % 60, currentSong.Length / 60, currentSong.Length % 60); var musicSlider = panel.Get<SliderWidget>("MUSIC_SLIDER"); musicSlider.OnChange += x => Sound.MusicVolume = x; musicSlider.Value = Sound.MusicVolume; var installButton = widget.GetOrNull<ButtonWidget>("INSTALL_BUTTON"); if (installButton != null) { installButton.IsDisabled = () => world == null || world.Type != WorldType.Shellmap; var args = new string[] { "Install.Music=true" }; installButton.OnClick = () => Game.RunAfterTick(() => Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args))); var installData = Game.ModData.Manifest.Get<ContentInstaller>(); installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length <= installData.ShippedSoundtracks; } var songWatcher = widget.GetOrNull<LogicTickerWidget>("SONG_WATCHER"); if (songWatcher != null) { songWatcher.OnTick = () => { if (Sound.CurrentMusic == null || currentSong == Sound.CurrentMusic) return; currentSong = Sound.CurrentMusic; }; } panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { Game.Settings.Save(); Ui.CloseWindow(); onExit(); }; }
public MissionBrowserLogic(Widget widget, World world, Action onStart, Action onExit) { this.onStart = onStart; missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST"); headerTemplate = widget.Get<ScrollItemWidget>("HEADER"); template = widget.Get<ScrollItemWidget>("TEMPLATE"); var title = widget.GetOrNull<LabelWidget>("MISSIONBROWSER_TITLE"); if (title != null) title.GetText = () => playingVideo != PlayingVideo.None ? selectedMapPreview.Title : title.Text; widget.Get("MISSION_INFO").IsVisible = () => selectedMapPreview != null; var previewWidget = widget.Get<MapPreviewWidget>("MISSION_PREVIEW"); previewWidget.Preview = () => selectedMapPreview; previewWidget.IsVisible = () => playingVideo == PlayingVideo.None; videoPlayer = widget.Get<VqaPlayerWidget>("MISSION_VIDEO"); widget.Get("MISSION_BIN").IsVisible = () => playingVideo != PlayingVideo.None; fullscreenVideoPlayer = Ui.LoadWidget<BackgroundWidget>("FULLSCREEN_PLAYER", Ui.Root, new WidgetArgs { { "world", world } }); descriptionPanel = widget.Get<ScrollPanelWidget>("MISSION_DESCRIPTION_PANEL"); description = descriptionPanel.Get<LabelWidget>("MISSION_DESCRIPTION"); descriptionFont = Game.Renderer.Fonts[description.Font]; difficultyButton = widget.Get<DropDownButtonWidget>("DIFFICULTY_DROPDOWNBUTTON"); gameSpeedButton = widget.GetOrNull<DropDownButtonWidget>("GAMESPEED_DROPDOWNBUTTON"); startBriefingVideoButton = widget.Get<ButtonWidget>("START_BRIEFING_VIDEO_BUTTON"); stopBriefingVideoButton = widget.Get<ButtonWidget>("STOP_BRIEFING_VIDEO_BUTTON"); stopBriefingVideoButton.IsVisible = () => playingVideo == PlayingVideo.Briefing; stopBriefingVideoButton.OnClick = () => StopVideo(videoPlayer); startInfoVideoButton = widget.Get<ButtonWidget>("START_INFO_VIDEO_BUTTON"); stopInfoVideoButton = widget.Get<ButtonWidget>("STOP_INFO_VIDEO_BUTTON"); stopInfoVideoButton.IsVisible = () => playingVideo == PlayingVideo.Info; stopInfoVideoButton.OnClick = () => StopVideo(videoPlayer); var allMaps = new List<Map>(); missionList.RemoveChildren(); // Add a group for each campaign if (Game.ModData.Manifest.Missions.Any()) { var yaml = Game.ModData.Manifest.Missions.Select(MiniYaml.FromFile).Aggregate(MiniYaml.MergeLiberal); foreach (var kv in yaml) { var missionMapPaths = kv.Value.Nodes.Select(n => Path.GetFullPath(n.Key)); var maps = Game.ModData.MapCache .Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path))) .Select(p => p.Map); CreateMissionGroup(kv.Key, maps); allMaps.AddRange(maps); } } // Add an additional group for loose missions var looseMissions = Game.ModData.MapCache .Where(p => p.Status == MapStatus.Available && p.Map.Visibility.HasFlag(MapVisibility.MissionSelector) && !allMaps.Contains(p.Map)) .Select(p => p.Map); if (looseMissions.Any()) { CreateMissionGroup("Missions", looseMissions); allMaps.AddRange(looseMissions); } if (allMaps.Any()) SelectMap(allMaps.First()); var startButton = widget.Get<ButtonWidget>("STARTGAME_BUTTON"); startButton.OnClick = StartMissionClicked; startButton.IsDisabled = () => selectedMapPreview == null || selectedMapPreview.RuleStatus != MapRuleStatus.Cached; widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => { StopVideo(videoPlayer); Game.Disconnect(); Ui.CloseWindow(); onExit(); }; }
public IngameMenuLogic(Widget widget, ModData modData, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel activePanel) { var leaving = false; menu = widget.Get("INGAME_MENU"); var mpe = world.WorldActor.TraitOrDefault<MenuPaletteEffect>(); if (mpe != null) mpe.Fade(mpe.Info.MenuEffect); menu.Get<LabelWidget>("VERSION_LABEL").Text = modData.Manifest.Mod.Version; var hideMenu = false; menu.Get("MENU_BUTTONS").IsVisible = () => !hideMenu; var scriptContext = world.WorldActor.TraitOrDefault<LuaScript>(); var hasError = scriptContext != null && scriptContext.FatalErrorOccurred; // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions Action onQuit = () => { if (world.Type == WorldType.Regular) Game.Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Faction.InternalName); leaving = true; var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault(); var exitDelay = iop != null ? iop.ExitDelay : 0; if (mpe != null) { Game.RunAfterDelay(exitDelay, () => { if (Game.IsCurrentWorld(world)) mpe.Fade(MenuPaletteEffect.EffectType.Black); }); exitDelay += 40 * mpe.Info.FadeLength; } Game.RunAfterDelay(exitDelay, () => { if (!Game.IsCurrentWorld(world)) return; Game.Disconnect(); Ui.ResetAll(); Game.LoadShellMap(); }); }; Action closeMenu = () => { Ui.CloseWindow(); if (mpe != null) mpe.Fade(MenuPaletteEffect.EffectType.None); onExit(); }; Action showMenu = () => hideMenu = false; var abortMissionButton = menu.Get<ButtonWidget>("ABORT_MISSION"); abortMissionButton.IsVisible = () => world.Type == WorldType.Regular; abortMissionButton.IsDisabled = () => leaving; if (world.IsGameOver) abortMissionButton.GetText = () => "Leave"; abortMissionButton.OnClick = () => { hideMenu = true; if (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Won) { Action restartAction = null; var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault(); var exitDelay = iop != null ? iop.ExitDelay : 0; if (world.LobbyInfo.IsSinglePlayer) { restartAction = () => { Ui.CloseWindow(); if (mpe != null) { if (Game.IsCurrentWorld(world)) mpe.Fade(MenuPaletteEffect.EffectType.Black); exitDelay += 40 * mpe.Info.FadeLength; } Game.RunAfterDelay(exitDelay, Game.RestartGame); }; } ConfirmationDialogs.PromptConfirmAction( title: "Leave Mission", text: "Leave this game and return to the menu?", onConfirm: onQuit, onCancel: showMenu, confirmText: "Leave", cancelText: "Stay", otherText: "Restart", onOther: restartAction); } else onQuit(); }; var exitEditorButton = menu.Get<ButtonWidget>("EXIT_EDITOR"); exitEditorButton.IsVisible = () => world.Type == WorldType.Editor; exitEditorButton.OnClick = () => { hideMenu = true; ConfirmationDialogs.PromptConfirmAction( title: "Exit Map Editor", text: "Exit and lose all unsaved changes?", onConfirm: onQuit, onCancel: showMenu); }; Action onSurrender = () => { world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); closeMenu(); }; var surrenderButton = menu.Get<ButtonWidget>("SURRENDER"); surrenderButton.IsVisible = () => world.Type == WorldType.Regular; surrenderButton.IsDisabled = () => world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined || world.Map.Visibility.HasFlag(MapVisibility.MissionSelector) || hasError; surrenderButton.OnClick = () => { hideMenu = true; ConfirmationDialogs.PromptConfirmAction( title: "Surrender", text: "Are you sure you want to surrender?", onConfirm: onSurrender, onCancel: showMenu, confirmText: "Surrender", cancelText: "Stay"); }; var saveMapButton = menu.Get<ButtonWidget>("SAVE_MAP"); saveMapButton.IsVisible = () => world.Type == WorldType.Editor; saveMapButton.OnClick = () => { hideMenu = true; var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>(); Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs() { { "onSave", (Action<string>)(_ => hideMenu = false) }, { "onExit", () => hideMenu = false }, { "map", world.Map }, { "playerDefinitions", editorActorLayer.Players.ToMiniYaml() }, { "actorDefinitions", editorActorLayer.Save() } }); }; var musicButton = menu.Get<ButtonWidget>("MUSIC"); musicButton.IsDisabled = () => leaving; musicButton.OnClick = () => { hideMenu = true; Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs() { { "onExit", () => hideMenu = false }, { "world", world } }); }; var settingsButton = widget.Get<ButtonWidget>("SETTINGS"); settingsButton.IsDisabled = () => leaving; settingsButton.OnClick = () => { hideMenu = true; Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() { { "world", world }, { "worldRenderer", worldRenderer }, { "onExit", () => hideMenu = false }, }); }; var resumeButton = menu.Get<ButtonWidget>("RESUME"); resumeButton.IsDisabled = () => leaving; if (world.IsGameOver) resumeButton.GetText = () => "Return to map"; resumeButton.OnClick = closeMenu; var panelRoot = widget.GetOrNull("PANEL_ROOT"); if (panelRoot != null && world.Type != WorldType.Editor) { var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs() { { "activePanel", activePanel } }); gameInfoPanel.IsVisible = () => !hideMenu; } }
public ClassicProductionLogic(Widget widget, OrderManager orderManager, World world) { this.world = world; palette = widget.Get<ProductionPaletteWidget>("PRODUCTION_PALETTE"); var background = widget.GetOrNull("PALETTE_BACKGROUND"); var foreground = widget.GetOrNull("PALETTE_FOREGROUND"); if (background != null || foreground != null) { Widget backgroundTemplate = null; Widget backgroundBottom = null; Widget foregroundTemplate = null; if (background != null) { backgroundTemplate = background.Get("ROW_TEMPLATE"); backgroundBottom = background.GetOrNull("BOTTOM_CAP"); } if (foreground != null) foregroundTemplate = foreground.Get("ROW_TEMPLATE"); Action<int, int> updateBackground = (_, icons) => { var rows = Math.Max(palette.MinimumRows, (icons + palette.Columns - 1) / palette.Columns); rows = Math.Min(rows, palette.MaximumRows); if (background != null) { background.RemoveChildren(); var rowHeight = backgroundTemplate.Bounds.Height; for (var i = 0; i < rows; i++) { var row = backgroundTemplate.Clone(); row.Bounds.Y = i * rowHeight; background.AddChild(row); } if (backgroundBottom == null) return; backgroundBottom.Bounds.Y = rows * rowHeight; background.AddChild(backgroundBottom); } if (foreground != null) { foreground.RemoveChildren(); var rowHeight = foregroundTemplate.Bounds.Height; for (var i = 0; i < rows; i++) { var row = foregroundTemplate.Clone(); row.Bounds.Y = i * rowHeight; foreground.AddChild(row); } } }; palette.OnIconCountChanged += updateBackground; // Set the initial palette state updateBackground(0, 0); } var typesContainer = widget.Get("PRODUCTION_TYPES"); foreach (var i in typesContainer.Children) SetupProductionGroupButton(orderManager, i as ProductionTypeButtonWidget); var ticker = widget.Get<LogicTickerWidget>("PRODUCTION_TICKER"); ticker.OnTick = () => { if (palette.CurrentQueue == null || palette.DisplayedIconCount == 0) { // Select the first active tab foreach (var b in typesContainer.Children) { var button = b as ProductionTypeButtonWidget; if (button == null || button.IsDisabled()) continue; button.OnClick(); break; } } }; // Hook up scroll up and down buttons on the palette var scrollDown = widget.GetOrNull<ButtonWidget>("SCROLL_DOWN_BUTTON"); if (scrollDown != null) { scrollDown.OnClick = palette.ScrollDown; scrollDown.IsVisible = () => palette.TotalIconCount > (palette.MaxIconRowOffset * palette.Columns); scrollDown.IsDisabled = () => !palette.CanScrollDown; } var scrollUp = widget.GetOrNull<ButtonWidget>("SCROLL_UP_BUTTON"); if (scrollUp != null) { scrollUp.OnClick = palette.ScrollUp; scrollUp.IsVisible = () => palette.TotalIconCount > (palette.MaxIconRowOffset * palette.Columns); scrollUp.IsDisabled = () => !palette.CanScrollUp; } SetMaximumVisibleRows(palette); }
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>("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; var mapTitle = panel.Get<LabelWidget>("MAP_NAME"); if (mapTitle != null) { var font = Game.Renderer.Fonts[mapTitle.Font]; var title = new CachedTransform<MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, mapTitle.Bounds.Width, font)); mapTitle.GetText = () => title.Update(preview); } } var serverName = panel.Get<TextFieldWidget>("SERVER_NAME"); serverName.Text = Settings.SanitizedServerName(settings.Server.Name); serverName.OnEnterKey = () => { serverName.YieldKeyboardFocus(); return true; }; serverName.OnLoseFocus = () => { serverName.Text = Settings.SanitizedServerName(serverName.Text); settings.Server.Name = serverName.Text; }; 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; }
public DebugMenuLogic(Widget widget, World world) { var devTrait = world.LocalPlayer.PlayerActor.Trait<DeveloperMode>(); var shroudCheckbox = widget.GetOrNull<CheckboxWidget>("DISABLE_SHROUD"); if (shroudCheckbox != null) { shroudCheckbox.IsChecked = () => devTrait.DisableShroud; shroudCheckbox.OnClick = () => Order(world, "DevShroudDisable"); } var pathCheckbox = widget.GetOrNull<CheckboxWidget>("SHOW_UNIT_PATHS"); if (pathCheckbox != null) { pathCheckbox.IsChecked = () => devTrait.PathDebug; pathCheckbox.OnClick = () => Order(world, "DevPathDebug"); } var cashButton = widget.GetOrNull<ButtonWidget>("GIVE_CASH"); if (cashButton != null) cashButton.OnClick = () => world.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor, false)); var growResourcesButton = widget.GetOrNull<ButtonWidget>("GROW_RESOURCES"); if (growResourcesButton != null) growResourcesButton.OnClick = () => world.IssueOrder(new Order("DevGrowResources", world.LocalPlayer.PlayerActor, false)); var fastBuildCheckbox = widget.GetOrNull<CheckboxWidget>("INSTANT_BUILD"); if (fastBuildCheckbox != null) { fastBuildCheckbox.IsChecked = () => devTrait.FastBuild; fastBuildCheckbox.OnClick = () => Order(world, "DevFastBuild"); } var fastChargeCheckbox = widget.GetOrNull<CheckboxWidget>("INSTANT_CHARGE"); if (fastChargeCheckbox != null) { fastChargeCheckbox.IsChecked = () => devTrait.FastCharge; fastChargeCheckbox.OnClick = () => Order(world, "DevFastCharge"); } var showCombatCheckbox = widget.GetOrNull<CheckboxWidget>("SHOW_COMBATOVERLAY"); if (showCombatCheckbox != null) { showCombatCheckbox.IsChecked = () => devTrait.ShowCombatGeometry; showCombatCheckbox.OnClick = () => devTrait.ShowCombatGeometry ^= true; } var showGeometryCheckbox = widget.GetOrNull<CheckboxWidget>("SHOW_GEOMETRY"); if (showGeometryCheckbox != null) { showGeometryCheckbox.IsChecked = () => devTrait.ShowDebugGeometry; showGeometryCheckbox.OnClick = () => devTrait.ShowDebugGeometry ^= true; } var terrainGeometryTrait = world.WorldActor.Trait<TerrainGeometryOverlay>(); var showTerrainGeometryCheckbox = widget.GetOrNull<CheckboxWidget>("SHOW_TERRAIN_OVERLAY"); if (showTerrainGeometryCheckbox != null && terrainGeometryTrait != null) { showTerrainGeometryCheckbox.IsChecked = () => terrainGeometryTrait.Enabled; showTerrainGeometryCheckbox.OnClick = () => terrainGeometryTrait.Enabled ^= true; } var allTechCheckbox = widget.GetOrNull<CheckboxWidget>("ENABLE_TECH"); if (allTechCheckbox != null) { allTechCheckbox.IsChecked = () => devTrait.AllTech; allTechCheckbox.OnClick = () => Order(world, "DevEnableTech"); } var powerCheckbox = widget.GetOrNull<CheckboxWidget>("UNLIMITED_POWER"); if (powerCheckbox != null) { powerCheckbox.IsChecked = () => devTrait.UnlimitedPower; powerCheckbox.OnClick = () => Order(world, "DevUnlimitedPower"); } var buildAnywhereCheckbox = widget.GetOrNull<CheckboxWidget>("BUILD_ANYWHERE"); if (buildAnywhereCheckbox != null) { buildAnywhereCheckbox.IsChecked = () => devTrait.BuildAnywhere; buildAnywhereCheckbox.OnClick = () => Order(world, "DevBuildAnywhere"); } var explorationButton = widget.GetOrNull<ButtonWidget>("GIVE_EXPLORATION"); if (explorationButton != null) explorationButton.OnClick = () => world.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor, false)); var noexplorationButton = widget.GetOrNull<ButtonWidget>("RESET_EXPLORATION"); if (noexplorationButton != null) noexplorationButton.OnClick = () => world.IssueOrder(new Order("DevResetExploration", world.LocalPlayer.PlayerActor, false)); var dbgOverlay = world.WorldActor.TraitOrDefault<PathfinderDebugOverlay>(); var showAstarCostCheckbox = widget.GetOrNull<CheckboxWidget>("SHOW_ASTAR"); if (showAstarCostCheckbox != null) { showAstarCostCheckbox.IsChecked = () => dbgOverlay != null ? dbgOverlay.Visible : false; showAstarCostCheckbox.OnClick = () => { if (dbgOverlay != null) dbgOverlay.Visible ^= true; }; } }