Skip to content

Commit 0344e34

Browse files
committed
feat(observer): Add button mapping for toggling Replay Observer
The CommandMap name is 'TOGGLE_PLAYER_OBSERVER' and the default button mapping is 'M'
1 parent df6ebbd commit 0344e34

File tree

7 files changed

+49
-8
lines changed

7 files changed

+49
-8
lines changed

Core/GameEngine/Include/Common/GameUtility.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace rts
2828
Bool localPlayerIsObserving();
2929
Player* getObservedOrLocalPlayer(); ///< Get the current observed or local player. Is never null.
3030

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

3434
} // namespace rts

Core/GameEngine/Source/Common/GameUtility.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ Player* getObservedOrLocalPlayer()
7070

7171
void changeLocalPlayer(Player* player)
7272
{
73+
DEBUG_ASSERTCRASH(player != NULL, ("Player is NULL"));
74+
7375
ThePlayerList->setLocalPlayer(player);
7476
TheControlBar->setControlBarSchemeByPlayer(player);
7577
TheControlBar->initSpecialPowershortcutBar(player);
@@ -87,7 +89,11 @@ void changeObservedPlayer(Player* player)
8789
if (canBeginObservePlayer || canEndObservePlayer)
8890
{
8991
TheControlBar->setObservedPlayer(player);
90-
detail::changePlayerCommon(player);
92+
93+
Player *becomePlayer = player;
94+
if (becomePlayer == NULL)
95+
becomePlayer = ThePlayerList->findPlayerWithNameKey(TheNameKeyGenerator->nameToKey("ReplayObserver"));
96+
detail::changePlayerCommon(becomePlayer);
9197
}
9298
}
9399

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);

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3388,6 +3388,28 @@ GameMessageDisposition CommandTranslator::translateGameMessage(const GameMessage
33883388
break;
33893389
}
33903390

3391+
//-----------------------------------------------------------------------------------------
3392+
case GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER:
3393+
{
3394+
if (Player *lookAtPlayer = TheControlBar->getObserverLookAtPlayer())
3395+
{
3396+
if (Player *observedPlayer = TheControlBar->getObservedPlayer())
3397+
{
3398+
// Set no observed player.
3399+
rts::changeObservedPlayer(NULL);
3400+
// But keep the look-at player.
3401+
TheControlBar->setObserverLookAtPlayer(lookAtPlayer);
3402+
}
3403+
else
3404+
{
3405+
// Set observed player to look-at player.
3406+
rts::changeObservedPlayer(lookAtPlayer);
3407+
}
3408+
disp = DESTROY_MESSAGE;
3409+
}
3410+
break;
3411+
}
3412+
33913413
//-----------------------------------------------------------------------------------------
33923414
case GameMessage::MSG_META_TOGGLE_ATTACKMOVE:
33933415
TheInGameUI->toggleAttackMoveToMode( );

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ static const LookupListRec GameMessageMetaTypeNames[] =
158158
{ "DECREASE_LOGIC_TIME_SCALE", GameMessage::MSG_META_DECREASE_LOGIC_TIME_SCALE },
159159
{ "TOGGLE_LOWER_DETAILS", GameMessage::MSG_META_TOGGLE_LOWER_DETAILS },
160160
{ "TOGGLE_CONTROL_BAR", GameMessage::MSG_META_TOGGLE_CONTROL_BAR },
161+
{ "TOGGLE_PLAYER_OBSERVER", GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER },
161162
{ "BEGIN_PATH_BUILD", GameMessage::MSG_META_BEGIN_PATH_BUILD },
162163
{ "END_PATH_BUILD", GameMessage::MSG_META_END_PATH_BUILD },
163164
{ "BEGIN_FORCEATTACK", GameMessage::MSG_META_BEGIN_FORCEATTACK },
@@ -771,6 +772,17 @@ MetaMapRec *MetaMap::getMetaMapRec(GameMessage::Type t)
771772
map->m_usableIn = COMMANDUSABLE_EVERYWHERE;
772773
}
773774
}
775+
{
776+
// Is useful for Generals and Zero Hour.
777+
MetaMapRec *map = TheMetaMap->getMetaMapRec(GameMessage::MSG_META_TOGGLE_PLAYER_OBSERVER);
778+
if (map->m_key == MK_NONE)
779+
{
780+
map->m_key = MK_M;
781+
map->m_transition = DOWN;
782+
map->m_modState = NONE;
783+
map->m_usableIn = COMMANDUSABLE_OBSERVER;
784+
}
785+
}
774786
{
775787
// Is mostly useful for Generals.
776788
MetaMapRec *map = TheMetaMap->getMetaMapRec(GameMessage::MSG_META_TOGGLE_FAST_FORWARD_REPLAY);

0 commit comments

Comments
 (0)