Index: binaries/data/mods/public/gui/gamesetup/gamesetup.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -52,12 +52,8 @@ "username": senderFont(sprintf(translate("<%(username)s>"), { "username": user })), "message": escapeText(msg.text || "") }), - "ready": (msg, user) => sprintf(translate("* %(username)s is ready!"), { - "username": user - }), - "not-ready": (msg, user) => sprintf(translate("* %(username)s is not ready."), { - "username": user - }), + "ready": (msg, user) => g_ReadyData[msg.status] && g_ReadyData[msg.status].chat && + sprintf(g_ReadyData[msg.status].chat, { "username": user }), "clientlist": (msg, user) => getUsernameList() }; @@ -134,9 +130,27 @@ const g_UnassignedPlayerColor = "170 170 250"; /** - * Highlight ready players. - */ -const g_ReadyColor = "green"; + * Containing the colors to highlight the ready status of players, + * the chat ready messages + * and the tooltips and captions for the ready button + */ + +const g_ReadyData = [ + { + "color": "", + "chat": translate("* %(username)s is not ready."), + "caption": translate("I'm ready"), + "tooltip": translate("State that you are ready to play!") + }, { + "color": "green", + "chat": translate("* %(username)s is ready!"), + "caption": translate("Stay ready"), + "tooltip": translate("Stay ready even when the game settings change.") + }, { + "color": "blue", + "caption": translate("I'm not ready!"), + "tooltip": translate("State that you are not ready to play.") + }]; /** * Placeholder item for the map-dropdownlist. @@ -172,6 +186,9 @@ /** * Whether the current player is ready to start the game. + * 0 - not ready + * 1 - ready + * 2 - stay ready */ var g_IsReady; @@ -706,9 +723,10 @@ { --g_ReadyChanged; - if (g_ReadyChanged < 1 && g_PlayerAssignments[message.guid].player != -1) + if (g_ReadyChanged < 1 && g_PlayerAssignments[message.guid].player != -1 && message.status < 2) addChatMessage({ - "type": message.status == 1 ? "ready" : "not-ready", + "type": "ready", + "status": message.status, "guid": message.guid }); @@ -1820,6 +1838,9 @@ let text = g_FormatChatMessage[msg.type](msg, user); + if (!text) + return; + if (Engine.ConfigDB_GetValue("user", "chat.timestamp") == "true") text = sprintf(translate("%(time)s %(message)s"), { "time": sprintf(translate("\\[%(time)s]"), { @@ -1857,7 +1878,7 @@ function toggleReady() { - setReady(!g_IsReady); + setReady((g_IsReady + 1) % 3); } function setReady(ready, sendMessage = true) @@ -1871,14 +1892,8 @@ return; let button = Engine.GetGUIObjectByName("startGame"); - - button.caption = g_IsReady ? - translate("I'm not ready!") : - translate("I'm ready"); - - button.tooltip = g_IsReady ? - translate("State that you are not ready to play.") : - translate("State that you are ready to play!"); + button.caption = g_ReadyData[+g_IsReady].caption; + button.tooltip = g_ReadyData[+g_IsReady].tooltip; } function updateReadyUI() @@ -1896,8 +1911,10 @@ let pData = g_GameAttributes.settings.PlayerData ? g_GameAttributes.settings.PlayerData[g_PlayerAssignments[guid].player - 1] : {}; let pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[g_PlayerAssignments[guid].player - 1] : {}; isAI[g_PlayerAssignments[guid].player] = false; - if (g_PlayerAssignments[guid].status || !g_IsNetworked) - Engine.GetGUIObjectByName("playerName[" + (g_PlayerAssignments[guid].player - 1) + "]").caption = '[color="' + g_ReadyColor + '"]' + translate(getSetting(pData, pDefs, "Name")) + '[/color]'; + if (g_PlayerAssignments[guid].status) + Engine.GetGUIObjectByName("playerName[" + (g_PlayerAssignments[guid].player - 1) + "]").caption = + '[color="' + g_ReadyData[+g_PlayerAssignments[guid].status].color + '"]' + + translate(getSetting(pData, pDefs, "Name")) + '[/color]'; else { Engine.GetGUIObjectByName("playerName[" + (g_PlayerAssignments[guid].player - 1) + "]").caption = translate(getSetting(pData, pDefs, "Name")); @@ -1913,7 +1930,8 @@ let pData = g_GameAttributes.settings.PlayerData ? g_GameAttributes.settings.PlayerData[playerid] : {}; let pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[playerid] : {}; if (isAI[playerid + 1]) - Engine.GetGUIObjectByName("playerName[" + playerid + "]").caption = '[color="' + g_ReadyColor + '"]' + translate(getSetting(pData, pDefs, "Name")) + '[/color]'; + Engine.GetGUIObjectByName("playerName[" + playerid + "]").caption = + '[color="' + g_ReadyData[2].color + '"]' + translate(getSetting(pData, pDefs, "Name")) + '[/color]'; } // The host is not allowed to start until everyone is ready. @@ -1950,7 +1968,7 @@ Engine.ClearAllPlayerReady(); setReady(true); } - else + else if (g_IsReady != 2) setReady(false, false); } Index: source/network/NetServer.cpp =================================================================== --- source/network/NetServer.cpp +++ source/network/NetServer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2016 Wildfire Games. +/* Copyright (C) 2017 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -774,7 +774,8 @@ void CNetServerWorker::ClearAllPlayerReady() { for (PlayerAssignmentMap::iterator it = m_PlayerAssignments.begin(); it != m_PlayerAssignments.end(); ++it) - it->second.m_Status = 0; + if (it->second.m_Status != 2) + it->second.m_Status = 0; SendPlayerAssignments(); }