Ticket #3806: 3806_player_gamesetup_v0.5.patch
File 3806_player_gamesetup_v0.5.patch, 16.8 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/settings.js
37 37 "MapTypes": loadMapTypes(), 38 38 "MapSizes": loadSettingValuesFile("map_sizes.json"), 39 39 "PlayerDefaults": loadPlayerDefaults(), 40 "PlayersCanChange": loadSettingValuesFile("players_can_change.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_PlayersCanChange = prepareForDropdown(g_Settings && g_Settings.PlayersCanChange); //["None", "Color", "Civilization","Team", "All"]; 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); … … 251 252 initMapNameList(); 252 253 initNumberOfPlayers(); 253 254 initGameSpeed(); 255 initPlayersCanChange(); 254 256 initPopulationCaps(); 255 257 initStartingResources(); 256 258 initCeasefire(); … … 319 321 "optionPopulationCap", 320 322 "optionStartingResources", 321 323 "optionCeasefire", 324 "optionPlayersCanChange", 322 325 "optionRevealMap", 323 326 "optionExploreMap", 324 327 "optionDisableTreasures", … … 423 426 }; 424 427 } 425 428 429 function initPlayersCanChange() 430 { 431 let playersCanChange = Engine.GetGUIObjectByName("playersCanChange"); 432 playersCanChange.list = g_PlayersCanChange.Title; 433 playersCanChange.list_data = g_PlayersCanChange.Data; 434 playersCanChange.selected = g_PlayersCanChange.Default; 435 playersCanChange.onSelectionChange = function() { 436 if (this.selected != -1) 437 g_GameAttributes.settings.PlayersCanChange = g_PlayersCanChange.Data[this.selected]; 438 439 updateGameAttributes(); 440 }; 441 } 442 426 443 function initVictoryConditions() 427 444 { 428 445 let victoryConditions = Engine.GetGUIObjectByName("victoryCondition"); … … 1300 1317 let startingResIdx = mapSettings.StartingResources !== undefined ? g_StartingResources.Resources.indexOf(mapSettings.StartingResources) : g_StartingResources.Default; 1301 1318 let ceasefireIdx = mapSettings.Ceasefire !== undefined ? g_Ceasefire.Duration.indexOf(mapSettings.Ceasefire) : g_Ceasefire.Default; 1302 1319 let numPlayers = mapSettings.PlayerData ? mapSettings.PlayerData.length : g_MaxPlayers; 1320 let playersCanChangeIdx = mapSettings.PlayersCanChange !== undefined ? g_PlayersCanChange.Data.indexOf(mapSettings.PlayersCanChange) : g_PlayersCanChange.Default; 1303 1321 1322 1304 1323 if (g_IsController) 1305 1324 { 1306 1325 Engine.GetGUIObjectByName("mapTypeSelection").selected = mapTypeIdx; … … 1310 1329 Engine.GetGUIObjectByName("numPlayersSelection").selected = numPlayers - 1; 1311 1330 Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx; 1312 1331 Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx; 1332 Engine.GetGUIObjectByName("playersCanChange").selected = playersCanChangeIdx; 1313 1333 Engine.GetGUIObjectByName("populationCap").selected = popIdx; 1314 1334 Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx; 1315 1335 Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx; … … 1328 1348 Engine.GetGUIObjectByName("numPlayersText").caption = numPlayers; 1329 1349 Engine.GetGUIObjectByName("victoryConditionText").caption = g_VictoryConditions.Title[victoryIdx]; 1330 1350 Engine.GetGUIObjectByName("wonderDurationText").caption = g_WonderDurations.Title[wonderDurationIdx]; 1351 Engine.GetGUIObjectByName("playersCanChangeText").caption = g_PlayersCanChange.Title[playersCanChangeIdx]; 1331 1352 Engine.GetGUIObjectByName("populationCapText").caption = g_PopulationCapacities.Title[popIdx]; 1332 1353 Engine.GetGUIObjectByName("startingResourcesText").caption = g_StartingResources.Title[startingResIdx]; 1333 1354 Engine.GetGUIObjectByName("ceasefireText").caption = g_Ceasefire.Title[ceasefireIdx]; … … 1367 1388 hideControl("disableTreasures", "disableTreasuresText", notScenario); 1368 1389 hideControl("lockTeams", "lockTeamsText", notScenario); 1369 1390 1391 hideControl("playersCanChange", "playersCanChangeText"); 1392 1370 1393 setMapDescription(); 1371 1394 1372 1395 for (let i = 0; i < g_MaxPlayers; ++i) … … 1479 1502 */ 1480 1503 function updateGameAttributes() 1481 1504 { 1482 if (g_IsInGuiUpdate || !g_IsController)1505 if (g_IsInGuiUpdate )//|| !g_IsController)TODO 1483 1506 return; 1484 1507 1485 1508 if (g_IsNetworked) 1486 1509 { 1487 Engine. SetNetworkGameAttributes(g_GameAttributes);1510 Engine.NetworkChangeSettings(g_GameAttributes); 1488 1511 if (g_LoadingState >= 2) 1489 1512 sendRegisterGameStanza(); 1490 1513 } -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
250 250 <translatableAttribute id="caption">Back</translatableAttribute> 251 251 <action on="Press">cancelSetup();</action> 252 252 </object> 253 254 <object 255 name="testButton" 256 type="button" 257 style="StoneButton" 258 size="100%-500 100%-52 100%-400 100%-24" 259 tooltip_style="onscreenToolTip" 260 > 261 <translatableAttribute id="caption">Test</translatableAttribute> 262 <action on="Press">warn("test: " + g_GameAttributes.settings.RevealMap); 263 g_GameAttributes.settings.RevealMap = false; 264 updateGameAttributes(); 265 warn("after: " + g_GameAttributes.settings.RevealMap) 266 </action> 267 </object> 253 268 254 269 <!-- Options --> 255 270 <object name="gameOptionsBox" size="100%-425 529 100%-25 525"> … … 336 351 </object> 337 352 </object> 338 353 354 <object name="optionPlayersCanChange" size="14 188 94% 206"> 355 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 356 <translatableAttribute id="caption">Players can change:</translatableAttribute> 357 </object> 358 <object name="playersCanChangeText" size="40% 0 100% 100%" type="text" style="ModernLeftLabelText"/> 359 <object name="playersCanChange" size="40%+10 0 100% 28" type="dropdown" style="ModernDropDown" hidden="true" tooltip_style="onscreenToolTip"> 360 <translatableAttribute id="tooltip">Set which settings can be changed by every player.</translatableAttribute> 361 </object> 362 </object> 363 339 364 <object name="optionRevealMap" size="14 218 94% 246"> 340 365 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 341 366 <translatableAttribute id="caption" comment="Make sure to differentiate between the revealed map and explored map options!">Revealed Map:</translatableAttribute> -
binaries/data/mods/public/simulation/data/settings/players_can_change.json
1 { 2 "TranslatedKeys": ["Title"], 3 "TranslationContext": "players can change", 4 "Data": 5 [ 6 { 7 "Title": "None", 8 "Data": "none" 9 }, 10 { 11 "Title": "Color", 12 "Data": "color", 13 "Default": true 14 }, 15 { 16 "Title": "Color & Civilization", 17 "Data": "civ" 18 }, 19 { 20 "Title": "Color & Civilization & Team", 21 "Data": "team" 22 }, 23 { 24 "Title": "All", 25 "Data": "all" 26 } 27 ] 28 } -
source/gui/scripting/ScriptFunctions.cpp
344 344 g_NetServer->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface)); 345 345 } 346 346 347 void NetworkChangeSettings(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1) 348 { 349 ENSURE(g_NetClient); 350 //TODO: This is a workaround because we need to pass a MutableHandle to a JSAPI functions somewhere 351 // (with no obvious reason). 352 JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); 353 JSAutoRequest rq(cx); 354 JS::RootedValue attribs(cx, attribs1); 355 356 g_NetClient->SendChangeSettingsMessage(&attribs, *(pCxPrivate->pScriptInterface)); 357 } 358 347 359 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName) 348 360 { 349 361 ENSURE(!g_NetClient); … … 1043 1055 scriptInterface.RegisterFunction<bool, CStrW, bool, &KickPlayer>("KickPlayer"); 1044 1056 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1045 1057 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1058 scriptInterface.RegisterFunction<void, JS::HandleValue, &NetworkChangeSettings>("NetworkChangeSettings"); 1046 1059 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); 1047 1060 scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus"); 1048 1061 scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady"); -
source/network/NetClient.cpp
320 320 SetCurrState(NCS_UNCONNECTED); 321 321 } 322 322 323 void CNetClient::SendChangeSettingsMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface) 324 { 325 // Pass the attributes as JSON, since that's the easiest safe 326 // cross-thread way of passing script data 327 std::string attrsJSON = scriptInterface.StringifyJSON(attrs, false); 328 CChangeSettingsMessage changeSetting; 329 changeSetting.m_Settings = attrsJSON; 330 SendMessage(&changeSetting); 331 332 /*const CStr& setting, const CStr& value) 333 { 334 CChangeSettingsMessage changeSetting; 335 changeSetting.m_Setting = setting; 336 changeSetting.m_Value = value; 337 SendMessage(&changeSetting);*/ 338 } 339 323 340 void CNetClient::SendChatMessage(const std::wstring& text) 324 341 { 325 342 CChatMessage chat; -
source/network/NetClient.h
187 187 */ 188 188 void LoadFinished(); 189 189 190 void SendChangeSettingsMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface); 191 190 192 void SendChatMessage(const std::wstring& text); 191 193 192 194 void SendReadyMessage(const int status); -
source/network/NetMessage.cpp
198 198 case NMT_SIMULATION_COMMAND: 199 199 pNewMessage = new CSimulationMessage(scriptInterface); 200 200 break; 201 case NMT_CHANGE_SETTINGS: 202 pNewMessage = new CChangeSettingsMessage; 203 break; 201 204 202 205 default: 203 206 LOGERROR("CNetMessageFactory::CreateMessage(): Unknown message type '%d' received", header.GetType()); -
source/network/NetMessages.h
45 45 NMT_SERVER_HANDSHAKE_RESPONSE, 46 46 NMT_AUTHENTICATE, // Authentication stage 47 47 NMT_AUTHENTICATE_RESULT, 48 NMT_CHAT, // Common chat message48 NMT_CHAT, // Common chat message 49 49 NMT_READY, 50 50 NMT_GAME_SETUP, 51 51 NMT_PLAYER_ASSIGNMENT, … … 66 66 NMT_LOADED_GAME, 67 67 NMT_GAME_START, 68 68 NMT_END_COMMAND_BATCH, 69 NMT_SYNC_CHECK, // OOS-detection hash checking70 NMT_SYNC_ERROR, // OOS-detection error69 NMT_SYNC_CHECK, // OOS-detection hash checking 70 NMT_SYNC_ERROR, // OOS-detection error 71 71 NMT_SIMULATION_COMMAND, 72 NMT_CHANGE_SETTINGS, // User changes a setting in gamesetup 72 73 NMT_LAST // Last message in the list 73 74 }; 74 75 … … 109 110 END_NMT_CLASS() 110 111 111 112 START_NMT_CLASS_(Authenticate, NMT_AUTHENTICATE) 112 NMT_FIELD(CStr 8, m_GUID)113 NMT_FIELD(CStr, m_GUID) 113 114 NMT_FIELD(CStrW, m_Name) 114 115 NMT_FIELD(CStrW, m_Password) 115 116 END_NMT_CLASS() … … 121 122 END_NMT_CLASS() 122 123 123 124 START_NMT_CLASS_(Chat, NMT_CHAT) 124 NMT_FIELD(CStr 8, m_GUID) // ignored when client->server, valid when server->client125 NMT_FIELD(CStr, m_GUID) // ignored when client->server, valid when server->client 125 126 NMT_FIELD(CStrW, m_Message) 126 127 END_NMT_CLASS() 127 128 128 129 START_NMT_CLASS_(Ready, NMT_READY) 129 NMT_FIELD(CStr 8, m_GUID)130 NMT_FIELD(CStr, m_GUID) 130 131 NMT_FIELD_INT(m_Status, u8, 1) 131 132 END_NMT_CLASS() 132 133 133 134 START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT) 134 135 NMT_START_ARRAY(m_Hosts) 135 NMT_FIELD(CStr 8, m_GUID)136 NMT_FIELD(CStr, m_GUID) 136 137 NMT_FIELD(CStrW, m_Name) 137 138 NMT_FIELD_INT(m_PlayerID, i8, 1) 138 139 NMT_FIELD_INT(m_Status, u8, 1) … … 150 151 151 152 START_NMT_CLASS_(FileTransferData, NMT_FILE_TRANSFER_DATA) 152 153 NMT_FIELD_INT(m_RequestID, u32, 4) 153 NMT_FIELD(CStr 8, m_Data)154 NMT_FIELD(CStr, m_Data) 154 155 END_NMT_CLASS() 155 156 156 157 START_NMT_CLASS_(FileTransferAck, NMT_FILE_TRANSFER_ACK) … … 162 163 END_NMT_CLASS() 163 164 164 165 START_NMT_CLASS_(Rejoined, NMT_REJOINED) 165 NMT_FIELD(CStr 8, m_GUID)166 NMT_FIELD(CStr, m_GUID) 166 167 END_NMT_CLASS() 167 168 168 169 START_NMT_CLASS_(Kicked, NMT_KICKED) … … 171 172 END_NMT_CLASS() 172 173 173 174 START_NMT_CLASS_(ClientTimeout, NMT_CLIENT_TIMEOUT) 174 NMT_FIELD(CStr 8, m_GUID)175 NMT_FIELD(CStr, m_GUID) 175 176 NMT_FIELD_INT(m_LastReceivedTime, u32, 4) 176 177 END_NMT_CLASS() 177 178 178 179 START_NMT_CLASS_(ClientPerformance, NMT_CLIENT_PERFORMANCE) 179 180 NMT_START_ARRAY(m_Clients) 180 NMT_FIELD(CStr 8, m_GUID)181 NMT_FIELD(CStr, m_GUID) 181 182 NMT_FIELD_INT(m_MeanRTT, u32, 4) 182 183 NMT_END_ARRAY() 183 184 END_NMT_CLASS() … … 207 208 NMT_END_ARRAY() 208 209 END_NMT_CLASS() 209 210 211 START_NMT_CLASS_(ChangeSettings, NMT_CHANGE_SETTINGS) 212 NMT_FIELD(CStr, m_GUID) 213 NMT_FIELD(CStr, m_Settings) 214 END_NMT_CLASS() 215 210 216 END_NMTS() 211 217 212 218 #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_SETTINGS, NSS_PREGAME, (void*)&OnChangeSettings, context); 652 653 session->AddTransition(NSS_PREGAME, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnLoadedGame, context); 653 654 654 655 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); … … 1105 1106 return true; 1106 1107 } 1107 1108 1109 bool CNetServerWorker::OnChangeSettings(void* context, CFsmEvent* event) 1110 { 1111 ENSURE(event->GetType() == (uint)NMT_CHANGE_SETTINGS); 1112 CNetServerSession* session = (CNetServerSession*)context; 1113 CNetServerWorker& server = session->GetServer(); 1114 1115 CChangeSettingsMessage* message = (CChangeSettingsMessage*)event->GetParamRef(); 1116 server.m_GameAttributesQueue.push_back(message->m_Settings); 1117 return true; 1118 /*JS::RootedValue gameAttributesVal(cx); 1119 GetScriptInterface().ParseJSON(newGameAttributes.back(), &gameAttributesVal); 1120 UpdateGameAttributes(&gameAttributesVal);*/ 1121 1122 //UpdateGameAttributes(&(message->m_Settings)); 1123 1124 /* 1125 message->m_GUID = session->GetGUID(); 1126 PushGuiMessage?? 1127 server.SendMessage(m_Host, message);*/ 1128 1129 } 1130 1108 1131 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 1109 1132 { 1110 1133 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); -
source/network/NetServer.h
188 188 bool SendMessage(ENetPeer* peer, const CNetMessage* message); 189 189 190 190 /** 191 * Send message to the host 192 */ 193 bool SendMessageToHost(const CNetMessage* message); 194 195 /** 191 196 * Disconnects a player from gamesetup or session. 192 197 */ 193 198 bool KickPlayer(const CStrW& playerName, const bool ban); … … 270 275 static bool OnInGame(void* context, CFsmEvent* event); 271 276 static bool OnChat(void* context, CFsmEvent* event); 272 277 static bool OnReady(void* context, CFsmEvent* event); 278 static bool OnChangeSettings(void* context, CFsmEvent* event); 273 279 static bool OnLoadedGame(void* context, CFsmEvent* event); 274 280 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 275 281 static bool OnRejoined(void* context, CFsmEvent* event);