Ticket #3242: t3242_observer_late_join_v1.patch

File t3242_observer_late_join_v1.patch, 8.1 KB (added by elexis, 9 years ago)

Thanks again to Yves for helping me with the SpiderMonkey interaction! This patch implements the described function.

  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    152152    var mapFilters = Engine.GetGUIObjectByName("mapFilterSelection");
    153153    mapFilters.list = getFilterNames();
    154154    mapFilters.list_data = getFilterIds();
    155155    g_GameAttributes.mapFilter = "default";
    156156
     157    // Reduce size of more mptions dialog by two options (observer late join and rated games = 60px)
     158    if (!g_IsNetworked)
     159    {
     160        Engine.GetGUIObjectByName("moreOptions").size = "50%-200 50%-195 50%+200 50%+160";
     161        Engine.GetGUIObjectByName("hideMoreOptions").size = "50%-70 310 50%+70 336";
     162    }
     163   
    157164    // Setup controls for host only
    158165    if (g_IsController)
    159166    {
    160167        mapTypes.selected = 0;
    161168        mapFilters.selected = 0;
     
    253260        Engine.GetGUIObjectByName("exploreMap").onPress = function() {
    254261            g_GameAttributes.settings.ExploreMap = this.checked;
    255262            updateGameAttributes();
    256263        };
    257264
     265        Engine.GetGUIObjectByName("observerLateJoin").onPress = function() {
     266            g_GameAttributes.settings.observerLateJoin = this.checked;
     267            updateGameAttributes();
     268        };
     269       
    258270        Engine.GetGUIObjectByName("disableTreasures").onPress = function() {
    259271            g_GameAttributes.settings.DisableTreasures = this.checked;
    260272            updateGameAttributes();
    261273        };
    262274
     
    314326    }
    315327    else
    316328    {
    317329        Engine.GetGUIObjectByName("optionCheats").hidden = false;
    318330        Engine.GetGUIObjectByName("enableCheats").checked = false;
     331        Engine.GetGUIObjectByName("optionObserverLateJoin").hidden = false;
    319332        g_GameAttributes.settings.CheatsEnabled = false;
    320333        // Setup ranked option if we are connected to the lobby.
    321334        if (Engine.HasXmppClient())
    322335        {
    323336            Engine.GetGUIObjectByName("optionRating").hidden = false;
     
    329342        }
    330343        if (g_IsController)
    331344        {
    332345            Engine.GetGUIObjectByName("enableCheatsText").hidden = true;
    333346            Engine.GetGUIObjectByName("enableCheats").hidden = false;
     347            Engine.GetGUIObjectByName("observerLateJoinText").hidden = true;
     348            Engine.GetGUIObjectByName("observerLateJoin").hidden = false;
     349
    334350            if (Engine.HasXmppClient())
    335351            {
    336352                Engine.GetGUIObjectByName("enableRatingText").hidden = true;
    337353                Engine.GetGUIObjectByName("enableRating").hidden = false;
    338354            }
     
    11841200    var enableCheats = Engine.GetGUIObjectByName("enableCheats");
    11851201    var enableRating = Engine.GetGUIObjectByName("enableRating");
    11861202    var populationCap = Engine.GetGUIObjectByName("populationCap");
    11871203    var startingResources = Engine.GetGUIObjectByName("startingResources");
    11881204    var ceasefire = Engine.GetGUIObjectByName("ceasefire");
    1189 
     1205    var observerLateJoin = Engine.GetGUIObjectByName("observerLateJoin");
     1206   
    11901207    var numPlayersText= Engine.GetGUIObjectByName("numPlayersText");
    11911208    var mapSizeDesc = Engine.GetGUIObjectByName("mapSizeDesc");
    11921209    var mapSizeText = Engine.GetGUIObjectByName("mapSizeText");
     1210    var observerLateJoinText = Engine.GetGUIObjectByName("observerLateJoinText");
    11931211    var revealMapText = Engine.GetGUIObjectByName("revealMapText");
    11941212    var exploreMapText = Engine.GetGUIObjectByName("exploreMapText");
    11951213    var disableTreasuresText = Engine.GetGUIObjectByName("disableTreasuresText");
    11961214    var victoryConditionText = Engine.GetGUIObjectByName("victoryConditionText");
    11971215    var lockTeamsText = Engine.GetGUIObjectByName("lockTeamsText");
     
    12171235        enableRatingText.caption = (enableRating.checked ? translate("Yes") : translate("No"));
    12181236        enableCheats.enabled = !enableRating.checked;
    12191237        lockTeams.enabled = !enableRating.checked;
    12201238    }
    12211239    else
     1240        // TODO: if it's undefined, then its not activated right? Therefore it should display "No"
    12221241        enableRatingText.caption = "Unknown";
     1242   
     1243    observerLateJoin.checked = g_GameAttributes.settings.observerLateJoin;
     1244    observerLateJoinText.caption = (observerLateJoin.checked ? translate("Yes") : translate("No"));
     1245   
    12231246    gameSpeedText.caption = g_GameSpeeds.names[speedIdx];
    12241247    gameSpeedBox.selected = speedIdx;
    12251248    populationCap.selected = (mapSettings.PopulationCap !== undefined && POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) != -1 ? POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) : POPULATION_CAP_DEFAULTIDX);
    12261249    populationCapText.caption = POPULATION_CAP[populationCap.selected];
    12271250    startingResources.selected = (mapSettings.StartingResources !== undefined && STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) != -1 ? STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) : STARTING_RESOURCES_DEFAULTIDX);
     
    12411264    // Handle map type specific logic
    12421265    switch (g_GameAttributes.mapType)
    12431266    {
    12441267    case "random":
    12451268        mapSizeDesc.hidden = false;
    1246 
     1269       
    12471270        updateDisplay(numPlayersSelection, numPlayersText, g_IsController);
    12481271        updateDisplay(mapSize, mapSizeText, g_IsController);
    12491272        updateDisplay(revealMap, revealMapText, g_IsController);
    12501273        updateDisplay(exploreMap, exploreMapText, g_IsController);
    12511274        updateDisplay(disableTreasures, disableTreasuresText, g_IsController);
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    373373                    <object name="enableCheats" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
    374374                        <translatableAttribute id="tooltip">Toggle the usability of cheats.</translatableAttribute>
    375375                    </object>
    376376                </object>
    377377
    378                 <object name="optionRating" size="14 338 94% 366" hidden="true">
     378                <object name="optionObserverLateJoin" size="14 338 94% 366" hidden="true">
     379                    <object size="0 0 40% 28" type="text" hidden="false" style="ModernRightLabelText">
     380                        <translatableAttribute id="caption" comment="Allow observers to join after the game started:">Observers can join after gamestart:</translatableAttribute>
     381                    </object>
     382                    <object name="observerLateJoinText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
     383                    <object name="observerLateJoin" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
     384                        <translatableAttribute id="tooltip" comment="Allow observers to join after the game started:">Allow observers to join after the game started:</translatableAttribute>
     385                    </object>
     386                </object>
     387               
     388                <object name="optionRating" size="14 368 94% 396" hidden="true">
    379389                    <object size="0 0 40% 28" hidden="false" type="text" style="ModernRightLabelText">
    380390                        <translatableAttribute id="caption">Rated Game:</translatableAttribute>
    381391                    </object>
    382392                    <object name="enableRatingText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/>
    383393                    <object name="enableRating" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip">
  • source/network/NetServer.cpp

     
    795795
    796796    bool isRejoining = false;
    797797
    798798    if (server.m_State != SERVER_STATE_PREGAME)
    799799    {
    800 //      isRejoining = true; // uncomment this to test rejoining even if the player wasn't connected previously
     800        // Optionally allow observers to join after the game has started
     801        bool observerLateJoin;
     802        JSContext* cx = server.GetScriptInterface().GetContext();
     803        JSAutoRequest rq(cx);
     804        JS::RootedValue settings(cx);
     805        server.GetScriptInterface().GetProperty(server.m_GameAttributes.get(), "settings", &settings);
     806        server.GetScriptInterface().GetProperty(settings, "observerLateJoin", observerLateJoin);
     807        if (observerLateJoin)
     808            isRejoining = true;
    801809
    802810        // Search for an old disconnected player of the same name
    803811        // (TODO: if GUIDs were stable, we should use them instead)
    804812        for (PlayerAssignmentMap::iterator it = server.m_PlayerAssignments.begin(); it != server.m_PlayerAssignments.end(); ++it)
    805813        {