Ticket #3168: t3168_let_observer_change_perspective_wip1.patch

File t3168_let_observer_change_perspective_wip1.patch, 21.3 KB (added by elexis, 9 years ago)

Reuses the "change perspective" dropdown list. Works for the top panel (resources, population count, civ icon), trade & diplomacy window and updates the hero & tech research overlay. TODO: (1) Line-of-sight (How to handle SetCurrentDisplayedPlayer? in SimContext??) (2) How to clean GuiInterface? calls ('differentPlayer')? (3) Probably in another ticket implement TODO in menu.js L643, so that one can see researched techs in the ingame tech tree.

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

     
    3434const STEP = 5;
    3535
    3636var isMenuOpen = false;
    3737var menu;
    3838
    39 var isDiplomacyOpen = false;
    40 var isTradeOpen = false;
     39var g_isDiplomacyOpen = false;
     40var g_isTradeOpen = false;
    4141
    4242// Redefined every time someone makes a tribute (so we can save some data in a closure). Called in input.js handleInputBeforeGui.
    4343var flushTributing = function() {};
    4444
    4545// Ignore size defined in XML and set the actual menu size here
     
    261261    Engine.PostNetworkCommand({"type": "tribute", "player": data.player, "amounts":  data.amounts});
    262262}
    263263
    264264function openDiplomacy()
    265265{
    266     if (isTradeOpen)
     266    if (g_isTradeOpen)
    267267        closeTrade();
    268     isDiplomacyOpen = true;
     268   
     269    let playerID = Engine.GetPlayerID();
     270    let viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     271    let we = g_IsObserver ? g_ViewedPlayer : playerID;
    269272
    270     let we = Engine.GetPlayerID();
     273    if (we <= 0)
     274        return;
     275
     276    g_isDiplomacyOpen = true;
    271277
    272278    // Get offset for one line
    273279    let onesize = Engine.GetGUIObjectByName("diplomacyPlayer[0]").size;
    274280    let rowsize = onesize.bottom - onesize.top;
    275281
     
    336342                    };
    337343                    if (!isBatchTrainPressed)
    338344                        flushTributing();
    339345                };
    340346            })(i, resource, button);
    341             button.hidden = false;
     347            button.hidden = g_IsObserver;
    342348            button.tooltip = formatTributeTooltip(g_Players[i], resource, 100);
    343349        }
    344350
    345351        // Attack Request
    346352        var simState = GetSimState();
    347353        let button = Engine.GetGUIObjectByName("diplomacyAttackRequest["+(i-1)+"]");
    348354        button.hidden = simState.ceasefireActive || !(g_Players[i].isEnemy[we]);
    349355        button.tooltip = translate("request for your allies to attack this enemy");
     356        button.hidden = g_IsObserver;
    350357        button.onpress = (function(i, we){ return function() {
    351358            Engine.PostNetworkCommand({"type": "attack-request", "source": we, "target": i});
    352359        } })(i, we);
    353360
    354361        // Skip our own teams on teams locked
     
    358365        // Diplomacy settings
    359366        // Set up the buttons
    360367        for each (let setting in ["Ally", "Neutral", "Enemy"])
    361368        {
    362369            let button = Engine.GetGUIObjectByName("diplomacyPlayer"+setting+"["+(i-1)+"]");
    363 
    364370            button.caption = g_Players[we]["is"+setting][i] ? translate("x") : "";
    365371            button.onpress = (function(e){ return function() { setDiplomacy(e) } })({"player": i, "to": setting.toLowerCase()});
    366372            button.hidden = simState.ceasefireActive;
     373            button.enabled = (we == playerID && we > 0);
    367374        }
    368375    }
    369376
    370377    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false;
    371378}
    372379
    373380function closeDiplomacy()
    374381{
    375     isDiplomacyOpen = false;
     382    g_isDiplomacyOpen = false;
    376383    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = true;
    377384}
    378385
    379386function toggleDiplomacy()
    380387{
    381     if (isDiplomacyOpen)
     388    if (g_isDiplomacyOpen)
    382389        closeDiplomacy();
    383390    else
    384391        openDiplomacy();
    385392}
    386393
    387394function openTrade()
    388395{
    389     if (isDiplomacyOpen)
     396    if (g_isDiplomacyOpen)
    390397        closeDiplomacy();
    391     isTradeOpen = true;
     398    g_isTradeOpen = true;
    392399
     400    var playerID = Engine.GetPlayerID();
     401    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     402   
    393403    var updateButtons = function()
    394404    {
    395405        for (var res in button)
    396406        {
    397407            button[res].label.caption = proba[res] + "%";
    398408            if (res == selec)
    399409            {
    400                 button[res].sel.hidden = false;
     410                button[res].sel.hidden = g_IsObserver;
    401411                button[res].up.hidden = true;
    402412                button[res].dn.hidden = true;
    403413            }
    404414            else
    405415            {
    406416                button[res].sel.hidden = true;
    407                 button[res].up.hidden = (proba[res] == 100 || proba[selec] == 0);
    408                 button[res].dn.hidden = (proba[res] == 0 || proba[selec] == 100);
     417                button[res].up.hidden = g_IsObserver || (proba[res] == 100 || proba[selec] == 0);
     418                button[res].dn.hidden = g_IsObserver || (proba[res] == 0 || proba[selec] == 100);
    409419            }
    410420        }
    411421    }
    412422
    413     var proba = Engine.GuiInterfaceCall("GetTradingGoods");
     423    var proba = Engine.GuiInterfaceCall("GetTradingGoods", viewedPlayer);
    414424    var button = {};
    415425    var selec = RESOURCES[0];
    416426    for (var i = 0; i < RESOURCES.length; ++i)
    417427    {
    418428        var buttonResource = Engine.GetGUIObjectByName("tradeResource["+i+"]");
     
    433443        var buttonUp = Engine.GetGUIObjectByName("tradeArrowUp["+i+"]");
    434444        var buttonDn = Engine.GetGUIObjectByName("tradeArrowDn["+i+"]");
    435445        var iconSel = Engine.GetGUIObjectByName("tradeResourceSelection["+i+"]");
    436446        button[resource] = { "up": buttonUp, "dn": buttonDn, "label": label, "sel": iconSel };
    437447
     448        buttonResource.enabled = !g_IsObserver;
    438449        buttonResource.onpress = (function(resource){
    439450            return function() {
    440451                if (Engine.HotkeyIsPressed("session.fulltradeswap"))
    441452                {
    442453                    for (var ress of RESOURCES)
     
    467478            }
    468479        })(resource);
    469480    }
    470481    updateButtons();
    471482
    472     var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber");
     483    var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber", viewedPlayer);
    473484    var caption = "";
    474485    if (traderNumber.landTrader.total == 0)
    475486        caption = translate("There are no land traders.");
    476487    else
    477488    {
     
    597608    Engine.GetGUIObjectByName("tradeDialogPanel").hidden = false;
    598609}
    599610
    600611function closeTrade()
    601612{
    602     isTradeOpen = false;
     613    g_isTradeOpen = false;
    603614    Engine.GetGUIObjectByName("tradeDialogPanel").hidden = true;
    604615}
    605616
    606617function toggleTrade()
    607618{
    608     if (isTradeOpen)
     619    if (g_isTradeOpen)
    609620        closeTrade();
    610621    else
    611622        openTrade();
    612623}
    613624
     
    620631function openStrucTree()
    621632{
    622633    closeMenu();
    623634    closeOpenDialogs();
    624635    pauseGame();
     636   
     637    var playerID = Engine.GetPlayerID();
     638    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     639   
     640    if (playerID == 0 || (g_IsObserver && g_ViewedPlayer <= 0))
     641        return;
     642   
    625643    var data = { // TODO add info about researched techs and unlocked entities
    626         "civ" : g_Players[Engine.GetPlayerID()].civ,
     644        "civ" : g_Players[viewedPlayer].civ,
    627645        "callback": "resumeGame",
    628646    };
    629647    Engine.PushGuiPage("page_structree.xml", data);
    630648}
    631649
  • binaries/data/mods/public/gui/session/selection_details.js

     
    400400    detailsPanel.hidden = false;
    401401
    402402    if (g_IsObserver)
    403403    {
    404404        // Observers don't need these displayed.
    405         supplementalDetailsPanel.hidden = true;
    406         commandsPanel.hidden = true;
     405        //supplementalDetailsPanel.hidden = true;
     406        //commandsPanel.hidden = true;
    407407    }
    408408    else
    409409    {
    410410        // Fill out commands panel for specific unit selected (or first unit of primary group)
    411411        updateUnitCommands(entState, supplementalDetailsPanel, commandsPanel, selection);
  • binaries/data/mods/public/gui/session/session.js

     
    55var g_IsController;
    66// Match ID for tracking
    77var g_MatchID;
    88// Is this user an observer?
    99var g_IsObserver = false;
    10 
     10// Is the change-perspective developers option activated?
     11var g_ChangePerspective = false;
     12// The player which is selected by the observer / change-perspective tool list
     13var g_ViewedPlayer = -1;
    1114// Cache the basic player data (name, civ, color)
    1215var g_Players = [];
    1316// Cache the useful civ data
    1417var g_CivData = {};
    1518
     
    5558
    5659// for saving the hitpoins of the hero (is there a better way to do that?)
    5760// Should be possible with AttackDetection but might be an overkill because it would have to loop
    5861// always through the list of all ongoing attacks...
    5962var g_previousHeroHitPoints = undefined;
     63var g_previouslyViewedHero = undefined;
    6064
    6165function GetSimState()
    6266{
    6367    if (!g_SimState)
    6468        g_SimState = Engine.GuiInterfaceCall("GetSimulationState");
     
    192196        playerNames.push(g_Players[player].name);
    193197        playerIDs.push(player);
    194198    }
    195199
    196200    var viewPlayerDropdown = Engine.GetGUIObjectByName("viewPlayer");
    197     viewPlayerDropdown.list = playerNames;
    198     viewPlayerDropdown.list_data = playerIDs;
    199     viewPlayerDropdown.selected = Engine.GetPlayerID();
    200 
     201    viewPlayerDropdown.list = ["Observer"].concat(playerNames);
     202    viewPlayerDropdown.list_data = [-1].concat(playerIDs);
     203    viewPlayerDropdown.selected = Engine.GetPlayerID() + 1;
     204    viewPlayerDropdown.hidden = !g_IsObserver && !g_ChangePerspective;
     205   
    201206    // If in Atlas editor, disable the exit button
    202207    if (Engine.IsAtlasRunning())
    203208        Engine.GetGUIObjectByName("menuExitButton").enabled = false;
    204209
    205210    if (hotloadData)
     
    227232    //setTimeout(function() { reportPerformance(60); }, 60000);
    228233}
    229234
    230235function selectViewPlayer(playerID)
    231236{
    232     Engine.SetPlayerID(playerID);
     237    playerID--;
     238    if (g_ChangePerspective)
     239        Engine.SetPlayerID(playerID);
     240    else
     241        g_ViewedPlayer = playerID;
     242   
    233243    updateTopPanel();
     244   
     245    if (playerID < 1)
     246    {
     247        closeTrade();
     248        closeDiplomacy();
     249    }
     250    else
     251    {
     252        if (g_isDiplomacyOpen)
     253            openDiplomacy();
     254        else if (g_isTradeOpen)
     255            openTrade();
     256    }
    234257}
    235258
    236259function updateTopPanel()
    237260{
    238261    var playerID = Engine.GetPlayerID();
    239262    var isPlayer =  playerID > 0;
    240     if (isPlayer)
     263    var viewsPlayer = isPlayer || (g_IsObserver && g_ViewedPlayer > 0);
     264    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     265   
     266    Engine.GetGUIObjectByName("buildTimeLabel").size="50%-78 0 50%+178 100%-2";
     267
     268    // Set civ icon
     269    if (viewsPlayer)
    241270    {
    242         var civName = g_CivData[g_Players[playerID].civ].Name
    243         Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[playerID].civ].Emblem;
     271        let civName = g_CivData[g_Players[viewedPlayer].civ].Name
     272        Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[viewedPlayer].civ].Emblem;
    244273        Engine.GetGUIObjectByName("civIconOverlay").tooltip = sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName});
     274        Engine.GetGUIObjectByName("civIcon").hidden = false;
    245275    }
     276    else
     277        Engine.GetGUIObjectByName("civIcon").hidden = true;
     278   
     279    // Hide stuff gaia doesn't use.
     280    Engine.GetGUIObjectByName("food").hidden = !viewsPlayer;
     281    Engine.GetGUIObjectByName("wood").hidden = !viewsPlayer;
     282    Engine.GetGUIObjectByName("stone").hidden = !viewsPlayer;
     283    Engine.GetGUIObjectByName("metal").hidden = !viewsPlayer;
     284    Engine.GetGUIObjectByName("population").hidden = !viewsPlayer;
     285    Engine.GetGUIObjectByName("diplomacyButton1").hidden = !viewsPlayer;
     286    Engine.GetGUIObjectByName("tradeButton1").hidden = !viewsPlayer;
     287    Engine.GetGUIObjectByName("observerText").hidden = viewsPlayer;
     288   
     289    //TODO: Observers can pause the game with the hotkey.
    246290   
    247     // Hide stuff gaia/observers don't use.
    248     Engine.GetGUIObjectByName("food").hidden = !isPlayer;
    249     Engine.GetGUIObjectByName("wood").hidden = !isPlayer;
    250     Engine.GetGUIObjectByName("stone").hidden = !isPlayer;
    251     Engine.GetGUIObjectByName("metal").hidden = !isPlayer;
    252     Engine.GetGUIObjectByName("population").hidden = !isPlayer;
    253     Engine.GetGUIObjectByName("civIcon").hidden = !isPlayer;
    254     Engine.GetGUIObjectByName("diplomacyButton1").hidden = !isPlayer;
    255     Engine.GetGUIObjectByName("tradeButton1").hidden = !isPlayer;
    256     Engine.GetGUIObjectByName("observerText").hidden = playerID >= 0;
    257 
    258291    // Disable stuff observers shouldn't use
    259292    var isActive = isPlayer && GetSimState().players[playerID].state == "active";
    260293    Engine.GetGUIObjectByName("pauseButton").enabled = isActive || !g_IsNetworked;
    261294    Engine.GetGUIObjectByName("menuResignButton").enabled = isActive;
    262295}
     
    399432{
    400433    var now = new Date;
    401434    var tickLength = new Date - lastTickTime;
    402435    lastTickTime = now;
    403436
    404     checkPlayerState();
     437    checkGameEnded();
    405438    while (true)
    406439    {
    407440        var message = Engine.PollNetworkClient();
    408441        if (!message)
    409442            break;
     
    439472
    440473    // Clear renamed entities list
    441474    Engine.GuiInterfaceCall("ClearRenamedEntities");
    442475}
    443476
    444 function checkPlayerState()
     477function checkGameEnded()
    445478{
    446479    // Once the game ends, we're done here.
    447     if (g_GameEnded || g_IsObserver)
     480    if (g_GameEnded || g_IsObserver || g_ViewedPlayer <= 0)
    448481        return;
    449482
    450483    // Send a game report for each player in this game.
    451484    var m_simState = GetSimState();
    452485    var playerState = m_simState.players[Engine.GetPlayerID()];
     
    543576    updateSelectionDetails();
    544577    updateBuildingPlacementPreview();
    545578    updateTimeElapsedCounter();
    546579    updateCeasefireCounter();
    547580    updateTimeNotifications();
    548     if (!g_IsObserver)
    549         updateResearchDisplay();
     581    updateResearchDisplay();
    550582
    551583    if (!g_IsObserver && !g_GameEnded)
    552584    {
    553585        // Update music state on basis of battle state.
    554586        var battleState = Engine.GuiInterfaceCall("GetBattleState", Engine.GetPlayerID());
     
    596628}
    597629
    598630
    599631function updateHero()
    600632{
    601     var playerState = GetSimState().players[Engine.GetPlayerID()];
     633    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID();
     634    var playerState = GetSimState().players[viewedPlayer];
    602635    var unitHeroPanel = Engine.GetGUIObjectByName("unitHeroPanel");
    603636    var heroButton = Engine.GetGUIObjectByName("unitHeroButton");
    604637
    605638    if (!playerState || playerState.heroes.length <= 0)
    606639    {
    607640        g_previousHeroHitPoints = undefined;
     641        g_previouslyViewedHero = undefined;
    608642        unitHeroPanel.hidden = true;
    609643        return;
    610644    }
    611645
    612646    var heroImage = Engine.GetGUIObjectByName("unitHeroImage");
     
    640674    // update heros health bar
    641675    updateGUIStatusBar("heroHealthBar", heroState.hitpoints, heroState.maxHitpoints);
    642676   
    643677    // define the hit points if not defined
    644678    if (!g_previousHeroHitPoints)
     679    {
    645680        g_previousHeroHitPoints = heroState.hitpoints;
     681        g_previouslyViewedHero = viewedPlayer;
     682    }
    646683   
    647684    // if the health of the hero changed since the last update, trigger the animation
    648     if (heroState.hitpoints < g_previousHeroHitPoints)
     685    if (g_previouslyViewedHero == viewedPlayer && heroState.hitpoints < g_previousHeroHitPoints)
    649686        startColorFade("heroHitOverlay", 100, 0, colorFade_attackUnit, true, smoothColorFadeRestart_attackUnit);
    650687
    651688    g_previousHeroHitPoints = heroState.hitpoints;
     689    g_previouslyViewedHero = viewedPlayer;
    652690}
    653691
    654692
    655693function updateGroups()
    656694{
     
    704742    debug.caption = text.replace(/\[/g, "\\[");
    705743}
    706744
    707745function updatePlayerDisplay()
    708746{
    709     var playerState = GetSimState().players[Engine.GetPlayerID()];
     747    var playerID = Engine.GetPlayerID();
     748    var viewsPlayer = playerID > 0 || (g_IsObserver && g_ViewedPlayer > 0);
     749    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     750
     751    if (!viewsPlayer)
     752        return;
     753   
     754    var playerState = GetSimState().players[viewedPlayer];
    710755    if (!playerState)
    711756        return;
    712757
    713758    Engine.GetGUIObjectByName("resourceFood").caption = Math.floor(playerState.resourceCounts.food);
    714759    Engine.GetGUIObjectByName("resourceWood").caption = Math.floor(playerState.resourceCounts.wood);
     
    734779    Engine.CameraMoveTo(position.x, position.z);
    735780}
    736781
    737782function updateResearchDisplay()
    738783{
    739     var researchStarted = Engine.GuiInterfaceCall("GetStartedResearch", Engine.GetPlayerID());
    740     if (!researchStarted)
     784    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID();
     785   
     786    var researchStarted = Engine.GuiInterfaceCall("GetStartedResearch", viewedPlayer);
     787    if (!researchStarted && !g_IsObserver)
    741788        return;
    742789
    743790    // Set up initial positioning.
    744791    var buttonSideLength = Engine.GetGUIObjectByName("researchStartedButton[0]").size.right;
    745792    for (var i = 0; i < 10; ++i)
  • binaries/data/mods/public/gui/session/session.xml

     
    6363
    6464        <object size="0 16 100%-18 32" type="text" style="devCommandsText">
    6565            <translatableAttribute id="caption">Change perspective</translatableAttribute>
    6666        </object>
    6767        <object size="100%-16 16 100% 32" type="checkbox" style="ModernTickBox">
    68             <action on="Press">Engine.GetGUIObjectByName("viewPlayer").hidden = !this.checked;</action>
     68            <action on="Press">
     69                g_ChangePerspective = !g_ChangePerspective;
     70                Engine.GetGUIObjectByName("viewPlayer").hidden = !g_ChangePerspective;
     71            </action>
    6972        </object>
    7073
    7174        <object size="0 32 100%-18 48" type="text" style="devCommandsText">
    7275            <translatableAttribute id="caption">Display selection state</translatableAttribute>
    7376        </object>
  • binaries/data/mods/public/gui/session/top_panel.xml

     
    2121
    2222    <!-- ================================  ================================ -->
    2323    <!-- Observer Mode Warning -->
    2424    <!-- ================================  ================================ -->
    2525    <object size="50 4 50% 100%-2" name="observerText" type="text" style="ModernLabelText" text_align="left" hidden="true">
    26         <translatableAttribute id="caption">Observer Mode (experimental)</translatableAttribute>
     26        <translatableAttribute id="caption">Observer Mode</translatableAttribute>
    2727    </object>
    2828
    2929</object>
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    109109            "isEnemy": enemies,
    110110            "entityLimits": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetLimits() : null,
    111111            "entityCounts": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetCounts() : null,
    112112            "entityLimitChangers": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetLimitChangers() : null,
    113113            "researchQueued": cmpTechnologyManager ? cmpTechnologyManager.GetQueuedResearch() : null,
    114             "researchStarted": cmpTechnologyManager ? cmpTechnologyManager.GetStartedResearch() : null,
     114            "researchStarted": cmpTechnologyManager ? cmpTechnologyManager.GetStartedResearch(i) : null,
    115115            "researchedTechs": cmpTechnologyManager ? cmpTechnologyManager.GetResearchedTechs() : null,
    116116            "classCounts": cmpTechnologyManager ? cmpTechnologyManager.GetClassCounts() : null,
    117117            "typeCountsByClass": cmpTechnologyManager ? cmpTechnologyManager.GetTypeCountsByClass() : null
    118118        };
    119119        ret.players.push(playerData);
     
    639639    return cmpTechnologyManager.CanResearch(tech);
    640640};
    641641
    642642// Returns technologies that are being actively researched, along with
    643643// which entity is researching them and how far along the research is.
    644 GuiInterface.prototype.GetStartedResearch = function(player)
     644GuiInterface.prototype.GetStartedResearch = function(player, differentPlayer)
    645645{
     646    // TODO: player will be filled in automatically by ScriptCall, how to make it less ugly?
     647    player = differentPlayer ? differentPlayer : player;
    646648    var cmpTechnologyManager = QueryPlayerIDInterface(player, IID_TechnologyManager);
    647649    if (!cmpTechnologyManager)
    648650        return false;
    649651
    650652    var ret = {};
     
    17971799{
    17981800    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    17991801    cmpRangeManager.SetDebugOverlay(enabled);
    18001802};
    18011803
    1802 GuiInterface.prototype.GetTraderNumber = function(player)
     1804GuiInterface.prototype.GetTraderNumber = function(player, differentPlayer)
    18031805{
     1806    player = differentPlayer ? differentPlayer : player;
    18041807    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    18051808    var traders = cmpRangeManager.GetEntitiesByPlayer(player).filter( function(e) {
    18061809        return Engine.QueryInterface(e, IID_Trader);
    18071810    });
    18081811
     
    18361839    }
    18371840
    18381841    return { "landTrader": landTrader, "shipTrader": shipTrader };
    18391842};
    18401843
    1841 GuiInterface.prototype.GetTradingGoods = function(player, tradingGoods)
     1844GuiInterface.prototype.GetTradingGoods = function(player, differentPlayer)
    18421845{
     1846    player = differentPlayer ? differentPlayer : player;
    18431847    var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
    18441848    return cmpPlayer.GetTradingGoods();
    18451849};
    18461850
    18471851GuiInterface.prototype.OnGlobalEntityRenamed = function(msg)
  • source/simulation2/system/SimContext.cpp

     
    1 /* Copyright (C) 2011 Wildfire Games.
     1/* Copyright (C) 2015 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
    55 * it under the terms of the GNU General Public License as published by
    66 * the Free Software Foundation, either version 2 of the License, or
     
    6565    return GetComponentManager().GetScriptInterface();
    6666}
    6767
    6868int CSimContext::GetCurrentDisplayedPlayer() const
    6969{
    70     if (!g_Game)
     70    if (g_Game)
     71        return g_Game->GetPlayerID();
     72    else
    7173        return -1;
    72     return g_Game->GetPlayerID();
     74}
     75
     76void CSimContext::SetCurrentDisplayedPlayer(int player)
     77{
     78    currentDisplayedPlayer = player;
    7379}
  • source/simulation2/system/SimContext.h

     
    5151    /**
    5252     * Returns the player ID that the current display is being rendered for.
    5353     * Currently relies on g_Game being initialised (evil globals...)
    5454     */
    5555    int GetCurrentDisplayedPlayer() const;
     56    void SetCurrentDisplayedPlayer(int player);
    5657
    5758private:
    5859    CComponentManager* m_ComponentManager;
    5960    CUnitManager* m_UnitManager;
    6061    CTerrain* m_Terrain;
    6162
    6263    CEntityHandle m_SystemEntity;
    6364
     65    int currentDisplayedPlayer;
     66
    6467    friend class CSimulation2Impl;
    6568};
    6669
    6770#endif // INCLUDED_SIMCONTEXT