Ticket #3168: t3168_let_observer_change_perspective_wip1.1.patch

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

Rebased. Has a bug when starting as a player and then changing perspective to observer. Still doesn't change fog-of-war.

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

    const RESOURCES = ["food", "wood", "ston  
    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
    function tributeResource(data)  
    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;
    269268
    270     let we = Engine.GetPlayerID();
     269    let playerID = Engine.GetPlayerID();
     270    let viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     271    let we = g_IsObserver ? g_ViewedPlayer : playerID;
     272
     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
    function openDiplomacy()  
    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 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
    function openDiplomacy()  
    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
     399    g_IsTradeOpen = true;
     400    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID();
    392401
    393402    var updateButtons = function()
    394403    {
    395404        for (var res in button)
    396405        {
    397406            button[res].label.caption = proba[res] + "%";
    398407            if (res == selec)
    399408            {
    400                 button[res].sel.hidden = false;
     409                button[res].sel.hidden = g_IsObserver;
    401410                button[res].up.hidden = true;
    402411                button[res].dn.hidden = true;
    403412            }
    404413            else
    405414            {
    406415                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);
     416                button[res].up.hidden = g_IsObserver || (proba[res] == 100 || proba[selec] == 0);
     417                button[res].dn.hidden = g_IsObserver || (proba[res] == 0 || proba[selec] == 100);
    409418            }
    410419        }
    411420    };
    412421
    413     var proba = Engine.GuiInterfaceCall("GetTradingGoods");
     422    var proba = Engine.GuiInterfaceCall("GetTradingGoods", viewedPlayer);
    414423    var button = {};
    415424    var selec = RESOURCES[0];
    416425    for (var i = 0; i < RESOURCES.length; ++i)
    417426    {
    418427        var buttonResource = Engine.GetGUIObjectByName("tradeResource["+i+"]");
    function openTrade()  
    433442        var buttonUp = Engine.GetGUIObjectByName("tradeArrowUp["+i+"]");
    434443        var buttonDn = Engine.GetGUIObjectByName("tradeArrowDn["+i+"]");
    435444        var iconSel = Engine.GetGUIObjectByName("tradeResourceSelection["+i+"]");
    436445        button[resource] = { "up": buttonUp, "dn": buttonDn, "label": label, "sel": iconSel };
    437446
     447        buttonResource.enabled = !g_IsObserver;
    438448        buttonResource.onpress = (function(resource){
    439449            return function() {
    440450                if (Engine.HotkeyIsPressed("session.fulltradeswap"))
    441451                {
    442452                    for (var ress of RESOURCES)
    function openTrade()  
    467477            };
    468478        })(resource);
    469479    }
    470480    updateButtons();
    471481
    472     var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber");
     482    var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber", viewedPlayer);
    473483    var caption = "";
    474484    if (traderNumber.landTrader.total == 0)
    475485        caption = translate("There are no land traders.");
    476486    else
    477487    {
    function openTrade()  
    597607    Engine.GetGUIObjectByName("tradeDialogPanel").hidden = false;
    598608}
    599609
    600610function closeTrade()
    601611{
    602     isTradeOpen = false;
     612    g_IsTradeOpen = false;
    603613    Engine.GetGUIObjectByName("tradeDialogPanel").hidden = true;
    604614}
    605615
    606616function toggleTrade()
    607617{
    608     if (isTradeOpen)
     618    if (g_IsTradeOpen)
    609619        closeTrade();
    610620    else
    611621        openTrade();
    612622}
    613623
    function toggleGameSpeed()  
    620630function openStrucTree()
    621631{
    622632    closeMenu();
    623633    closeOpenDialogs();
    624634    pauseGame();
     635
     636    var playerID = Engine.GetPlayerID();
     637    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     638
     639    if (playerID == 0 || (g_IsObserver && g_ViewedPlayer <= 0))
     640        return;
     641
    625642    var data = { // TODO add info about researched techs and unlocked entities
    626         "civ" : g_Players[Engine.GetPlayerID()].civ,
     643        "civ" : g_Players[viewedPlayer].civ,
    627644        "callback": "resumeGame",
    628645    };
    629646    Engine.PushGuiPage("page_structree.xml", data);
    630647}
    631648
  • binaries/data/mods/public/gui/session/selection_details.js

    function updateSelectionDetails()  
    408408    detailsPanel.hidden = false;
    409409
    410410    if (g_IsObserver)
    411411    {
    412412        // Observers don't need these displayed.
    413         supplementalDetailsPanel.hidden = true;
    414         commandsPanel.hidden = true;
     413        //supplementalDetailsPanel.hidden = true;
     414        //commandsPanel.hidden = true;
    415415    }
    416416    else
    417417    {
    418418        // Fill out commands panel for specific unit selected (or first unit of primary group)
    419419        updateUnitCommands(entState, supplementalDetailsPanel, commandsPanel, selection);
  • binaries/data/mods/public/gui/session/session.js

    var g_IsNetworked = false;  
    88var g_IsController;
    99// Match ID for tracking
    1010var g_MatchID;
    1111// Is this user an observer?
    1212var g_IsObserver = false;
    13 
     13// Is the change-perspective developers option activated?
     14var g_ChangePerspective = false;
     15// The player which is selected by the observer / change-perspective tool list
     16var g_ViewedPlayer = -1;
    1417// Cache the basic player data (name, civ, color)
    1518var g_Players = [];
    1619// Cache the useful civ data
    1720var g_CivData = {};
    1821
    var g_AdditionalHighlight = [];  
    5861
    5962// for saving the hitpoins of the hero (is there a better way to do that?)
    6063// Should be possible with AttackDetection but might be an overkill because it would have to loop
    6164// always through the list of all ongoing attacks...
    6265var g_previousHeroHitPoints = undefined;
     66var g_previouslyViewedHero = undefined;
    6367
    6468function GetSimState()
    6569{
    6670    if (!g_SimState)
    6771        g_SimState = Engine.GuiInterfaceCall("GetSimulationState");
    function init(initData, hotloadData)  
    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();
     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;
    200205
    201206    // If in Atlas editor, disable the exit button
    202207    if (Engine.IsAtlasRunning())
    203208        Engine.GetGUIObjectByName("menuExitButton").enabled = false;
    204209
    function init(initData, hotloadData)  
    227232    //setTimeout(function() { reportPerformance(60); }, 60000);
    228233}
    229234
    230235function selectViewPlayer(playerID)
    231236{
    232     Engine.SetPlayerID(playerID);
     237    playerID--;
     238
     239    if (g_ChangePerspective)
     240        Engine.SetPlayerID(playerID);
     241    else
     242        g_ViewedPlayer = playerID;
     243
    233244    updateTopPanel();
     245
     246    if (playerID < 1)
     247    {
     248        closeTrade();
     249        closeDiplomacy();
     250    }
     251    else
     252    {
     253        if (g_IsDiplomacyOpen)
     254            openDiplomacy();
     255        else if (g_IsTradeOpen)
     256            openTrade();
     257    }
    234258}
    235259
    236260function updateTopPanel()
    237261{
    238262    var playerID = Engine.GetPlayerID();
    239263    var isPlayer =  playerID > 0;
    240     if (isPlayer)
     264    var viewsPlayer = isPlayer || (g_IsObserver && g_ViewedPlayer > 0);
     265    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     266
     267    Engine.GetGUIObjectByName("buildTimeLabel").size="50%-78 0 50%+178 100%-2";
     268
     269    // Set civ icon
     270    if (viewsPlayer)
    241271    {
    242         var civName = g_CivData[g_Players[playerID].civ].Name;
    243         Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[playerID].civ].Emblem;
     272        let civName = g_CivData[g_Players[viewedPlayer].civ].Name
     273        Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[viewedPlayer].civ].Emblem;
    244274        Engine.GetGUIObjectByName("civIconOverlay").tooltip = sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName});
    245275    }
    246    
    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;
     276
     277    // Hide stuff gaia doesn't use.
     278    Engine.GetGUIObjectByName("food").hidden = !viewsPlayer;
     279    Engine.GetGUIObjectByName("wood").hidden = !viewsPlayer;
     280    Engine.GetGUIObjectByName("stone").hidden = !viewsPlayer;
     281    Engine.GetGUIObjectByName("metal").hidden = !viewsPlayer;
     282    Engine.GetGUIObjectByName("population").hidden = !viewsPlayer;
     283    Engine.GetGUIObjectByName("civIcon").hidden = !viewsPlayer;
     284    Engine.GetGUIObjectByName("diplomacyButton1").hidden = !viewsPlayer;
     285    Engine.GetGUIObjectByName("tradeButton1").hidden = !viewsPlayer;
     286    Engine.GetGUIObjectByName("observerText").hidden = viewsPlayer;
    257287
    258288    // Disable stuff observers shouldn't use
    259289    var isActive = isPlayer && GetSimState().players[playerID].state == "active";
    260290    Engine.GetGUIObjectByName("pauseButton").enabled = isActive || !g_IsNetworked;
    261291    Engine.GetGUIObjectByName("menuResignButton").enabled = isActive;
    function onTick()  
    408438
    409439    var now = new Date();
    410440    var tickLength = new Date() - lastTickTime;
    411441    lastTickTime = now;
    412442
    413     checkPlayerState();
     443    checkGameEnded();
     444
    414445    while (true)
    415446    {
    416447        var message = Engine.PollNetworkClient();
    417448        if (!message)
    418449            break;
    function onTick()  
    448479
    449480    // Clear renamed entities list
    450481    Engine.GuiInterfaceCall("ClearRenamedEntities");
    451482}
    452483
    453 function checkPlayerState()
     484function checkGameEnded()
    454485{
    455486    // Once the game ends, we're done here.
    456     if (g_GameEnded || g_IsObserver)
     487    if (g_GameEnded || g_IsObserver || g_ViewedPlayer <= 0)
    457488        return;
    458489
    459490    // Send a game report for each player in this game.
    460491    var m_simState = GetSimState();
    461492    var playerState = m_simState.players[Engine.GetPlayerID()];
    function onSimulationUpdate()  
    547578    updateDebug();
    548579    updatePlayerDisplay();
    549580    updateSelectionDetails();
    550581    updateBuildingPlacementPreview();
    551582    updateTimeNotifications();
    552     if (!g_IsObserver)
    553         updateResearchDisplay();
     583    updateResearchDisplay();
    554584
    555585    if (!g_IsObserver && !g_GameEnded)
    556586    {
    557587        // Update music state on basis of battle state.
    558588        var battleState = Engine.GuiInterfaceCall("GetBattleState", Engine.GetPlayerID());
    function updateGUIStatusBar(nameOfBar, p  
    610640}
    611641
    612642
    613643function updateHero()
    614644{
    615     var playerState = GetSimState().players[Engine.GetPlayerID()];
     645    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID();
     646    var playerState = GetSimState().players[viewedPlayer];
    616647    var unitHeroPanel = Engine.GetGUIObjectByName("unitHeroPanel");
    617648    var heroButton = Engine.GetGUIObjectByName("unitHeroButton");
    618649
    619650    if (!playerState || playerState.heroes.length <= 0)
    620651    {
    621652        g_previousHeroHitPoints = undefined;
     653        g_previouslyViewedHero = undefined;
    622654        unitHeroPanel.hidden = true;
    623655        return;
    624656    }
    625657
    626658    var heroImage = Engine.GetGUIObjectByName("unitHeroImage");
    function updateHero()  
    654686    // update heros health bar
    655687    updateGUIStatusBar("heroHealthBar", heroState.hitpoints, heroState.maxHitpoints);
    656688   
    657689    // define the hit points if not defined
    658690    if (!g_previousHeroHitPoints)
     691    {
    659692        g_previousHeroHitPoints = heroState.hitpoints;
     693        g_previouslyViewedHero = viewedPlayer;
     694    }
    660695   
    661696    // if the health of the hero changed since the last update, trigger the animation
    662     if (heroState.hitpoints < g_previousHeroHitPoints)
     697    if (g_previouslyViewedHero == viewedPlayer && heroState.hitpoints < g_previousHeroHitPoints)
    663698        startColorFade("heroHitOverlay", 100, 0, colorFade_attackUnit, true, smoothColorFadeRestart_attackUnit);
    664699
    665700    g_previousHeroHitPoints = heroState.hitpoints;
     701    g_previouslyViewedHero = viewedPlayer;
    666702}
    667703
    668704
    669705function updateGroups()
    670706{
    function updateDebug()  
    718754    debug.caption = text.replace(/\[/g, "\\[");
    719755}
    720756
    721757function updatePlayerDisplay()
    722758{
    723     var playerState = GetSimState().players[Engine.GetPlayerID()];
     759    var playerID = Engine.GetPlayerID();
     760    var viewsPlayer = playerID > 0 || (g_IsObserver && g_ViewedPlayer > 0);
     761    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID;
     762
     763    if (!viewsPlayer)
     764        return;
     765
     766    var playerState = GetSimState().players[viewedPlayer];
    724767    if (!playerState)
    725768        return;
    726769
    727770    Engine.GetGUIObjectByName("resourceFood").caption = Math.floor(playerState.resourceCounts.food);
    728771    Engine.GetGUIObjectByName("resourceWood").caption = Math.floor(playerState.resourceCounts.wood);
    function selectAndMoveTo(ent)  
    748791    Engine.CameraMoveTo(position.x, position.z);
    749792}
    750793
    751794function updateResearchDisplay()
    752795{
    753     var researchStarted = Engine.GuiInterfaceCall("GetStartedResearch", Engine.GetPlayerID());
    754     if (!researchStarted)
     796    var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID();
     797
     798    var researchStarted = Engine.GuiInterfaceCall("GetStartedResearch", viewedPlayer);
     799    if (!researchStarted && !g_IsObserver)
    755800        return;
    756801
    757802    // Set up initial positioning.
    758803    var buttonSideLength = Engine.GetGUIObjectByName("researchStartedButton[0]").size.right;
    759804    for (var i = 0; i < 10; ++i)
  • binaries/data/mods/public/gui/session/session.xml

     
    6868
    6969        <object size="0 16 100%-18 32" type="text" style="devCommandsText">
    7070            <translatableAttribute id="caption">Change perspective</translatableAttribute>
    7171        </object>
    7272        <object size="100%-16 16 100% 32" type="checkbox" style="ModernTickBox">
    73             <action on="Press">Engine.GetGUIObjectByName("viewPlayer").hidden = !this.checked;</action>
     73            <action on="Press">
     74                g_ChangePerspective = !g_ChangePerspective;
     75                Engine.GetGUIObjectByName("viewPlayer").hidden = !g_ChangePerspective;
     76            </action>
    7477        </object>
    7578
    7679        <object size="0 32 100%-18 48" type="text" style="devCommandsText">
    7780            <translatableAttribute id="caption">Display selection state</translatableAttribute>
    7881        </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

    GuiInterface.prototype.GetSimulationStat  
    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);
    GuiInterface.prototype.CheckTechnologyRe  
    645645    return cmpTechnologyManager.CanResearch(tech);
    646646};
    647647
    648648// Returns technologies that are being actively researched, along with
    649649// which entity is researching them and how far along the research is.
    650 GuiInterface.prototype.GetStartedResearch = function(player)
     650// TODO: player will be filled in automatically by ScriptCall, how to make it less ugly?
     651GuiInterface.prototype.GetStartedResearch = function(player, differentPlayer)
    651652{
    652     var cmpTechnologyManager = QueryPlayerIDInterface(player, IID_TechnologyManager);
     653    var cmpTechnologyManager = QueryPlayerIDInterface(differentPlayer ? differentPlayer : player, IID_TechnologyManager);
    653654    if (!cmpTechnologyManager)
    654655        return false;
    655656
    656657    var ret = {};
    657658    for (var tech in cmpTechnologyManager.GetTechsStarted())
    GuiInterface.prototype.SetRangeDebugOver  
    18031804{
    18041805    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    18051806    cmpRangeManager.SetDebugOverlay(enabled);
    18061807};
    18071808
    1808 GuiInterface.prototype.GetTraderNumber = function(player)
     1809// TODO: player will be filled in automatically by ScriptCall, how to make it less ugly?
     1810GuiInterface.prototype.GetTraderNumber = function(player, differentPlayer)
    18091811{
    18101812    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    1811     var traders = cmpRangeManager.GetEntitiesByPlayer(player).filter( function(e) {
     1813    var traders = cmpRangeManager.GetEntitiesByPlayer(differentPlayer ? differentPlayer : player).filter(e => {
    18121814        return Engine.QueryInterface(e, IID_Trader);
    18131815    });
    18141816
    18151817    var landTrader = { "total": 0, "trading": 0, "garrisoned": 0 };
    18161818    var shipTrader = { "total": 0, "trading": 0 };
    GuiInterface.prototype.GetTraderNumber =  
    18421844    }
    18431845
    18441846    return { "landTrader": landTrader, "shipTrader": shipTrader };
    18451847};
    18461848
    1847 GuiInterface.prototype.GetTradingGoods = function(player)
     1849// TODO: player will be filled in automatically by ScriptCall, how to make it less ugly?
     1850GuiInterface.prototype.GetTradingGoods = function(player, differentPlayer)
    18481851{
    1849     return QueryPlayerIDInterface(player).GetTradingGoods();
     1852    return QueryPlayerIDInterface(differentPlayer ? differentPlayer : player).GetTradingGoods();
    18501853};
    18511854
    18521855GuiInterface.prototype.OnGlobalEntityRenamed = function(msg)
    18531856{
    18541857    this.renamedEntities.push(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
    ScriptInterface& CSimContext::GetScriptI  
    6565    return GetComponentManager().GetScriptInterface();
    6666}
    6767
    6868int CSimContext::GetCurrentDisplayedPlayer() const
    6969{
     70    // TODO: use currentDisplayedPlayer and use that for fog-of-war
    7071    if (!g_Game)
    7172        return -1;
    7273    return g_Game->GetPlayerID();
    7374}
     75
     76void CSimContext::SetCurrentDisplayedPlayer(int player)
     77{
     78    currentDisplayedPlayer = player;
     79}
  • source/simulation2/system/SimContext.h

    public:  
    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 = -1;
     66
    6467    friend class CSimulation2Impl;
    6568};
    6669
    6770#endif // INCLUDED_SIMCONTEXT