Skip to content

Commit 84017ea

Browse files
authored
feat(observer): Add button mapping for toggling Replay Observer (#1718)
Adds CommandMap TOGGLE_PLAYER_OBSERVER with default button mapping 'M'
1 parent 4f89033 commit 84017ea

File tree

12 files changed

+89
-13
lines changed

12 files changed

+89
-13
lines changed

Core/GameEngine/Include/Common/GameUtility.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Player* getObservedOrLocalPlayer(); ///< Get the current observed or local playe
3434
Player* getObservedOrLocalPlayer_Safe(); ///< Get the current observed or local player. Is never null, except when the application does not have players.
3535
PlayerIndex getObservedOrLocalPlayerIndex_Safe(); ///< Get the current observed or local player index. Returns 0 when the application does not have players.
3636

37-
void changeLocalPlayer(Player* player); //< Change local player during game
38-
void changeObservedPlayer(Player* player); ///< Change observed player during game
37+
void changeLocalPlayer(Player* player); //< Change local player during game. Must not pass null.
38+
void changeObservedPlayer(Player* player); ///< Change observed player during game. Can pass null: is identical to passing the "ReplayObserver" player.
3939

4040
} // namespace rts

Core/GameEngine/Source/Common/GameUtility.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ PlayerIndex getObservedOrLocalPlayerIndex_Safe()
112112

113113
void changeLocalPlayer(Player* player)
114114
{
115+
DEBUG_ASSERTCRASH(player != NULL, ("Player is NULL"));
116+
115117
ThePlayerList->setLocalPlayer(player);
116118
TheControlBar->setObserverLookAtPlayer(NULL);
117119
TheControlBar->setObservedPlayer(NULL);
@@ -131,7 +133,11 @@ void changeObservedPlayer(Player* player)
131133
if (canBeginObservePlayer || canEndObservePlayer)
132134
{
133135
TheControlBar->setObservedPlayer(player);
134-
detail::changePlayerCommon(player);
136+
137+
Player *becomePlayer = player;
138+
if (becomePlayer == NULL)
139+
becomePlayer = ThePlayerList->findPlayerWithNameKey(TheNameKeyGenerator->nameToKey("ReplayObserver"));
140+
detail::changePlayerCommon(becomePlayer);
135141
}
136142
}
137143

Generals/Code/GameEngine/Include/Common/MessageStream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class GameMessage : public MemoryPoolObject
247247
MSG_META_DECREASE_LOGIC_TIME_SCALE, ///< TheSuperHackers @feature Decrease the logic time scale
248248
MSG_META_TOGGLE_LOWER_DETAILS, ///< toggles graphics options to crappy mode instantly
249249
MSG_META_TOGGLE_CONTROL_BAR, ///< show/hide controlbar
250+
MSG_META_TOGGLE_PLAYER_OBSERVER, ///< TheSuperHackers @feature Toggle the player observer view in game
250251

251252
MSG_META_BEGIN_PATH_BUILD, ///< enter path-building mode
252253
MSG_META_END_PATH_BUILD, ///< exit path-building mode

