1
0
forked from 0ad/0ad

Use an actual playername instead of "You" in singleplayer, fixes #3979.

Differentiate between SP and MP name and allow editing it in the
settings.
Defaults to the OS username.
Makes sharing singleplayer replays more effective.
Also fixes a troublesome colorization of "You" in a translated sentence,
refs #3501.

This was SVN commit r18180.
This commit is contained in:
elexis 2016-05-15 17:13:35 +00:00
parent 6680fe82e2
commit 9eccf5cd07
12 changed files with 69 additions and 46 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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()
});
}

View File

@ -4,6 +4,7 @@
<script file="gui/common/network.js"/>
<script file="gui/common/functions_global_object.js"/>
<script file="gui/common/functions_utility.js"/>
<script file="gui/gamesetup/gamesetup_mp.js"/>
<!-- Add a translucent black background to fade out the menu page -->
@ -31,7 +32,7 @@
<object name="joinPlayerName" type="input" size="50%+10 40 100%-20 64" style="ModernInput">
<action on="Load">
this.caption = Engine.ConfigDB_GetValue("user", "playername");
this.caption = multiplayerName();
</action>
</object>
@ -41,7 +42,7 @@
<object name="joinServer" type="input" size="50%+10 80 100%-20 104" style="ModernInput">
<action on="Load">
this.caption = Engine.ConfigDB_GetValue("user", "multiplayerserver")
this.caption = Engine.ConfigDB_GetValue("user", "multiplayerserver");
</action>
</object>
@ -69,7 +70,7 @@
<object name="hostPlayerName" type="input" size="50%+10 40 100%-20 64" style="ModernInput">
<action on="Load">
this.caption = Engine.ConfigDB_GetValue("user", "playername");
this.caption = multiplayerName();
</action>
</object>
</object>

View File

@ -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.

View File

@ -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",

View File

@ -64,7 +64,7 @@ function reallyStartVisualReplay(replayDirectory)
"isNetworked": false,
"playerAssignments": {
"local":{
"name": translate("You"),
"name": singleplayerName(),
"player": -1
}
},

View File

@ -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)

View File

@ -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.

View File

@ -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;

View File

@ -140,7 +140,7 @@ function startReplay()
"isNetworked": false,
"playerAssignments": {
"local": {
"name": translate("You"),
"name": singleplayerName(),
"player": -1
}
},

View File

@ -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<void, unsigned int, &EnableTimeWarpRecording>("EnableTimeWarpRecording");
scriptInterface.RegisterFunction<void, &RewindTimeWarp>("RewindTimeWarp");
scriptInterface.RegisterFunction<void, bool, &SetBoundingBoxDebugOverlay>("SetBoundingBoxDebugOverlay");
scriptInterface.RegisterFunction<CStrW, &GetSystemUsername>("GetSystemUsername");
}