Ticket #3806: 3806_player_gamesetup_v0.9.patch

File 3806_player_gamesetup_v0.9.patch, 31.7 KB (added by Imarok, 8 years ago)

This patch works completley. One little bug is that the guestsettings setting sometimes resets. Also I need to cleanup the code to remove comments, warnings and follow the CodingConventions.

  • binaries/data/mods/public/gui/common/settings.js

     
    3737        "MapTypes": loadMapTypes(),
    3838        "MapSizes": loadSettingValuesFile("map_sizes.json"),
    3939        "PlayerDefaults": loadPlayerDefaults(),
     40        "GuestSettings": loadSettingValuesFile("guest_settings.json"),
    4041        "PopulationCapacities": loadPopulationCapacities(),
    4142        "StartingResources": loadSettingValuesFile("starting_resources.json"),
    4243        "VictoryConditions": loadVictoryConditions()
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    55const g_GameSpeeds = prepareForDropdown(g_Settings && g_Settings.GameSpeeds.filter(speed => !speed.ReplayOnly));
    66const g_MapSizes = prepareForDropdown(g_Settings && g_Settings.MapSizes);
    77const g_MapTypes = prepareForDropdown(g_Settings && g_Settings.MapTypes);
     8const g_GuestSettings = prepareForDropdown(g_Settings && g_Settings.GuestSettings); //["None", "Color", "Civilization","Team", "All"];
    89const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.PopulationCapacities);
    910const g_StartingResources = prepareForDropdown(g_Settings && g_Settings.StartingResources);
    1011const g_VictoryConditions = prepareForDropdown(g_Settings && g_Settings.VictoryConditions);
     
    146147 */
    147148const g_RandomCiv = '[color="' + g_ColorRandom + '"]' + translateWithContext("civilization", "Random") + '[/color]';
    148149
    149 // Is this is a networked game, or offline
     150// Is this a networked game, or offline
    150151var g_IsNetworked;
    151152
    152153// Is this user in control of game settings (i.e. is a network server, or offline player)
     
    260261        g_GameAttributes.settings.CheatsEnabled = !g_IsNetworked;
    261262        g_GameAttributes.settings.RatingEnabled = Engine.IsRankedGame() || undefined;
    262263
    263         initMapNameList();
    264         initNumberOfPlayers();
    265         initGameSpeed();
    266         initPopulationCaps();
    267         initStartingResources();
    268         initCeasefire();
    269         initWonderDurations();
    270         initVictoryConditions();
    271         initMapSizes();
    272         initRadioButtons();
     264        initDropdowns();
    273265    }
    274     else
    275         hideControls();
    276266
    277267    initMultiplayerSettings();
    278268    initPlayerAssignments();
     
    291281    }
    292282}
    293283
     284function initDropdowns()
     285{
     286    initMapNameList();
     287    initNumberOfPlayers();
     288    initGameSpeed();
     289    initGuestSettings();
     290    initPopulationCaps();
     291    initStartingResources();
     292    initCeasefire();
     293    initWonderDurations();
     294    initVictoryConditions();
     295    initMapSizes();
     296    initRadioButtons();
     297}
     298
    294299function initMapTypes()
    295300{
    296301    let mapTypes = Engine.GetGUIObjectByName("mapType");
     
    331336        "optionPopulationCap",
    332337        "optionStartingResources",
    333338        "optionCeasefire",
     339        "optionGuestSettings",
    334340        "optionRevealMap",
    335341        "optionExploreMap",
    336342        "optionDisableTreasures",
     
    380386function initGameSpeed()
    381387{
    382388    let gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    383     gameSpeed.hidden = false;
    384     Engine.GetGUIObjectByName("gameSpeedText").hidden = true;
     389    gameSpeed.hidden = !canPlayerChange("gameSpeed");
     390    Engine.GetGUIObjectByName("gameSpeedText").hidden = canPlayerChange("gameSpeed");
    385391    gameSpeed.list = g_GameSpeeds.Title;
    386392    gameSpeed.list_data = g_GameSpeeds.Speed;
    387393    gameSpeed.onSelectionChange = function() {
     
    435441    };
    436442}
    437443
     444function initGuestSettings()
     445{
     446    let guestSettings = Engine.GetGUIObjectByName("guestSettings");
     447    guestSettings.list = g_GuestSettings.Title;
     448    guestSettings.list_data = g_GuestSettings.Data;
     449    guestSettings.selected = g_GuestSettings.Default;
     450    guestSettings.onSelectionChange = function() {
     451        if (this.selected != -1)
     452            g_GameAttributes.settings.GuestSettings = g_GuestSettings.Data[this.selected];
     453
     454        updateGameAttributes();
     455    };
     456}
     457
    438458function initVictoryConditions()
    439459{
    440460    let victoryConditions = Engine.GetGUIObjectByName("victoryCondition");
     
    515535function hideControls()
    516536{
    517537    for (let ctrl of ["mapType", "mapFilter", "mapSelection", "victoryCondition", "gameSpeed", "numPlayers"])
    518         hideControl(ctrl, ctrl + "Text");
     538        hideControl(ctrl, ctrl + "Text", canPlayerChange(ctrl));
    519539
    520540    // TODO: Shouldn't players be able to choose their own assignment?
    521541    for (let i = 0; i < g_MaxPlayers; ++i)
     
    555575}
    556576
    557577/**
     578 * Returns if the player is allowed to change this setting
     579 */
     580function canPlayerChange(setting) // TODO
     581{
     582    if (setting == "")
     583    if (g_GameAttributes.mapType == "scenario" &&
     584         ["victoryCondition", "wonderDuration", "populationCap",
     585         "startingResources", "ceasefire", "revealMap", "exploreMap",
     586         "disableTreasures", "lockTeams", "playerCiv", "playerTeam", "playerColor"].indexOf(setting) >= 0)
     587        return false;
     588    if (g_GameAttributes.mapType != "random" && setting == "numPlayers")
     589        return false;
     590    //TODO scenario etc.?
     591    if (g_IsController)
     592        return true;
     593 
     594    switch (setting)
     595    {
     596        case "guestSettings": return false;
     597        case "playerColor": return g_GuestSettings.Data.indexOf(g_GameAttributes.settings.GuestSettings) >= g_GuestSettings.Data.indexOf("color");
     598        case "playerCiv": return g_GuestSettings.Data.indexOf(g_GameAttributes.settings.GuestSettings) >= g_GuestSettings.Data.indexOf("civ");
     599        case "playerTeam": return g_GuestSettings.Data.indexOf(g_GameAttributes.settings.GuestSettings) >= g_GuestSettings.Data.indexOf("team");
     600        default: return g_GuestSettings.Data.indexOf(g_GameAttributes.settings.GuestSettings) >= g_GuestSettings.Data.indexOf("all");
     601    }
     602}
     603
     604/**
    558605 * Hide and set some elements depending on whether we play single- or multiplayer.
    559606 */
    560607function initMultiplayerSettings()
     
    561608{
    562609    Engine.GetGUIObjectByName("chatPanel").hidden = !g_IsNetworked;
    563610    Engine.GetGUIObjectByName("optionCheats").hidden = !g_IsNetworked;
     611    Engine.GetGUIObjectByName("optionGuestSettings").hidden = !g_IsNetworked;
    564612    Engine.GetGUIObjectByName("optionRating").hidden = !Engine.HasXmppClient();
    565613
    566614    Engine.GetGUIObjectByName("enableCheats").enabled = !Engine.IsRankedGame();
     
    607655        colorPicker.list_data = g_PlayerColors.map((color, index) => index);
    608656        colorPicker.selected = -1;
    609657        colorPicker.onSelectionChange = function() { selectPlayerColor(playerSlot, this.selected); };
    610 
     658warn("color: " + colorPicker.list);
    611659        Engine.GetGUIObjectByName("playerCiv["+i+"]").onSelectionChange = function() {
    612660            if ((this.selected != -1)&&(g_GameAttributes.mapType !== "scenario"))
    613661                g_GameAttributes.settings.PlayerData[playerSlot].Civ = this.list_data[this.selected];
     
    677725}
    678726
    679727/**
    680  * Called whenever the host changed any setting.
     728 * Called whenever someone changed any setting.
    681729 * @param {Object} message
    682730 */
    683731function handleGamesetupMessage(message)
     
    695743
    696744    Engine.SetRankedGame(!!g_GameAttributes.settings.RatingEnabled);
    697745
     746   
     747    //initMapNameList();
     748
    698749    updateGUIObjects();
    699750}
    700751
     
    871922/**
    872923 * Sets the gameattributes the way they were the last time the user left the gamesetup.
    873924 */
    874 function loadPersistMatchSettings()
     925function loadPersistMatchSettings() //TODO is the guestSettings setting getting restored?
    875926{
    876927    if (Engine.ConfigDB_GetValue("user", "persistmatchsettings") != "true")
    877928        return;
     
    9951046        initGUIObjects();
    9961047        ++g_LoadingState;
    9971048    }
    998     else if (g_LoadingState == 2)
     1049    else if (g_LoadingState == 2 || g_LoadingState == 3)
    9991050    {
    10001051        while (true)
    10011052        {
     
    10061057            log("Net message: " + uneval(message));
    10071058
    10081059            if (g_NetMessageTypes[message.type])
     1060            {
    10091061                g_NetMessageTypes[message.type](message);
     1062                if (g_LoadingState == 2 && message.type == "gamesetup")
     1063                {
     1064                    ++g_LoadingState;
     1065                    initDropdowns();
     1066                    hideControls();
     1067                }
     1068            }
    10101069            else
    10111070                error("Unrecognised net message type " + message.type);
    10121071        }
     
    10221081function selectNumPlayers(num)
    10231082{
    10241083    // Avoid recursion
    1025     if (g_IsInGuiUpdate || !g_IsController || g_GameAttributes.mapType != "random")
     1084    if (g_IsInGuiUpdate || !canPlayerChange("numPlayers") || g_GameAttributes.mapType != "random")
    10261085        return;
    1027 
    10281086    // Unassign players from nonexistent slots
    10291087    if (g_IsNetworked)
    10301088    {
    10311089        for (let i = g_MaxPlayers; i > num; --i)
    1032             Engine.AssignNetworkPlayer(i, "");
     1090            Engine.AssignNetworkPlayer(i, ""); //TODO: AssignNetworkPlayer only works for host
    10331091    }
    10341092    else if (g_PlayerAssignments.local.player > num)
    10351093        g_PlayerAssignments.local.player = 1;
     
    10861144function selectMapType(type)
    10871145{
    10881146    // Avoid recursion
    1089     if (g_IsInGuiUpdate || !g_IsController)
     1147    if (g_IsInGuiUpdate )//|| !g_IsController)
    10901148        return;
    10911149
    10921150    if (!g_MapPath[type])
     
    11161174function selectMapFilter(id)
    11171175{
    11181176    // Avoid recursion
    1119     if (g_IsInGuiUpdate || !g_IsController)
     1177    if (g_IsInGuiUpdate)
    11201178        return;
    11211179
    11221180    g_GameAttributes.mapFilter = id;
     
    11301188function selectMap(name)
    11311189{
    11321190    // Avoid recursion
    1133     if (g_IsInGuiUpdate || !g_IsController || !name)
     1191    if (g_IsInGuiUpdate || !name)
    11341192        return;
    11351193
    11361194    // Reset some map specific properties which are not necessarily redefined on each map
     
    11821240        {   // Unassign extra players
    11831241            let player = g_PlayerAssignments[guid].player;
    11841242            if (player <= g_MaxPlayers && player > numPlayers)
    1185                 Engine.AssignNetworkPlayer(player, "");
     1243                Engine.AssignNetworkPlayer(player, ""); //TODO: make usable for everyone
    11861244        }
    11871245    }
    11881246
     
    12621320
    12631321    if (g_IsNetworked)
    12641322    {
    1265         Engine.SetNetworkGameAttributes(g_GameAttributes);
     1323        Engine.NetworkChangeSettings(g_GameAttributes);
    12661324        Engine.StartNetworkGame();
    12671325    }
    12681326    else
     
    13101368    let startingResIdx = mapSettings.StartingResources !== undefined ? g_StartingResources.Resources.indexOf(mapSettings.StartingResources) : g_StartingResources.Default;
    13111369    let ceasefireIdx = mapSettings.Ceasefire !== undefined ? g_Ceasefire.Duration.indexOf(mapSettings.Ceasefire) : g_Ceasefire.Default;
    13121370    let numPlayers = mapSettings.PlayerData ? mapSettings.PlayerData.length : g_MaxPlayers;
     1371    let guestSettingsIdx = mapSettings.GuestSettings !== undefined ? g_GuestSettings.Data.indexOf(mapSettings.GuestSettings) : g_GuestSettings.Default;
    13131372
    1314     if (g_IsController)
    1315     {
    1316         Engine.GetGUIObjectByName("mapType").selected = mapTypeIdx;
    1317         Engine.GetGUIObjectByName("mapFilter").selected = mapFilterIdx;
    1318         Engine.GetGUIObjectByName("mapSelection").selected = Engine.GetGUIObjectByName("mapSelection").list_data.indexOf(mapName);
    1319         Engine.GetGUIObjectByName("mapSize").selected = mapSizeIdx;
    1320         Engine.GetGUIObjectByName("numPlayers").selected = numPlayers - 1;
    1321         Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx;
    1322         Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx;
    1323         Engine.GetGUIObjectByName("populationCap").selected = popIdx;
    1324         Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx;
    1325         Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx;
    1326         Engine.GetGUIObjectByName("startingResources").selected = startingResIdx;
    1327     }
    1328     else
    1329     {
    1330         Engine.GetGUIObjectByName("mapTypeText").caption = g_MapTypes.Title[mapTypeIdx];
    1331         Engine.GetGUIObjectByName("mapFilterText").caption = g_MapFilters[mapFilterIdx].name;
    1332         Engine.GetGUIObjectByName("mapSelectionText").caption = mapName == "random" ? g_RandomMap : translate(getMapDisplayName(mapName));
     1373    Engine.GetGUIObjectByName("mapType").selected = mapTypeIdx;
     1374    Engine.GetGUIObjectByName("mapFilter").selected = mapFilterIdx;
     1375    Engine.GetGUIObjectByName("mapSelection").selected = Engine.GetGUIObjectByName("mapSelection").list_data.indexOf(mapName);
     1376    Engine.GetGUIObjectByName("mapSize").selected = mapSizeIdx;
     1377    Engine.GetGUIObjectByName("numPlayers").selected = numPlayers - 1;
     1378    Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx;
     1379    Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx;
     1380    Engine.GetGUIObjectByName("populationCap").selected = popIdx;
     1381    Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx;
     1382    Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx;
     1383    Engine.GetGUIObjectByName("startingResources").selected = startingResIdx;
     1384
     1385    //if (g_IsController)
    13331386        initMapNameList();
    1334     }
    13351387
    13361388    // Can be visible to both host and clients
    13371389    Engine.GetGUIObjectByName("mapSizeText").caption = g_GameAttributes.mapType == "random" ? g_MapSizes.LongName[mapSizeIdx] : translate("Default");
     
    13381390    Engine.GetGUIObjectByName("numPlayersText").caption = numPlayers;
    13391391    Engine.GetGUIObjectByName("victoryConditionText").caption = g_VictoryConditions.Title[victoryIdx];
    13401392    Engine.GetGUIObjectByName("wonderDurationText").caption = g_WonderDurations.Title[wonderDurationIdx];
     1393    Engine.GetGUIObjectByName("guestSettingsText").caption = g_GuestSettings.Title[guestSettingsIdx];
    13411394    Engine.GetGUIObjectByName("populationCapText").caption = g_PopulationCapacities.Title[popIdx];
    13421395    Engine.GetGUIObjectByName("startingResourcesText").caption = g_StartingResources.Title[startingResIdx];
    13431396    Engine.GetGUIObjectByName("ceasefireText").caption = g_Ceasefire.Title[ceasefireIdx];
    13441397    Engine.GetGUIObjectByName("gameSpeedText").caption = g_GameSpeeds.Title[gameSpeedIdx];
     1398    Engine.GetGUIObjectByName("mapTypeText").caption = g_MapTypes.Title[mapTypeIdx];
     1399    Engine.GetGUIObjectByName("mapFilterText").caption = g_MapFilters[mapFilterIdx].name;
     1400    Engine.GetGUIObjectByName("mapSelectionText").caption = mapName == "random" ? g_RandomMap : translate(getMapDisplayName(mapName));
    13451401
    13461402    setGUIBoolean("enableCheats", "enableCheatsText", !!mapSettings.CheatsEnabled);
    13471403    setGUIBoolean("disableTreasures", "disableTreasuresText", !!mapSettings.DisableTreasures);
     
    13641420    Engine.GetGUIObjectByName("mapSizeDesc").hidden = !isRandom;
    13651421    Engine.GetGUIObjectByName("mapSize").hidden = !isRandom || !g_IsController;
    13661422    Engine.GetGUIObjectByName("mapSizeText").hidden = !isRandom || g_IsController;
    1367     hideControl("numPlayers", "numPlayersText", isRandom && g_IsController);
    13681423
    1369     let notScenario = g_GameAttributes.mapType != "scenario" && g_IsController ;
    1370 
    13711424    for (let ctrl of ["victoryCondition", "wonderDuration", "populationCap",
    13721425                      "startingResources", "ceasefire", "revealMap",
    1373                       "exploreMap", "disableTreasures", "lockTeams"])
    1374         hideControl(ctrl, ctrl + "Text", notScenario);
     1426                      "exploreMap", "disableTreasures", "lockTeams",
     1427                      "gameSpeed", "guestSettings", "enableCheats",
     1428                      "mapSelection", "numPlayers", "mapType", "mapFilter"])
     1429        hideControl(ctrl, ctrl + "Text", canPlayerChange(ctrl));
    13751430
     1431    let notScenario = g_GameAttributes.mapType != "scenario" && g_IsController ;
     1432
    13761433    setMapDescription();
    13771434
    13781435    for (let i = 0; i < g_MaxPlayers; ++i)
     
    14081465        pCiv.selected = civ ? pCiv.list_data.indexOf(civ) : 0;
    14091466        pTeam.selected = team !== undefined && team >= 0 ? team+1 : 0;
    14101467
    1411         hideControl("playerAssignment["+i+"]", "playerAssignmentText["+i+"]", g_IsController);
    1412         hideControl("playerCiv["+i+"]", "playerCivText["+i+"]", notScenario);
    1413         hideControl("playerTeam["+i+"]", "playerTeamText["+i+"]", notScenario);
     1468        hideControl("playerAssignment["+i+"]", "playerAssignmentText["+i+"]", canPlayerChange("playerAssignment"));
     1469        hideControl("playerCiv["+i+"]", "playerCivText["+i+"]", canPlayerChange("playerCiv"));
     1470        hideControl("playerTeam["+i+"]", "playerTeamText["+i+"]", canPlayerChange("playerTeam"));
    14141471
    14151472        // Allow host to chose player colors on non-scenario maps
    14161473        let pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]");
    14171474        let pColorPickerHeading = Engine.GetGUIObjectByName("playerColorHeading");
    1418         let canChangeColors = g_IsController && g_GameAttributes.mapType != "scenario";
    1419         pColorPicker.hidden = !canChangeColors;
    1420         pColorPickerHeading.hidden = !canChangeColors;
    1421         if (canChangeColors)
     1475        //let canChangeColors = g_IsController && g_GameAttributes.mapType != "scenario";
     1476        pColorPicker.hidden = !canPlayerChange("playerColor");
     1477        pColorPickerHeading.hidden = !canPlayerChange("playerColor");
     1478        if (canPlayerChange("playerColor"))
    14221479            pColorPicker.selected = g_PlayerColors.findIndex(col => sameColor(col, color));
    14231480    }
    14241481
     
    14851542 */
    14861543function updateGameAttributes()
    14871544{
    1488     if (g_IsInGuiUpdate || !g_IsController)
     1545    if (g_IsInGuiUpdate )//|| !g_IsController)TODO
    14891546        return;
    14901547
    14911548    if (g_IsNetworked)
    14921549    {
    1493         Engine.SetNetworkGameAttributes(g_GameAttributes);
     1550        Engine.NetworkChangeSettings(g_GameAttributes);
    14941551        if (g_LoadingState >= 2)
    14951552            sendRegisterGameStanza();
    14961553    }
     
    15041561
    15051562    Engine.PushGuiPage("page_aiconfig.xml", {
    15061563        "callback": "AIConfigCallback",
    1507         "isController": g_IsController,
     1564        "isController": canPlayerChange("playerConfig"),
    15081565        "playerSlot": playerSlot,
    15091566        "id": g_GameAttributes.settings.PlayerData[playerSlot].AI,
    15101567        "difficulty": g_GameAttributes.settings.PlayerData[playerSlot].AIDiff
     
    15181575{
    15191576    g_LastViewedAIPlayer = -1;
    15201577
    1521     if (!ai.save || !g_IsController)
     1578    if (!ai.save)// || !g_IsController)
    15221579        return;
    15231580
    15241581    g_GameAttributes.settings.PlayerData[ai.playerSlot].AI = ai.id;
     
    15251582    g_GameAttributes.settings.PlayerData[ai.playerSlot].AIDiff = ai.difficulty;
    15261583
    15271584    if (g_IsNetworked)
    1528         Engine.SetNetworkGameAttributes(g_GameAttributes);
     1585        Engine.NetworkChangeSettings(g_GameAttributes);
    15291586    else
    15301587        updatePlayerList();
    15311588}
     
    16211678        {
    16221679            g_GameAttributes.settings.PlayerData[playerSlot].AI = "";
    16231680            if (g_IsNetworked)
    1624                 Engine.SetNetworkGameAttributes(g_GameAttributes);
     1681                Engine.NetworkChangeSettings(g_GameAttributes);
    16251682        }
    16261683
    16271684        let assignBox = Engine.GetGUIObjectByName("playerAssignment["+i+"]");
     
    16321689            assignBox.selected = selection;
    16331690        assignBoxText.caption = hostNameList[selection];
    16341691
    1635         if (g_IsController)
     1692        //if (g_IsController)
    16361693            assignBox.onselectionchange = function() {
    16371694                if (g_IsInGuiUpdate)
    16381695                    return;
     
    16581715                    swapPlayers(guid, playerSlot);
    16591716
    16601717                if (g_IsNetworked)
    1661                     Engine.SetNetworkGameAttributes(g_GameAttributes);
     1718                    Engine.NetworkChangeSettings(g_GameAttributes);
    16621719                else
    16631720                    updatePlayerList();
    16641721                updateReadyUI();
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    8080                            <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="22%+37 2 50%+35 30" tooltip_style="onscreenToolTip">
    8181                                <translatableAttribute id="tooltip">Select player.</translatableAttribute>
    8282                            </object>
    83                             <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+5 0 50%+35 30"/>
     83                            <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+33 0 50%+35 30"/>
    8484                            <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+40 4 50%+64 28"
    8585                                tooltip_style="onscreenToolTip"
    8686                                font="sans-bold-stroke-12"
     
    251251                <action on="Press">cancelSetup();</action>
    252252            </object>
    253253
     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>
     268 
    254269            <!-- Options -->
    255270            <object name="gameOptionsBox" size="100%-425 529 100%-25 525">
    256271                <!-- More Options Button -->
     
    336351                    </object>
    337352                </object>
    338353
     354                <object name="optionGuestSettings" size="14 188 94% 206">
     355                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
     356                        <translatableAttribute id="caption">Guest Settings:</translatableAttribute>
     357                    </object>
     358                    <object name="guestSettingsText" size="40% 0 100% 100%" type="text" style="ModernLeftLabelText"/>
     359                    <object name="guestSettings" 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
    339364                <object name="optionRevealMap" size="14 218 94% 246">
    340365                    <object size="0 0 40% 28" type="text" style="ModernRightLabelText">
    341366                        <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/guest_settings.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

     
    344344    g_NetServer->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface));
    345345}
    346346
     347void 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
    347359void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName)
    348360{
    349361    ENSURE(!g_NetClient);
     
    427439
    428440void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid)
    429441{
    430     ENSURE(g_NetServer);
     442    ENSURE(g_NetClient);
    431443
    432     g_NetServer->AssignPlayer(playerID, guid);
     444    g_NetClient->SendAssignPlayerMessage(playerID, guid);
    433445}
    434446
    435447void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready)
     
    10491061    scriptInterface.RegisterFunction<bool, CStrW, bool, &KickPlayer>("KickPlayer");
    10501062    scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient");
    10511063    scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes");
     1064    scriptInterface.RegisterFunction<void, JS::HandleValue, &NetworkChangeSettings>("NetworkChangeSettings");
    10521065    scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer");
    10531066    scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus");
    10541067    scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady");
  • source/network/NetClient.cpp

     
    321321    SetCurrState(NCS_UNCONNECTED);
    322322}
    323323
     324void CNetClient::SendChangeSettingsMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface)
     325{
     326    // Pass the attributes as JSON, since that's the easiest safe
     327    // cross-thread way of passing script data
     328    std::string attrsJSON = scriptInterface.StringifyJSON(attrs, false);
     329    CChangeSettingsMessage changeSetting;
     330    changeSetting.m_Settings = attrsJSON;
     331    SendMessage(&changeSetting);
     332   
     333    /*const CStr& setting, const CStr& value)
     334{
     335    CChangeSettingsMessage changeSetting;
     336    changeSetting.m_Setting = setting;
     337    changeSetting.m_Value = value;
     338    SendMessage(&changeSetting);*/
     339}
     340
     341void CNetClient::SendAssignPlayerMessage(const int playerID, const std::string guid)
     342{
     343    CAssignPlayerMessage assignPlayer;
     344    assignPlayer.m_PlayerID = playerID;
     345    assignPlayer.m_GUIDToAssign = guid;
     346    SendMessage(&assignPlayer);
     347}
     348
    324349void CNetClient::SendChatMessage(const std::wstring& text)
    325350{
    326351    CChatMessage chat;
  • source/network/NetClient.h

     
    187187     */
    188188    void LoadFinished();
    189189
     190    void SendChangeSettingsMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface);
     191
     192    void SendAssignPlayerMessage(const int playerID, const std::string guid);
     193
    190194    void SendChatMessage(const std::wstring& text);
    191195
    192196    void SendReadyMessage(const int status);
  • source/network/NetMessage.cpp

     
    199199        pNewMessage = new CSimulationMessage(scriptInterface);
    200200        break;
    201201
     202    case NMT_CHANGE_SETTINGS:
     203        pNewMessage = new CChangeSettingsMessage;
     204        break;
     205    case NMT_ASSIGN_PLAYER:
     206        pNewMessage = new CAssignPlayerMessage;
     207        break;
     208
    202209    default:
    203210        LOGERROR("CNetMessageFactory::CreateMessage(): Unknown message type '%d' received", header.GetType());
    204211        break;
  • source/network/NetMessages.h

     
    4545    NMT_SERVER_HANDSHAKE_RESPONSE,
    4646    NMT_AUTHENTICATE,       // Authentication stage
    4747    NMT_AUTHENTICATE_RESULT,
    48     NMT_CHAT,       // Common chat message
     48    NMT_CHAT,               // Common chat message
    4949    NMT_READY,
    5050    NMT_GAME_SETUP,
    5151    NMT_PLAYER_ASSIGNMENT,
     
    6666    NMT_LOADED_GAME,
    6767    NMT_GAME_START,
    6868    NMT_END_COMMAND_BATCH,
    69     NMT_SYNC_CHECK, // OOS-detection hash checking
    70     NMT_SYNC_ERROR, // OOS-detection error
     69    NMT_SYNC_CHECK,         // OOS-detection hash checking
     70    NMT_SYNC_ERROR,         // OOS-detection error
    7171    NMT_SIMULATION_COMMAND,
     72    NMT_CHANGE_SETTINGS,        // User changes a setting in gamesetup
     73    NMT_ASSIGN_PLAYER,
    7274    NMT_LAST                // Last message in the list
    7375};
    7476
     
    109111END_NMT_CLASS()
    110112
    111113START_NMT_CLASS_(Authenticate, NMT_AUTHENTICATE)
    112     NMT_FIELD(CStr8, m_GUID)
     114    NMT_FIELD(CStr, m_GUID)
    113115    NMT_FIELD(CStrW, m_Name)
    114116    NMT_FIELD(CStrW, m_Password)
    115117    NMT_FIELD_INT(m_IsLocalClient, u8, 1)
     
    122124END_NMT_CLASS()
    123125
    124126START_NMT_CLASS_(Chat, NMT_CHAT)
    125     NMT_FIELD(CStr8, m_GUID) // ignored when client->server, valid when server->client
     127    NMT_FIELD(CStr, m_GUID) // ignored when client->server, valid when server->client
    126128    NMT_FIELD(CStrW, m_Message)
    127129END_NMT_CLASS()
    128130
    129131START_NMT_CLASS_(Ready, NMT_READY)
    130     NMT_FIELD(CStr8, m_GUID)
     132    NMT_FIELD(CStr, m_GUID)
    131133    NMT_FIELD_INT(m_Status, u8, 1)
    132134END_NMT_CLASS()
    133135
    134136START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT)
    135137    NMT_START_ARRAY(m_Hosts)
    136         NMT_FIELD(CStr8, m_GUID)
     138        NMT_FIELD(CStr, m_GUID)
    137139        NMT_FIELD(CStrW, m_Name)
    138140        NMT_FIELD_INT(m_PlayerID, i8, 1)
    139141        NMT_FIELD_INT(m_Status, u8, 1)
     
    151153
    152154START_NMT_CLASS_(FileTransferData, NMT_FILE_TRANSFER_DATA)
    153155    NMT_FIELD_INT(m_RequestID, u32, 4)
    154     NMT_FIELD(CStr8, m_Data)
     156    NMT_FIELD(CStr, m_Data)
    155157END_NMT_CLASS()
    156158
    157159START_NMT_CLASS_(FileTransferAck, NMT_FILE_TRANSFER_ACK)
     
    163165END_NMT_CLASS()
    164166
    165167START_NMT_CLASS_(Rejoined, NMT_REJOINED)
    166     NMT_FIELD(CStr8, m_GUID)
     168    NMT_FIELD(CStr, m_GUID)
    167169END_NMT_CLASS()
    168170
    169171START_NMT_CLASS_(Kicked, NMT_KICKED)
     
    172174END_NMT_CLASS()
    173175
    174176START_NMT_CLASS_(ClientTimeout, NMT_CLIENT_TIMEOUT)
    175     NMT_FIELD(CStr8, m_GUID)
     177    NMT_FIELD(CStr, m_GUID)
    176178    NMT_FIELD_INT(m_LastReceivedTime, u32, 4)
    177179END_NMT_CLASS()
    178180
    179181START_NMT_CLASS_(ClientPerformance, NMT_CLIENT_PERFORMANCE)
    180182    NMT_START_ARRAY(m_Clients)
    181         NMT_FIELD(CStr8, m_GUID)
     183        NMT_FIELD(CStr, m_GUID)
    182184        NMT_FIELD_INT(m_MeanRTT, u32, 4)
    183185    NMT_END_ARRAY()
    184186END_NMT_CLASS()
     
    208210    NMT_END_ARRAY()
    209211END_NMT_CLASS()
    210212
     213START_NMT_CLASS_(ChangeSettings, NMT_CHANGE_SETTINGS)
     214    NMT_FIELD(CStr, m_GUID)
     215    NMT_FIELD(CStr, m_Settings)
     216END_NMT_CLASS()
     217
     218START_NMT_CLASS_(AssignPlayer, NMT_ASSIGN_PLAYER)
     219    NMT_FIELD_INT(m_PlayerID, i8, 1)
     220    NMT_FIELD(CStr, m_GUIDToAssign)
     221END_NMT_CLASS()
     222
    211223END_NMTS()
    212224
    213225#else
  • source/network/NetServer.cpp

     
    649649    session->AddTransition(NSS_PREGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context);
    650650    session->AddTransition(NSS_PREGAME, (uint)NMT_CHAT, NSS_PREGAME, (void*)&OnChat, context);
    651651    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);
     653    session->AddTransition(NSS_PREGAME, (uint)NMT_ASSIGN_PLAYER, NSS_PREGAME, (void*)&OnAssignPlayer, context);
    652654    session->AddTransition(NSS_PREGAME, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnLoadedGame, context);
    653655
    654656    session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context);
     
    11061108    return true;
    11071109}
    11081110
     1111bool CNetServerWorker::OnChangeSettings(void* context, CFsmEvent* event)
     1112{
     1113    ENSURE(event->GetType() == (uint)NMT_CHANGE_SETTINGS);
     1114    CNetServerSession* session = (CNetServerSession*)context;
     1115    CNetServerWorker& server = session->GetServer();
     1116
     1117    CChangeSettingsMessage* message = (CChangeSettingsMessage*)event->GetParamRef();
     1118    server.m_GameAttributesQueue.push_back(message->m_Settings);
     1119    return true;
     1120    /*JS::RootedValue gameAttributesVal(cx);
     1121    GetScriptInterface().ParseJSON(newGameAttributes.back(), &gameAttributesVal);
     1122    UpdateGameAttributes(&gameAttributesVal);*/
     1123
     1124    //UpdateGameAttributes(&(message->m_Settings));
     1125
     1126    /*
     1127    message->m_GUID = session->GetGUID();
     1128    PushGuiMessage??
     1129    server.SendMessage(m_Host, message);*/
     1130
     1131}
     1132
     1133bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event)
     1134{
     1135    ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER);
     1136    CNetServerSession* session = (CNetServerSession*)context;
     1137    CNetServerWorker& server = session->GetServer();
     1138
     1139    CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef();
     1140    server.m_AssignPlayerQueue.emplace_back(message->m_PlayerID, message->m_GUIDToAssign);
     1141    return true;
     1142}
     1143
    11091144bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event)
    11101145{
    11111146    ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
  • source/network/NetServer.h

     
    188188    bool SendMessage(ENetPeer* peer, const CNetMessage* message);
    189189
    190190    /**
     191     * Send message to the host
     192    */
     193    bool SendMessageToHost(const CNetMessage* message);
     194
     195    /**
    191196     * Disconnects a player from gamesetup or session.
    192197     */
    193198    bool KickPlayer(const CStrW& playerName, const bool ban);
     
    270275    static bool OnInGame(void* context, CFsmEvent* event);
    271276    static bool OnChat(void* context, CFsmEvent* event);
    272277    static bool OnReady(void* context, CFsmEvent* event);
     278    static bool OnChangeSettings(void* context, CFsmEvent* event);
     279    static bool OnAssignPlayer(void* context, CFsmEvent* event);
    273280    static bool OnLoadedGame(void* context, CFsmEvent* event);
    274281    static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event);
    275282    static bool OnRejoined(void* context, CFsmEvent* event);