Index: binaries/data/mods/public/gui/lobby/lobby.js =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.js +++ binaries/data/mods/public/gui/lobby/lobby.js @@ -91,6 +91,11 @@ var g_GameList = {}; /** + * All players currently in the lobby. + */ +var g_PlayerList = {}; + +/** * Used to restore the selection after updating the playerlist. */ var g_SelectedPlayer = ""; @@ -611,7 +616,7 @@ let nickList = []; let ratingList = []; - let cleanPlayerList = Engine.GetPlayerList().map(player => { + g_PlayerList = Engine.GetPlayerList().map(player => { player.isBuddy = g_Buddies.indexOf(player.name) != -1; return player; }).sort((a, b) => { @@ -646,7 +651,7 @@ }); // Colorize list entries - for (let player of cleanPlayerList) + for (let player of g_PlayerList) { if (player.rating && player.name == g_Username) g_UserRating = player.rating; @@ -674,6 +679,8 @@ playersBox.list_rating = ratingList; playersBox.list = nickList; + updatePlayersGamesStatsNumbers(); + playersBox.selected = playersBox.list.indexOf(g_SelectedPlayer); } @@ -739,6 +746,68 @@ } } +function updatePlayersGamesStatsNumbers() +{ + let header = []; + let headerTooltip = []; + + if (g_PlayerList.length > 0) + { + header.push({ + avail: g_PlayerList.filter(player => player.presence == "available").length, + el: g_PlayerList.length, + text: translatePlural("Player", "Players", g_PlayerList.length) + }) + let buddyNum = g_PlayerList.filter(player => player.isBuddy).length; + if (buddyNum > 0) + headerTooltip.push({ + avail: g_PlayerList.filter(player => player.isBuddy && player.presence == "available").length, + el: buddyNum, + text: translatePlural("Buddy Player", "Buddy Players", buddyNum) + }); + } + + if (g_GameList.length > 0) + { + header.push({ + avail: g_GameList.filter(game => game.state == "init").length, + el: g_GameList.length, + text: translatePlural("Game", "Games", g_GameList.length) + }); + let buddyGamesNum = g_GameList.filter(game => game.hasBuddies >= 1).length; + if (buddyGamesNum > 0) + headerTooltip.push({ + avail: g_GameList.filter(game => game.hasBuddies >= 1 && game.state == "init").length, + el: buddyGamesNum, + text: translatePlural("Buddy Game", "Buddy Games", buddyGamesNum) + }); + } + + if (header.length) + Engine.GetGUIObjectByName("playersGamesNumbers").caption = makeHeaderString(header); + + if (headerTooltip.length) + Engine.GetGUIObjectByName("playersGamesNumbers").tooltip = '[font="sans-bold-stroke-13"][color="240 240 240"]' + makeHeaderString(headerTooltip) + '[/color][/font]'; +} + +/** + * Construct header from players and games count array. + */ +function makeHeaderString(array) +{ + let first = true; + let caption = ""; + for (let element of array) + { + caption += (first ? "" : " ") + element.el; + caption += (element.avail > 0 ? '/[color="' + g_PlayerStatuses.available.color + '"]' + element.avail + '[/color]' : ''); + caption += " " + element.text; + if (first) + first = false; + } + return caption; +} + function onPlayerListSelection() { let playerList = Engine.GetGUIObjectByName("playersBox"); @@ -1008,6 +1077,8 @@ gamesBox.list = list; gamesBox.list_data = list_data; gamesBox.selected = selectedGameIndex; + + updatePlayersGamesStatsNumbers(); updateGameSelection(); } Index: binaries/data/mods/public/gui/lobby/lobby_panels.xml =================================================================== --- binaries/data/mods/public/gui/lobby/lobby_panels.xml +++ binaries/data/mods/public/gui/lobby/lobby_panels.xml @@ -8,13 +8,16 @@ + +