@@ -141,6 +141,9 @@ enum { OBJ_HASH_SIZE = 8192 };
141141// / The GameLogic singleton instance
142142GameLogic *TheGameLogic = nullptr ;
143143
144+ extern GameInfo *TheGameInfo;
145+
146+
144147static void findAndSelectCommandCenter (Object *obj, void * alreadyFound);
145148
146149
@@ -262,6 +265,7 @@ GameLogic::GameLogic( void )
262265 m_loadingMap = FALSE ;
263266 m_loadingSave = FALSE ;
264267 m_clearingGameData = FALSE ;
268+ m_quitToDesktopAfterMatch = FALSE ;
265269}
266270
267271// -------------------------------------------------------------------------------------------------
@@ -4162,14 +4166,71 @@ UnsignedInt GameLogic::getCRC( Int mode, AsciiString deepCRCFileName )
41624166// ------------------------------------------------------------------------------------------------
41634167void GameLogic::exitGame ()
41644168{
4165- // TheSuperHackers @fix The logic update must not be halted to process the game exit message.
41664169 setGamePaused (FALSE );
41674170 TheScriptEngine->forceUnfreezeTime ();
41684171 TheScriptEngine->doUnfreezeTime ();
41694172
41704173 TheMessageStream->appendMessage (GameMessage::MSG_CLEAR_GAME_DATA );
41714174}
41724175
4176+ // ------------------------------------------------------------------------------------------------
4177+ void GameLogic::quit (Bool toDesktop, Bool forceSurrender)
4178+ {
4179+ if (isInGame ())
4180+ {
4181+ if (forceSurrender)
4182+ {
4183+ if (isInMultiplayerGame () && !isInSkirmishGame () && TheGameInfo && !TheGameInfo->isSandbox ())
4184+ {
4185+ GameMessage *msg = TheMessageStream->appendMessage (GameMessage::MSG_SELF_DESTRUCT );
4186+ msg->appendBooleanArgument (TRUE );
4187+ }
4188+ }
4189+
4190+ if (TheRecorder && TheRecorder->getMode () == RECORDERMODETYPE_RECORD )
4191+ {
4192+ TheRecorder->stopRecording ();
4193+ }
4194+
4195+ setGamePaused (FALSE );
4196+ if (TheScriptEngine)
4197+ {
4198+ TheScriptEngine->forceUnfreezeTime ();
4199+ TheScriptEngine->doUnfreezeTime ();
4200+ }
4201+
4202+ if (toDesktop)
4203+ {
4204+ if (isInMultiplayerGame ())
4205+ {
4206+ m_quitToDesktopAfterMatch = TRUE ;
4207+ exitGame ();
4208+ }
4209+ else
4210+ {
4211+ clearGameData ();
4212+ }
4213+ }
4214+ else
4215+ {
4216+ exitGame ();
4217+ }
4218+ }
4219+
4220+ if (toDesktop)
4221+ {
4222+ if (!isInMultiplayerGame ())
4223+ {
4224+ TheGameEngine->setQuitting (TRUE );
4225+ }
4226+ }
4227+
4228+ if (TheInGameUI)
4229+ {
4230+ TheInGameUI->setClientQuiet (TRUE );
4231+ }
4232+ }
4233+
41734234// ------------------------------------------------------------------------------------------------
41744235/* * A new GameLogic object has been constructed, therefore create
41754236 * a corresponding drawable and bind them together. */
0 commit comments