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