Ticket #2640: 2640_4.patch
File 2640_4.patch, 15.5 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/common/functions_chat.js
1 const INVALID_MESSAGE = "Invalid chat message "; 2 3 // GAMESETUP CONSTANTS 4 const CONNECT_TEXT = " has joined"; 5 const DISCONNECT_TEXT = " has left"; 6 const USER_READY_TEXT = " is ready!"; 7 const USER_NOT_READY_TEXT = " is not ready."; 8 const SETTINGS_CHANGED_TEXT = "Game settings have been changed"; 9 10 // IN-GAME CONSTANTS 11 const CONNECT_TEXT_INGAME = " has joined the game."; 12 const DISCONNECT_TEXT_INGAME = " has left the game."; 13 14 const DEFEATED_TEXT_PLAYER_1 = "You have been defeated." 15 const DEFEATED_TEXT_PLAYER_X = " has been defeated." 16 17 const DIPLOMACY_ALLY_TEXT = "You are now allied with "; 18 const DIPLOMACY_ENEMY_TEXT = "You are now at war with "; 19 const DIPLOMACY_NEUTRAL_TEXT = "You are now neutral with "; 20 const DIPLOMACY_ALLY_TEXT_2 = " is now allied with you."; 21 const DIPLOMACY_ENEMY_TEXT_2 = " is now at war with you."; 22 const DIPLOMACY_NEUTRAL_TEXT_2 = " is now neutral with you."; 23 24 const TRIBUTE_TEXT = " has sent you "; 25 const ATTACK_TEXT = "You have been attacked by "; 26 27 28 // GAMESETUP MESSAGE TYPES and IN-GAME MESSAGE TYPES 29 const CONNECT_STR = "connect"; 30 const DISCONNECT_STR = "disconnect"; 31 const MESSAGE_STR = "message"; 32 33 // GAMESETUP MESSAGE TYPES 34 const READY_STR = "ready"; 35 const SETTINGS_STR = "settings"; 36 37 38 // IN-GAME MESSAGE TYPES 39 const DEFEAT_STR = "defeat"; 40 const DIPLOMACY_STR = "diplomacy"; 41 const TRIBUTE_STR = "tribute"; 42 const ATTACK_STR = "attack"; 43 44 45 46 // other miscellaneous constants 47 const ALLY_STR = "ally"; 48 const ENEMY_STR = "enemy"; 49 const NEUTRAL_STR = "neutral"; 50 No newline at end of file -
binaries/data/mods/public/gui/common/functions_utility.js
284 284 input.caption = newText + text.substring(bufferPosition); 285 285 input.buffer_position = bufferPosition + (newText.length - textTillBufferPosition.length); 286 286 } 287 288 function colorText(text, color) 289 { 290 return '[color="'+ color +'"]' + text + '[/color]'; 291 } 292 293 function boldText(text) 294 { 295 return '[font="sans-bold-13"] ' + text + '[/font]'; 296 } 297 298 function prependText(text, textToPrepend) 299 { 300 return textToPrepend + text; 301 } 302 303 function postpendText(text, textToPostpend) 304 { 305 return text + textToPostpend; 306 } -
binaries/data/mods/public/gui/gamesetup/gamesetup.js
1660 1660 1661 1661 color = rgbToGuiColor(getSetting(pData, pDefs, "Color")); 1662 1662 } 1663 1664 username = colorText(username, color); 1663 1665 1664 1666 var formatted; 1665 1667 switch (msg.type) 1666 1668 { 1667 case "connect": 1668 var formattedUsername = '[color="'+ color +'"]' + username + '[/color]'; 1669 formatted = '[font="sans-bold-13"] ' + sprintf(translate("== %(message)s"), { message: sprintf(translate("%(username)s has joined"), { username: formattedUsername }) }) + '[/font]'; 1669 case CONNECT_STR: 1670 formatted = boldText(sprintf(translate("== %(message)s"), { message: sprintf(translate("%(username)s" + CONNECT_TEXT), {username : username})})); 1670 1671 break; 1671 1672 1672 case "disconnect": 1673 var formattedUsername = '[color="'+ color +'"]' + username + '[/color]'; 1674 formatted = '[font="sans-bold-13"] ' + sprintf(translate("== %(message)s"), { message: sprintf(translate("%(username)s has left"), { username: formattedUsername }) }) + '[/font]'; 1673 case DISCONNECT_STR: 1674 formatted = boldText(sprintf(translate("== %(message)s"), { message: sprintf(translate("%(username)s" + DISCONNECT_TEXT), {username : username})})); 1675 1675 break; 1676 1676 1677 case "message": 1678 var formattedUsername = '[color="'+ color +'"]' + username + '[/color]'; 1679 var formattedUsernamePrefix = '[font="sans-bold-13"]' + sprintf(translate("<%(username)s>"), { username: formattedUsername }) + '[/font]' 1677 case MESSAGE_STR: 1678 var formattedUsernamePrefix = boldText(sprintf(translate("<%(username)s>"), {username : username})); 1680 1679 formatted = sprintf(translate("%(username)s %(message)s"), { username: formattedUsernamePrefix, message: message }); 1681 1680 break; 1682 1681 1683 case "ready": 1684 var formattedUsername = '[font="sans-bold-13"][color="'+ color +'"]' + username + '[/color][/font]' 1682 case READY_STR: 1685 1683 if (msg.ready) 1686 formatted = ' ' + sprintf(translate("* %(username)s is ready!"), { username: formattedUsername});1684 formatted = ' ' + sprintf(translate("* %(username)s is ready!"), {username: boldText(username)}); 1687 1685 else 1688 formatted = ' ' + sprintf(translate("* %(username)s is not ready."), { username: formattedUsername});1686 formatted = ' ' + sprintf(translate("* %(username)s is not ready."), {username: boldText(username)}); 1689 1687 break; 1690 1688 1691 case "settings":1692 formatted = '[font="sans-bold-13"] ' + sprintf(translate("== %(message)s"), { message: translate('Game settings have been changed') }) + '[/font]';1689 case SETTINGS_STR: 1690 formatted = boldText(sprintf(translate("== %(message)s"), { message: translate(SETTINGS_CHANGED_TEXT) })); 1693 1691 break; 1694 1692 1695 1693 default: 1696 error(sprintf( "Invalid chat message'%(message)s'", { message: uneval(msg) }));1694 error(sprintf(INVALID_MESSAGE + "'%(message)s'", { message: uneval(msg) })); 1697 1695 return; 1698 1696 } 1699 1697 -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
3 3 <objects> 4 4 5 5 <script file="gui/common/network.js"/> 6 <script file="gui/common/functions_chat.js"/> 6 7 <script file="gui/common/functions_civinfo.js"/> 7 8 <script file="gui/common/functions_global_object.js"/> 8 9 <script file="gui/common/functions_utility.js"/> -
binaries/data/mods/public/gui/session/messages.js
388 388 389 389 function addChatMessage(msg, playerAssignments) 390 390 { 391 // take care of exit cases early so it cleans up the logic below 392 if ((msg.type == "tribute" || msg.type == "attack") && msg.player != Engine.GetPlayerID()) 393 return; 394 // May have been hidden by the 'team' command. 395 if (msg.type == "message" && msg.hide) 396 return; 397 // Don't need to alert diplomacy if we're not involved 398 if (msg.type == "diplomacy" && (msg.player != Engine.GetPlayerID() && msg.player1 != Engine.GetPlayerID())) 399 return; 400 391 401 // Default to global assignments, but allow overriding for when reporting 392 402 // new players joining 393 403 if (!playerAssignments) … … 408 418 username = escapeText(playerAssignments[msg.guid].name); 409 419 410 420 // Parse in-line commands in regular messages. 411 if (msg.type == "message")421 if (msg.type == MESSAGE_STR) 412 422 parseChatCommands(msg, playerAssignments); 413 423 } 414 else if (msg.type == "defeat"&& msg.player)424 else if (msg.type == DEFEAT_STR && msg.player) 415 425 { 416 426 [username, playerColor] = getUsernameAndColor(msg.player); 417 427 } 418 else if (msg.type == "message")428 else if (msg.type == MESSAGE_STR) 419 429 { 420 430 [username, playerColor] = getUsernameAndColor(msg.player); 421 431 parseChatCommands(msg, playerAssignments); … … 427 437 } 428 438 429 439 var formatted; 430 440 var formattedUserName = colorText(username, playerColor); 441 431 442 switch (msg.type) 432 443 { 433 case "connect":434 formatted = sprintf(translate("%(player)s has joined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});444 case CONNECT_STR: 445 formatted = sprintf(translate("%(player)s" + CONNECT_TEXT_INGAME), {player : formattedUserName}); 435 446 break; 436 case "disconnect":437 formatted = sprintf(translate("%(player)s has left the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});447 case DISCONNECT_STR: 448 formatted = sprintf(translate("%(player)s" + DISCONNECT_TEXT_INGAME), {player : formattedUserName}); 438 449 break; 439 case "defeat":450 case DEFEAT_STR: 440 451 // In singleplayer, the local player is "You". "You has" is incorrect. 441 452 if (!g_IsNetworked && msg.player == Engine.GetPlayerID()) 442 formatted = translate( "You have been defeated.");453 formatted = translate(DEFEATED_TEXT_PLAYER_1); 443 454 else 444 formatted = sprintf(translate("%(player)s has been defeated."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});455 formatted = sprintf(translate("%(player)s" + DEFEATED_TEXT_PLAYER_X), {player : formattedUserName}); 445 456 break; 446 case "diplomacy": 447 var status = (msg.status == "ally" ? "allied" : (msg.status == "enemy" ? "at war" : "neutral")); 457 case DIPLOMACY_STR: 448 458 if (msg.player == Engine.GetPlayerID()) 449 459 { 450 460 [username, playerColor] = getUsernameAndColor(msg.player1); 451 if (msg.status == "ally")452 formatted = sprintf(translate( "You are now allied with %(player)s."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});453 else if (msg.status == "enemy")454 formatted = sprintf(translate( "You are now at war with %(player)s."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});455 else // (msg.status == "neutral")456 formatted = sprintf(translate( "You are now neutral with %(player)s."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});461 if (msg.status == ALLY_STR) 462 formatted = sprintf(translate(DIPLOMACY_ALLY_TEXT + "%(player)s."), {player : formattedUserName}); 463 else if (msg.status == ENEMY_STR) 464 formatted = sprintf(translate(DIPLOMACY_ENEMY_TEXT + "%(player)s."), {player : formattedUserName}); 465 else 466 formatted = sprintf(translate(DIPLOMACY_NEUTRAL_TEXT + "%(player)s."), {player : formattedUserName}); 457 467 } 458 468 else if (msg.player1 == Engine.GetPlayerID()) 459 469 { 460 470 [username, playerColor] = getUsernameAndColor(msg.player); 461 if (msg.status == "ally")462 formatted = sprintf(translate("%(player)s is now allied with you."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});463 else if (msg.status == "enemy")464 formatted = sprintf(translate("%(player)s is now at war with you."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});465 else // (msg.status == "neutral")466 formatted = sprintf(translate("%(player)s is now neutral with you."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]"});471 if (msg.status == ALLY_STR) 472 formatted = sprintf(translate("%(player)s" + DIPLOMACY_ALLY_TEXT_2), {player : formattedUserName}); 473 else if (msg.status == ENEMY_STR) 474 formatted = sprintf(translate("%(player)s" + DIPLOMACY_ENEMY_TEXT_2), {player : formattedUserName}); 475 else 476 formatted = sprintf(translate("%(player)s" + DIPLOMACY_NEUTRAL_TEXT_2), {player : formattedUserName}); 467 477 } 468 else // No need for other players to know of this. 469 return; 470 break; 471 case "tribute": 472 if (msg.player != Engine.GetPlayerID()) 473 return; 474 478 case TRIBUTE_STR: 475 479 [username, playerColor] = getUsernameAndColor(msg.player1); 476 480 477 // Format the amounts to proper English: 200 food, 100 wood, and 300 metal; 100 food; 400 wood and 200 stone 478 let amounts = Object.keys(msg.amounts) 479 .filter(function (type) { return msg.amounts[type] > 0; }) 480 .map(function (type) { return sprintf(translate("%(amount)s %(resourceType)s"), { 481 "amount": msg.amounts[type], 482 "resourceType": getLocalizedResourceName(type, "withinSentence")}); 483 }); 481 let amounts = getTributeAmounts(msg); 484 482 485 if (amounts.length > 1) 486 { 487 let lastAmount = amounts.pop(); 488 amounts = sprintf(translate("%(previousAmounts)s and %(lastAmount)s"), { 489 previousAmounts: amounts.join(translate(", ")), 490 lastAmount: lastAmount 491 }); 492 } 493 494 formatted = sprintf(translate("%(player)s has sent you %(amounts)s."), { 495 player: "[color=\"" + playerColor + "\"]" + username + "[/color]", 483 formatted = sprintf(translate("%(player)s" + TRIBUTE_TEXT + "%(amounts)s."), { 484 player: formattedUserName, 496 485 amounts: amounts 497 486 }); 498 487 break; 499 case "attack": 500 if (msg.player != Engine.GetPlayerID()) 501 return; 502 488 case ATTACK_STR: 503 489 [username, playerColor] = getUsernameAndColor(msg.attacker); 504 formatted = sprintf(translate( "You have been attacked by %(attacker)s!"), { attacker: "[color=\"" + playerColor + "\"]" + username + "[/color]"});490 formatted = sprintf(translate(ATTACK_TEXT + "%(attacker)s!"), {attacker : colorText(username, playerColor)}); 505 491 break; 506 case "message": 507 // May have been hidden by the 'team' command. 508 if (msg.hide) 509 return; 510 492 case MESSAGE_STR: 511 493 var message; 512 494 if ("translate" in msg && msg.translate) 513 495 { … … 528 510 { 529 511 formatted = sprintf(translate("(%(context)s) * %(user)s %(message)s"), { 530 512 context: msg.context, 531 user: "[color=\"" + playerColor + "\"]" + username + "[/color]",513 user: formattedUserName, 532 514 message: message 533 515 }); 534 516 } … … 535 517 else 536 518 { 537 519 formatted = sprintf(translate("* %(user)s %(message)s"), { 538 user: "[color=\"" + playerColor + "\"]" + username + "[/color]",520 user: formattedUserName, 539 521 message: message 540 522 }); 541 523 } … … 542 524 } 543 525 else 544 526 { 545 var userTag = sprintf(translate("<%(user)s>"), { user: username})546 var formattedUserTag = sprintf(translate("<%(user)s>"), { user: "[color=\"" + playerColor + "\"]" + username + "[/color]"})527 var userTag = sprintf(translate("<%(user)s>"), {user : username}) 528 var formattedUserTag = sprintf(translate("<%(user)s>"), {user : formattedUserName}) 547 529 if (msg.context !== "") 548 530 { 549 531 formatted = sprintf(translate("(%(context)s) %(userTag)s %(message)s"), { … … 559 541 } 560 542 break; 561 543 default: 562 error(sprintf( "Invalid chat message'%(message)s'", { message: uneval(msg) }));544 error(sprintf(INVALID_MESSAGE + "'%(message)s'", { message: uneval(msg) })); 563 545 return; 564 546 } 565 547 … … 572 554 Engine.GetGUIObjectByName("chatText").caption = chatMessages.join("\n"); 573 555 } 574 556 557 function getTributeAmounts(msg) { 558 // Format the amounts to proper English: 200 food, 100 wood, and 300 metal; 100 food; 400 wood and 200 stone 559 let amounts = Object.keys(msg.amounts) 560 .filter(function (type) { return msg.amounts[type] > 0; }) 561 .map(function (type) { return sprintf(translate("%(amount)s %(resourceType)s"), { 562 amount: msg.amounts[type], 563 resourceType: getLocalizedResourceName(type, "withinSentence")}); 564 }); 565 566 if (amounts.length > 1) 567 { 568 let lastAmount = amounts.pop(); 569 amounts = sprintf(translate("%(previousAmounts)s and %(lastAmount)s"), { 570 previousAmounts: amounts.join(translate(", ")), 571 lastAmount: lastAmount 572 }); 573 } 574 return amounts; 575 } 576 575 577 function removeOldChatMessages() 576 578 { 577 579 clearTimeout(chatTimers[0]); // The timer only needs to be cleared when new messages bump old messages off -
binaries/data/mods/public/gui/session/session.xml
3 3 <objects> 4 4 5 5 <script file="gui/common/colorFades.js"/> 6 <script file="gui/common/functions_chat.js"/> 6 7 <script file="gui/common/functions_civinfo.js"/> 7 8 <script file="gui/common/functions_global_object.js"/> 8 9 <script file="gui/common/functions_utility.js"/>