Index: binaries/data/config/default.cfg
===================================================================
--- binaries/data/config/default.cfg
+++ binaries/data/config/default.cfg
@@ -372,6 +372,7 @@
room = "arena22" ; Default MUC room to join
server = "lobby.wildfiregames.com" ; Address of lobby server
xpartamupp = "wfgbot22" ; Name of the server-side xmpp client that manage games
+buddies = "|" ; User buddies
[mod]
enabledmods = "mod public"
Index: binaries/data/mods/public/gui/common/functions_utility.js
===================================================================
--- binaries/data/mods/public/gui/common/functions_utility.js
+++ binaries/data/mods/public/gui/common/functions_utility.js
@@ -214,6 +214,15 @@
}
/**
+ * Removes rate from playername string
+ */
+function playerNameRateRemove(playerName)
+{
+ let result = /^(\S+)\ \(\d+\)$/g.exec(playerName);
+ return result ? result[1] : playerName;
+}
+
+/**
* Plays a sound if user's nick is mentioned in chat
*/
function notifyUser(userName, msgText)
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
@@ -69,6 +69,21 @@
const g_SenderFont = "sans-bold-13";
/**
+ * Buddy sign
+ */
+const g_BuddySign = '●';
+
+/**
+ * User sign
+ */
+const g_UserSign = '▶';
+
+/**
+ * User buddies
+ */
+var g_UserBuddies = Engine.ConfigDB_GetValue("user", "lobby.buddies").split("|");
+
+/**
* All chat messages received since init (i.e. after lobby join and after returning from a game).
*/
var g_ChatMessages = [];
@@ -382,21 +397,30 @@
if (playersBox.selected > -1)
g_SelectedPlayer = playersBox.list[playersBox.selected];
+ let buddyStatusList = [];
let playerList = [];
let presenceList = [];
let nickList = [];
let ratingList = [];
- let cleanPlayerList = Engine.GetPlayerList().sort((a, b) => {
+ let cleanPlayerList = Engine.GetPlayerList().map(player => {
+ player.isBuddy = g_UserBuddies.concat(g_Username).indexOf(player.name) != -1;
+ return player; });
+
+ cleanPlayerList = cleanPlayerList.sort((a, b) => {
let sortA, sortB;
+ let statusOrder = Object.keys(g_PlayerStatuses);
switch (sortBy)
{
+ case 'buddy':
+ sortA = (a.isBuddy ? "1" : "2") + (statusOrder.indexOf(a.presence) + 1).toString() + a.name.toLowerCase();
+ sortB = (b.isBuddy ? "1" : "2") + (statusOrder.indexOf(b.presence) + 1).toString() + b.name.toLowerCase();
+ break;
case 'rating':
sortA = +a.rating;
sortB = +b.rating;
break;
case 'status':
- let statusOrder = Object.keys(g_PlayerStatuses);
sortA = statusOrder.indexOf(a.presence);
sortB = statusOrder.indexOf(b.presence);
break;
@@ -427,12 +451,14 @@
let coloredPresence = '[color="' + statusColor + '"]' + g_PlayerStatuses[presence].status + "[/color]";
let coloredRating = '[color="' + statusColor + '"]' + rating + "[/color]";
+ buddyStatusList.push('[color="' + statusColor + ' ' + (player.isBuddy ? 255 : 0) + '"]' + (player.name == g_Username ? g_UserSign : g_BuddySign) + '[/color]');
playerList.push(coloredName);
presenceList.push(coloredPresence);
ratingList.push(coloredRating);
nickList.push(player.name);
}
+ playersBox.list_buddy = buddyStatusList;
playersBox.list_name = playerList;
playersBox.list_status = presenceList;
playersBox.list_rating = ratingList;
@@ -443,6 +469,45 @@
playersBox.selected = playersBox.list.indexOf(g_SelectedPlayer);
}
+function unhideToggleBuddy(playersBox)
+{
+ if (playersBox.selected != -1)
+ {
+ Engine.GetGUIObjectByName("leftPanel").size = "20 30 20% 100%-310";
+ Engine.GetGUIObjectByName("profilePanel").size="20 100%-305 20% 100%-110";
+ Engine.GetGUIObjectByName("leftButtonPanel").size="20 100%-105 20% 100%-20";
+ Engine.GetGUIObjectByName("toggleBuddy").hidden = false;
+ }
+ else
+ {
+ Engine.GetGUIObjectByName("leftPanel").size = "20 30 20% 100%-280";
+ Engine.GetGUIObjectByName("profilePanel").size="20 100%-275 20% 100%-80";
+ Engine.GetGUIObjectByName("leftButtonPanel").size="20 100%-75 20% 100%-20";
+ Engine.GetGUIObjectByName("toggleBuddy").hidden = true;
+ }
+}
+
+/**
+* Toggle buddy state for a player in playerlist within the user config
+*/
+function toggleBuddy()
+{
+ var buddies = Engine.ConfigDB_GetValue("user", "lobby.buddies");
+ let playerList = Engine.GetGUIObjectByName("playersBox");
+ let name = playerList.list[playerList.selected];
+
+ let index = g_UserBuddies.indexOf(name);
+ if (index != -1)
+ g_UserBuddies.splice(index, 1);
+ else
+ g_UserBuddies.push(name);
+
+ Engine.ConfigDB_CreateValue("user", "lobby.buddies", g_UserBuddies.join("|"));
+ Engine.ConfigDB_WriteValueToFile("user", "lobby.buddies", g_UserBuddies.join("|"), "config/user.cfg");
+ updatePlayerList();
+ updateGameList();
+}
+
/**
* Select the game listing the selected player when toggling the full games filter.
*/
@@ -632,7 +697,23 @@
g_SelectedGamePort = g_GameList[gamesBox.selected].port;
}
- g_GameList = Engine.GetGameList().filter(game => !filterGame(game)).sort((a, b) => {
+ g_GameList = Engine.GetGameList().map(game => {
+ game.buddy = 0;
+ for (let player of stringifiedTeamListToPlayerData(game.players))
+ {
+ if (!player.Name)
+ continue;
+ if (playerNameRateRemove(player.Name) == g_Username)
+ {
+ game.buddy = 3;
+ break;
+ }
+ if (game.buddy < 2 && g_UserBuddies.indexOf(playerNameRateRemove(player.Name)) != -1)
+ game.buddy = player.Team == "observer" ? 1 : 2;
+ }
+ return game; });
+
+ g_GameList = g_GameList.filter(game => !filterGame(game)).sort((a, b) => {
let sortA, sortB;
switch (sortBy)
{
@@ -642,6 +723,10 @@
sortA = a[sortBy];
sortB = b[sortBy];
break;
+ case 'buddy':
+ sortA = b.buddy + "" + g_GameStatusOrder.indexOf(a.state) + "" + a.name.toLowerCase();
+ sortB = a.buddy + "" + g_GameStatusOrder.indexOf(b.state) + "" + b.name.toLowerCase();
+ break;
case 'mapName':
sortA = translate(a.niceMapName);
sortB = translate(b.niceMapName);
@@ -661,6 +746,7 @@
return 0;
});
+ let list_buddy = [];
let list_name = [];
let list_mapName = [];
let list_mapSize = [];
@@ -679,6 +765,7 @@
if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort)
selectedGameIndex = +i;
+ list_buddy.push('[color="' + g_GameColors[game.state] + ' ' + (game.buddy ? 255 : 0) + '"]' + (game.buddy == 3 ? g_UserSign : g_BuddySign) + '[/color]');
list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName);
list_mapName.push(translateMapTitle(game.niceMapName));
list_mapSize.push(translateMapSize(game.mapSize));
@@ -688,6 +775,7 @@
list_data.push(i);
}
+ gamesBox.list_buddy = list_buddy;
gamesBox.list_name = list_name;
gamesBox.list_mapName = list_mapName;
gamesBox.list_mapSize = list_mapSize;
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
@@ -36,10 +36,13 @@
size="0 0 100% 100%"
font="sans-bold-stroke-13"
>
+
+
+
Status
-
+
Name
@@ -47,6 +50,7 @@
displayProfile("lobbylist");
+ unhideToggleBuddy(this);
updatePlayerList();
@@ -88,7 +92,13 @@