diff --git a/binaries/data/mods/public/gui/common/functions_utility.js b/binaries/data/mods/public/gui/common/functions_utility.js
index 392848dc62..2af05fea6e 100644
--- a/binaries/data/mods/public/gui/common/functions_utility.js
+++ b/binaries/data/mods/public/gui/common/functions_utility.js
@@ -141,6 +141,16 @@ function sanitizePlayerName(name, stripUnicode, stripSpaces)
return sanitizedName.substr(0,20);
}
+function singleplayerName()
+{
+ return Engine.ConfigDB_GetValue("user", "playername.singleplayer") || Engine.GetSystemUsername();
+}
+
+function multiplayerName()
+{
+ return Engine.ConfigDB_GetValue("user", "playername.multiplayer") || Engine.GetSystemUsername();
+}
+
function tryAutoComplete(text, autoCompleteList)
{
if (!text.length)
diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js
index d9d4a8f861..e1b7b7cd13 100644
--- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js
+++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js
@@ -226,6 +226,13 @@ function init(attribs)
g_IsController = attribs.type != "client";
g_ServerName = attribs.serverName || undefined;
+ // Replace empty playername when entering a singleplayermatch for the first time
+ if (!g_IsNetworked)
+ {
+ Engine.ConfigDB_CreateValue("user", "playername.singleplayer", singleplayerName());
+ Engine.ConfigDB_WriteValueToFile("user", "playername.singleplayer", singleplayerName(), "config/user.cfg");
+ }
+
// Get default player data - remove gaia
g_DefaultPlayerData = g_Settings.PlayerDefaults;
g_DefaultPlayerData.shift();
@@ -1165,7 +1172,8 @@ function selectMap(name)
// Reset player assignments on map change
if (!g_IsNetworked)
- g_PlayerAssignments = { "local": { "name": translate("You"), "player": 1, "civ": "", "team": -1, "ready": 0 } };
+ g_PlayerAssignments = { "local": { "name": singleplayerName(), "player": 1, "civ": "", "team": -1, "ready": 0 } };
+
else
{
let numPlayers = mapSettings.PlayerData ? mapSettings.PlayerData.length : g_GameAttributes.settings.PlayerData.length;
diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
index e4c7d548ad..7ebcc2acc3 100644
--- a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
+++ b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
@@ -194,8 +194,8 @@ function switchSetupPage(oldpage, newpage)
function startHost(playername, servername)
{
// Save player name
- Engine.ConfigDB_CreateValue("user", "playername", playername);
- Engine.ConfigDB_WriteValueToFile("user", "playername", playername, "config/user.cfg");
+ Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername);
+ Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg");
// Disallow identically named games in the multiplayer lobby
if (Engine.HasXmppClient())
@@ -263,8 +263,8 @@ function startJoin(playername, ip)
else
{
// Only save the player name and host address if they're valid and we're not in the lobby
- Engine.ConfigDB_CreateValue("user", "playername", playername);
- Engine.ConfigDB_WriteValueToFile("user", "playername", playername, "config/user.cfg");
+ Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername);
+ Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg");
Engine.ConfigDB_CreateValue("user", "multiplayerserver", ip);
Engine.ConfigDB_WriteValueToFile("user", "multiplayerserver", ip, "config/user.cfg");
}
@@ -274,6 +274,6 @@ function startJoin(playername, ip)
function getDefaultGameName()
{
return sprintf(translate("%(playername)s's game"), {
- "playername": Engine.ConfigDB_GetValue("user", "playername")
+ "playername": multiplayerName()
});
}
diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml
index 08fbc9040d..12fbd7fd63 100644
--- a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml
+++ b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml
@@ -4,6 +4,7 @@
+
@@ -31,7 +32,7 @@
@@ -41,7 +42,7 @@
@@ -69,7 +70,7 @@
diff --git a/binaries/data/mods/public/gui/lobby/prelobby.js b/binaries/data/mods/public/gui/lobby/prelobby.js
index 413b9c3a71..2c111a1922 100644
--- a/binaries/data/mods/public/gui/lobby/prelobby.js
+++ b/binaries/data/mods/public/gui/lobby/prelobby.js
@@ -179,8 +179,8 @@ function onTick()
{
Engine.PopGuiPage();
Engine.SwitchGuiPage("page_lobby.xml");
- Engine.ConfigDB_CreateValue("user", "playername", sanitizePlayerName(username, true, true));
- Engine.ConfigDB_WriteValueToFile("user", "playername", sanitizePlayerName(username, true, true), "config/user.cfg");
+ Engine.ConfigDB_CreateValue("user", "playername.multiplayer", sanitizePlayerName(username, true, true));
+ Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", sanitizePlayerName(username, true, true), "config/user.cfg");
Engine.ConfigDB_CreateValue("user", "lobby.login", username);
Engine.ConfigDB_WriteValueToFile("user", "lobby.login", username, "config/user.cfg");
// We only store the encrypted password, so make sure to re-encrypt it if changed before saving.
diff --git a/binaries/data/mods/public/gui/options/options.json b/binaries/data/mods/public/gui/options/options.json
index 6c79ca2a69..9e41a07ef7 100644
--- a/binaries/data/mods/public/gui/options/options.json
+++ b/binaries/data/mods/public/gui/options/options.json
@@ -1,6 +1,18 @@
{
"generalSetting":
[
+ {
+ "type": "string",
+ "label": "Playername (Single Player)",
+ "tooltip": "How you want to be addressed in Single Player matches).",
+ "parameters": { "config": "playername.singleplayer" }
+ },
+ {
+ "type": "string",
+ "label": "Playername (Multiplayer)",
+ "tooltip": "How you want to be addressed in Multiplayer matches (except lobby).",
+ "parameters": { "config": "playername.multiplayer" }
+ },
{
"type": "boolean",
"label": "Windowed Mode",
diff --git a/binaries/data/mods/public/gui/replaymenu/replay_actions.js b/binaries/data/mods/public/gui/replaymenu/replay_actions.js
index 761d1124b8..96a0955447 100644
--- a/binaries/data/mods/public/gui/replaymenu/replay_actions.js
+++ b/binaries/data/mods/public/gui/replaymenu/replay_actions.js
@@ -64,7 +64,7 @@ function reallyStartVisualReplay(replayDirectory)
"isNetworked": false,
"playerAssignments": {
"local":{
- "name": translate("You"),
+ "name": singleplayerName(),
"player": -1
}
},
diff --git a/binaries/data/mods/public/gui/session/messages.js b/binaries/data/mods/public/gui/session/messages.js
index 62ec923011..68f3ed2b92 100644
--- a/binaries/data/mods/public/gui/session/messages.js
+++ b/binaries/data/mods/public/gui/session/messages.js
@@ -652,32 +652,12 @@ function colorizePlayernameHelper(username, playerID)
function formatDefeatMessage(msg)
{
- let defeatMsg;
- let playername;
-
- // In singleplayer, the local player is "You". "You has" is incorrect.
- if (!g_IsNetworked && msg.player == Engine.GetPlayerID())
- {
- // Translation: String used to colorize the word "You" of that sentence
- playername = colorizePlayernameHelper(translateWithContext("You have been defeated", "You"), msg.player);
- if (msg.resign)
- defeatMsg = translate("%(You)s have resigned.");
- else
- defeatMsg = translate("%(You)s have been defeated.");
- }
- else
- {
- playername = colorizePlayernameByID(msg.player);
- if (msg.resign)
- defeatMsg = translate("%(player)s has resigned.");
- else
- defeatMsg = translate("%(player)s has been defeated.");
- }
-
- return sprintf(defeatMsg, {
- "player": playername,
- "You": playername
- });
+ return sprintf(
+ msg.resign ?
+ translate("%(player)s has resigned.") :
+ translate("%(player)s has been defeated."),
+ { "player": colorizePlayernameByID(msg.player) }
+ );
}
function formatDiplomacyMessage(msg)
diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js
index f5befa926c..494dd1d9f4 100644
--- a/binaries/data/mods/public/gui/session/session.js
+++ b/binaries/data/mods/public/gui/session/session.js
@@ -74,7 +74,12 @@ var g_CivData = {};
*/
var g_ReplaySelectionData;
-var g_PlayerAssignments = { "local": { "name": translate("You"), "player": 1 } };
+var g_PlayerAssignments = {
+ "local": {
+ "name": singleplayerName(),
+ "player": 1
+ }
+};
/**
* Cache dev-mode settings that are frequently or widely used.
diff --git a/binaries/data/mods/public/gui/session/utility_functions.js b/binaries/data/mods/public/gui/session/utility_functions.js
index 21b9d82ab5..73947e8b59 100644
--- a/binaries/data/mods/public/gui/session/utility_functions.js
+++ b/binaries/data/mods/public/gui/session/utility_functions.js
@@ -87,19 +87,19 @@ function getTradingTooltip(gain)
gainString += translate("+") + gain.market2Gain;
var tooltip = sprintf(translate("%(gain)s (%(player)s)"), {
- gain: gainString,
- player: (!g_IsNetworked && gain.traderOwner == playerID) ? translate("You") : simState.players[gain.traderOwner].name
+ "gain": gainString,
+ "player": simState.players[gain.traderOwner].name
});
if (gain.market1Gain && gain.market1Owner != gain.traderOwner)
tooltip += translateWithContext("Separation mark in an enumeration", ", ") + sprintf(translate("%(gain)s (%(player)s)"), {
- gain: gain.market1Gain,
- player: (!g_IsNetworked && gain.market1Owner == playerID) ? translate("You") : simState.players[gain.market1Owner].name
+ "gain": gain.market1Gain,
+ "player": simState.players[gain.market1Owner].name
});
if (gain.market2Gain && gain.market2Owner != gain.traderOwner)
tooltip += translateWithContext("Separation mark in an enumeration", ", ") + sprintf(translate("%(gain)s (%(player)s)"), {
- gain: gain.market2Gain,
- player: (!g_IsNetworked && gain.market2Owner == playerID) ? translate("You") : simState.players[gain.market2Owner].name
+ "gain": gain.market2Gain,
+ "player": simState.players[gain.market2Owner].name
});
return tooltip;
diff --git a/binaries/data/mods/public/gui/summary/summary.js b/binaries/data/mods/public/gui/summary/summary.js
index f27adc88a1..2f302b8a49 100644
--- a/binaries/data/mods/public/gui/summary/summary.js
+++ b/binaries/data/mods/public/gui/summary/summary.js
@@ -140,7 +140,7 @@ function startReplay()
"isNetworked": false,
"playerAssignments": {
"local": {
- "name": translate("You"),
+ "name": singleplayerName(),
"player": -1
}
},
diff --git a/source/gui/scripting/ScriptFunctions.cpp b/source/gui/scripting/ScriptFunctions.cpp
index 41520edc6b..52204dbacc 100644
--- a/source/gui/scripting/ScriptFunctions.cpp
+++ b/source/gui/scripting/ScriptFunctions.cpp
@@ -748,6 +748,12 @@ void Script_EndGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
EndGame();
}
+CStrW GetSystemUsername(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
+{
+ return sys_get_user_name();
+}
+
+
// Cause the game to exit gracefully.
// params:
// returns:
@@ -1117,4 +1123,5 @@ void GuiScriptingInit(ScriptInterface& scriptInterface)
scriptInterface.RegisterFunction("EnableTimeWarpRecording");
scriptInterface.RegisterFunction("RewindTimeWarp");
scriptInterface.RegisterFunction("SetBoundingBoxDebugOverlay");
+ scriptInterface.RegisterFunction("GetSystemUsername");
}