diff --git a/.gitignore b/.gitignore
index b6069737a3..2042aa7c8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,6 +62,7 @@ OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.mode1v3
DOCUMENTATION.md
Lua-API.md
*.html
+openra.6
# StyleCop
*.Cache
diff --git a/Makefile b/Makefile
index b1ec5246e8..e6bc54600c 100644
--- a/Makefile
+++ b/Makefile
@@ -58,6 +58,7 @@ endif
prefix ?= /usr/local
datarootdir ?= $(prefix)/share
datadir ?= $(datarootdir)
+mandir ?= $(datarootdir)/man/
bindir ?= $(prefix)/bin
libdir ?= $(prefix)/lib
gameinstalldir ?= $(libdir)/openra
@@ -320,6 +321,9 @@ docs: utility mods version
@mono --debug OpenRA.Utility.exe all --docs > DOCUMENTATION.md
@mono --debug OpenRA.Utility.exe ra --lua-docs > Lua-API.md
+man-page: utility mods
+ @mono --debug OpenRA.Utility.exe all --man-page > openra.6
+
install: install-core
install-all: install-core install-tools
@@ -389,6 +393,10 @@ install-linux-appdata:
@$(INSTALL_DIR) "$(DESTDIR)$(datadir)/appdata/"
@$(INSTALL_DATA) packaging/linux/openra.appdata.xml "$(DESTDIR)$(datadir)/appdata/"
+install-man-page: man-page
+ @$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man6/"
+ @$(INSTALL_DATA) openra.6 "$(DESTDIR)$(mandir)/man6/"
+
install-linux-scripts:
@echo "#!/bin/sh" > openra
@echo 'cd "$(gameinstalldir)"' >> openra
@@ -419,6 +427,7 @@ uninstall:
@-$(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/128x128/apps/openra.png"
@-$(RM_F) "$(DESTDIR)$(datadir)/mime/packages/openra.xml"
@-$(RM_F) "$(DESTDIR)$(datadir)/appdata/openra.appdata.xml"
+ @-$(RM_F) "$(DESTDIR)$(mandir)/man6/openra.6"
help:
@echo to compile, run:
diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj
index ea74fbb26a..f0e91d291e 100644
--- a/OpenRA.Game/OpenRA.Game.csproj
+++ b/OpenRA.Game/OpenRA.Game.csproj
@@ -164,6 +164,7 @@
+
diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs
index 1e4c66c6ee..297f93b2c6 100644
--- a/OpenRA.Game/Settings.cs
+++ b/OpenRA.Game/Settings.cs
@@ -23,24 +23,55 @@ namespace OpenRA
public class ServerSettings
{
+ [Desc("Sets the server name.")]
public string Name = "OpenRA Game";
+
+ [Desc("Sets the internal port.")]
public int ListenPort = 1234;
+
+ [Desc("Sets the port advertised to the master server.")]
public int ExternalPort = 1234;
+
+ [Desc("Reports the game to the master server list.")]
public bool AdvertiseOnline = true;
+
+ [Desc("Locks the game with a password.")]
public string Password = "";
+
public string MasterServer = "http://master.openra.net/";
- public bool DiscoverNatDevices = false; // Allow users to disable NAT discovery if problems occur
- public bool AllowPortForward = true; // let the user disable it even if compatible devices are found
+
+ [Desc("Allow users to enable NAT discovery for external IP detection and automatic port forwarding.")]
+ public bool DiscoverNatDevices = false;
+
+ [Desc("Set this to false to disable UPnP even if compatible devices are found.")]
+ public bool AllowPortForward = true;
+
public bool NatDeviceAvailable = false; // internal check if discovery succeeded
- public int NatDiscoveryTimeout = 1000; // ms to search for UPnP enabled NATs
- public bool VerboseNatDiscovery = false; // print very detailed logs for debugging
+
+ [Desc("Time in miliseconds to search for UPnP enabled NAT devices.")]
+ public int NatDiscoveryTimeout = 1000;
+
+ [Desc("Print very detailed logs for debugging issues with routers.")]
+ public bool VerboseNatDiscovery = false;
+
+ [Desc("Starts the game with a default map. Input as hash that can be obtained by the utility.")]
public string Map = null;
+
+ [Desc("Takes a comma separated list of IP addresses that are not allowed to join.")]
public string[] Ban = { };
+
+ [Desc("Value in miliseconds when to terminate the game. Needs to be at least 10000 (10 s) to enable the timer.")]
public int TimeOut = 0;
+
+ [Desc("Run in headless mode with an empty renderer and without sound output.")]
public bool Dedicated = false;
+
+ [Desc("Automatically restart when a game ends. Disable this when something else already takes care about it.")]
public bool DedicatedLoop = true;
+
+ [Desc("Disallow AI bots.")]
public bool LockBots = false;
- public bool AllowVersionMismatch = false;
+
public string TimestampFormat = "HH:mm";
public ServerSettings() { }
@@ -64,7 +95,6 @@ namespace OpenRA
Dedicated = other.Dedicated;
DedicatedLoop = other.DedicatedLoop;
LockBots = other.LockBots;
- AllowVersionMismatch = other.AllowVersionMismatch;
}
}
@@ -124,6 +154,7 @@ namespace OpenRA
public class GameSettings
{
+ [Desc("Load a specific mod on startup. Shipped ones include: ra, cnc and d2k")]
public string Mod = "modchooser";
public string PreviousMod = "ra";
diff --git a/OpenRA.Game/Support/LaunchArguments.cs b/OpenRA.Game/Support/LaunchArguments.cs
new file mode 100644
index 0000000000..16c5cae8e3
--- /dev/null
+++ b/OpenRA.Game/Support/LaunchArguments.cs
@@ -0,0 +1,44 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2015 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
+
+namespace OpenRA
+{
+ public class LaunchArguments
+ {
+ [Desc("Connect to the following server given as IP:PORT on startup.")]
+ public string Connect;
+
+ [Desc("Connect to the unified resource identifier openra://IP:PORT on startup.")]
+ public string URI;
+
+ [Desc("Automatically start playing the given replay file.")]
+ public string Replay;
+
+ public LaunchArguments(Arguments args)
+ {
+ foreach (var f in this.GetType().GetFields())
+ if (args.Contains("Launch" + "." + f.Name))
+ FieldLoader.LoadField(this, f.Name, args.GetValue("Launch" + "." + f.Name, ""));
+ }
+
+ public string GetConnectAddress()
+ {
+ var connect = string.Empty;
+
+ if (!string.IsNullOrEmpty(Connect))
+ connect = Connect;
+
+ if (!string.IsNullOrEmpty(URI))
+ connect = URI.Replace("openra://", "").TrimEnd('/');
+
+ return connect;
+ }
+ }
+}
diff --git a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs
index 7de5e8f276..f356025ac8 100644
--- a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs
+++ b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs
@@ -20,6 +20,8 @@ namespace OpenRA.Mods.Common.LoadScreens
{
public class BlankLoadScreen : ILoadScreen
{
+ public LaunchArguments Launch;
+
public virtual void Init(Manifest m, Dictionary info) { }
public virtual void Display()
@@ -34,6 +36,7 @@ namespace OpenRA.Mods.Common.LoadScreens
public void StartGame(Arguments args)
{
+ Launch = new LaunchArguments(args);
Ui.ResetAll();
Game.Settings.Save();
@@ -62,23 +65,7 @@ namespace OpenRA.Mods.Common.LoadScreens
}
// Join a server directly
- var connect = string.Empty;
- if (args != null)
- {
- if (args.Contains("Launch.Connect"))
- connect = args.GetValue("Launch.Connect", null);
-
- if (args.Contains("Launch.URI"))
- {
- connect = args.GetValue("Launch.URI", null);
- if (connect != null)
- {
- connect = connect.Replace("openra://", "");
- connect = connect.TrimEnd('/');
- }
- }
- }
-
+ var connect = Launch.GetConnectAddress();
if (!string.IsNullOrEmpty(connect))
{
var parts = connect.Split(':');
@@ -94,12 +81,11 @@ namespace OpenRA.Mods.Common.LoadScreens
}
// Load a replay directly
- var replayFilename = args != null ? args.GetValue("Launch.Replay", null) : null;
- if (!string.IsNullOrEmpty(replayFilename))
+ if (!string.IsNullOrEmpty(Launch.Replay))
{
- var replayMeta = ReplayMetadata.Read(replayFilename);
+ var replayMeta = ReplayMetadata.Read(Launch.Replay);
if (ReplayUtils.PromptConfirmReplayCompatibility(replayMeta, Game.LoadShellMap))
- Game.JoinReplay(replayFilename);
+ Game.JoinReplay(Launch.Replay);
if (replayMeta != null)
{
diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index 687d3c95b4..564ab510c2 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -529,6 +529,7 @@
+
diff --git a/OpenRA.Mods.Common/UtilityCommands/CreateManPage.cs b/OpenRA.Mods.Common/UtilityCommands/CreateManPage.cs
new file mode 100644
index 0000000000..6f8a6090b2
--- /dev/null
+++ b/OpenRA.Mods.Common/UtilityCommands/CreateManPage.cs
@@ -0,0 +1,68 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2015 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 System.Linq;
+
+namespace OpenRA.Mods.Common.UtilityCommands
+{
+ class CreateManPage : IUtilityCommand
+ {
+ public string Name { get { return "--man-page"; } }
+
+ [Desc("Create a man page in troff format.")]
+ public void Run(ModData modData, string[] args)
+ {
+ Console.WriteLine(".TH OPENRA 6");
+ Console.WriteLine(".SH NAME");
+ Console.WriteLine("openra \\- An Open Source modernization of the early 2D Command & Conquer games.");
+ Console.WriteLine(".SH SYNOPSIS");
+ Console.WriteLine(".B openra");
+ Console.WriteLine("[\\fB\\Game.Mod=\\fR\\fImodchooser\\fR]");
+ Console.WriteLine(".SH DESCRIPTION");
+ Console.WriteLine(".B openra");
+ Console.WriteLine("starts the game.");
+ Console.WriteLine(".SH OPTIONS");
+
+ var sections = Game.Settings.Sections;
+ sections.Add("Launch", new LaunchArguments(new Arguments(new string[0])));
+ foreach (var section in sections.OrderBy(s => s.Key))
+ {
+ var fields = section.Value.GetType().GetFields();
+ foreach (var field in fields)
+ {
+ if (!field.HasAttribute())
+ continue;
+
+ Console.WriteLine(".TP");
+
+ Console.Write(".BR {0}.{1}=".F(section.Key, field.Name));
+ var value = field.GetValue(section.Value);
+ if (value != null && !value.ToString().StartsWith("System."))
+ Console.WriteLine("\\fI{0}\\fR".F(value));
+ else
+ Console.WriteLine();
+
+ var lines = field.GetCustomAttributes(false).SelectMany(d => d.Lines);
+ foreach (var line in lines)
+ Console.WriteLine(line);
+ }
+ }
+
+ Console.WriteLine(".SH FILES");
+ Console.WriteLine("Settings are stored in the ~/.openra user folder.");
+ Console.WriteLine(".SH BUGS");
+ Console.WriteLine("Known issues are tracked at http://bugs.openra.net");
+ Console.WriteLine(".SH COPYRIGHT");
+ Console.WriteLine("Copyright 2007-2015 The OpenRA Developers (see AUTHORS)");
+ Console.WriteLine("This manual is part of OpenRA, which is free software. It is GNU GPL v3 licensed. See COPYING for details.");
+ }
+ }
+}
diff --git a/packaging/linux/buildpackage.sh b/packaging/linux/buildpackage.sh
index c26f43b7b3..38908d459b 100755
--- a/packaging/linux/buildpackage.sh
+++ b/packaging/linux/buildpackage.sh
@@ -24,6 +24,7 @@ make install-all prefix="/usr" DESTDIR="$PWD/packaging/linux/$ROOTDIR"
make install-linux-shortcuts prefix="/usr" DESTDIR="$PWD/packaging/linux/$ROOTDIR"
make install-linux-mime prefix="/usr" DESTDIR="$PWD/packaging/linux/$ROOTDIR"
make install-linux-appdata prefix="/usr" DESTDIR="$PWD/packaging/linux/$ROOTDIR"
+make install-man-page prefix="/usr" DESTDIR="$PWD/packaging/linux/$ROOTDIR"
# Documentation
mkdir -p $PWD/packaging/linux/$ROOTDIR/usr/share/doc/openra/