diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
index b22fb2e5f3..e684a7b905 100644
--- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
+++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
@@ -84,6 +84,7 @@
+
diff --git a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs
index 7ee6de97a6..9ddea0750a 100755
--- a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs
+++ b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs
@@ -103,7 +103,7 @@ namespace OpenRA.Mods.Cnc.Widgets
var doNothing = (Action)(() => {});
menu.GetWidget("QUIT_BUTTON").OnClick = () =>
- PromptConfirmAction("Exit Game", "Are you sure you want to leave the game?", onQuit, doNothing);
+ PromptConfirmAction("Quit", "Are you sure you want to quit?", onQuit, doNothing);
var onSurrender = (Action)(() => world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)));
var surrenderButton = menu.GetWidget("SURRENDER_BUTTON");
@@ -120,7 +120,14 @@ namespace OpenRA.Mods.Cnc.Widgets
});
};
- menu.GetWidget("PREFERENCES_BUTTON").IsDisabled = () => true;
+ menu.GetWidget("PREFERENCES_BUTTON").OnClick = () =>
+ {
+ hideButtons = true;
+ Widget.OpenWindow("SETTINGS_PANEL", new Dictionary()
+ {
+ { "onExit", new Action(() => hideButtons = false) },
+ });
+ };
menu.GetWidget("RESUME_BUTTON").OnClick = () =>
{
diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs
index 35b7528104..2d1d0d1a07 100755
--- a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs
+++ b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs
@@ -19,6 +19,7 @@ using System.Drawing;
using System.Linq;
using OpenRA.GameRules;
using OpenRA.Mods.RA;
+using OpenRA.Support;
namespace OpenRA.Mods.Cnc.Widgets
{
@@ -117,7 +118,14 @@ namespace OpenRA.Mods.Cnc.Widgets
});
};
- settingsMenu.GetWidget("PREFERENCES_BUTTON").IsDisabled = () => true;
+ settingsMenu.GetWidget("PREFERENCES_BUTTON").OnClick = () =>
+ {
+ Menu = MenuType.None;
+ Widget.OpenWindow("SETTINGS_PANEL", new Dictionary()
+ {
+ { "onExit", new Action(() => ReturnToMenu(MenuType.Settings)) },
+ });
+ };
settingsMenu.GetWidget("BACK_BUTTON").OnClick = () => Menu = MenuType.Main;
}
diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs
new file mode 100755
index 0000000000..6240ee50bf
--- /dev/null
+++ b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs
@@ -0,0 +1,149 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using OpenRA.FileFormats.Graphics;
+using OpenRA.GameRules;
+using OpenRA.Widgets;
+
+namespace OpenRA.Mods.Cnc.Widgets
+{
+ public class CncSettingsLogic : IWidgetDelegate
+ {
+ Widget bg;
+
+ [ObjectCreator.UseCtor]
+ public CncSettingsLogic([ObjectCreator.Param] Widget widget,
+ [ObjectCreator.Param] Action onExit)
+ {
+ bg = widget.GetWidget("SETTINGS_PANEL");
+ var tabs = bg.GetWidget("TAB_CONTAINER");
+
+ //Tabs
+ tabs.GetWidget("GENERAL").OnMouseUp = mi => FlipToTab("GENERAL_PANE");
+ tabs.GetWidget("AUDIO").OnMouseUp = mi => FlipToTab("AUDIO_PANE");
+ tabs.GetWidget("DISPLAY").OnMouseUp = mi => FlipToTab("DISPLAY_PANE");
+ tabs.GetWidget("DEBUG").OnMouseUp = mi => FlipToTab("DEBUG_PANE");
+ FlipToTab("GENERAL_PANE");
+
+ //General
+ var general = bg.GetWidget("GENERAL_PANE");
+
+ var name = general.GetWidget("NAME");
+ name.Text = Game.Settings.Player.Name;
+ name.OnLoseFocus = () =>
+ {
+ name.Text = name.Text.Trim();
+
+ if (name.Text.Length == 0)
+ name.Text = Game.Settings.Player.Name;
+ else
+ Game.Settings.Player.Name = name.Text;
+ };
+ name.OnEnterKey = () => { name.LoseFocus(); return true; };
+
+ general.GetWidget("EDGE_SCROLL").Bind(Game.Settings.Game, "ViewportEdgeScroll");
+
+ // Added scroll sensitivity - Gecko
+ var edgeScrollSlider = general.GetWidget("EDGE_SCROLL_AMOUNT");
+ if (edgeScrollSlider != null) // Backwards compatible - Gecko
+ {
+ edgeScrollSlider.SetOffset(Game.Settings.Game.ViewportEdgeScrollStep);
+ edgeScrollSlider.OnChange += _ => { Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); };
+ Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset();
+ }
+
+ general.GetWidget("INVERSE_SCROLL").Bind(Game.Settings.Game, "InverseDragScroll");
+ general.GetWidget("TEAMCHAT_TOGGLE").Bind(Game.Settings.Game, "TeamChatToggle");
+
+
+ // Audio
+ var audio = bg.GetWidget("AUDIO_PANE");
+
+ var soundslider = audio.GetWidget("SOUND_VOLUME");
+ soundslider.OnChange += x => { Sound.SoundVolume = x; };
+ soundslider.GetOffset = () => { return Sound.SoundVolume; };
+ soundslider.SetOffset(Sound.SoundVolume);
+
+ var musicslider = audio.GetWidget("MUSIC_VOLUME");
+ musicslider.OnChange += x => { Sound.MusicVolume = x; };
+ musicslider.GetOffset = () => { return Sound.MusicVolume; };
+ musicslider.SetOffset(Sound.MusicVolume);
+
+
+ // Display
+ var display = bg.GetWidget("DISPLAY_PANE");
+ display.GetWidget("FULLSCREEN_CHECKBOX").Bind(Game.Settings.Game, "TeamChatToggle");
+
+ var fullscreen = display.GetWidget("FULLSCREEN_CHECKBOX");
+ fullscreen.IsChecked = () => Game.Settings.Graphics.Mode != WindowMode.Windowed;
+ fullscreen.OnChange += c => Game.Settings.Graphics.Mode = (Game.Settings.Graphics.Mode == WindowMode.Windowed) ? WindowMode.PseudoFullscreen : WindowMode.Windowed;
+
+ var width = display.GetWidget("SCREEN_WIDTH");
+ Game.Settings.Graphics.WindowedSize.X = (Game.Settings.Graphics.WindowedSize.X < Game.Settings.Graphics.MinResolution.X)?
+ Game.Settings.Graphics.MinResolution.X : Game.Settings.Graphics.WindowedSize.X;
+ width.Text = Game.Settings.Graphics.WindowedSize.X.ToString();
+ width.OnLoseFocus = () =>
+ {
+ try {
+ var w = int.Parse(width.Text);
+ if (w > Game.Settings.Graphics.MinResolution.X)
+ Game.Settings.Graphics.WindowedSize = new int2(w, Game.Settings.Graphics.WindowedSize.Y);
+ }
+ catch (FormatException) {
+ width.Text = Game.Settings.Graphics.WindowedSize.X.ToString();
+ }
+ };
+ width.OnEnterKey = () => { width.LoseFocus(); return true; };
+
+ var height = display.GetWidget("SCREEN_HEIGHT");
+ Game.Settings.Graphics.WindowedSize.Y = (Game.Settings.Graphics.WindowedSize.Y < Game.Settings.Graphics.MinResolution.Y)?
+ Game.Settings.Graphics.MinResolution.Y : Game.Settings.Graphics.WindowedSize.Y;
+ height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString();
+ height.OnLoseFocus = () =>
+ {
+ try {
+ var h = int.Parse(height.Text);
+ if (h > Game.Settings.Graphics.MinResolution.Y)
+ Game.Settings.Graphics.WindowedSize = new int2(Game.Settings.Graphics.WindowedSize.X, h);
+ else
+ height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString();
+ }
+ catch (FormatException) {
+ height.Text = Game.Settings.Graphics.WindowedSize.Y.ToString();
+ }
+ };
+ height.OnEnterKey = () => { height.LoseFocus(); return true; };
+
+ // Debug
+ var debug = bg.GetWidget("DEBUG_PANE");
+ debug.GetWidget("PERFDEBUG_CHECKBOX").Bind(Game.Settings.Debug, "PerfGraph");
+ debug.GetWidget("GAMETIME_CHECKBOX").Bind(Game.Settings.Game, "MatchTimer");
+ debug.GetWidget("CHECKUNSYNCED_CHECKBOX").Bind(Game.Settings.Debug, "SanityCheckUnsyncedCode");
+
+ bg.GetWidget("BUTTON_CLOSE").OnClick = () => {
+ Game.Settings.Save();
+ Widget.CloseWindow();
+ onExit();
+ };
+ }
+
+ string open = null;
+ bool FlipToTab(string id)
+ {
+ if (open != null)
+ bg.GetWidget(open).Visible = false;
+
+ open = id;
+ bg.GetWidget(open).Visible = true;
+ return true;
+ }
+ }
+}
diff --git a/mods/cnc/chrome/ingamemenu.yaml b/mods/cnc/chrome/ingamemenu.yaml
index 9f70a84c83..33834660dc 100644
--- a/mods/cnc/chrome/ingamemenu.yaml
+++ b/mods/cnc/chrome/ingamemenu.yaml
@@ -32,7 +32,7 @@ Container@INGAME_MENU:
Y:0
Width:140
Height:35
- Text:Exit Game
+ Text:Quit
CncMenuButton@SURRENDER_BUTTON:
Id:SURRENDER_BUTTON
X:150
diff --git a/mods/cnc/chrome/preferences.yaml b/mods/cnc/chrome/preferences.yaml
new file mode 100644
index 0000000000..04e7b8922a
--- /dev/null
+++ b/mods/cnc/chrome/preferences.yaml
@@ -0,0 +1,226 @@
+Background@SETTINGS_PANEL:
+ Id:SETTINGS_PANEL
+ Delegate:CncSettingsLogic
+ X:(WINDOW_RIGHT - WIDTH)/2
+ Y:(WINDOW_BOTTOM- HEIGHT)/2
+ Width: 450
+ Height: 350
+ Children:
+ Label@SETTINGS_LABEL_TITLE:
+ Id:SETTINGS_LABEL_TITLE
+ X:0
+ Y:20
+ Width:450
+ Height:25
+ Text:Settings
+ Align:Center
+ Bold:True
+ CncMenuButton@BUTTON_CLOSE:
+ Id:BUTTON_CLOSE
+ X:PARENT_RIGHT - 180
+ Y:PARENT_BOTTOM - 45
+ Width:160
+ Height:25
+ Text:Close
+ Bold:True
+ Container@TAB_CONTAINER:
+ Id:TAB_CONTAINER
+ X:0
+ Y:50
+ Width:PARENT_RIGHT
+ Height:25
+ Children:
+ Button@GENERAL:
+ Id:GENERAL
+ X:45
+ Y:0
+ Width:90
+ Height:25
+ Text:General
+ Bold:True
+ Button@AUDIO:
+ Id:AUDIO
+ X:135
+ Y:0
+ Width:90
+ Height:25
+ Text:Audio
+ Bold:True
+ Button@DISPLAY:
+ Id:DISPLAY
+ X:225
+ Y:0
+ Width:90
+ Height:25
+ Text:Display
+ Bold:True
+ Button@DEBUG:
+ Id:DEBUG
+ X:315
+ Y:0
+ Width:90
+ Height:25
+ Text:Debug
+ Bold:True
+ Container@GENERAL_PANE:
+ Id:GENERAL_PANE
+ X:37
+ Y:100
+ Width:PARENT_RIGHT - 37
+ Height:PARENT_BOTTOM - 100
+ Visible: true
+ Children:
+ Label@SETTINGS_PLAYER_NAME:
+ Id:SETTINGS_PLAYER_NAME
+ X:0
+ Y:10
+ Text: Player Name:
+ TextField@NAME:
+ Id:NAME
+ Text:Name
+ Width:139
+ Height:25
+ X:90
+ Y:0
+ MaxLength:16
+ Checkbox@EDGE_SCROLL:
+ Id:EDGE_SCROLL
+ X:0
+ Y:30
+ Width:200
+ Height:20
+ Text: Enable Edge Scrolling
+ Label@EDGE_SCROLL_AMOUNT_LABEL:
+ Id:EDGE_SCROLL_AMOUNT_LABEL
+ X:0
+ Y:70
+ Text: Scroll Speed
+ Slider@EDGE_SCROLL_AMOUNT:
+ Id:EDGE_SCROLL_AMOUNT
+ X:130
+ Y:60
+ Width:250
+ Height:20
+ Ticks:5
+ Range:10,50
+ Checkbox@INVERSE_SCROLL:
+ Id:INVERSE_SCROLL
+ X:0
+ Y:90
+ Width:200
+ Height:20
+ Text: Invert Mouse Drag Scrolling
+ Checkbox@TEAMCHAT_TOGGLE:
+ Id:TEAMCHAT_TOGGLE
+ X:0
+ Y:120
+ Width:200
+ Height:20
+ Text: Shift-Enter Toggles Team Chat
+ Container@AUDIO_PANE:
+ Id:AUDIO_PANE
+ X:37
+ Y:100
+ Width:PARENT_RIGHT - 37
+ Height:PARENT_BOTTOM - 100
+ Visible: false
+ Children:
+ Label@SOUND_VOLUME_LABEL:
+ Id:SOUND_VOLUME_LABEL
+ X:0
+ Y:10
+ Text: Sound Volume
+ Slider@SOUND_VOLUME:
+ Id:SOUND_VOLUME
+ X:100
+ Y:0
+ Width:250
+ Height:20
+ Ticks:5
+ Label@MUSIC_VOLUME_LABEL:
+ Id:MUSIC_VOLUME_LABEL
+ X:0
+ Y:40
+ Text: Music Volume
+ Slider@MUSIC_VOLUME:
+ Id:MUSIC_VOLUME
+ X:100
+ Y:30
+ Width:250
+ Height:20
+ Ticks:5
+ Container@DISPLAY_PANE:
+ Id:DISPLAY_PANE
+ X:37
+ Y:100
+ Width:PARENT_RIGHT - 37
+ Height:PARENT_BOTTOM - 100
+ Visible: false
+ Children:
+ Checkbox@FULLSCREEN_CHECKBOX:
+ Id:FULLSCREEN_CHECKBOX
+ X:0
+ Y:0
+ Width:300
+ Height:20
+ Text:Fullscreen
+ Label@RESOLUTION_LABEL:
+ Id:RESOLUTION_LABEL
+ X:0
+ Y:50
+ Text: Window Resolution:
+ TextField@SCREEN_WIDTH:
+ Id:SCREEN_WIDTH
+ Text:Width
+ Width:50
+ Height:25
+ X:130
+ Y:40
+ MaxLength:5
+ Label@X:
+ Id:X
+ Text:x
+ X:185
+ Y:50
+ TextField@SCREEN_HEIGHT:
+ Id:SCREEN_HEIGHT
+ Text:Height
+ Width:50
+ Height:25
+ X:195
+ Y:40
+ MaxLength:5
+ Label@RESTART:
+ Id:RESTART
+ Text: Restart Game To Apply Changes
+ X:0
+ Y:PARENT_BOTTOM - 30
+ Container@DEBUG_PANE:
+ Id:DEBUG_PANE
+ X:37
+ Y:100
+ Width:PARENT_RIGHT - 37
+ Height:PARENT_BOTTOM - 100
+ Visible: false
+ Children:
+ Checkbox@PERFDEBUG_CHECKBOX:
+ Id:PERFDEBUG_CHECKBOX
+ X:0
+ Y:0
+ Width:300
+ Height:20
+ Text:Show Performance Information
+ Checkbox@GAMETIME_CHECKBOX:
+ Id:GAMETIME_CHECKBOX
+ X:0
+ Y:30
+ Width:300
+ Height:20
+ Text:Show Game Time Counter
+ Checkbox@CHECKUNSYNCED_CHECKBOX:
+ Id:CHECKUNSYNCED_CHECKBOX
+ X:0
+ Y:60
+ Width:300
+ Height:20
+ Text:Check Sync around Unsynced Code
diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml
index 64000646d5..7b6b7568c5 100644
--- a/mods/cnc/mod.yaml
+++ b/mods/cnc/mod.yaml
@@ -74,6 +74,7 @@ ChromeLayout:
mods/cnc/chrome/ingamemenu.yaml
mods/cnc/chrome/music.yaml
mods/cnc/chrome/modchooser.yaml
+ mods/cnc/chrome/preferences.yaml
Weapons:
mods/cnc/weapons.yaml