protected SingleHotkeyBaseLogic(Widget widget, string argName, string parentName, Dictionary <string, MiniYaml> logicArgs) { var ks = Game.Settings.Keys; MiniYaml yaml; var namedKey = new NamedHotkey(); if (logicArgs.TryGetValue(argName, out yaml)) { namedKey = new NamedHotkey(yaml.Value, ks); } var keyhandler = widget.Get <LogicKeyListenerWidget>(parentName); keyhandler.AddHandler(e => { if (e.Event == KeyInputEvent.Down) { var key = Hotkey.FromKeyInput(e); if (key == namedKey.GetValue()) { return(OnHotkeyActivated(e)); } } return(false); }); }
public MapEditorLogic(Widget widget, World world, WorldRenderer worldRenderer, Dictionary <string, MiniYaml> logicArgs) { MiniYaml yaml; var changeZoomKey = new NamedHotkey(); if (logicArgs.TryGetValue("ChangeZoomKey", out yaml)) { changeZoomKey = new NamedHotkey(yaml.Value, Game.Settings.Keys); } var editorViewport = widget.Get <EditorViewportControllerWidget>("MAP_EDITOR"); var gridButton = widget.GetOrNull <ButtonWidget>("GRID_BUTTON"); var terrainGeometryTrait = world.WorldActor.Trait <TerrainGeometryOverlay>(); if (gridButton != null && terrainGeometryTrait != null) { gridButton.OnClick = () => terrainGeometryTrait.Enabled ^= true; gridButton.IsHighlighted = () => terrainGeometryTrait.Enabled; } var zoomDropdown = widget.GetOrNull <DropDownButtonWidget>("ZOOM_BUTTON"); if (zoomDropdown != null) { var selectedZoom = (Game.Settings.Graphics.PixelDouble ? 2f : 1f).ToString(); zoomDropdown.SelectedItem = selectedZoom; Func <float, ScrollItemWidget, ScrollItemWidget> setupItem = (zoom, itemTemplate) => { var item = ScrollItemWidget.Setup( itemTemplate, () => { return(float.Parse(zoomDropdown.SelectedItem) == zoom); }, () => { zoomDropdown.SelectedItem = selectedZoom = zoom.ToString(); worldRenderer.Viewport.Zoom = float.Parse(selectedZoom); }); var label = zoom.ToString(); item.Get <LabelWidget>("LABEL").GetText = () => label; return(item); }; var options = worldRenderer.Viewport.AvailableZoomSteps; zoomDropdown.OnMouseDown = _ => zoomDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem); zoomDropdown.GetText = () => zoomDropdown.SelectedItem; zoomDropdown.OnKeyPress = e => { var key = Hotkey.FromKeyInput(e); if (key != changeZoomKey.GetValue()) { return; } var selected = (options.IndexOf(float.Parse(selectedZoom)) + 1) % options.Length; var zoom = options[selected]; worldRenderer.Viewport.Zoom = zoom; selectedZoom = zoom.ToString(); zoomDropdown.SelectedItem = zoom.ToString(); }; } var copypasteButton = widget.GetOrNull <ButtonWidget>("COPYPASTE_BUTTON"); if (copypasteButton != null) { copypasteButton.OnClick = () => editorViewport.SetBrush(new EditorCopyPasteBrush(editorViewport, worldRenderer)); copypasteButton.IsHighlighted = () => editorViewport.CurrentBrush is EditorCopyPasteBrush; } var coordinateLabel = widget.GetOrNull <LabelWidget>("COORDINATE_LABEL"); if (coordinateLabel != null) { coordinateLabel.GetText = () => { var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos); var map = worldRenderer.World.Map; return(map.Height.Contains(cell) ? "{0},{1} ({2})".F(cell, map.Height[cell], map.Tiles[cell].Type) : ""); }; } var cashLabel = widget.GetOrNull <LabelWidget>("CASH_LABEL"); if (cashLabel != null) { var reslayer = worldRenderer.World.WorldActor.TraitsImplementing <EditorResourceLayer>().FirstOrDefault(); if (reslayer != null) { cashLabel.GetText = () => "$ {0}".F(reslayer.NetWorth); } } }
public MenuButtonsChromeLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs) { this.world = world; worldRoot = Ui.Root.Get("WORLD_ROOT"); menuRoot = Ui.Root.Get("MENU_ROOT"); MiniYaml yaml; var ks = Game.Settings.Keys; string[] keyNames = Enum.GetNames(typeof(ObserverStatsPanel)); var statsHotkeys = new NamedHotkey[keyNames.Length]; for (var i = 0; i < keyNames.Length; i++) { statsHotkeys[i] = logicArgs.TryGetValue("Statistics" + keyNames[i] + "Key", out yaml) ? new NamedHotkey(yaml.Value, ks) : new NamedHotkey(); } // System buttons var options = widget.GetOrNull <MenuButtonWidget>("OPTIONS_BUTTON"); if (options != null) { var blinking = false; var lp = world.LocalPlayer; options.IsDisabled = () => disableSystemButtons; options.OnClick = () => { blinking = false; OpenMenuPanel(options, new WidgetArgs() { { "activePanel", IngameInfoPanel.AutoSelect } }); }; options.IsHighlighted = () => blinking && Game.LocalTick % 50 < 25; if (lp != null) { Action <Player, bool> startBlinking = (player, inhibitAnnouncement) => { if (!inhibitAnnouncement && player == world.LocalPlayer) { blinking = true; } }; var mo = lp.PlayerActor.TraitOrDefault <MissionObjectives>(); if (mo != null) { mo.ObjectiveAdded += startBlinking; } } } var debug = widget.GetOrNull <MenuButtonWidget>("DEBUG_BUTTON"); if (debug != null) { // Can't use DeveloperMode.Enabled because there is a hardcoded hack to *always* // enable developer mode for singleplayer games, but we only want to show the button // if it has been explicitly enabled var def = world.Map.Rules.Actors["player"].TraitInfo <DeveloperModeInfo>().Enabled; var enabled = world.LobbyInfo.GlobalSettings.OptionOrDefault("cheats", def); debug.IsVisible = () => enabled; debug.IsDisabled = () => disableSystemButtons; debug.OnClick = () => OpenMenuPanel(debug, new WidgetArgs() { { "activePanel", IngameInfoPanel.Debug } }); } var stats = widget.GetOrNull <MenuButtonWidget>("OBSERVER_STATS_BUTTON"); if (stats != null) { stats.IsDisabled = () => disableSystemButtons || world.Map.Visibility.HasFlag(MapVisibility.MissionSelector); stats.OnClick = () => OpenMenuPanel(stats, new WidgetArgs() { { "activePanel", ObserverStatsPanel.Basic } }); } var keyListener = widget.GetOrNull <LogicKeyListenerWidget>("OBSERVER_KEY_LISTENER"); if (keyListener != null) { keyListener.AddHandler(e => { if (e.Event == KeyInputEvent.Down && !e.IsRepeat) { var key = Hotkey.FromKeyInput(e); for (var i = 0; i < statsHotkeys.Length; i++) { if (key == statsHotkeys[i].GetValue()) { OpenMenuPanel(stats, new WidgetArgs() { { "activePanel", i } }); return(true); } } } return(false); }); } }
public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget, Action onExit, ObserverStatsPanel activePanel, Dictionary <string, MiniYaml> logicArgs) { this.world = world; this.worldRenderer = worldRenderer; MiniYaml yaml; var ks = Game.Settings.Keys; string[] keyNames = Enum.GetNames(typeof(ObserverStatsPanel)); var statsHotkeys = new NamedHotkey[keyNames.Length]; for (var i = 0; i < keyNames.Length; i++) { statsHotkeys[i] = logicArgs.TryGetValue("Statistics" + keyNames[i] + "Key", out yaml) ? new NamedHotkey(yaml.Value, ks) : new NamedHotkey(); } players = world.Players.Where(p => !p.NonCombatant); basicStatsHeaders = widget.Get <ContainerWidget>("BASIC_STATS_HEADERS"); economyStatsHeaders = widget.Get <ContainerWidget>("ECONOMY_STATS_HEADERS"); productionStatsHeaders = widget.Get <ContainerWidget>("PRODUCTION_STATS_HEADERS"); combatStatsHeaders = widget.Get <ContainerWidget>("COMBAT_STATS_HEADERS"); earnedThisMinuteGraphHeaders = widget.Get <ContainerWidget>("EARNED_THIS_MIN_GRAPH_HEADERS"); playerStatsPanel = widget.Get <ScrollPanelWidget>("PLAYER_STATS_PANEL"); playerStatsPanel.Layout = new GridLayout(playerStatsPanel); basicPlayerTemplate = playerStatsPanel.Get <ScrollItemWidget>("BASIC_PLAYER_TEMPLATE"); economyPlayerTemplate = playerStatsPanel.Get <ScrollItemWidget>("ECONOMY_PLAYER_TEMPLATE"); productionPlayerTemplate = playerStatsPanel.Get <ScrollItemWidget>("PRODUCTION_PLAYER_TEMPLATE"); combatPlayerTemplate = playerStatsPanel.Get <ScrollItemWidget>("COMBAT_PLAYER_TEMPLATE"); earnedThisMinuteGraphTemplate = playerStatsPanel.Get <ContainerWidget>("EARNED_THIS_MIN_GRAPH_TEMPLATE"); teamTemplate = playerStatsPanel.Get <ScrollItemWidget>("TEAM_TEMPLATE"); var statsDropDown = widget.Get <DropDownButtonWidget>("STATS_DROPDOWN"); Func <string, ContainerWidget, Action, StatsDropDownOption> createStatsOption = (title, headers, a) => { return(new StatsDropDownOption { Title = title, IsSelected = () => headers.Visible, OnClick = () => { ClearStats(); statsDropDown.GetText = () => title; a(); } }); }; var statsDropDownOptions = new StatsDropDownOption[] { createStatsOption("Basic", basicStatsHeaders, () => DisplayStats(BasicStats)), createStatsOption("Economy", economyStatsHeaders, () => DisplayStats(EconomyStats)), createStatsOption("Production", productionStatsHeaders, () => DisplayStats(ProductionStats)), createStatsOption("Combat", combatStatsHeaders, () => DisplayStats(CombatStats)), createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph()) }; Func <StatsDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) => { var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); item.Get <LabelWidget>("LABEL").GetText = () => option.Title; return(item); }; statsDropDown.OnMouseDown = _ => statsDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, statsDropDownOptions, setupItem); statsDropDownOptions[(int)activePanel].OnClick(); var close = widget.GetOrNull <ButtonWidget>("CLOSE"); if (close != null) { close.OnClick = () => { Ui.CloseWindow(); Ui.Root.RemoveChild(widget); onExit(); } } ; var keyListener = statsDropDown.Get <LogicKeyListenerWidget>("STATS_DROPDOWN_KEYHANDLER"); keyListener.AddHandler(e => { if (e.Event == KeyInputEvent.Down && !e.IsRepeat) { var key = Hotkey.FromKeyInput(e); for (var i = 0; i < statsHotkeys.Length; i++) { if (key == statsHotkeys[i].GetValue()) { statsDropDownOptions[i].OnClick(); return(true); } } } return(false); }); } void ClearStats() { playerStatsPanel.Children.Clear(); basicStatsHeaders.Visible = false; economyStatsHeaders.Visible = false; productionStatsHeaders.Visible = false; combatStatsHeaders.Visible = false; earnedThisMinuteGraphHeaders.Visible = false; } void EarnedThisMinuteGraph() { earnedThisMinuteGraphHeaders.Visible = true; var template = earnedThisMinuteGraphTemplate.Clone(); var graph = template.Get <LineGraphWidget>("EARNED_THIS_MIN_GRAPH"); graph.GetSeries = () => players.Select(p => new LineGraphSeries( p.PlayerName, p.Color.RGB, (p.PlayerActor.TraitOrDefault <PlayerStatistics>() ?? new PlayerStatistics(p.PlayerActor)).EarnedSamples.Select(s => (float)s))); playerStatsPanel.AddChild(template); playerStatsPanel.ScrollToTop(); } void DisplayStats(Func <Player, ScrollItemWidget> createItem) { var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key); foreach (var t in teams) { var team = t; var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); tt.IgnoreMouseOver = true; tt.Get <LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key; playerStatsPanel.AddChild(tt); foreach (var p in team) { var player = p; playerStatsPanel.AddChild(createItem(player)); } } } ScrollItemWidget CombatStats(Player player) { combatStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player); LobbyUtils.AddPlayerFlagAndName(template, player); var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>(); if (stats == null) { return(template); } template.Get <LabelWidget>("ASSETS_DESTROYED").GetText = () => "$" + stats.KillsCost; template.Get <LabelWidget>("ASSETS_LOST").GetText = () => "$" + stats.DeathsCost; template.Get <LabelWidget>("UNITS_KILLED").GetText = () => stats.UnitsKilled.ToString(); template.Get <LabelWidget>("UNITS_DEAD").GetText = () => stats.UnitsDead.ToString(); template.Get <LabelWidget>("BUILDINGS_KILLED").GetText = () => stats.BuildingsKilled.ToString(); template.Get <LabelWidget>("BUILDINGS_DEAD").GetText = () => stats.BuildingsDead.ToString(); return(template); } ScrollItemWidget ProductionStats(Player player) { productionStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player); LobbyUtils.AddPlayerFlagAndName(template, player); template.Get <ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer = () => player; template.Get <ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player; template.IgnoreChildMouseOver = false; return(template); } ScrollItemWidget EconomyStats(Player player) { economyStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player); LobbyUtils.AddPlayerFlagAndName(template, player); var res = player.PlayerActor.Trait <PlayerResources>(); var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>(); if (stats == null) { return(template); } template.Get <LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources); template.Get <LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned); template.Get <LabelWidget>("EARNED_THIS_MIN").GetText = () => "$" + stats.EarnedThisMinute; template.Get <LabelWidget>("EARNED").GetText = () => "$" + res.Earned; template.Get <LabelWidget>("SPENT").GetText = () => "$" + res.Spent; var assets = template.Get <LabelWidget>("ASSETS"); assets.GetText = () => "$" + world.ActorsHavingTrait <Valued>() .Where(a => a.Owner == player && !a.IsDead) .Sum(a => a.Info.TraitInfos <ValuedInfo>().First().Cost); var harvesters = template.Get <LabelWidget>("HARVESTERS"); harvesters.GetText = () => world.ActorsHavingTrait <Harvester>().Count(a => a.Owner == player && !a.IsDead).ToString(); return(template); } ScrollItemWidget BasicStats(Player player) { basicStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player); LobbyUtils.AddPlayerFlagAndName(template, player); var res = player.PlayerActor.Trait <PlayerResources>(); template.Get <LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources); template.Get <LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned); var powerRes = player.PlayerActor.Trait <PowerManager>(); var power = template.Get <LabelWidget>("POWER"); power.GetText = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided; power.GetColor = () => GetPowerColor(powerRes.PowerState); var stats = player.PlayerActor.TraitOrDefault <PlayerStatistics>(); if (stats == null) { return(template); } template.Get <LabelWidget>("KILLS").GetText = () => (stats.UnitsKilled + stats.BuildingsKilled).ToString(); template.Get <LabelWidget>("DEATHS").GetText = () => (stats.UnitsDead + stats.BuildingsDead).ToString(); template.Get <LabelWidget>("ASSETS_DESTROYED").GetText = () => "$" + stats.KillsCost; template.Get <LabelWidget>("ASSETS_LOST").GetText = () => "$" + stats.DeathsCost; template.Get <LabelWidget>("EXPERIENCE").GetText = () => stats.Experience.ToString(); template.Get <LabelWidget>("ACTIONS_MIN").GetText = () => AverageOrdersPerMinute(stats.OrderCount); return(template); } ScrollItemWidget SetupPlayerScrollItemWidget(ScrollItemWidget template, Player player) { return(ScrollItemWidget.Setup(template, () => false, () => { var playerBase = world.ActorsHavingTrait <BaseBuilding>().FirstOrDefault(a => !a.IsDead && a.Owner == player); if (playerBase != null) { worldRenderer.Viewport.Center(playerBase.CenterPosition); } })); }
public MusicHotkeyLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs) { musicPlaylist = world.WorldActor.Trait <MusicPlaylist>(); var ks = Game.Settings.Keys; MiniYaml yaml; var stopKey = new NamedHotkey(); if (logicArgs.TryGetValue("StopMusicKey", out yaml)) { stopKey = new NamedHotkey(yaml.Value, ks); } var pauseKey = new NamedHotkey(); if (logicArgs.TryGetValue("PauseMusicKey", out yaml)) { pauseKey = new NamedHotkey(yaml.Value, ks); } var prevKey = new NamedHotkey(); if (logicArgs.TryGetValue("PrevMusicKey", out yaml)) { prevKey = new NamedHotkey(yaml.Value, ks); } var nextKey = new NamedHotkey(); if (logicArgs.TryGetValue("NextMusicKey", out yaml)) { nextKey = new NamedHotkey(yaml.Value, ks); } var keyhandler = widget.Get <LogicKeyListenerWidget>("GLOBAL_KEYHANDLER"); keyhandler.AddHandler(e => { if (e.Event == KeyInputEvent.Down) { var key = Hotkey.FromKeyInput(e); if (key == nextKey.GetValue()) { musicPlaylist.Play(musicPlaylist.GetNextSong()); } else if (key == prevKey.GetValue()) { musicPlaylist.Play(musicPlaylist.GetPrevSong()); } else if (key == stopKey.GetValue()) { StopMusic(); } else if (key == pauseKey.GetValue()) { PauseOrResumeMusic(); } } return(false); }); }
public ObserverShroudSelectorLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs) { MiniYaml yaml; var ks = Game.Settings.Keys; if (logicArgs.TryGetValue("CombinedViewKey", out yaml)) { combinedViewKey = new NamedHotkey(yaml.Value, ks); } if (logicArgs.TryGetValue("WorldViewKey", out yaml)) { worldViewKey = new NamedHotkey(yaml.Value, ks); } limitViews = world.Map.Visibility.HasFlag(MapVisibility.MissionSelector); var groups = new Dictionary <string, IEnumerable <CameraOption> >(); combined = new CameraOption(this, world, "All Players", world.Players.First(p => p.InternalName == "Everyone")); disableShroud = new CameraOption(this, world, "Disable Shroud", null); if (!limitViews) { groups.Add("Other", new List <CameraOption>() { combined, disableShroud }); } teams = world.Players.Where(p => !p.NonCombatant && p.Playable) .Select(p => new CameraOption(this, p)) .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.Player.ClientIndex) ?? new Session.Client()).Team) .OrderBy(g => g.Key); var noTeams = teams.Count() == 1; foreach (var t in teams) { var label = noTeams ? "Players" : t.Key == 0 ? "No Team" : "Team {0}".F(t.Key); groups.Add(label, t); } var shroudSelector = widget.Get <DropDownButtonWidget>("SHROUD_SELECTOR"); shroudSelector.OnMouseDown = _ => { Func <CameraOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) => { var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); var showFlag = option.Faction != null; var label = item.Get <LabelWidget>("LABEL"); label.IsVisible = () => showFlag; label.GetText = () => option.Label; label.GetColor = () => option.Color; var flag = item.Get <ImageWidget>("FLAG"); flag.IsVisible = () => showFlag; flag.GetImageCollection = () => "flags"; flag.GetImageName = () => option.Faction; var labelAlt = item.Get <LabelWidget>("NOFLAG_LABEL"); labelAlt.IsVisible = () => !showFlag; labelAlt.GetText = () => option.Label; labelAlt.GetColor = () => option.Color; return(item); }; shroudSelector.ShowDropDown("SPECTATOR_DROPDOWN_TEMPLATE", 400, groups, setupItem); }; var shroudLabel = shroudSelector.Get <LabelWidget>("LABEL"); shroudLabel.IsVisible = () => selected.Faction != null; shroudLabel.GetText = () => selected.Label; shroudLabel.GetColor = () => selected.Color; var shroudFlag = shroudSelector.Get <ImageWidget>("FLAG"); shroudFlag.IsVisible = () => selected.Faction != null; shroudFlag.GetImageCollection = () => "flags"; shroudFlag.GetImageName = () => selected.Faction; var shroudLabelAlt = shroudSelector.Get <LabelWidget>("NOFLAG_LABEL"); shroudLabelAlt.IsVisible = () => selected.Faction == null; shroudLabelAlt.GetText = () => selected.Label; shroudLabelAlt.GetColor = () => selected.Color; var keyhandler = shroudSelector.Get <LogicKeyListenerWidget>("SHROUD_KEYHANDLER"); keyhandler.AddHandler(HandleKeyPress); selected = limitViews ? groups.First().Value.First() : world.WorldActor.Owner.Shroud.ExploreMapEnabled ? combined : disableShroud; selected.OnClick(); }