Ticket #2447: ready.patch
File ready.patch, 15.4 KB (added by , 10 years ago) |
---|
-
binaries/data/mods/public/gui/common/modern/sprites.xml
296 296 size="0 0 22 22" 297 297 /> 298 298 </sprite> 299 <sprite name="ModernCheckOn"> 300 <image texture="global/modern/checkbox-on.png" 301 real_texture_placement="0 0 32 32" 302 /> 303 </sprite> 304 <sprite name="ModernCheckOff"> 305 <image texture="global/modern/checkbox-off.png" 306 real_texture_placement="0 0 32 32" 307 /> 308 </sprite> 299 309 </sprites> -
binaries/data/mods/public/gui/gamesetup/gamesetup.js
35 35 36 36 // Default game setup attributes 37 37 var g_DefaultPlayerData = []; 38 var g_IsReady = false; 39 var g_ReadyData = {}; 38 40 var g_GameAttributes = { 39 41 settings: {} 40 42 }; … … 281 283 // Set up multiplayer/singleplayer bits: 282 284 if (!g_IsNetworked) 283 285 { 284 Engine.GetGUIObjectByName("chatPanel").hidden = true; 286 Engine.GetGUIObjectByName("chatPanel").hidden = true; 287 Engine.GetGUIObjectByName("toggleReady").hidden = true; 285 288 Engine.GetGUIObjectByName("enableCheats").checked = true; 286 289 g_GameAttributes.settings.CheatsEnabled = true; 287 290 } 288 291 else 289 292 { 293 Engine.GetGUIObjectByName("toggleReady").hidden = false; 290 294 Engine.GetGUIObjectByName("enableCheatsDesc").hidden = false; 291 295 Engine.GetGUIObjectByName("enableCheats").checked = false; 292 296 g_GameAttributes.settings.CheatsEnabled = false; … … 347 351 // to allow easy keyboard selection of maps 348 352 Engine.GetGUIObjectByName("mapSelection").focus(); 349 353 } 354 resetReady(); 350 355 } 351 356 352 357 function handleNetMessage(message) … … 384 389 // Find and report all joinings/leavings 385 390 for (var host in message.hosts) 386 391 if (! g_PlayerAssignments[host]) 392 { 387 393 addChatMessage({ "type": "connect", "username": message.hosts[host].name }); 394 g_ReadyData[host] = false; 395 resetReady(); 396 } 388 397 389 398 for (var host in g_PlayerAssignments) 390 399 if (! message.hosts[host]) 400 { 391 401 addChatMessage({ "type": "disconnect", "guid": host }); 402 g_ReadyData[host] = false; 403 resetReady(); 404 } 392 405 393 406 // Update the player list 394 407 g_PlayerAssignments = message.hosts; … … 399 412 break; 400 413 401 414 case "start": 415 if (!g_IsController) 416 { 417 for (var guid in g_PlayerAssignments) 418 { 419 if (g_PlayerAssignments[guid].player != 255 && !g_ReadyData[guid]) 420 { 421 cancelSetup(); 422 if (Engine.HasXmppClient()) 423 Engine.SwitchGuiPage("page_lobby.xml"); 424 else 425 Engine.SwitchGuiPage("page_pregame.xml"); 426 reportDisconnect("The host has tampered with the code"); 427 return; 428 } 429 } 430 } 402 431 if (g_IsController && Engine.HasXmppClient()) 403 432 { 404 433 var players = [ assignment.name for each (assignment in g_PlayerAssignments) ] … … 413 442 break; 414 443 415 444 case "chat": 416 addChatMessage({ "type": "message", "guid": message.guid, "text": message.text }); 445 if (message.text == "/setready") 446 { 447 Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[message.guid].player - 1) + "]").sprite = "ModernCheckOn"; 448 g_ReadyData[message.guid] = true; 449 addChatMessage({ "type": "message", "guid": message.guid, "text": "/" + g_PlayerAssignments[message.guid].name + " is ready to start!" }); 450 } 451 else if (message.text == "/unsetready") 452 { 453 Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[message.guid].player - 1) + "]").sprite = "ModernCheckOff"; 454 g_ReadyData[message.guid] = false; 455 addChatMessage({ "type": "message", "guid": message.guid, "text": "/" + g_PlayerAssignments[message.guid].name + " is not ready to start." }); 456 } 457 else 458 addChatMessage({ "type": "message", "guid": message.guid, "text": message.text }); 417 459 break; 418 460 419 461 default: … … 587 629 588 630 function cancelSetup() 589 631 { 632 g_ReadyData = {}; 633 resetReady(); 590 634 Engine.DisconnectNetworkGame(); 591 635 592 636 if (Engine.HasXmppClient()) … … 809 853 updateGameAttributes(); 810 854 } 811 855 856 function setReady(inputReady) 857 { 858 if (inputReady == g_IsReady) 859 { 860 return; 861 } 862 for (var guid in g_PlayerAssignments) 863 { 864 if (g_PlayerAssignments[guid].name.split(" (")[0] == Engine.ConfigDB_GetValue("user", "playername")) 865 { 866 if (g_PlayerAssignments[guid].player == 255) 867 addErrorMessage("You cannot be ready if you haven't been assigned yet!"); 868 if (inputReady) 869 Engine.SendNetworkChat("/setready") 870 else 871 Engine.SendNetworkChat("/unsetready"); 872 g_IsReady = inputReady; 873 } 874 } 875 } 876 877 function toggleReady() 878 { 879 setReady(!g_IsReady); 880 } 881 812 882 function launchGame() 813 883 { 814 884 if (g_IsNetworked && !g_IsController) … … 817 887 return; 818 888 } 819 889 890 if (g_IsNetworked) 891 { 892 for (var guid in g_PlayerAssignments) 893 { 894 if (g_PlayerAssignments[guid].player != 255 && !g_ReadyData[guid]) 895 { 896 addErrorMessage("All active players must be ready before starting!") 897 return; 898 } 899 } 900 } 901 820 902 // Check that we have a map 821 903 if (!g_GameAttributes.map) 822 904 return; … … 1140 1222 // Common to all game types 1141 1223 var color = iColorToString(getSetting(pData, pDefs, "Colour")); 1142 1224 pColor.sprite = "colour:"+color+" 100"; 1143 pName.caption = getSetting(pData, pDefs, "Name");1144 1225 1145 1226 var team = getSetting(pData, pDefs, "Team"); 1146 1227 var civ = getSetting(pData, pDefs, "Civ"); … … 1177 1258 1178 1259 // Game attributes include AI settings, so update the player list 1179 1260 updatePlayerList(); 1261 resetReady(); 1180 1262 } 1181 1263 1182 1264 function updateGameAttributes() … … 1204 1286 updatePlayerList(); 1205 1287 } 1206 1288 1289 function resetReady() 1290 { 1291 g_IsReady = false; 1292 // If we just joined, g_PlayerAssignments won't have been loaded yet. 1293 if (Object.keys(g_PlayerAssignments).length == 0) 1294 return; 1295 // AI and unassigned are automatically ready. 1296 for (var player = 0; player < MAX_PLAYERS; player++) 1297 { 1298 try 1299 { 1300 Engine.GetGUIObjectByName("playerReadySprite[" + String(player) + "]").sprite = "ModernCheckOn"; 1301 } 1302 catch (TypeError) {} 1303 } 1304 if (g_IsNetworked) // Set multiplayer readiness to default. 1305 { 1306 for (var guid in g_PlayerAssignments) 1307 { 1308 try 1309 { 1310 Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[guid].player - 1) + "]").sprite = "ModernCheckOff"; 1311 } 1312 catch (TypeError) {} 1313 } 1314 for (var guid in g_ReadyData) 1315 { 1316 g_ReadyData[guid] = false; 1317 } 1318 } 1319 } 1320 1207 1321 function updatePlayerList() 1208 1322 { 1209 1323 g_IsInGuiUpdate = true; … … 1412 1526 1413 1527 // Remove AI from this player slot 1414 1528 g_GameAttributes.settings.PlayerData[newSlot].AI = ""; 1529 resetReady(); 1415 1530 } 1416 1531 1417 1532 function submitChatInput() … … 1420 1535 var text = input.caption; 1421 1536 if (text.length) 1422 1537 { 1423 Engine.SendNetworkChat(text); 1538 if (text[0] == "/") 1539 { 1540 if (text.substr(1).toLowerCase() == "setready" && !g_IsReady) 1541 setReady(true); 1542 else if (text.substr(1).toLowerCase() == "unsetready" && g_IsReady) 1543 setReady(false); 1544 else 1545 addErrorMessage("The " + text.split(" ")[0] + " command is not supported."); 1546 } 1547 else 1548 Engine.SendNetworkChat(text); 1424 1549 input.caption = ""; 1425 1550 } 1426 1551 } 1427 1552 1553 function addErrorMessage(message) 1554 { 1555 var formatted = '[font="serif-bold-13"]<[color="255 0 0"]system[/color]>[/font] ' + message; 1556 g_ChatMessages.push(formatted); 1557 Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n"); 1558 } 1559 1428 1560 function addChatMessage(msg) 1429 1561 { 1430 1562 var username = escapeText(msg.username || g_PlayerAssignments[msg.guid].name); … … 1457 1589 break; 1458 1590 1459 1591 case "message": 1460 formatted = '[font="serif-bold-13"]<[color="'+ color +'"]' + username + '[/color]>[/font] ' + message; 1592 if (message[0] == '/') 1593 if (Engine.HasXmppClient()) 1594 formatted = '[font="serif-bold-13"]*[color="'+ color +'"]' + username + '[/color][/font]' + message.substr(message.indexOf(") ") + 1); 1595 else 1596 formatted = '[font="serif-bold-13"]*[color="'+ color +'"]' + username + '[/color][/font]' + message.substr(message.indexOf(" ")); 1597 else 1598 formatted = '[font="serif-bold-13"]<[color="'+ color +'"]' + username + '[/color]>[/font] ' + message; 1461 1599 break; 1462 1600 1463 1601 default: -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
14 14 <object style="TitleText" type="text" size="50%-128 4 50%+128 36"> 15 15 Match Setup 16 16 </object> 17 17 18 18 <object type="image" style="ModernDialog" size="50%-190 50%-80 50%+190 50%+80" name="loadingWindow"> 19 19 20 20 <object type="text" style="TitleText" size="50%-128 0%-16 50%+128 16"> … … 32 32 <action on="Tick"> 33 33 onTick(); 34 34 </action> 35 35 36 36 <!-- Number of Players--> 37 37 <object size="24 26 224 54"> 38 38 … … 40 40 <object size="0 0 150 28"> 41 41 <object size="0 0 100% 100%" type="text" style="ModernRightLabelText">Number of players:</object> 42 42 </object> 43 43 44 44 <!-- Number of Players--> 45 45 <object size="150 0 200 28"> 46 46 <object name="numPlayersText" size="0 0 100% 100%" type="text" style="ModernLeftLabelText"/> … … 53 53 <action on="SelectionChange">selectNumPlayers(this.list_data[this.selected]);</action> 54 54 </object> 55 55 </object> 56 </object> 56 57 57 </object>58 59 58 <!-- Player assignments --> 60 59 <object size="24 59 100%-440 358" type="image" sprite="ModernDarkBoxGold" name="playerAssignmentsPannel"> 61 60 <object size="0 6 100% 30"> 62 <object name="playerNameHeading" type="text" style="ModernLabelText" size="0 0 20% 100%">Player Name</object> 63 <object name="playerPlacementHeading" type="text" style="ModernLabelText" size="20%+5 0 50% 100%">Player Placement</object> 64 <object name="playerCivHeading" type="text" style="ModernLabelText" size="50%+65 0 85% 100%">Civilization</object> 61 <object name="playerPlacementHeading" type="text" style="ModernLabelText" size="5 0 40% 100%">Player Name</object> 62 <object name="playerCivHeading" type="text" style="ModernLabelText" size="40%+65 0 75%-26 100%">Civilization</object> 65 63 <object name="civInfoButton" 66 64 type="button" 67 65 sprite="iconInfoGold" 68 66 sprite_over="iconInfoWhite" 69 size=" 82%-8 0 82%+816"67 size="57.5%+68 0 57.5%+84 16" 70 68 tooltip_style="onscreenToolTip" 71 69 tooltip="View civilization info" 72 70 > … … 74 72 Engine.PushGuiPage("page_civinfo.xml"); 75 73 ]]></action> 76 74 </object> 77 <object name="playerTeamHeading" type="text" style="ModernLabelText" size="85%+5 0 100%-5 100%">Team</object> 75 <object name="playerTeamHeading" type="text" style="ModernLabelText" size="75%+5 0 90%-5 100%">Team</object> 76 <object name="playerReadyHeading" type="text" style="ModernLabelText" size="90%+5 0 100%-5 100%">Ready</object> 78 77 </object> 79 78 <object size="1 36 100%-1 100%"> 80 79 <repeat count="8"> 81 80 <object name="playerBox[n]" size="0 0 100% 32" hidden="true"> 82 81 <object name="playerColour[n]" type="image" size="0 0 100% 100%"/> 83 <object name="playerName[n]" type="text" style="ModernLabelText" size="0 2 20% 30"/> 84 <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="20%+5 2 50% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/> 85 <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+5 6 50%+60 26" 82 <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="5 2 40% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/> 83 <object name="playerConfig[n]" type="button" style="StoneButton" size="40%+5 6 40%+60 26" 86 84 tooltip_style="onscreenToolTip" 87 85 tooltip="Configure AI settings." 88 86 font="serif-bold-stroke-12" 89 87 >Settings</object> 90 <object name="playerCiv[n]" type="dropdown" style="ModernDropDown" size="50%+65 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/> 91 <object name="playerCivText[n]" type="text" style="ModernLabelText" size="50%+65 0 85% 30"/> 92 <object name="playerTeam[n]" type="dropdown" style="ModernDropDown" size="85%+5 2 100%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/> 93 <object name="playerTeamText[n]" type="text" style="ModernLabelText" size="85%+5 0 100%-5 100%"/> 88 <object name="playerCiv[n]" type="dropdown" style="ModernDropDown" size="40%+65 2 75% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/> 89 <object name="playerCivText[n]" type="text" style="ModernLabelText" size="40%+65 0 75% 30"/> 90 <object name="playerTeam[n]" type="dropdown" style="ModernDropDown" size="75%+5 2 90%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/> 91 <object name="playerTeamText[n]" type="text" style="ModernLabelText" size="75%+5 0 90%-5 100%"/> 92 <object name="playerReadySprite[n]" type="image" sprite="ModernCheckOff" size="95%-16 0 95%+16 32"/> 94 93 </object> 95 94 </repeat> 96 95 </object> 97 96 </object> 98 <object size="24 64 100%-460 358" type="image" sprite="CoverFillDark" name="playerAssignmentsPan nelCover" hidden="true"/>97 <object size="24 64 100%-460 358" type="image" sprite="CoverFillDark" name="playerAssignmentsPanelCover" hidden="true"/> 99 98 <!-- Map selection --> 100 99 101 100 … … 112 111 <object name="mapSelectionText" type="text" style="ModernLeftLabelText" size="0 64 100% 94" hidden="true"/> 113 112 <object name="mapSizeText" type="text" style="ModernLeftLabelText" size="0 96 100% 126" hidden="true"/> 114 113 </object> 115 114 116 115 <object name="mapTypeSelection" 117 116 type="dropdown" 118 117 style="ModernDropDown" … … 159 158 </object> 160 159 161 160 <!-- Chat window --> 162 <object name="chatPanel" size="24 370 100%-440 100%- 60" type="image" sprite="ModernDarkBoxGold">161 <object name="chatPanel" size="24 370 100%-440 100%-58" type="image" sprite="ModernDarkBoxGold"> 163 162 <object name="chatText" size="2 2 100%-2 100%-26" type="text" style="ChatPanel"/> 164 163 165 164 <object name="chatInput" size="4 100%-24 100%-76 100%-4" type="input" style="ModernInput"> … … 179 178 textcolor="white" 180 179 sprite="BackgroundTranslucent" 181 180 hidden="true" 182 size=" 100%-700 100%-56 100%-312100%-24"181 size="25 100%-56 100%-445 100%-24" 183 182 >[Tooltip text]</object> 184 183 184 <!-- Ready Button --> 185 <object 186 name="toggleReady" 187 type="button" 188 style="StoneButton" 189 hidden="false" 190 size="100%-425 100%-52 100%-305 100%-24" 191 tooltip_style="onscreenToolTip" 192 tooltip="Accept the current settings and state you are ready to play!" 193 enabled="true" 194 > 195 Set/Unset Ready 196 <action on="Press">toggleReady();</action> 197 </object> 198 185 199 <!-- Start Button --> 186 200 <object 187 201 name="startGame" 188 202 type="button" 189 203 style="StoneButton" 190 size="100%- 308 100%-52 100%-168100%-24"204 size="100%-285 100%-52 100%-165 100%-24" 191 205 tooltip_style="onscreenToolTip" 192 206 tooltip="Start a new game with the current settings." 193 207 enabled="false" … … 202 216 caption="Back" 203 217 type="button" 204 218 style="StoneButton" 205 size="100%-1 64 100%-52 100%-24100%-24"219 size="100%-145 100%-52 100%-25 100%-24" 206 220 tooltip_style="onscreenToolTip" 207 221 > 208 222 <action on="Press"> … … 215 229 ]]> 216 230 </action> 217 231 </object> 218 232 219 233 <!-- Options --> 220 234 <object name="gameOptionsBox" size="100%-425 497 100%-25 525"> 221 235 <!-- More Options Button -->