Skip to content

Commit dd2bb78

Browse files
authored
feat(gui): Add button to select the next idle worker of the currently viewed player for observers (#1526)
1 parent 5765997 commit dd2bb78

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

Generals/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBarObserver.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ static NameKeyType buttonCancelID = NAMEKEY_INVALID;
8989

9090
static GameWindow *winFlag = NULL;
9191
static GameWindow *winGeneralPortrait = NULL;
92+
// TheSuperHackers @tweak Allow idle worker selection for observers.
93+
static GameWindow *buttonIdleWorker = NULL;
9294
static GameWindow *staticTextNumberOfUnits = NULL;
9395
static GameWindow *staticTextNumberOfBuildings = NULL;
9496
static GameWindow *staticTextNumberOfUnitsKilled = NULL;
@@ -123,6 +125,7 @@ void ControlBar::initObserverControls( void )
123125
staticTextPlayerName = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:StaticTextPlayerName"));
124126
winFlag = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:WinFlag"));
125127
winGeneralPortrait = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:WinGeneralPortrait"));
128+
buttonIdleWorker = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:ButtonIdleWorker"));
126129

127130
buttonCancelID = TheNameKeyGenerator->nameToKey("ControlBar.wnd:ButtonCancel");
128131
}
@@ -163,6 +166,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
163166
TheControlBar->setObserverLookAtPlayer(NULL);
164167
ObserverPlayerInfoWindow->winHide(TRUE);
165168
ObserverPlayerListWindow->winHide(FALSE);
169+
buttonIdleWorker->winHide(TRUE);
166170
TheControlBar->populateObserverList();
167171

168172
}
@@ -301,6 +305,7 @@ void ControlBar::populateObserverInfoWindow ( void )
301305
{
302306
ObserverPlayerInfoWindow->winHide(TRUE);
303307
ObserverPlayerListWindow->winHide(FALSE);
308+
buttonIdleWorker->winHide(TRUE);
304309
populateObserverList();
305310
return;
306311
}
@@ -338,4 +343,5 @@ void ControlBar::populateObserverInfoWindow ( void )
338343
staticTextPlayerName->winSetEnabledTextColors(color, GameMakeColor(0,0,0,255));
339344
winFlag->winSetEnabledImage(0, m_observerLookAtPlayer->getPlayerTemplate()->getFlagWaterMarkImage());
340345
winGeneralPortrait->winHide(FALSE);
346+
buttonIdleWorker->winHide(FALSE);
341347
}

Generals/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5428,7 +5428,7 @@ void InGameUI::removeIdleWorker( Object *obj, Int playerNumber )
54285428

54295429
void InGameUI::selectNextIdleWorker( void )
54305430
{
5431-
Int index = ThePlayerList->getLocalPlayer()->getPlayerIndex();
5431+
Int index = TheControlBar->getCurrentlyViewedPlayer()->getPlayerIndex();
54325432
if(m_idleWorkers[index].empty())
54335433
{
54345434
DEBUG_ASSERTCRASH(FALSE, ("InGameUI::selectNextIdleWorker We're trying to select a worker when our list is empty for player %ls", ThePlayerList->getLocalPlayer()->getPlayerDisplayName().str()));
@@ -5518,8 +5518,13 @@ ObjectPtrVector InGameUI::getUniqueIdleWorkers(const ObjectList& idleWorkers)
55185518

55195519
Int InGameUI::getIdleWorkerCount( void )
55205520
{
5521-
Int index = ThePlayerList->getLocalPlayer()->getPlayerIndex();
5522-
return m_idleWorkers[index].size();
5521+
if (Player* player = TheControlBar->getCurrentlyViewedPlayer())
5522+
{
5523+
Int index = player->getPlayerIndex();
5524+
return m_idleWorkers[index].size();
5525+
}
5526+
5527+
return 0;
55235528
}
55245529

55255530
void InGameUI::showIdleWorkerLayout( void )

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBarObserver.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ static NameKeyType buttonCancelID = NAMEKEY_INVALID;
8989

9090
static GameWindow *winFlag = NULL;
9191
static GameWindow *winGeneralPortrait = NULL;
92+
// TheSuperHackers @tweak Allow idle worker selection for observers.
93+
static GameWindow *buttonIdleWorker = NULL;
9294
static GameWindow *staticTextNumberOfUnits = NULL;
9395
static GameWindow *staticTextNumberOfBuildings = NULL;
9496
static GameWindow *staticTextNumberOfUnitsKilled = NULL;
@@ -123,6 +125,7 @@ void ControlBar::initObserverControls( void )
123125
staticTextPlayerName = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:StaticTextPlayerName"));
124126
winFlag = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:WinFlag"));
125127
winGeneralPortrait = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:WinGeneralPortrait"));
128+
buttonIdleWorker = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("ControlBar.wnd:ButtonIdleWorker"));
126129

127130
buttonCancelID = TheNameKeyGenerator->nameToKey("ControlBar.wnd:ButtonCancel");
128131
}
@@ -163,6 +166,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
163166
TheControlBar->setObserverLookAtPlayer(NULL);
164167
ObserverPlayerInfoWindow->winHide(TRUE);
165168
ObserverPlayerListWindow->winHide(FALSE);
169+
buttonIdleWorker->winHide(TRUE);
166170
TheControlBar->populateObserverList();
167171

168172
}
@@ -301,6 +305,7 @@ void ControlBar::populateObserverInfoWindow ( void )
301305
{
302306
ObserverPlayerInfoWindow->winHide(TRUE);
303307
ObserverPlayerListWindow->winHide(FALSE);
308+
buttonIdleWorker->winHide(TRUE);
304309
populateObserverList();
305310
return;
306311
}
@@ -338,4 +343,5 @@ void ControlBar::populateObserverInfoWindow ( void )
338343
staticTextPlayerName->winSetEnabledTextColors(color, GameMakeColor(0,0,0,255));
339344
winFlag->winSetEnabledImage(0, m_observerLookAtPlayer->getPlayerTemplate()->getFlagWaterMarkImage());
340345
winGeneralPortrait->winHide(FALSE);
346+
buttonIdleWorker->winHide(FALSE);
341347
}

GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5600,7 +5600,7 @@ void InGameUI::removeIdleWorker( Object *obj, Int playerNumber )
56005600

56015601
void InGameUI::selectNextIdleWorker( void )
56025602
{
5603-
Int index = ThePlayerList->getLocalPlayer()->getPlayerIndex();
5603+
Int index = TheControlBar->getCurrentlyViewedPlayer()->getPlayerIndex();
56045604
if(m_idleWorkers[index].empty())
56055605
{
56065606
DEBUG_ASSERTCRASH(FALSE, ("InGameUI::selectNextIdleWorker We're trying to select a worker when our list is empty for player %ls", ThePlayerList->getLocalPlayer()->getPlayerDisplayName().str()));
@@ -5690,8 +5690,13 @@ ObjectPtrVector InGameUI::getUniqueIdleWorkers(const ObjectList& idleWorkers)
56905690

56915691
Int InGameUI::getIdleWorkerCount( void )
56925692
{
5693-
Int index = ThePlayerList->getLocalPlayer()->getPlayerIndex();
5694-
return m_idleWorkers[index].size();
5693+
if (Player* player = TheControlBar->getCurrentlyViewedPlayer())
5694+
{
5695+
Int index = player->getPlayerIndex();
5696+
return m_idleWorkers[index].size();
5697+
}
5698+
5699+
return 0;
56955700
}
56965701

56975702
void InGameUI::showIdleWorkerLayout( void )

0 commit comments

Comments
 (0)