Ticket #3806: 3806_player_gamesetup_v2.0.patch
File 3806_player_gamesetup_v2.0.patch, 30.8 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/aiconfig/aiconfig.js
16 16 let aiSelection = Engine.GetGUIObjectByName("aiSelection"); 17 17 aiSelection.list = g_AIDescriptions.map(ai => ai.data.name); 18 18 aiSelection.selected = g_AIDescriptions.findIndex(ai => ai.id == settings.id); 19 aiSelection.hidden = !settings. isController;19 aiSelection.hidden = !settings.canBeChanged; 20 20 21 21 let aiSelectionText = Engine.GetGUIObjectByName("aiSelectionText"); 22 22 aiSelectionText.caption = aiSelection.list[aiSelection.selected]; 23 aiSelectionText.hidden = settings. isController;23 aiSelectionText.hidden = settings.canBeChanged; 24 24 25 25 let aiDiff = Engine.GetGUIObjectByName("aiDifficulty"); 26 26 aiDiff.list = prepareForDropdown(g_Settings.AIDifficulties).Title; 27 27 aiDiff.selected = settings.difficulty; 28 aiDiff.hidden = !settings. isController;28 aiDiff.hidden = !settings.canBeChanged; 29 29 30 30 let aiDiffText = Engine.GetGUIObjectByName("aiDifficultyText"); 31 31 aiDiffText.caption = aiDiff.list[aiDiff.selected]; 32 aiDiffText.hidden = settings. isController;32 aiDiffText.hidden = settings.canBeChanged; 33 33 } 34 34 35 35 function selectAI(idx) -
binaries/data/mods/public/gui/common/settings.js
37 37 "MapTypes": loadMapTypes(), 38 38 "MapSizes": loadSettingValuesFile("map_sizes.json"), 39 39 "PlayerDefaults": loadPlayerDefaults(), 40 "GuestSettings": loadSettingValuesFile("guest_settings.json"), 40 41 "PopulationCapacities": loadPopulationCapacities(), 41 42 "StartingResources": loadSettingValuesFile("starting_resources.json"), 42 43 "VictoryConditions": loadVictoryConditions() -
binaries/data/mods/public/gui/gamesetup/gamesetup.js
5 5 const g_GameSpeeds = prepareForDropdown(g_Settings && g_Settings.GameSpeeds.filter(speed => !speed.ReplayOnly)); 6 6 const g_MapSizes = prepareForDropdown(g_Settings && g_Settings.MapSizes); 7 7 const g_MapTypes = prepareForDropdown(g_Settings && g_Settings.MapTypes); 8 const g_GuestSettings = prepareForDropdown(g_Settings && g_Settings.GuestSettings); 8 9 const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.PopulationCapacities); 9 10 const g_StartingResources = prepareForDropdown(g_Settings && g_Settings.StartingResources); 10 11 const g_VictoryConditions = prepareForDropdown(g_Settings && g_Settings.VictoryConditions); … … 270 271 initCivNameList(); 271 272 initMapTypes(); 272 273 initMapFilters(); 274 initDropdowns(); 273 275 274 276 if (g_IsController) 275 277 { … … 277 279 g_GameAttributes.matchID = Engine.GetMatchID(); 278 280 g_GameAttributes.settings.CheatsEnabled = !g_IsNetworked; 279 281 g_GameAttributes.settings.RatingEnabled = Engine.IsRankedGame() || undefined; 280 281 initMapNameList();282 initNumberOfPlayers();283 initGameSpeed();284 initPopulationCaps();285 initStartingResources();286 initCeasefire();287 initWonderDurations();288 initVictoryConditions();289 initMapSizes();290 initRadioButtons();291 282 } 292 283 else 293 284 hideControls(); … … 309 300 } 310 301 } 311 302 303 function initDropdowns() 304 { 305 initMapNameList(); 306 initNumberOfPlayers(); 307 initGameSpeed(); 308 initGuestSettings(); 309 initPopulationCaps(); 310 initStartingResources(); 311 initCeasefire(); 312 initWonderDurations(); 313 initVictoryConditions(); 314 initMapSizes(); 315 initRadioButtons(); 316 } 317 312 318 function initMapTypes() 313 319 { 314 320 let mapTypes = Engine.GetGUIObjectByName("mapType"); … … 318 324 if (this.selected != -1) 319 325 selectMapType(this.list_data[this.selected]); 320 326 }; 321 if (g_IsController) 322 mapTypes.selected = g_MapTypes.Default; 327 mapTypes.selected = g_MapTypes.Default; 323 328 } 324 329 325 330 function initMapFilters() … … 331 336 if (this.selected != -1) 332 337 selectMapFilter(this.list_data[this.selected]); 333 338 }; 334 if (g_IsController) 335 mapFilters.selected = 0; 339 mapFilters.selected = 0; 336 340 g_GameAttributes.mapFilter = "default"; 337 341 } 338 342 … … 349 353 "optionPopulationCap", 350 354 "optionStartingResources", 351 355 "optionCeasefire", 356 "optionGuestSettings", 352 357 "optionRevealMap", 353 358 "optionExploreMap", 354 359 "optionDisableTreasures", … … 398 403 function initGameSpeed() 399 404 { 400 405 let gameSpeed = Engine.GetGUIObjectByName("gameSpeed"); 401 gameSpeed.hidden = false;402 Engine.GetGUIObjectByName("gameSpeedText").hidden = true;403 406 gameSpeed.list = g_GameSpeeds.Title; 404 407 gameSpeed.list_data = g_GameSpeeds.Speed; 405 408 gameSpeed.onSelectionChange = function() { … … 453 456 }; 454 457 } 455 458 459 function initGuestSettings() 460 { 461 let guestSettings = Engine.GetGUIObjectByName("guestSettings"); 462 guestSettings.list = g_GuestSettings.Title; 463 guestSettings.list_data = g_GuestSettings.Data; 464 guestSettings.onSelectionChange = function() { 465 if (this.selected != -1) 466 g_GameAttributes.GuestSettings = g_GuestSettings.Data[this.selected]; 467 468 updateGameAttributes(); 469 }; 470 if (guestSettings.selected == -1) 471 guestSettings.selected = g_GuestSettings.Default; 472 } 473 456 474 function initVictoryConditions() 457 475 { 458 476 let victoryConditions = Engine.GetGUIObjectByName("victoryCondition"); … … 533 551 function hideControls() 534 552 { 535 553 for (let ctrl of ["mapType", "mapFilter", "mapSelection", "victoryCondition", "gameSpeed", "numPlayers"]) 536 hideControl(ctrl, ctrl + "Text" );554 hideControl(ctrl, ctrl + "Text", canPlayerChange(ctrl)); 537 555 538 // TODO: Shouldn't players be able to choose their own assignment?539 556 for (let i = 0; i < g_MaxPlayers; ++i) 540 557 { 541 558 Engine.GetGUIObjectByName("playerAssignment["+i+"]").hidden = true; … … 573 590 } 574 591 575 592 /** 593 * Returns if the player is allowed to change this setting 594 */ 595 function canPlayerChange(setting, index = -1) 596 { 597 if (g_GameAttributes.mapType == "scenario" && 598 ["victoryCondition", "wonderDuration", "populationCap", 599 "startingResources", "ceasefire", "revealMap", "exploreMap", 600 "disableTreasures", "lockTeams", "playerCiv", "playerTeam", "playerColor"].indexOf(setting) >= 0) 601 return false; 602 603 if (g_GameAttributes.mapType != "random" && setting == "numPlayers") 604 return false; 605 606 if (g_IsController) 607 return true; 608 609 if (setting == "guestSettings") 610 return false; 611 612 if (g_GuestSettings.Data.indexOf(setting) == -1) 613 return g_GameAttributes.GuestSettings == "all"; 614 615 if (index >= 0 && g_PlayerAssignments[Engine.GetPlayerGUID()] !== undefined && index != g_PlayerAssignments[Engine.GetPlayerGUID()].player-1) 616 return g_GameAttributes.GuestSettings == "all"; 617 618 return g_GuestSettings.Data.indexOf(g_GameAttributes.GuestSettings) >= g_GuestSettings.Data.indexOf(setting); 619 } 620 621 /** 576 622 * Hide and set some elements depending on whether we play single- or multiplayer. 577 623 */ 578 624 function initMultiplayerSettings() … … 579 625 { 580 626 Engine.GetGUIObjectByName("chatPanel").hidden = !g_IsNetworked; 581 627 Engine.GetGUIObjectByName("optionCheats").hidden = !g_IsNetworked; 628 Engine.GetGUIObjectByName("optionGuestSettings").hidden = !g_IsNetworked; 582 629 Engine.GetGUIObjectByName("optionRating").hidden = !Engine.HasXmppClient(); 583 630 584 631 Engine.GetGUIObjectByName("enableCheats").enabled = !Engine.IsRankedGame(); … … 695 742 } 696 743 697 744 /** 698 * Called whenever the hostchanged any setting.745 * Called whenever someone changed any setting. 699 746 * @param {Object} message 700 747 */ 701 748 function handleGamesetupMessage(message) … … 1046 1093 function selectNumPlayers(num) 1047 1094 { 1048 1095 // Avoid recursion 1049 if (g_IsInGuiUpdate || ! g_IsController|| g_GameAttributes.mapType != "random")1096 if (g_IsInGuiUpdate || !canPlayerChange("numPlayers") || g_GameAttributes.mapType != "random") 1050 1097 return; 1051 1098 1052 1099 // Unassign players from nonexistent slots … … 1110 1157 function selectMapType(type) 1111 1158 { 1112 1159 // Avoid recursion 1113 if (g_IsInGuiUpdate || !g_IsController)1160 if (g_IsInGuiUpdate) 1114 1161 return; 1115 1162 1116 1163 if (!g_MapPath[type]) … … 1140 1187 function selectMapFilter(id) 1141 1188 { 1142 1189 // Avoid recursion 1143 if (g_IsInGuiUpdate || !g_IsController)1190 if (g_IsInGuiUpdate) 1144 1191 return; 1145 1192 1146 1193 g_GameAttributes.mapFilter = id; … … 1153 1200 function selectMap(name) 1154 1201 { 1155 1202 // Avoid recursion 1156 if (g_IsInGuiUpdate || ! g_IsController || !name)1203 if (g_IsInGuiUpdate || !name) 1157 1204 return; 1158 1205 1159 1206 // Reset some map specific properties which are not necessarily redefined on each map … … 1285 1332 1286 1333 if (g_IsNetworked) 1287 1334 { 1288 Engine. SetNetworkGameAttributes(g_GameAttributes);1335 Engine.NetworkChangeSettings(g_GameAttributes); 1289 1336 Engine.StartNetworkGame(); 1290 1337 } 1291 1338 else … … 1324 1371 let mapFilterIdx = g_MapFilters.findIndex(mapFilter => mapFilter.id == (g_GameAttributes.mapFilter || "default")); 1325 1372 let mapTypeIdx = g_GameAttributes.mapType !== undefined ? g_MapTypes.Name.indexOf(g_GameAttributes.mapType) : g_MapTypes.Default; 1326 1373 let gameSpeedIdx = g_GameAttributes.gameSpeed !== undefined ? g_GameSpeeds.Speed.indexOf(g_GameAttributes.gameSpeed) : g_GameSpeeds.Default; 1374 let guestSettingsIdx = g_GameAttributes.GuestSettings !== undefined ? g_GuestSettings.Data.indexOf(g_GameAttributes.GuestSettings) : g_GuestSettings.Default; 1327 1375 1328 1376 // These dropdowns might set the default (as they ignore g_IsInGuiUpdate) 1329 1377 let mapSizeIdx = mapSettings.Size !== undefined ? g_MapSizes.Tiles.indexOf(mapSettings.Size) : g_MapSizes.Default; … … 1334 1382 let ceasefireIdx = mapSettings.Ceasefire !== undefined ? g_Ceasefire.Duration.indexOf(mapSettings.Ceasefire) : g_Ceasefire.Default; 1335 1383 let numPlayers = mapSettings.PlayerData ? mapSettings.PlayerData.length : g_MaxPlayers; 1336 1384 1337 if (g_IsController) 1338 { 1339 Engine.GetGUIObjectByName("mapType").selected = mapTypeIdx; 1340 Engine.GetGUIObjectByName("mapFilter").selected = mapFilterIdx; 1341 Engine.GetGUIObjectByName("mapSelection").selected = Engine.GetGUIObjectByName("mapSelection").list_data.indexOf(mapName); 1342 Engine.GetGUIObjectByName("mapSize").selected = mapSizeIdx; 1343 Engine.GetGUIObjectByName("numPlayers").selected = numPlayers - 1; 1344 Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx; 1345 Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx; 1346 Engine.GetGUIObjectByName("populationCap").selected = popIdx; 1347 Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx; 1348 Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx; 1349 Engine.GetGUIObjectByName("startingResources").selected = startingResIdx; 1350 } 1351 else 1352 { 1353 Engine.GetGUIObjectByName("mapTypeText").caption = g_MapTypes.Title[mapTypeIdx]; 1354 Engine.GetGUIObjectByName("mapFilterText").caption = g_MapFilters[mapFilterIdx].name; 1355 Engine.GetGUIObjectByName("mapSelectionText").caption = mapName == "random" ? g_RandomMap : translate(getMapDisplayName(mapName)); 1356 initMapNameList(); 1357 } 1385 Engine.GetGUIObjectByName("mapType").selected = mapTypeIdx; 1386 Engine.GetGUIObjectByName("mapFilter").selected = mapFilterIdx; 1387 Engine.GetGUIObjectByName("mapSelection").selected = Engine.GetGUIObjectByName("mapSelection").list_data.indexOf(mapName); 1388 Engine.GetGUIObjectByName("mapSize").selected = mapSizeIdx; 1389 Engine.GetGUIObjectByName("numPlayers").selected = numPlayers - 1; 1390 Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx; 1391 Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx; 1392 Engine.GetGUIObjectByName("populationCap").selected = popIdx; 1393 Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx; 1394 Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx; 1395 Engine.GetGUIObjectByName("startingResources").selected = startingResIdx; 1396 Engine.GetGUIObjectByName("guestSettings").selected = guestSettingsIdx; 1358 1397 1398 1399 initMapNameList(); 1400 1359 1401 // Can be visible to both host and clients 1360 1402 Engine.GetGUIObjectByName("mapSizeText").caption = g_GameAttributes.mapType == "random" ? g_MapSizes.LongName[mapSizeIdx] : translate("Default"); 1361 1403 Engine.GetGUIObjectByName("numPlayersText").caption = numPlayers; 1362 1404 Engine.GetGUIObjectByName("victoryConditionText").caption = g_VictoryConditions.Title[victoryIdx]; 1363 1405 Engine.GetGUIObjectByName("wonderDurationText").caption = g_WonderDurations.Title[wonderDurationIdx]; 1406 Engine.GetGUIObjectByName("guestSettingsText").caption = g_GuestSettings.Title[guestSettingsIdx]; 1364 1407 Engine.GetGUIObjectByName("populationCapText").caption = g_PopulationCapacities.Title[popIdx]; 1365 1408 Engine.GetGUIObjectByName("startingResourcesText").caption = g_StartingResources.Title[startingResIdx]; 1366 1409 Engine.GetGUIObjectByName("ceasefireText").caption = g_Ceasefire.Title[ceasefireIdx]; 1367 1410 Engine.GetGUIObjectByName("gameSpeedText").caption = g_GameSpeeds.Title[gameSpeedIdx]; 1411 Engine.GetGUIObjectByName("mapTypeText").caption = g_MapTypes.Title[mapTypeIdx]; 1412 Engine.GetGUIObjectByName("mapFilterText").caption = g_MapFilters[mapFilterIdx].name; 1413 Engine.GetGUIObjectByName("mapSelectionText").caption = mapName == "random" ? g_RandomMap : translate(getMapDisplayName(mapName)); 1368 1414 1369 1415 setGUIBoolean("enableCheats", "enableCheatsText", !!mapSettings.CheatsEnabled); 1370 1416 setGUIBoolean("disableTreasures", "disableTreasuresText", !!mapSettings.DisableTreasures); … … 1387 1433 Engine.GetGUIObjectByName("mapSizeDesc").hidden = !isRandom; 1388 1434 Engine.GetGUIObjectByName("mapSize").hidden = !isRandom || !g_IsController; 1389 1435 Engine.GetGUIObjectByName("mapSizeText").hidden = !isRandom || g_IsController; 1390 hideControl("numPlayers", "numPlayersText", isRandom && g_IsController);1391 1436 1392 let notScenario = g_GameAttributes.mapType != "scenario" && g_IsController ;1393 1394 1437 for (let ctrl of ["victoryCondition", "wonderDuration", "populationCap", 1395 1438 "startingResources", "ceasefire", "revealMap", 1396 "exploreMap", "disableTreasures", "lockTeams"]) 1397 hideControl(ctrl, ctrl + "Text", notScenario); 1439 "exploreMap", "disableTreasures", "lockTeams", 1440 "gameSpeed", "guestSettings", "enableCheats", 1441 "mapSelection", "numPlayers", "mapType", "mapFilter"]) 1442 hideControl(ctrl, ctrl + "Text", canPlayerChange(ctrl)); 1398 1443 1444 let notScenario = g_GameAttributes.mapType != "scenario" && g_IsController ; 1445 1399 1446 setMapDescription(); 1400 1447 1401 1448 for (let i = 0; i < g_MaxPlayers; ++i) … … 1431 1478 pCiv.selected = civ ? pCiv.list_data.indexOf(civ) : 0; 1432 1479 pTeam.selected = team !== undefined && team >= 0 ? team+1 : 0; 1433 1480 1434 hideControl("playerAssignment["+i+"]", "playerAssignmentText["+i+"]", g_IsController);1435 hideControl("playerCiv["+i+"]", "playerCivText["+i+"]", notScenario);1436 hideControl("playerTeam["+i+"]", "playerTeamText["+i+"]", notScenario);1481 hideControl("playerAssignment["+i+"]", "playerAssignmentText["+i+"]", canPlayerChange("playerAssignment", i)); 1482 hideControl("playerCiv["+i+"]", "playerCivText["+i+"]", canPlayerChange("playerCiv", i)); 1483 hideControl("playerTeam["+i+"]", "playerTeamText["+i+"]", canPlayerChange("playerTeam", i)); 1437 1484 1438 1485 // Allow host to chose player colors on non-scenario maps 1439 1486 let pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]"); 1440 1487 let pColorPickerHeading = Engine.GetGUIObjectByName("playerColorHeading"); 1441 let canChangeColors = g_IsController && g_GameAttributes.mapType != "scenario"; 1442 pColorPicker.hidden = !canChangeColors; 1443 pColorPickerHeading.hidden = !canChangeColors; 1444 if (canChangeColors) 1488 pColorPicker.hidden = !canPlayerChange("playerColor", i); 1489 pColorPickerHeading.hidden = !canPlayerChange("playerColor", i); 1490 if (canPlayerChange("playerColor", i)) 1445 1491 pColorPicker.selected = g_PlayerColors.findIndex(col => sameColor(col, color)); 1446 1492 } 1447 1493 … … 1508 1554 */ 1509 1555 function updateGameAttributes() 1510 1556 { 1511 if (g_IsInGuiUpdate || !g_IsController)1557 if (g_IsInGuiUpdate) 1512 1558 return; 1513 1559 1514 1560 if (g_IsNetworked) 1515 1561 { 1516 Engine. SetNetworkGameAttributes(g_GameAttributes);1562 Engine.NetworkChangeSettings(g_GameAttributes); 1517 1563 if (g_LoadingState >= 2) 1518 1564 sendRegisterGameStanza(); 1519 1565 } … … 1527 1573 1528 1574 Engine.PushGuiPage("page_aiconfig.xml", { 1529 1575 "callback": "AIConfigCallback", 1530 " isController": g_IsController,1576 "canBeChanged": canPlayerChange("playerConfig"), 1531 1577 "playerSlot": playerSlot, 1532 1578 "id": g_GameAttributes.settings.PlayerData[playerSlot].AI, 1533 1579 "difficulty": g_GameAttributes.settings.PlayerData[playerSlot].AIDiff … … 1541 1587 { 1542 1588 g_LastViewedAIPlayer = -1; 1543 1589 1544 if (!ai.save || !g_IsController)1590 if (!ai.save) 1545 1591 return; 1546 1592 1547 1593 g_GameAttributes.settings.PlayerData[ai.playerSlot].AI = ai.id; … … 1548 1594 g_GameAttributes.settings.PlayerData[ai.playerSlot].AIDiff = ai.difficulty; 1549 1595 1550 1596 if (g_IsNetworked) 1551 Engine. SetNetworkGameAttributes(g_GameAttributes);1597 Engine.NetworkChangeSettings(g_GameAttributes); 1552 1598 else 1553 1599 updatePlayerList(); 1554 1600 } … … 1644 1690 { 1645 1691 g_GameAttributes.settings.PlayerData[playerSlot].AI = ""; 1646 1692 if (g_IsNetworked) 1647 Engine. SetNetworkGameAttributes(g_GameAttributes);1693 Engine.NetworkChangeSettings(g_GameAttributes); 1648 1694 } 1649 1695 1650 1696 let assignBox = Engine.GetGUIObjectByName("playerAssignment["+i+"]"); … … 1655 1701 assignBox.selected = selection; 1656 1702 assignBoxText.caption = hostNameList[selection]; 1657 1703 1658 if (g_IsController) 1659 assignBox.onselectionchange = function() { 1660 if (g_IsInGuiUpdate) 1661 return; 1704 assignBox.onSelectionChange = function() { 1705 if (g_IsInGuiUpdate) 1706 return; 1662 1707 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1708 let guid = hostGuidList[this.selected]; 1709 if (!guid) 1710 { 1711 if (g_IsNetworked) 1712 // Unassign any host from this player slot 1713 Engine.AssignNetworkPlayer(playerID, ""); 1714 // Remove AI from this player slot 1715 g_GameAttributes.settings.PlayerData[playerSlot].AI = ""; 1716 } 1717 else if (guid.substr(0, 3) == "ai:") 1718 { 1719 if (g_IsNetworked) 1720 // Unassign any host from this player slot 1721 Engine.AssignNetworkPlayer(playerID, ""); 1722 // Set the AI for this player slot 1723 g_GameAttributes.settings.PlayerData[playerSlot].AI = guid.substr(3); 1724 } 1725 else 1726 swapPlayers(guid, playerSlot); 1682 1727 1683 1684 Engine.SetNetworkGameAttributes(g_GameAttributes);1685 1686 1687 1688 1728 if (g_IsNetworked) 1729 Engine.NetworkChangeSettings(g_GameAttributes); 1730 else 1731 updatePlayerList(); 1732 updateReadyUI(); 1733 }; 1689 1734 } 1690 1735 1691 1736 g_IsInGuiUpdate = false; -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
80 80 <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="22%+37 2 50%+35 30" tooltip_style="onscreenToolTip"> 81 81 <translatableAttribute id="tooltip">Select player.</translatableAttribute> 82 82 </object> 83 <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+ 50 50%+35 30"/>83 <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+33 0 50%+35 30"/> 84 84 <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+40 4 50%+64 28" 85 85 tooltip_style="onscreenToolTip" 86 86 font="sans-bold-stroke-12" … … 336 336 </object> 337 337 </object> 338 338 339 <object name="optionGuestSettings" size="14 188 94% 206"> 340 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 341 <translatableAttribute id="caption">Guest Settings:</translatableAttribute> 342 </object> 343 <object name="guestSettingsText" size="40% 0 100% 100%" type="text" style="ModernLeftLabelText"/> 344 <object name="guestSettings" size="40%+10 0 100% 28" type="dropdown" style="ModernDropDown" hidden="true" tooltip_style="onscreenToolTip"> 345 <translatableAttribute id="tooltip">Set which settings can be changed by every player.</translatableAttribute> 346 </object> 347 </object> 348 339 349 <object name="optionRevealMap" size="14 218 94% 246"> 340 350 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 341 351 <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Revealed Map:</translatableAttribute> -
source/gui/scripting/ScriptFunctions.cpp
332 332 LOGERROR("Failed to save game"); 333 333 } 334 334 335 void SetNetworkGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1)335 void NetworkChangeSetting(ScriptInterface::CxPrivate* pCxPrivate, const std::string& changedSetting, const std::string& value) 336 336 { 337 ENSURE(g_NetServer); 337 ENSURE(g_NetClient); 338 g_NetClient->SendChangeSettingMessage(changedSetting, value); 339 } 340 341 void NetworkSetGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1) 342 { 343 ENSURE(g_NetClient); 338 344 //TODO: This is a workaround because we need to pass a MutableHandle to a JSAPI functions somewhere 339 345 // (with no obvious reason). 340 346 JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); … … 341 347 JSAutoRequest rq(cx); 342 348 JS::RootedValue attribs(cx, attribs1); 343 349 344 g_Net Server->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface));350 g_NetClient->SendSetGameAttributesMessage(&attribs, *(pCxPrivate->pScriptInterface)); 345 351 } 346 352 347 353 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName) … … 427 433 428 434 void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid) 429 435 { 430 ENSURE(g_Net Server);436 ENSURE(g_NetClient); 431 437 432 g_Net Server->AssignPlayer(playerID, guid);438 g_NetClient->SendAssignPlayerMessage(playerID, guid); 433 439 } 434 440 435 441 void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready) … … 1048 1054 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1049 1055 scriptInterface.RegisterFunction<bool, CStrW, bool, &KickPlayer>("KickPlayer"); 1050 1056 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1051 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1057 scriptInterface.RegisterFunction<void, std::string, std::string, &NetworkChangeSetting>("NetworkChangeSetting"); 1058 scriptInterface.RegisterFunction<void, JS::HandleValue, &NetworkSetGameAttributes>("NetworkSetGameAttributes"); 1052 1059 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); 1053 1060 scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus"); 1054 1061 scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady"); -
source/network/NetClient.cpp
321 321 SetCurrState(NCS_UNCONNECTED); 322 322 } 323 323 324 void CNetClient::SendChangeSettingMessage(const std::string& changedSetting, const std::string& value) 325 { 326 CChangeSettingMessage changeSetting; 327 changeSetting.m_ChangedSetting = changedSetting; 328 changeSetting.m_NewValue = value; 329 SendMessage(&changeSetting); 330 } 331 332 void CNetClient::SendSetGameAttributesMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface) 333 { 334 // Pass the attributes as JSON, since that's the easiest safe 335 // cross-thread way of passing script data 336 std::string attrsJSON = scriptInterface.StringifyJSON(attrs, false); 337 CSetGameAttributesMessage setGameAttributes; 338 setGameAttributes.m_GameAttributes = attrsJSON; 339 SendMessage(&setGameAttributes); 340 } 341 342 void CNetClient::SendAssignPlayerMessage(const int playerID, const std::string& guid) 343 { 344 CAssignPlayerMessage assignPlayer; 345 assignPlayer.m_PlayerID = playerID; 346 assignPlayer.m_GUIDToAssign = guid; 347 SendMessage(&assignPlayer); 348 } 349 324 350 void CNetClient::SendChatMessage(const std::wstring& text) 325 351 { 326 352 CChatMessage chat; -
source/network/NetClient.h
187 187 */ 188 188 void LoadFinished(); 189 189 190 void SendChangeSettingMessage(const std::string& changedSetting, const std::string& value); 191 192 void SendSetGameAttributesMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface); 193 194 void SendAssignPlayerMessage(const int playerID, const std::string& guid); 195 190 196 void SendChatMessage(const std::wstring& text); 191 197 192 198 void SendReadyMessage(const int status); -
source/network/NetMessage.cpp
199 199 pNewMessage = new CSimulationMessage(scriptInterface); 200 200 break; 201 201 202 case NMT_CHANGE_SETTING: 203 pNewMessage = new CChangeSettingMessage; 204 break; 205 206 case NMT_SET_GAME_ATTRIBUTES: 207 pNewMessage = new CSetGameAttributesMessage; 208 break; 209 210 case NMT_ASSIGN_PLAYER: 211 pNewMessage = new CAssignPlayerMessage; 212 break; 213 202 214 default: 203 215 LOGERROR("CNetMessageFactory::CreateMessage(): Unknown message type '%d' received", header.GetType()); 204 216 break; -
source/network/NetMessages.h
28 28 29 29 #define PS_PROTOCOL_MAGIC 0x5073013f // 'P', 's', 0x01, '?' 30 30 #define PS_PROTOCOL_MAGIC_RESPONSE 0x50630121 // 'P', 'c', 0x01, '!' 31 #define PS_PROTOCOL_VERSION 0x0101001 2// Arbitrary protocol31 #define PS_PROTOCOL_VERSION 0x01010013 // Arbitrary protocol 32 32 #define PS_DEFAULT_PORT 0x5073 // 'P', 's' 33 33 34 34 // Defines the list of message types. The order of the list must not change. … … 69 69 NMT_SYNC_CHECK, // OOS-detection hash checking 70 70 NMT_SYNC_ERROR, // OOS-detection error 71 71 NMT_SIMULATION_COMMAND, 72 NMT_CHANGE_SETTING, 73 NMT_SET_GAME_ATTRIBUTES, 74 NMT_ASSIGN_PLAYER, 72 75 NMT_LAST // Last message in the list 73 76 }; 74 77 … … 208 211 NMT_END_ARRAY() 209 212 END_NMT_CLASS() 210 213 214 START_NMT_CLASS_(ChangeSetting, NMT_CHANGE_SETTING) 215 NMT_FIELD(CStr, m_GUID) // Ignored when client->server, valid when server->client 216 NMT_FIELD(CStr, m_ChangedSetting) 217 NMT_FIELD(CStr, m_NewValue) 218 END_NMT_CLASS() 219 220 START_NMT_CLASS_(SetGameAttributes, NMT_SET_GAME_ATTRIBUTES) 221 NMT_FIELD(CStr, m_GameAttributes) 222 END_NMT_CLASS() 223 224 START_NMT_CLASS_(AssignPlayer, NMT_ASSIGN_PLAYER) 225 NMT_FIELD_INT(m_PlayerID, i8, 1) 226 NMT_FIELD(CStr, m_GUIDToAssign) 227 END_NMT_CLASS() 228 211 229 END_NMTS() 212 230 213 231 #else -
source/network/NetServer.cpp
649 649 session->AddTransition(NSS_PREGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 650 650 session->AddTransition(NSS_PREGAME, (uint)NMT_CHAT, NSS_PREGAME, (void*)&OnChat, context); 651 651 session->AddTransition(NSS_PREGAME, (uint)NMT_READY, NSS_PREGAME, (void*)&OnReady, context); 652 session->AddTransition(NSS_PREGAME, (uint)NMT_CHANGE_SETTING, NSS_PREGAME, (void*)&OnChangeSetting, context); 653 session->AddTransition(NSS_PREGAME, (uint)NMT_SET_GAME_ATTRIBUTES, NSS_PREGAME, (void*)&OnSetGameAttributes, context); 654 session->AddTransition(NSS_PREGAME, (uint)NMT_ASSIGN_PLAYER, NSS_PREGAME, (void*)&OnAssignPlayer, context); 652 655 session->AddTransition(NSS_PREGAME, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnLoadedGame, context); 653 656 654 657 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); … … 1106 1109 return true; 1107 1110 } 1108 1111 1112 bool CNetServerWorker::OnChangeSetting(void* context, CFsmEvent* event) 1113 { 1114 ENSURE(event->GetType() == (uint)NMT_CHANGE_SETTING); 1115 CNetServerSession* session = (CNetServerSession*)context; 1116 CNetServerWorker& server = session->GetServer(); 1117 1118 CChangeSettingMessage* message = (CChangeSettingMessage*)event->GetParamRef(); 1119 message->m_GUID = session->GetGUID(); 1120 // Forward message to host 1121 for (CNetServerSession* session : server.m_Sessions) 1122 if (session->GetCurrState() == NSS_PREGAME && session->GetGUID() == server.m_HostGUID) 1123 return session->SendMessage(message); 1124 return false; 1125 } 1126 1127 bool CNetServerWorker::OnSetGameAttributes(void* context, CFsmEvent* event) 1128 { 1129 ENSURE(event->GetType() == (uint)NMT_CHANGE_SETTING); 1130 CNetServerSession* session = (CNetServerSession*)context; 1131 CNetServerWorker& server = session->GetServer(); 1132 1133 if (session->GetGUID() != server.m_HostGUID) // Client wasn't allowed to send new attributes 1134 return false; 1135 1136 CSetGameAttributesMessage* message = (CSetGameAttributesMessage*)event->GetParamRef(); 1137 server.m_GameAttributesQueue.push_back(message->m_GameAttributes); 1138 return true; 1139 } 1140 1141 bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event) 1142 { 1143 ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER); 1144 CNetServerSession* session = (CNetServerSession*)context; 1145 CNetServerWorker& server = session->GetServer(); 1146 1147 if (session->GetGUID() != server.m_HostGUID) // Client wasn't allowed to assign a player 1148 return false; 1149 1150 CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef(); 1151 server.m_AssignPlayerQueue.emplace_back(message->m_PlayerID, message->m_GUIDToAssign); 1152 return true; 1153 } 1154 1109 1155 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 1110 1156 { 1111 1157 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); -
source/network/NetServer.h
270 270 static bool OnInGame(void* context, CFsmEvent* event); 271 271 static bool OnChat(void* context, CFsmEvent* event); 272 272 static bool OnReady(void* context, CFsmEvent* event); 273 static bool OnChangeSetting(void* context, CFsmEvent* event); 274 static bool OnSetGameAttributes(void* context, CFsmEvent* event); 275 static bool OnAssignPlayer(void* context, CFsmEvent* event); 273 276 static bool OnLoadedGame(void* context, CFsmEvent* event); 274 277 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 275 278 static bool OnRejoined(void* context, CFsmEvent* event);