Ticket #3168: t3168_let_observer_change_perspective_wip1.patch
File t3168_let_observer_change_perspective_wip1.patch, 21.3 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/session/menu.js
34 34 const STEP = 5; 35 35 36 36 var isMenuOpen = false; 37 37 var menu; 38 38 39 var isDiplomacyOpen = false;40 var isTradeOpen = false;39 var g_isDiplomacyOpen = false; 40 var g_isTradeOpen = false; 41 41 42 42 // Redefined every time someone makes a tribute (so we can save some data in a closure). Called in input.js handleInputBeforeGui. 43 43 var flushTributing = function() {}; 44 44 45 45 // Ignore size defined in XML and set the actual menu size here … … 261 261 Engine.PostNetworkCommand({"type": "tribute", "player": data.player, "amounts": data.amounts}); 262 262 } 263 263 264 264 function openDiplomacy() 265 265 { 266 if ( isTradeOpen)266 if (g_isTradeOpen) 267 267 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; 269 272 270 let we = Engine.GetPlayerID(); 273 if (we <= 0) 274 return; 275 276 g_isDiplomacyOpen = true; 271 277 272 278 // Get offset for one line 273 279 let onesize = Engine.GetGUIObjectByName("diplomacyPlayer[0]").size; 274 280 let rowsize = onesize.bottom - onesize.top; 275 281 … … 336 342 }; 337 343 if (!isBatchTrainPressed) 338 344 flushTributing(); 339 345 }; 340 346 })(i, resource, button); 341 button.hidden = false;347 button.hidden = g_IsObserver; 342 348 button.tooltip = formatTributeTooltip(g_Players[i], resource, 100); 343 349 } 344 350 345 351 // Attack Request 346 352 var simState = GetSimState(); 347 353 let button = Engine.GetGUIObjectByName("diplomacyAttackRequest["+(i-1)+"]"); 348 354 button.hidden = simState.ceasefireActive || !(g_Players[i].isEnemy[we]); 349 355 button.tooltip = translate("request for your allies to attack this enemy"); 356 button.hidden = g_IsObserver; 350 357 button.onpress = (function(i, we){ return function() { 351 358 Engine.PostNetworkCommand({"type": "attack-request", "source": we, "target": i}); 352 359 } })(i, we); 353 360 354 361 // Skip our own teams on teams locked … … 358 365 // Diplomacy settings 359 366 // Set up the buttons 360 367 for each (let setting in ["Ally", "Neutral", "Enemy"]) 361 368 { 362 369 let button = Engine.GetGUIObjectByName("diplomacyPlayer"+setting+"["+(i-1)+"]"); 363 364 370 button.caption = g_Players[we]["is"+setting][i] ? translate("x") : ""; 365 371 button.onpress = (function(e){ return function() { setDiplomacy(e) } })({"player": i, "to": setting.toLowerCase()}); 366 372 button.hidden = simState.ceasefireActive; 373 button.enabled = (we == playerID && we > 0); 367 374 } 368 375 } 369 376 370 377 Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false; 371 378 } 372 379 373 380 function closeDiplomacy() 374 381 { 375 isDiplomacyOpen = false;382 g_isDiplomacyOpen = false; 376 383 Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = true; 377 384 } 378 385 379 386 function toggleDiplomacy() 380 387 { 381 if ( isDiplomacyOpen)388 if (g_isDiplomacyOpen) 382 389 closeDiplomacy(); 383 390 else 384 391 openDiplomacy(); 385 392 } 386 393 387 394 function openTrade() 388 395 { 389 if ( isDiplomacyOpen)396 if (g_isDiplomacyOpen) 390 397 closeDiplomacy(); 391 isTradeOpen = true;398 g_isTradeOpen = true; 392 399 400 var playerID = Engine.GetPlayerID(); 401 var viewedPlayer = g_IsObserver ? g_ViewedPlayer : playerID; 402 393 403 var updateButtons = function() 394 404 { 395 405 for (var res in button) 396 406 { 397 407 button[res].label.caption = proba[res] + "%"; 398 408 if (res == selec) 399 409 { 400 button[res].sel.hidden = false;410 button[res].sel.hidden = g_IsObserver; 401 411 button[res].up.hidden = true; 402 412 button[res].dn.hidden = true; 403 413 } 404 414 else 405 415 { 406 416 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); 409 419 } 410 420 } 411 421 } 412 422 413 var proba = Engine.GuiInterfaceCall("GetTradingGoods" );423 var proba = Engine.GuiInterfaceCall("GetTradingGoods", viewedPlayer); 414 424 var button = {}; 415 425 var selec = RESOURCES[0]; 416 426 for (var i = 0; i < RESOURCES.length; ++i) 417 427 { 418 428 var buttonResource = Engine.GetGUIObjectByName("tradeResource["+i+"]"); … … 433 443 var buttonUp = Engine.GetGUIObjectByName("tradeArrowUp["+i+"]"); 434 444 var buttonDn = Engine.GetGUIObjectByName("tradeArrowDn["+i+"]"); 435 445 var iconSel = Engine.GetGUIObjectByName("tradeResourceSelection["+i+"]"); 436 446 button[resource] = { "up": buttonUp, "dn": buttonDn, "label": label, "sel": iconSel }; 437 447 448 buttonResource.enabled = !g_IsObserver; 438 449 buttonResource.onpress = (function(resource){ 439 450 return function() { 440 451 if (Engine.HotkeyIsPressed("session.fulltradeswap")) 441 452 { 442 453 for (var ress of RESOURCES) … … 467 478 } 468 479 })(resource); 469 480 } 470 481 updateButtons(); 471 482 472 var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber" );483 var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber", viewedPlayer); 473 484 var caption = ""; 474 485 if (traderNumber.landTrader.total == 0) 475 486 caption = translate("There are no land traders."); 476 487 else 477 488 { … … 597 608 Engine.GetGUIObjectByName("tradeDialogPanel").hidden = false; 598 609 } 599 610 600 611 function closeTrade() 601 612 { 602 isTradeOpen = false;613 g_isTradeOpen = false; 603 614 Engine.GetGUIObjectByName("tradeDialogPanel").hidden = true; 604 615 } 605 616 606 617 function toggleTrade() 607 618 { 608 if ( isTradeOpen)619 if (g_isTradeOpen) 609 620 closeTrade(); 610 621 else 611 622 openTrade(); 612 623 } 613 624 … … 620 631 function openStrucTree() 621 632 { 622 633 closeMenu(); 623 634 closeOpenDialogs(); 624 635 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 625 643 var data = { // TODO add info about researched techs and unlocked entities 626 "civ" : g_Players[ Engine.GetPlayerID()].civ,644 "civ" : g_Players[viewedPlayer].civ, 627 645 "callback": "resumeGame", 628 646 }; 629 647 Engine.PushGuiPage("page_structree.xml", data); 630 648 } 631 649 -
binaries/data/mods/public/gui/session/selection_details.js
400 400 detailsPanel.hidden = false; 401 401 402 402 if (g_IsObserver) 403 403 { 404 404 // Observers don't need these displayed. 405 supplementalDetailsPanel.hidden = true;406 commandsPanel.hidden = true;405 //supplementalDetailsPanel.hidden = true; 406 //commandsPanel.hidden = true; 407 407 } 408 408 else 409 409 { 410 410 // Fill out commands panel for specific unit selected (or first unit of primary group) 411 411 updateUnitCommands(entState, supplementalDetailsPanel, commandsPanel, selection); -
binaries/data/mods/public/gui/session/session.js
5 5 var g_IsController; 6 6 // Match ID for tracking 7 7 var g_MatchID; 8 8 // Is this user an observer? 9 9 var g_IsObserver = false; 10 10 // Is the change-perspective developers option activated? 11 var g_ChangePerspective = false; 12 // The player which is selected by the observer / change-perspective tool list 13 var g_ViewedPlayer = -1; 11 14 // Cache the basic player data (name, civ, color) 12 15 var g_Players = []; 13 16 // Cache the useful civ data 14 17 var g_CivData = {}; 15 18 … … 55 58 56 59 // for saving the hitpoins of the hero (is there a better way to do that?) 57 60 // Should be possible with AttackDetection but might be an overkill because it would have to loop 58 61 // always through the list of all ongoing attacks... 59 62 var g_previousHeroHitPoints = undefined; 63 var g_previouslyViewedHero = undefined; 60 64 61 65 function GetSimState() 62 66 { 63 67 if (!g_SimState) 64 68 g_SimState = Engine.GuiInterfaceCall("GetSimulationState"); … … 192 196 playerNames.push(g_Players[player].name); 193 197 playerIDs.push(player); 194 198 } 195 199 196 200 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 201 206 // If in Atlas editor, disable the exit button 202 207 if (Engine.IsAtlasRunning()) 203 208 Engine.GetGUIObjectByName("menuExitButton").enabled = false; 204 209 205 210 if (hotloadData) … … 227 232 //setTimeout(function() { reportPerformance(60); }, 60000); 228 233 } 229 234 230 235 function selectViewPlayer(playerID) 231 236 { 232 Engine.SetPlayerID(playerID); 237 playerID--; 238 if (g_ChangePerspective) 239 Engine.SetPlayerID(playerID); 240 else 241 g_ViewedPlayer = playerID; 242 233 243 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 } 234 257 } 235 258 236 259 function updateTopPanel() 237 260 { 238 261 var playerID = Engine.GetPlayerID(); 239 262 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) 241 270 { 242 var civName = g_CivData[g_Players[playerID].civ].Name243 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; 244 273 Engine.GetGUIObjectByName("civIconOverlay").tooltip = sprintf(translate("%(civ)s - Structure Tree"), {"civ": civName}); 274 Engine.GetGUIObjectByName("civIcon").hidden = false; 245 275 } 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. 246 290 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 258 291 // Disable stuff observers shouldn't use 259 292 var isActive = isPlayer && GetSimState().players[playerID].state == "active"; 260 293 Engine.GetGUIObjectByName("pauseButton").enabled = isActive || !g_IsNetworked; 261 294 Engine.GetGUIObjectByName("menuResignButton").enabled = isActive; 262 295 } … … 399 432 { 400 433 var now = new Date; 401 434 var tickLength = new Date - lastTickTime; 402 435 lastTickTime = now; 403 436 404 check PlayerState();437 checkGameEnded(); 405 438 while (true) 406 439 { 407 440 var message = Engine.PollNetworkClient(); 408 441 if (!message) 409 442 break; … … 439 472 440 473 // Clear renamed entities list 441 474 Engine.GuiInterfaceCall("ClearRenamedEntities"); 442 475 } 443 476 444 function check PlayerState()477 function checkGameEnded() 445 478 { 446 479 // Once the game ends, we're done here. 447 if (g_GameEnded || g_IsObserver )480 if (g_GameEnded || g_IsObserver || g_ViewedPlayer <= 0) 448 481 return; 449 482 450 483 // Send a game report for each player in this game. 451 484 var m_simState = GetSimState(); 452 485 var playerState = m_simState.players[Engine.GetPlayerID()]; … … 543 576 updateSelectionDetails(); 544 577 updateBuildingPlacementPreview(); 545 578 updateTimeElapsedCounter(); 546 579 updateCeasefireCounter(); 547 580 updateTimeNotifications(); 548 if (!g_IsObserver) 549 updateResearchDisplay(); 581 updateResearchDisplay(); 550 582 551 583 if (!g_IsObserver && !g_GameEnded) 552 584 { 553 585 // Update music state on basis of battle state. 554 586 var battleState = Engine.GuiInterfaceCall("GetBattleState", Engine.GetPlayerID()); … … 596 628 } 597 629 598 630 599 631 function updateHero() 600 632 { 601 var playerState = GetSimState().players[Engine.GetPlayerID()]; 633 var viewedPlayer = g_IsObserver ? g_ViewedPlayer : Engine.GetPlayerID(); 634 var playerState = GetSimState().players[viewedPlayer]; 602 635 var unitHeroPanel = Engine.GetGUIObjectByName("unitHeroPanel"); 603 636 var heroButton = Engine.GetGUIObjectByName("unitHeroButton"); 604 637 605 638 if (!playerState || playerState.heroes.length <= 0) 606 639 { 607 640 g_previousHeroHitPoints = undefined; 641 g_previouslyViewedHero = undefined; 608 642 unitHeroPanel.hidden = true; 609 643 return; 610 644 } 611 645 612 646 var heroImage = Engine.GetGUIObjectByName("unitHeroImage"); … … 640 674 // update heros health bar 641 675 updateGUIStatusBar("heroHealthBar", heroState.hitpoints, heroState.maxHitpoints); 642 676 643 677 // define the hit points if not defined 644 678 if (!g_previousHeroHitPoints) 679 { 645 680 g_previousHeroHitPoints = heroState.hitpoints; 681 g_previouslyViewedHero = viewedPlayer; 682 } 646 683 647 684 // 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) 649 686 startColorFade("heroHitOverlay", 100, 0, colorFade_attackUnit, true, smoothColorFadeRestart_attackUnit); 650 687 651 688 g_previousHeroHitPoints = heroState.hitpoints; 689 g_previouslyViewedHero = viewedPlayer; 652 690 } 653 691 654 692 655 693 function updateGroups() 656 694 { … … 704 742 debug.caption = text.replace(/\[/g, "\\["); 705 743 } 706 744 707 745 function updatePlayerDisplay() 708 746 { 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]; 710 755 if (!playerState) 711 756 return; 712 757 713 758 Engine.GetGUIObjectByName("resourceFood").caption = Math.floor(playerState.resourceCounts.food); 714 759 Engine.GetGUIObjectByName("resourceWood").caption = Math.floor(playerState.resourceCounts.wood); … … 734 779 Engine.CameraMoveTo(position.x, position.z); 735 780 } 736 781 737 782 function updateResearchDisplay() 738 783 { 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) 741 788 return; 742 789 743 790 // Set up initial positioning. 744 791 var buttonSideLength = Engine.GetGUIObjectByName("researchStartedButton[0]").size.right; 745 792 for (var i = 0; i < 10; ++i) -
binaries/data/mods/public/gui/session/session.xml
63 63 64 64 <object size="0 16 100%-18 32" type="text" style="devCommandsText"> 65 65 <translatableAttribute id="caption">Change perspective</translatableAttribute> 66 66 </object> 67 67 <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> 69 72 </object> 70 73 71 74 <object size="0 32 100%-18 48" type="text" style="devCommandsText"> 72 75 <translatableAttribute id="caption">Display selection state</translatableAttribute> 73 76 </object> -
binaries/data/mods/public/gui/session/top_panel.xml
21 21 22 22 <!-- ================================ ================================ --> 23 23 <!-- Observer Mode Warning --> 24 24 <!-- ================================ ================================ --> 25 25 <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> 27 27 </object> 28 28 29 29 </object> -
binaries/data/mods/public/simulation/components/GuiInterface.js
109 109 "isEnemy": enemies, 110 110 "entityLimits": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetLimits() : null, 111 111 "entityCounts": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetCounts() : null, 112 112 "entityLimitChangers": cmpPlayerEntityLimits ? cmpPlayerEntityLimits.GetLimitChangers() : null, 113 113 "researchQueued": cmpTechnologyManager ? cmpTechnologyManager.GetQueuedResearch() : null, 114 "researchStarted": cmpTechnologyManager ? cmpTechnologyManager.GetStartedResearch( ) : null,114 "researchStarted": cmpTechnologyManager ? cmpTechnologyManager.GetStartedResearch(i) : null, 115 115 "researchedTechs": cmpTechnologyManager ? cmpTechnologyManager.GetResearchedTechs() : null, 116 116 "classCounts": cmpTechnologyManager ? cmpTechnologyManager.GetClassCounts() : null, 117 117 "typeCountsByClass": cmpTechnologyManager ? cmpTechnologyManager.GetTypeCountsByClass() : null 118 118 }; 119 119 ret.players.push(playerData); … … 639 639 return cmpTechnologyManager.CanResearch(tech); 640 640 }; 641 641 642 642 // Returns technologies that are being actively researched, along with 643 643 // which entity is researching them and how far along the research is. 644 GuiInterface.prototype.GetStartedResearch = function(player )644 GuiInterface.prototype.GetStartedResearch = function(player, differentPlayer) 645 645 { 646 // TODO: player will be filled in automatically by ScriptCall, how to make it less ugly? 647 player = differentPlayer ? differentPlayer : player; 646 648 var cmpTechnologyManager = QueryPlayerIDInterface(player, IID_TechnologyManager); 647 649 if (!cmpTechnologyManager) 648 650 return false; 649 651 650 652 var ret = {}; … … 1797 1799 { 1798 1800 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 1799 1801 cmpRangeManager.SetDebugOverlay(enabled); 1800 1802 }; 1801 1803 1802 GuiInterface.prototype.GetTraderNumber = function(player )1804 GuiInterface.prototype.GetTraderNumber = function(player, differentPlayer) 1803 1805 { 1806 player = differentPlayer ? differentPlayer : player; 1804 1807 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 1805 1808 var traders = cmpRangeManager.GetEntitiesByPlayer(player).filter( function(e) { 1806 1809 return Engine.QueryInterface(e, IID_Trader); 1807 1810 }); 1808 1811 … … 1836 1839 } 1837 1840 1838 1841 return { "landTrader": landTrader, "shipTrader": shipTrader }; 1839 1842 }; 1840 1843 1841 GuiInterface.prototype.GetTradingGoods = function(player, tradingGoods)1844 GuiInterface.prototype.GetTradingGoods = function(player, differentPlayer) 1842 1845 { 1846 player = differentPlayer ? differentPlayer : player; 1843 1847 var cmpPlayer = QueryPlayerIDInterface(player, IID_Player); 1844 1848 return cmpPlayer.GetTradingGoods(); 1845 1849 }; 1846 1850 1847 1851 GuiInterface.prototype.OnGlobalEntityRenamed = function(msg) -
source/simulation2/system/SimContext.cpp
1 /* Copyright (C) 201 1Wildfire Games.1 /* Copyright (C) 2015 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify 5 5 * it under the terms of the GNU General Public License as published by 6 6 * the Free Software Foundation, either version 2 of the License, or … … 65 65 return GetComponentManager().GetScriptInterface(); 66 66 } 67 67 68 68 int CSimContext::GetCurrentDisplayedPlayer() const 69 69 { 70 if (!g_Game) 70 if (g_Game) 71 return g_Game->GetPlayerID(); 72 else 71 73 return -1; 72 return g_Game->GetPlayerID(); 74 } 75 76 void CSimContext::SetCurrentDisplayedPlayer(int player) 77 { 78 currentDisplayedPlayer = player; 73 79 } -
source/simulation2/system/SimContext.h
51 51 /** 52 52 * Returns the player ID that the current display is being rendered for. 53 53 * Currently relies on g_Game being initialised (evil globals...) 54 54 */ 55 55 int GetCurrentDisplayedPlayer() const; 56 void SetCurrentDisplayedPlayer(int player); 56 57 57 58 private: 58 59 CComponentManager* m_ComponentManager; 59 60 CUnitManager* m_UnitManager; 60 61 CTerrain* m_Terrain; 61 62 62 63 CEntityHandle m_SystemEntity; 63 64 65 int currentDisplayedPlayer; 66 64 67 friend class CSimulation2Impl; 65 68 }; 66 69 67 70 #endif // INCLUDED_SIMCONTEXT