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 @@ -899,18 +899,38 @@ // Compute average rating of participating players let playerRatings = []; + let teamPlayers = {}; + let teamPlayersOrg = {}; for (let player of stringifiedTeamListToPlayerData(game.players)) { let [nick, rating] = splitRatingFromNick(player.Name); - if (player.Team != "observer") + if (player.Team != undefined && player.Team != "observer") + { playerRatings.push(rating || g_DefaultLobbyRating); + if (!teamPlayersOrg[player.Team]) + teamPlayersOrg[player.Team] = 1; + else + teamPlayersOrg[player.Team]++; + + if (!(player.State && player.State == "defeated")) + { + if (player.Team != undefined) + if (!teamPlayers[player.Team]) + teamPlayers[player.Team] = 1; + else + teamPlayers[player.Team]++; + } + } // Sort games with playing buddies above games with spectating buddies if (game.hasBuddies < 2 && g_Buddies.indexOf(nick) != -1) game.hasBuddies = player.Team == "observer" ? 1 : 2; } + + game.stateString = game.state == "init" ? translate("init") : + getGameStateString(teamPlayersOrg, teamPlayers); game.gameRating = playerRatings.length ? @@ -927,6 +947,7 @@ sortB = g_GameStatusOrder.indexOf(b.state) + b.name.toLowerCase(); break; case 'gameRating': + case 'state': case 'mapSize': case 'mapType': sortA = a[sortBy]; @@ -952,6 +973,7 @@ let list_buddy = []; let list_name = []; + let list_state = []; let list_mapName = []; let list_mapSize = []; let list_mapType = []; @@ -972,6 +994,7 @@ list_buddy.push(game.hasBuddies ? '[color="' + g_GameColors[game.state] + '"]' + g_BuddySymbol + '[/color]' : ""); list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); + list_state.push(game.stateString); list_mapName.push(translateMapTitle(game.niceMapName)); list_mapSize.push(translateMapSize(game.mapSize)); list_mapType.push(g_MapTypes.Title[mapTypeIdx] || ""); @@ -983,6 +1006,7 @@ gamesBox.list_buddy = list_buddy; gamesBox.list_name = list_name; + gamesBox.list_state = list_state; gamesBox.list_mapName = list_mapName; gamesBox.list_mapSize = list_mapSize; gamesBox.list_mapType = list_mapType; @@ -997,6 +1021,50 @@ updateGameSelection(); } + +function getGameStateString(teamPlayersOrg, teamPlayers) +{ + let state = ""; + + if (Object.keys(teamPlayers).length > 0) + { + let teamsUndefeatedNum = Object.keys(teamPlayers).filter(team => teamPlayers[team] > 0 && team > -1).length; + if ((teamsUndefeatedNum <= 1 && !teamPlayers[-1]) || (teamsUndefeatedNum <= 0 && teamPlayers[-1] <= 1)) + state += translate("done"); + else + { + let playersHasTeam = Object.keys(teamPlayers).filter(team => team != -1).map(team => teamPlayers[team]); + + if (playersHasTeam.length == 0) + state = translate("open"); + else + { + state += playersHasTeam.join("v"); + if (teamPlayers[-1]) + { + state += teamPlayers[-1] > 0 ? (playersHasTeam.length > 0 ? "v1" : "1" ) : ""; + for (let i = 1; i < teamPlayers[-1]; i++) + state += "v1"; + } + + let teamPlayersOrg = Object.keys(teamPlayersOrg).filter(team => team != -1).map(team => teamPlayersOrg[team]); + let stateOrg = teamPlayersOrg.join("v"); + + if (teamPlayersOrg[-1]) + { + stateOrg += teamPlayersOrg[-1] > 0 ? (teamPlayersOrg.length > 0 ? "v1" : "1" ) : ""; + for (let i = 1; i < teamPlayersOrg[-1]; i++) + stateOrg += "v1"; + } + + if (stateOrg != state) + state += '[color="128 128 128"] (' + stateOrg + ')[/color]'; + } + } + } + return state; +} + /** * Populate the game info area with information on the current game selection. */ Index: binaries/data/mods/public/gui/lobby/lobby.xml =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.xml +++ binaries/data/mods/public/gui/lobby/lobby.xml @@ -204,6 +204,9 @@ Name + + State + Map Name