1
0
forked from 0ad/0ad

Gamesetup message cleanup.

Transform switch-statements into objects.
Make them more consistent, in particular the kick/ban and
ready-messages.
Also colorizes the playername in disconnect messages.
Fix a wrong comment in the network code and remove a duplicate check
(AIs).

This was SVN commit r17568.
This commit is contained in:
elexis 2015-12-29 14:45:53 +00:00
parent 9f65e90b60
commit 46a42c04ef
2 changed files with 74 additions and 107 deletions

View File

@ -27,7 +27,7 @@ function reportDisconnect(reason)
* Get a colorized list of usernames sorted by player slot, observers last.
* Requires g_PlayerAssignments and colorizePlayernameByGUID.
*
* @returns {string[]}
* @returns {string}
*/
function getUsernameList()
{
@ -67,7 +67,7 @@ function executeNetworkCommand(input)
switch (command)
{
case "/list":
addChatMessage({ "type": "clientlist", "guid": "local" });
addChatMessage({ "type": "clientlist" });
return true;
case "/kick":

View File

@ -23,6 +23,52 @@ const g_MapPath = {
"skirmish": "maps/skirmishes/"
};
/**
* Processes a CNetMessage (see NetMessage.h, NetMessages.h) sent by the CNetServer.
*/
const g_NetMessageTypes = {
"netstatus": msg => handleNetStatusMessage(msg),
"gamesetup": msg => handleGamesetupMessage(msg),
"players": msg => handlePlayerAssignmentMessage(msg),
"ready": msg => handleReadyMessage(msg),
"start": msg => handleGamestartMessage(msg),
"kicked": msg => addChatMessage({ "type": "kicked", "username": msg.username }),
"banned": msg => addChatMessage({ "type": "banned", "username": msg.username }),
"chat": msg => addChatMessage({ "type": "chat", "guid": msg.guid, "text": msg.text })
};
const g_FormatChatMessage = {
"system": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": msg.text
})),
"settings": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": translate('Game settings have been changed')
})),
"connect": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": sprintf(translate("%(username)s has joined"), { "username": user })
})),
"disconnect": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": sprintf(translate("%(username)s has left"), { "username": user })
})),
"kicked": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": sprintf(translate("%(username)s has been kicked"), { "username": user })
})),
"banned": (msg, user) => senderFont(sprintf(translate("== %(message)s"), {
"message": sprintf(translate("%(username)s has been banned"), { "username": user })
})),
"chat": (msg, user) => sprintf(translate("%(username)s %(message)s"), {
"username": senderFont(sprintf(translate("<%(username)s>"), { "username": user })),
"message": escapeText(msg.text || "")
}),
"ready": (msg, user) => sprintf(translate("* %(username)s is ready!"), {
"username": user
}),
"not-ready": (msg, user) => sprintf(translate("* %(username)s is not ready."), {
"username": user
}),
"clientlist": (msg, user) => getUsernameList()
};
/**
* The dropdownlist items will appear in the order they are added.
*/
@ -519,55 +565,6 @@ function initPlayerAssignments()
}
}
/**
* Processes a CNetMessage (see NetMessage.h, NetMessages.h) sent by the CNetServer.
* Saves the received object to mainlog.html.
*
* @param {Object} message
*/
function handleNetMessage(message)
{
log("Net message: " + uneval(message));
switch (message.type)
{
case "netstatus":
handleNetStatusMessage(message);
break;
case "gamesetup":
handleGamesetupMessage(message);
break;
case "players":
handlePlayerAssignmentMessage(message);
break;
case "start":
handleGamestartMessage(message);
break;
case "chat":
addChatMessage({ "type": "message", "guid": message.guid, "text": message.text });
break;
case "kicked":
addChatMessage({ "type": "system", "text": sprintf(translate("%(username)s has been kicked"), { "username": message.username })});
break;
case "banned":
addChatMessage({ "type": "system", "text": sprintf(translate("%(username)s has been banned"), { "username": message.username })});
break;
case "ready":
handleReadyMessage(message);
break;
default:
error("Unrecognised net message type " + message.type);
}
}
/**
* Called when the client disconnects.
* The other cases from NetClient should never occur in the gamesetup.
@ -575,17 +572,14 @@ function handleNetMessage(message)
*/
function handleNetStatusMessage(message)
{
switch (message.status)
if (message.status != "disconnected")
{
case "disconnected":
error("Unrecognised netstatus type " + message.status);
return;
}
cancelSetup();
reportDisconnect(message.reason);
break;
default:
error("Unrecognised netstatus type " + message.status);
break;
}
}
/**
@ -597,7 +591,10 @@ function handleReadyMessage(message)
g_ReadyChanged -= 1;
if (g_ReadyChanged < 1 && g_PlayerAssignments[message.guid].player != -1)
addChatMessage({ "type": "ready", "guid": message.guid, "ready": +message.status == 1 });
addChatMessage({
"type": message.status == 1 ? "ready" : "not-ready",
"guid": message.guid
});
if (!g_IsController)
return;
@ -664,7 +661,7 @@ function handlePlayerAssignmentMessage(message)
if (g_PlayerAssignments[guid])
continue;
addChatMessage({ "type": "connect", "username": message.hosts[guid].name });
addChatMessage({ "type": "connect", "guid": guid, "username": message.hosts[guid].name });
newGUID = guid;
// Assign the new player
@ -953,7 +950,12 @@ function onTick()
if (!message)
break;
handleNetMessage(message);
log("Net message: " + uneval(message));
if (g_NetMessageTypes[message.type])
g_NetMessageTypes[message.type](message);
else
error("Unrecognised net message type " + message.type);
}
}
}
@ -1513,7 +1515,7 @@ function updatePlayerList()
}
// There was a human, so make sure we don't have any AI left
// over in their slot, if we're in charge of the attributes
else if (g_IsController && g_GameAttributes.settings.PlayerData[playerSlot].AI && g_GameAttributes.settings.PlayerData[playerSlot].AI != "")
else if (g_IsController && g_GameAttributes.settings.PlayerData[playerSlot].AI)
{
g_GameAttributes.settings.PlayerData[playerSlot].AI = "";
if (g_IsNetworked)
@ -1615,6 +1617,11 @@ function submitChatInput()
Engine.SendNetworkChat(text);
}
function senderFont(text)
{
return '[font="' + g_SenderFont + '"]' + text + '[/font]';
}
function colorizePlayernameByGUID(guid, username = "")
{
// TODO: Maybe the host should have the moderator-prefix?
@ -1639,52 +1646,12 @@ function colorizePlayernameByGUID(guid, username = "")
function addChatMessage(msg)
{
let formatted;
let formattedUsername = colorizePlayernameByGUID(msg.guid || -1, msg.username || "");
switch (msg.type)
{
case "connect":
formatted = '[font="' + g_SenderFont + '"] ' + sprintf(translate("== %(message)s"), { "message": sprintf(translate("%(username)s has joined"), { "username": formattedUsername }) }) + '[/font]';
break;
case "disconnect":
formatted = '[font="' + g_SenderFont + '"] ' + sprintf(translate("== %(message)s"), { "message": sprintf(translate("%(username)s has left"), { "username": formattedUsername }) }) + '[/font]';
break;
case "clientlist":
formatted = getUsernameList();
break;
case "system":
formatted = '[font="' + g_SenderFont + '"] ' + sprintf(translate("== %(message)s"), { "message": msg.text }) + '[/font]';
break;
case "message":
formatted = sprintf(translate("%(username)s %(message)s"), {
"username": '[font="' + g_SenderFont + '"]' + sprintf(translate("<%(username)s>"), { "username": formattedUsername }) + '[/font]',
"message": escapeText(msg.text || "")
});
break;
case "ready":
formattedUsername = '[font="' + g_SenderFont + '"]' + formattedUsername + '[/font]';
if (msg.ready)
formatted = ' ' + sprintf(translate("* %(username)s is ready!"), { "username": formattedUsername });
else
formatted = ' ' + sprintf(translate("* %(username)s is not ready."), { "username": formattedUsername });
break;
case "settings":
formatted = '[font="' + g_SenderFont + '"] ' + sprintf(translate("== %(message)s"), { "message": translate('Game settings have been changed') }) + '[/font]';
break;
default:
error("Invalid chat message " + uneval(msg));
if (!g_FormatChatMessage[msg.type])
return;
}
g_ChatMessages.push(formatted);
let user = colorizePlayernameByGUID(msg.guid || -1, msg.username || "");
g_ChatMessages.push(g_FormatChatMessage[msg.type](msg, user));
Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
}