Ticket #3101: t3101_dynamically_hide_elements_for_observers_v2.patch

File t3101_dynamically_hide_elements_for_observers_v2.patch, 5.5 KB (added by elexis, 9 years ago)

Pause button now available to observers in singleplayer mode, while still preventing defeated players and other observers in multiplayer to pause the game. Refactors the updating the top panel GUI to a single method, which is called when resigning too (so that you cant pause the game after resigning). The observerText should already be hidden for gaia.

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

     
    168168    // Cache civ data
    169169    g_CivData = loadCivData();
    170170    g_CivData["gaia"] = { "Code": "gaia", "Name": translate("Gaia") };
    171171
    172172    if (Engine.GetPlayerID() <= 0)
    173     {
    174173        g_IsObserver = true;
    175         // Hide stuff observers don't use.
    176         Engine.GetGUIObjectByName("food").hidden = true;
    177         Engine.GetGUIObjectByName("wood").hidden = true;
    178         Engine.GetGUIObjectByName("stone").hidden = true;
    179         Engine.GetGUIObjectByName("metal").hidden = true;
    180         Engine.GetGUIObjectByName("population").hidden = true;
    181         Engine.GetGUIObjectByName("diplomacyButton1").hidden = true;
    182         Engine.GetGUIObjectByName("tradeButton1").hidden = true;
    183         Engine.GetGUIObjectByName("menuResignButton").enabled = false;
    184         Engine.GetGUIObjectByName("pauseButton").enabled = false;
    185         Engine.GetGUIObjectByName("observerText").hidden = false;
    186     }
    187     else
    188     {
    189         var civName =  g_CivData[g_Players[Engine.GetPlayerID()].civ].Name;
    190         // TODO: Get a civ icon for gaia/observers.
    191         Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[Engine.GetPlayerID()].civ].Emblem;
    192         Engine.GetGUIObjectByName("civIconOverlay").tooltip = sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName});
    193     }
     174
     175    updateTopPanel();
    194176
    195177    g_GameSpeeds = initGameSpeeds();
    196178    g_CurrentSpeed = Engine.GetSimRate();
    197179    var gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    198180    gameSpeed.list = g_GameSpeeds.names;
     
    246228}
    247229
    248230function selectViewPlayer(playerID)
    249231{
    250232    Engine.SetPlayerID(playerID);
    251     if (playerID > 0)
     233    updateTopPanel();
     234}
     235
     236function updateTopPanel()
     237{
     238    var playerID = Engine.GetPlayerID();
     239    var isPlayer =  playerID > 0;
     240    if (isPlayer)
    252241    {
    253242        var civName = g_CivData[g_Players[playerID].civ].Name
     243        // TODO: Get a civ icon for gaia/observers.
    254244        Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[playerID].civ].Emblem;
    255         Engine.GetGUIObjectByName("civIconOverlay").tooltip =  sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName});
     245        Engine.GetGUIObjectByName("civIconOverlay").tooltip = sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName});
    256246    }
     247   
     248    // Hide stuff observers don't use.
     249    Engine.GetGUIObjectByName("food").hidden = !isPlayer;
     250    Engine.GetGUIObjectByName("wood").hidden = !isPlayer;
     251    Engine.GetGUIObjectByName("stone").hidden = !isPlayer;
     252    Engine.GetGUIObjectByName("metal").hidden = !isPlayer;
     253    Engine.GetGUIObjectByName("population").hidden = !isPlayer;
     254    Engine.GetGUIObjectByName("civIcon").hidden = !isPlayer;
     255    Engine.GetGUIObjectByName("diplomacyButton1").hidden = !isPlayer;
     256    Engine.GetGUIObjectByName("tradeButton1").hidden = !isPlayer;
     257    Engine.GetGUIObjectByName("observerText").hidden = isPlayer;
     258
     259    // Disable stuff observers shouldn't use
     260    var isActive = isPlayer && GetSimState().players[playerID].state == "active";
     261    Engine.GetGUIObjectByName("pauseButton").enabled = isActive || !g_IsNetworked;
     262    Engine.GetGUIObjectByName("menuResignButton").enabled = isActive;
    257263}
    258264
    259265function reportPerformance(time)
    260266{
    261267    var settings = Engine.GetMapSettings();
     
    286292    Engine.PostNetworkCommand({
    287293        "type": "defeat-player",
    288294        "playerId": Engine.GetPlayerID()
    289295    });
    290296   
    291     Engine.GetGUIObjectByName("menuResignButton").enabled = false;
     297    updateTopPanel();
    292298   
    293299    global.music.setState(global.music.states.DEFEAT);
    294300   
    295301    // Resume the game if not resigning.
    296302    if (!leaveGameAfterResign)
     
    456462
    457463    // If the local player hasn't finished playing, we return here to avoid the victory/defeat messages.
    458464    if (playerState.state == "active")
    459465        return;
    460466
    461     // We can't resign once the game is over.
    462     Engine.GetGUIObjectByName("menuResignButton").enabled = false;
    463 
     467    // Disable resign and pause buttons (we can't resign once the game is over)
     468    updateTopPanel();
     469   
    464470    // Make sure nothing is open to avoid stacking.
    465471    closeMenu();
    466472    closeOpenDialogs();
    467473
    468474    // Make sure this doesn't run again.
     
    591597}
    592598
    593599
    594600function updateHero()
    595601{
    596     var simState = GetSimState();
    597     var playerState = simState.players[Engine.GetPlayerID()];
     602    var playerState = GetSimState().players[Engine.GetPlayerID()];
    598603    var unitHeroPanel = Engine.GetGUIObjectByName("unitHeroPanel");
    599604    var heroButton = Engine.GetGUIObjectByName("unitHeroButton");
    600605
    601606    if (!playerState || playerState.heroes.length <= 0)
    602607    {
     
    667672    }
    668673}
    669674
    670675function updateDebug()
    671676{
    672     let simState = GetSimState();
    673677    let debug = Engine.GetGUIObjectByName("debug");
    674678
    675679    if (!Engine.GetGUIObjectByName("devDisplayState").checked)
    676680    {
    677681        debug.hidden = true;
    678682        return;
    679683    }
    680684
    681685    debug.hidden = false;
    682686
    683     let conciseSimState = deepcopy(simState);
     687    let conciseSimState = deepcopy(GetSimState());
    684688    conciseSimState.players = "<<<omitted>>>";
    685689    let text = "simulation: " + uneval(conciseSimState);
    686690
    687691    let selection = g_Selection.toList();
    688692    if (selection.length)
     
    701705    debug.caption = text.replace(/\[/g, "\\[");
    702706}
    703707
    704708function updatePlayerDisplay()
    705709{
    706     var simState = GetSimState();
    707     var playerState = simState.players[Engine.GetPlayerID()];
     710    var playerState = GetSimState().players[Engine.GetPlayerID()];
    708711    if (!playerState)
    709712        return;
    710713
    711714    Engine.GetGUIObjectByName("resourceFood").caption = Math.floor(playerState.resourceCounts.food);
    712715    Engine.GetGUIObjectByName("resourceWood").caption = Math.floor(playerState.resourceCounts.wood);