Generals/Code/GameEngine/Source/Common/MessageStream.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ const char *GameMessage::getCommandTypeAsString(GameMessage::Type t)
352352
CASE_LABEL(MSG_META_DECREASE_LOGIC_TIME_SCALE)
353353
CASE_LABEL(MSG_META_TOGGLE_LOWER_DETAILS)
354354
CASE_LABEL(MSG_META_TOGGLE_CONTROL_BAR)
355+
CASE_LABEL(MSG_META_TOGGLE_PLAYER_OBSERVER)
355356
CASE_LABEL(MSG_META_BEGIN_PATH_BUILD)
356357
CASE_LABEL(MSG_META_END_PATH_BUILD)
357358
CASE_LABEL(MSG_META_BEGIN_FORCEATTACK)

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void ControlBar::initObserverControls( void )
138138
//-------------------------------------------------------------------------------------------------
139139
void ControlBar::setObserverLookAtPlayer(Player *player)
140140
{
141-
if (player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
141+
if (player != NULL && player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
142142
{
143143
// Looking at the observer. Treat as not looking at player.
144144
m_observerLookAtPlayer = NULL;
@@ -152,7 +152,7 @@ void ControlBar::setObserverLookAtPlayer(Player *player)
152152
//-------------------------------------------------------------------------------------------------
153153
void ControlBar::setObservedPlayer(Player *player)
154154
{
155-
if (player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
155+
if (player != NULL && player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
156156
{
157157
// Looking at the observer. Treat as not observing player.
158158
m_observedPlayer = NULL;
@@ -196,8 +196,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
196196
Int controlID = control->winGetWindowId();
197197
if( controlID == buttonCancelID)
198198
{
199-
Player* observerPlayer = ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey);
200-
rts::changeObservedPlayer(observerPlayer);
199+
rts::changeObservedPlayer(NULL);
201200

202201
ObserverPlayerInfoWindow->winHide(TRUE);
203202
ObserverPlayerListWindow->winHide(FALSE);
@@ -209,7 +208,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
209208
{
210209
if( controlID == buttonPlayerID[i])
211210
{
212-
Player* player = reinterpret_cast<Player*>(GadgetButtonGetData(buttonPlayer[i]));
211+
Player* player = static_cast<Player*>(GadgetButtonGetData(buttonPlayer[i]));
213212
rts::changeObservedPlayer(player);
214213

215214
ObserverPlayerInfoWindow->winHide(FALSE);

Generals/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3236,6 +3236,28 @@ GameMessageDisposition CommandTranslator::translateGameMessage(const GameMessage
32363236
break;
32373237
}
32383238

3239+
//-----------------------------------------------------------------------------------------
3240+
case GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER:
3241+
{
3242+
if (Player *lookAtPlayer = TheControlBar->getObserverLookAtPlayer())
3243+
{
3244+
if (Player *observedPlayer = TheControlBar->getObservedPlayer())
3245+
{
3246+
// Set no observed player.
3247+
rts::changeObservedPlayer(NULL);
3248+
// But keep the look-at player.
3249+
TheControlBar->setObserverLookAtPlayer(lookAtPlayer);
3250+
}
3251+
else
3252+
{
3253+
// Set observed player to look-at player.
3254+
rts::changeObservedPlayer(lookAtPlayer);
3255+
}
3256+
disp = DESTROY_MESSAGE;
3257+
}
3258+
break;
3259+
}
3260+
32393261
//-----------------------------------------------------------------------------------------
32403262
case GameMessage::MSG_META_TOGGLE_ATTACKMOVE:
32413263
TheInGameUI->toggleAttackMoveToMode( );

Generals/Code/GameEngine/Source/GameClient/MessageStream/MetaEvent.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ static const LookupListRec GameMessageMetaTypeNames[] =
150150
{ "DECREASE_LOGIC_TIME_SCALE", GameMessage::MSG_META_DECREASE_LOGIC_TIME_SCALE },
151151
{ "TOGGLE_LOWER_DETAILS", GameMessage::MSG_META_TOGGLE_LOWER_DETAILS },
152152
{ "TOGGLE_CONTROL_BAR", GameMessage::MSG_META_TOGGLE_CONTROL_BAR },
153+
{ "TOGGLE_PLAYER_OBSERVER", GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER },
153154
{ "BEGIN_PATH_BUILD", GameMessage::MSG_META_BEGIN_PATH_BUILD },
154155
{ "END_PATH_BUILD", GameMessage::MSG_META_END_PATH_BUILD },
155156
{ "BEGIN_FORCEATTACK", GameMessage::MSG_META_BEGIN_FORCEATTACK },
@@ -713,6 +714,17 @@ MetaMapRec *MetaMap::getMetaMapRec(GameMessage::Type t)
713714
map->m_usableIn = COMMANDUSABLE_EVERYWHERE;
714715
}
715716
}
717+
{
718+
// Is useful for Generals and Zero Hour.
719+
MetaMapRec *map = TheMetaMap->getMetaMapRec(GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER);
720+
if (map->m_key == MK_NONE)
721+
{
722+
map->m_key = MK_M;
723+
map->m_transition = DOWN;
724+
map->m_modState = NONE;
725+
map->m_usableIn = COMMANDUSABLE_OBSERVER;
726+
}
727+
}
716728
{
717729
// Is mostly useful for Generals.
718730
MetaMapRec *map = TheMetaMap->getMetaMapRec(GameMessage::MSG_META_TOGGLE_FAST_FORWARD_REPLAY);

GeneralsMD/Code/GameEngine/Include/Common/MessageStream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class GameMessage : public MemoryPoolObject
247247
MSG_META_DECREASE_LOGIC_TIME_SCALE, ///< TheSuperHackers @feature Decrease the logic time scale
248248
MSG_META_TOGGLE_LOWER_DETAILS, ///< toggles graphics options to crappy mode instantly
249249
MSG_META_TOGGLE_CONTROL_BAR, ///< show/hide controlbar
250+
MSG_META_TOGGLE_PLAYER_OBSERVER, ///< TheSuperHackers @feature Toggle the player observer view in game
250251

251252
MSG_META_BEGIN_PATH_BUILD, ///< enter path-building mode
252253
MSG_META_END_PATH_BUILD, ///< exit path-building mode

GeneralsMD/Code/GameEngine/Source/Common/MessageStream.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ const char *GameMessage::getCommandTypeAsString(GameMessage::Type t)
352352
CASE_LABEL(MSG_META_DECREASE_LOGIC_TIME_SCALE)
353353
CASE_LABEL(MSG_META_TOGGLE_LOWER_DETAILS)
354354
CASE_LABEL(MSG_META_TOGGLE_CONTROL_BAR)
355+
CASE_LABEL(MSG_META_TOGGLE_PLAYER_OBSERVER)
355356
CASE_LABEL(MSG_META_BEGIN_PATH_BUILD)
356357
CASE_LABEL(MSG_META_END_PATH_BUILD)
357358
CASE_LABEL(MSG_META_BEGIN_FORCEATTACK)

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void ControlBar::initObserverControls( void )
138138
//-------------------------------------------------------------------------------------------------
139139
void ControlBar::setObserverLookAtPlayer(Player *player)
140140
{
141-
if (player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
141+
if (player != NULL && player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
142142
{
143143
// Looking at the observer. Treat as not looking at player.
144144
m_observerLookAtPlayer = NULL;
@@ -152,7 +152,7 @@ void ControlBar::setObserverLookAtPlayer(Player *player)
152152
//-------------------------------------------------------------------------------------------------
153153
void ControlBar::setObservedPlayer(Player *player)
154154
{
155-
if (player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
155+
if (player != NULL && player == ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey))
156156
{
157157
// Looking at the observer. Treat as not observing player.
158158
m_observedPlayer = NULL;
@@ -196,8 +196,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
196196
Int controlID = control->winGetWindowId();
197197
if( controlID == buttonCancelID)
198198
{
199-
Player* observerPlayer = ThePlayerList->findPlayerWithNameKey(s_replayObserverNameKey);
200-
rts::changeObservedPlayer(observerPlayer);
199+
rts::changeObservedPlayer(NULL);
201200

202201
ObserverPlayerInfoWindow->winHide(TRUE);
203202
ObserverPlayerListWindow->winHide(FALSE);
@@ -209,7 +208,7 @@ WindowMsgHandledType ControlBarObserverSystem( GameWindow *window, UnsignedInt m
209208
{
210209
if( controlID == buttonPlayerID[i])
211210
{
212-
Player* player = reinterpret_cast<Player*>(GadgetButtonGetData(buttonPlayer[i]));
211+
Player* player = static_cast<Player*>(GadgetButtonGetData(buttonPlayer[i]));
213212
rts::changeObservedPlayer(player);
214213

215214
ObserverPlayerInfoWindow->winHide(FALSE);

0 commit comments

Comments
 (0)