Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/gui/lobby/lobby.js
Show First 20 Lines • Show All 354 Lines • ▼ Show 20 Lines | function init(attribs) | ||||
initGameFilters(); | initGameFilters(); | ||||
Engine.LobbySetPlayerPresence("available"); | Engine.LobbySetPlayerPresence("available"); | ||||
// When rejoining the lobby after a game, we don't need to process presence changes | // When rejoining the lobby after a game, we don't need to process presence changes | ||||
Engine.LobbyClearPresenceUpdates(); | Engine.LobbyClearPresenceUpdates(); | ||||
updatePlayerList(); | updatePlayerList(); | ||||
updateSubject(Engine.LobbyGetRoomSubject()); | updateSubject(Engine.LobbyGetRoomSubject()); | ||||
updateLobbyColumns(); | |||||
Engine.GetGUIObjectByName("chatInput").tooltip = colorizeAutocompleteHotkey(); | Engine.GetGUIObjectByName("chatInput").tooltip = colorizeAutocompleteHotkey(); | ||||
} | } | ||||
function updateLobbyColumns() | |||||
{ | |||||
let gameRating = Engine.ConfigDB_GetValue("user", "lobby.columns.gamerating") == "true"; | |||||
// Only show the selected columns | |||||
let gamesBox = Engine.GetGUIObjectByName("gamesBox"); | |||||
gamesBox.hidden_mapType = gameRating; | |||||
gamesBox.hidden_gameRating = !gameRating; | |||||
// Only show the filters of selected columns | |||||
let mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter"); | |||||
mapTypeFilter.hidden = gameRating; | |||||
let gameRatingFilter = Engine.GetGUIObjectByName("gameRatingFilter"); | |||||
gameRatingFilter.hidden = !gameRating; | |||||
// Keep filters right above the according column | |||||
let playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter"); | |||||
let size = playersNumberFilter.size; | |||||
size.rleft = gameRating ? 74: 90; | |||||
size.rright = gameRating ? 84: 100; | |||||
playersNumberFilter.size = size; | |||||
} | |||||
function returnToMainMenu() | function returnToMainMenu() | ||||
{ | { | ||||
Engine.StopXmppClient(); | Engine.StopXmppClient(); | ||||
Engine.SwitchGuiPage("page_pregame.xml"); | Engine.SwitchGuiPage("page_pregame.xml"); | ||||
} | } | ||||
function initGameFilters() | function initGameFilters() | ||||
{ | { | ||||
let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); | let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); | ||||
mapSizeFilter.list = [translateWithContext("map size", "Any")].concat(g_MapSizes.Name); | mapSizeFilter.list = [translateWithContext("map size", "Any")].concat(g_MapSizes.Name); | ||||
mapSizeFilter.list_data = [""].concat(g_MapSizes.Tiles); | mapSizeFilter.list_data = [""].concat(g_MapSizes.Tiles); | ||||
let playersArray = Array(g_MaxPlayers).fill(0).map((v, i) => i + 1); // 1, 2, ... MaxPlayers | let playersArray = Array(g_MaxPlayers).fill(0).map((v, i) => i + 1); // 1, 2, ... MaxPlayers | ||||
let playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter"); | let playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter"); | ||||
playersNumberFilter.list = [translateWithContext("player number", "Any")].concat(playersArray); | playersNumberFilter.list = [translateWithContext("player number", "Any")].concat(playersArray); | ||||
playersNumberFilter.list_data = [""].concat(playersArray); | playersNumberFilter.list_data = [""].concat(playersArray); | ||||
let mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter"); | let mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter"); | ||||
mapTypeFilter.list = [translateWithContext("map", "Any")].concat(g_MapTypes.Title); | mapTypeFilter.list = [translateWithContext("map", "Any")].concat(g_MapTypes.Title); | ||||
mapTypeFilter.list_data = [""].concat(g_MapTypes.Name); | mapTypeFilter.list_data = [""].concat(g_MapTypes.Name); | ||||
let gameRatingOptions = ["<1000", "<1100","<1200",">1200",">1300",">1400",">1500"].reverse(); | |||||
gameRatingOptions = prepareForDropdown(gameRatingOptions.map(r => ({ | |||||
"value": r, | |||||
"label": sprintf( | |||||
r[0] == ">" ? | |||||
translateWithContext("gamelist filter", "> %(rating)s") : | |||||
translateWithContext("gamelist filter", "< %(rating)s"), | |||||
{ "rating": r.substr(1) }) | |||||
}))) | |||||
let gameRatingFilter = Engine.GetGUIObjectByName("gameRatingFilter"); | |||||
gameRatingFilter.list = [translateWithContext("map", "Any")].concat(gameRatingOptions.label); | |||||
gameRatingFilter.list_data = [""].concat(gameRatingOptions.value); | |||||
resetFilters(); | resetFilters(); | ||||
} | } | ||||
function resetFilters() | function resetFilters() | ||||
{ | { | ||||
Engine.GetGUIObjectByName("mapSizeFilter").selected = 0; | Engine.GetGUIObjectByName("mapSizeFilter").selected = 0; | ||||
Engine.GetGUIObjectByName("playersNumberFilter").selected = 0; | Engine.GetGUIObjectByName("playersNumberFilter").selected = 0; | ||||
Engine.GetGUIObjectByName("mapTypeFilter").selected = g_MapTypes.Default; | Engine.GetGUIObjectByName("mapTypeFilter").selected = g_MapTypes.Default; | ||||
Engine.GetGUIObjectByName("gameRatingFilter").selected = 0; | |||||
Engine.GetGUIObjectByName("showFullFilter").checked = false; | Engine.GetGUIObjectByName("showFullFilter").checked = false; | ||||
applyFilters(); | applyFilters(); | ||||
} | } | ||||
function applyFilters() | function applyFilters() | ||||
{ | { | ||||
updateGameList(); | updateGameList(); | ||||
updateGameSelection(); | updateGameSelection(); | ||||
} | } | ||||
/** | /** | ||||
* Filter a game based on the status of the filter dropdowns. | * Filter a game based on the status of the filter dropdowns. | ||||
* | * | ||||
* @param {Object} game | * @param {Object} game | ||||
* @returns {boolean} - True if game should not be displayed. | * @returns {boolean} - True if game should not be displayed. | ||||
*/ | */ | ||||
function filterGame(game) | function filterGame(game) | ||||
{ | { | ||||
let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); | let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); | ||||
let playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter"); | let playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter"); | ||||
let mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter"); | let mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter"); | ||||
let gameRatingFilter = Engine.GetGUIObjectByName("gameRatingFilter"); | |||||
let showFullFilter = Engine.GetGUIObjectByName("showFullFilter"); | let showFullFilter = Engine.GetGUIObjectByName("showFullFilter"); | ||||
// We assume index 0 means display all for any given filter. | // We assume index 0 means display all for any given filter. | ||||
if (mapSizeFilter.selected != 0 && | if (mapSizeFilter.selected != 0 && | ||||
game.mapSize != mapSizeFilter.list_data[mapSizeFilter.selected]) | game.mapSize != mapSizeFilter.list_data[mapSizeFilter.selected]) | ||||
return true; | return true; | ||||
if (playersNumberFilter.selected != 0 && | if (playersNumberFilter.selected != 0 && | ||||
game.maxnbp != playersNumberFilter.list_data[playersNumberFilter.selected]) | game.maxnbp != playersNumberFilter.list_data[playersNumberFilter.selected]) | ||||
return true; | return true; | ||||
if (mapTypeFilter.selected != 0 && | if (mapTypeFilter.selected != 0 && | ||||
game.mapType != mapTypeFilter.list_data[mapTypeFilter.selected]) | game.mapType != mapTypeFilter.list_data[mapTypeFilter.selected]) | ||||
return true; | return true; | ||||
if (!showFullFilter.checked && game.maxnbp <= game.nbp) | if (!showFullFilter.checked && game.maxnbp <= game.nbp) | ||||
return true; | return true; | ||||
if (gameRatingFilter.selected > 0) | |||||
{ | |||||
let selected = gameRatingFilter.list_data[gameRatingFilter.selected]; | |||||
if (selected.startsWith(">") && +selected.substr(1) >= game.gameRating || | |||||
selected.startsWith("<") && +selected.substr(1) <= game.gameRating) | |||||
return true; | |||||
} | |||||
return false; | return false; | ||||
} | } | ||||
function handleKick(banned, nick, reason) | function handleKick(banned, nick, reason) | ||||
{ | { | ||||
let kickString = nick == g_Username ? | let kickString = nick == g_Username ? | ||||
banned ? | banned ? | ||||
translate("You have been banned from the lobby!") : | translate("You have been banned from the lobby!") : | ||||
▲ Show 20 Lines • Show All 181 Lines • ▼ Show 20 Lines | |||||
function selectGameFromPlayername(playerName) | function selectGameFromPlayername(playerName) | ||||
{ | { | ||||
let gameList = Engine.GetGUIObjectByName("gamesBox"); | let gameList = Engine.GetGUIObjectByName("gamesBox"); | ||||
let foundAsObserver = false; | let foundAsObserver = false; | ||||
for (let i = 0; i < g_GameList.length; ++i) | for (let i = 0; i < g_GameList.length; ++i) | ||||
for (let player of stringifiedTeamListToPlayerData(g_GameList[i].players)) | for (let player of stringifiedTeamListToPlayerData(g_GameList[i].players)) | ||||
{ | { | ||||
let nick = removeRatingFromNick(player.Name); | let [nick, rating] = splitRatingFromNick(player.Name); | ||||
if (playerName != nick) | if (playerName != nick) | ||||
continue; | continue; | ||||
if (player.Team == "observer") | if (player.Team == "observer") | ||||
{ | { | ||||
foundAsObserver = true; | foundAsObserver = true; | ||||
gameList.selected = i; | gameList.selected = i; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 163 Lines • ▼ Show 20 Lines | function updateGameList() | ||||
if (gamesBox.selected > -1) | if (gamesBox.selected > -1) | ||||
{ | { | ||||
g_SelectedGameIP = g_GameList[gamesBox.selected].ip; | g_SelectedGameIP = g_GameList[gamesBox.selected].ip; | ||||
g_SelectedGamePort = g_GameList[gamesBox.selected].port; | g_SelectedGamePort = g_GameList[gamesBox.selected].port; | ||||
} | } | ||||
g_GameList = Engine.GetGameList().map(game => { | g_GameList = Engine.GetGameList().map(game => { | ||||
game.hasBuddies = 0; | game.hasBuddies = 0; | ||||
// Compute average rating of participating players | |||||
let playerRatings = []; | |||||
for (let player of stringifiedTeamListToPlayerData(game.players)) | for (let player of stringifiedTeamListToPlayerData(game.players)) | ||||
{ | { | ||||
let nick = removeRatingFromNick(player.Name); | let [nick, rating] = splitRatingFromNick(player.Name); | ||||
if (player.Team != "observer") | |||||
playerRatings.push(rating); | |||||
// Sort games with playing buddies above games with spectating buddies | // Sort games with playing buddies above games with spectating buddies | ||||
if (game.hasBuddies < 2 && g_Buddies.indexOf(nick) != -1) | if (game.hasBuddies < 2 && g_Buddies.indexOf(nick) != -1) | ||||
game.hasBuddies = player.Team == "observer" ? 1 : 2; | game.hasBuddies = player.Team == "observer" ? 1 : 2; | ||||
} | } | ||||
game.gameRating = | |||||
playerRatings.length ? | |||||
Math.round(playerRatings.reduce((sum, current) => sum + current) / playerRatings.length) : | |||||
g_DefaultLobbyRating; | |||||
return game; | return game; | ||||
}).filter(game => !filterGame(game)).sort((a, b) => { | }).filter(game => !filterGame(game)).sort((a, b) => { | ||||
let sortA, sortB; | let sortA, sortB; | ||||
switch (sortBy) | switch (sortBy) | ||||
{ | { | ||||
case 'name': | case 'name': | ||||
sortA = g_GameStatusOrder.indexOf(a.state) + a.name.toLowerCase(); | sortA = g_GameStatusOrder.indexOf(a.state) + a.name.toLowerCase(); | ||||
sortB = g_GameStatusOrder.indexOf(b.state) + b.name.toLowerCase(); | sortB = g_GameStatusOrder.indexOf(b.state) + b.name.toLowerCase(); | ||||
break; | break; | ||||
case 'gameRating': | |||||
case 'mapSize': | case 'mapSize': | ||||
case 'mapType': | case 'mapType': | ||||
sortA = a[sortBy]; | sortA = a[sortBy]; | ||||
sortB = b[sortBy]; | sortB = b[sortBy]; | ||||
break; | break; | ||||
case 'buddy': | case 'buddy': | ||||
sortA = String(b.hasBuddies) + g_GameStatusOrder.indexOf(a.state) + a.name.toLowerCase(); | sortA = String(b.hasBuddies) + g_GameStatusOrder.indexOf(a.state) + a.name.toLowerCase(); | ||||
sortB = String(a.hasBuddies) + g_GameStatusOrder.indexOf(b.state) + b.name.toLowerCase(); | sortB = String(a.hasBuddies) + g_GameStatusOrder.indexOf(b.state) + b.name.toLowerCase(); | ||||
Show All 13 Lines | function updateGameList() | ||||
}); | }); | ||||
let list_buddy = []; | let list_buddy = []; | ||||
let list_name = []; | let list_name = []; | ||||
let list_mapName = []; | let list_mapName = []; | ||||
let list_mapSize = []; | let list_mapSize = []; | ||||
let list_mapType = []; | let list_mapType = []; | ||||
let list_nPlayers = []; | let list_nPlayers = []; | ||||
let list_gameRating = []; | |||||
let list = []; | let list = []; | ||||
let list_data = []; | let list_data = []; | ||||
let selectedGameIndex = -1; | let selectedGameIndex = -1; | ||||
for (let i in g_GameList) | for (let i in g_GameList) | ||||
{ | { | ||||
let game = g_GameList[i]; | let game = g_GameList[i]; | ||||
let gameName = escapeText(game.name); | let gameName = escapeText(game.name); | ||||
let mapTypeIdx = g_MapTypes.Name.indexOf(game.mapType); | let mapTypeIdx = g_MapTypes.Name.indexOf(game.mapType); | ||||
if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort) | if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort) | ||||
selectedGameIndex = +i; | selectedGameIndex = +i; | ||||
list_buddy.push(game.hasBuddies ? '[color="' + g_GameColors[game.state] + '"]' + g_BuddySymbol + '[/color]' : ""); | list_buddy.push(game.hasBuddies ? '[color="' + g_GameColors[game.state] + '"]' + g_BuddySymbol + '[/color]' : ""); | ||||
list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); | list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); | ||||
list_mapName.push(translateMapTitle(game.niceMapName)); | list_mapName.push(translateMapTitle(game.niceMapName)); | ||||
list_mapSize.push(translateMapSize(game.mapSize)); | list_mapSize.push(translateMapSize(game.mapSize)); | ||||
list_mapType.push(g_MapTypes.Title[mapTypeIdx] || ""); | list_mapType.push(g_MapTypes.Title[mapTypeIdx] || ""); | ||||
list_nPlayers.push(game.nbp + "/" + game.maxnbp); | list_nPlayers.push(game.nbp + "/" + game.maxnbp); | ||||
list_gameRating.push(game.gameRating); | |||||
list.push(gameName); | list.push(gameName); | ||||
list_data.push(i); | list_data.push(i); | ||||
} | } | ||||
gamesBox.list_buddy = list_buddy; | gamesBox.list_buddy = list_buddy; | ||||
gamesBox.list_name = list_name; | gamesBox.list_name = list_name; | ||||
gamesBox.list_mapName = list_mapName; | gamesBox.list_mapName = list_mapName; | ||||
gamesBox.list_mapSize = list_mapSize; | gamesBox.list_mapSize = list_mapSize; | ||||
gamesBox.list_mapType = list_mapType; | gamesBox.list_mapType = list_mapType; | ||||
gamesBox.list_nPlayers = list_nPlayers; | gamesBox.list_nPlayers = list_nPlayers; | ||||
gamesBox.list_gameRating = list_gameRating; | |||||
// Change these last, otherwise crash | // Change these last, otherwise crash | ||||
gamesBox.list = list; | gamesBox.list = list; | ||||
gamesBox.list_data = list_data; | gamesBox.list_data = list_data; | ||||
gamesBox.selected = selectedGameIndex; | gamesBox.selected = selectedGameIndex; | ||||
updateGameSelection(); | updateGameSelection(); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 529 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator