Maelstrom: Removed the inner draw/event loops so each frame of the game goes through ShowFrame(), which is needed on iOS.

https://github.com/libsdl-org/Maelstrom/commit/9f8909359bd292bff0ca617cb6a9a3c738608822

From 9f8909359bd292bff0ca617cb6a9a3c738608822 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 25 Jun 2012 11:42:13 -0400
Subject: [PATCH] Removed the inner draw/event loops so each frame of the game
 goes through ShowFrame(), which is needed on iOS.

---
 Maelstrom_Data.zip                            | Bin 1107050 -> 1107066 bytes
 Xcode-iOS/Maelstrom.xcodeproj/project.pbxproj |   6 +
 game/MaelstromUI.cpp                          |   3 +
 game/Makefile.am                              |   2 +
 game/Makefile.in                              |  13 +-
 game/game.cpp                                 | 262 +----------------
 game/game.h                                   |   1 +
 game/gameover.cpp                             | 270 ++++++++++++++++++
 game/gameover.h                               |  49 ++++
 game/main.cpp                                 |  49 ++--
 screenlib/UIManager.cpp                       |   2 +-
 11 files changed, 380 insertions(+), 277 deletions(-)
 create mode 100644 game/gameover.cpp
 create mode 100644 game/gameover.h

diff --git a/Maelstrom_Data.zip b/Maelstrom_Data.zip
index 3438e768281125c565d9c66b31284f70deba4be2..f8c461ca841eb685725638dfce0e8ed804372742 100644
GIT binary patch
delta 13633
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
Ef7AP{J^%m!

delta 13629
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
IHJTd#2No#LtpET3

diff --git a/Xcode-iOS/Maelstrom.xcodeproj/project.pbxproj b/Xcode-iOS/Maelstrom.xcodeproj/project.pbxproj
index 9c4c4d28..faa7dccf 100644
--- a/Xcode-iOS/Maelstrom.xcodeproj/project.pbxproj
+++ b/Xcode-iOS/Maelstrom.xcodeproj/project.pbxproj
@@ -62,6 +62,7 @@
 		AA9781B91576A03700472542 /* replay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA9781A01576A03700472542 /* replay.cpp */; };
 		AA9781BA1576A03700472542 /* scores.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA9781A21576A03700472542 /* scores.cpp */; };
 		AA9781BC1576A14D00472542 /* Maelstrom_Data.zip in Resources */ = {isa = PBXBuildFile; fileRef = AA9781BB1576A14D00472542 /* Maelstrom_Data.zip */; };
+		AACF51001598BC2C00585701 /* gameover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AACF50FE1598BC2C00585701 /* gameover.cpp */; };
 		AAD13B82145E8A8F0040B19C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAD13B81145E8A8F0040B19C /* UIKit.framework */; };
 		AAD13B84145E8A8F0040B19C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAD13B83145E8A8F0040B19C /* Foundation.framework */; };
 		AAD13B86145E8A8F0040B19C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAD13B85145E8A8F0040B19C /* CoreGraphics.framework */; };
@@ -290,6 +291,8 @@
 		AA9781BB1576A14D00472542 /* Maelstrom_Data.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = Maelstrom_Data.zip; sourceTree = "<group>"; };
 		AA9781BE1576A39F00472542 /* SDL_net.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_net.h; sourceTree = "<group>"; };
 		AA9781BF1576A3BD00472542 /* physfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs.h; sourceTree = "<group>"; };
+		AACF50FE1598BC2C00585701 /* gameover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gameover.cpp; sourceTree = "<group>"; };
+		AACF50FF1598BC2C00585701 /* gameover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gameover.h; sourceTree = "<group>"; };
 		AAD13B7D145E8A8F0040B19C /* Maelstrom.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Maelstrom.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		AAD13B81145E8A8F0040B19C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
 		AAD13B83145E8A8F0040B19C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -538,6 +541,8 @@
 				AA97817D1576A03700472542 /* game.h */,
 				AA97817E1576A03700472542 /* gameinfo.cpp */,
 				AA97817F1576A03700472542 /* gameinfo.h */,
+				AACF50FE1598BC2C00585701 /* gameover.cpp */,
+				AACF50FF1598BC2C00585701 /* gameover.h */,
 				AA9781801576A03700472542 /* init.cpp */,
 				AA9781811576A03700472542 /* init.h */,
 				AA9781821576A03700472542 /* load.cpp */,
@@ -799,6 +804,7 @@
 				AA9781B91576A03700472542 /* replay.cpp in Sources */,
 				AA9781BA1576A03700472542 /* scores.cpp in Sources */,
 				AA7557AB1595062C00BBD41B /* Maelstrom_GameKit.mm in Sources */,
+				AACF51001598BC2C00585701 /* gameover.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/game/MaelstromUI.cpp b/game/MaelstromUI.cpp
index 86141284..f0f7b5fd 100644
--- a/game/MaelstromUI.cpp
+++ b/game/MaelstromUI.cpp
@@ -27,6 +27,7 @@
 #include "controls.h"
 #include "about.h"
 #include "game.h"
+#include "gameover.h"
 #include "player.h"
 #include "lobby.h"
 #include "MacDialog.h"
@@ -179,6 +180,8 @@ MaelstromUI::CreatePanelDelegate(UIPanel *panel, const char *delegate)
 		return new LobbyDialogDelegate(panel);
 	} else if (SDL_strcasecmp(delegate, "GamePanel") == 0) {
 		return new GamePanelDelegate(panel);
+	} else if (SDL_strcasecmp(delegate, "GameOverPanel") == 0) {
+		return new GameOverPanelDelegate(panel);
 	} else if (SDL_strcasecmp(delegate, "ControlsDialog") == 0) {
 		return new ControlsDialogDelegate(panel);
 	}
diff --git a/game/Makefile.am b/game/Makefile.am
index 89a513a7..c724a826 100644
--- a/game/Makefile.am
+++ b/game/Makefile.am
@@ -19,6 +19,8 @@ libgame_a_SOURCES =		\
 	game.h			\
 	gameinfo.cpp		\
 	gameinfo.h		\
+	gameover.cpp		\
+	gameover.h		\
 	init.cpp		\
 	init.h			\
 	load.cpp		\
diff --git a/game/Makefile.in b/game/Makefile.in
index 3e24f3fa..cbecf395 100644
--- a/game/Makefile.in
+++ b/game/Makefile.in
@@ -50,11 +50,11 @@ libgame_a_AR = $(AR) $(ARFLAGS)
 libgame_a_LIBADD =
 am_libgame_a_OBJECTS = MacDialog.$(OBJEXT) MaelstromUI.$(OBJEXT) \
 	about.$(OBJEXT) controls.$(OBJEXT) fastrand.$(OBJEXT) \
-	game.$(OBJEXT) gameinfo.$(OBJEXT) init.$(OBJEXT) \
-	load.$(OBJEXT) lobby.$(OBJEXT) main.$(OBJEXT) make.$(OBJEXT) \
-	myerror.$(OBJEXT) netplay.$(OBJEXT) object.$(OBJEXT) \
-	objects.$(OBJEXT) player.$(OBJEXT) rect.$(OBJEXT) \
-	replay.$(OBJEXT) scores.$(OBJEXT)
+	game.$(OBJEXT) gameinfo.$(OBJEXT) gameover.$(OBJEXT) \
+	init.$(OBJEXT) load.$(OBJEXT) lobby.$(OBJEXT) main.$(OBJEXT) \
+	make.$(OBJEXT) myerror.$(OBJEXT) netplay.$(OBJEXT) \
+	object.$(OBJEXT) objects.$(OBJEXT) player.$(OBJEXT) \
+	rect.$(OBJEXT) replay.$(OBJEXT) scores.$(OBJEXT)
 libgame_a_OBJECTS = $(am_libgame_a_OBJECTS)
 DEFAULT_INCLUDES = -I.@am__isrc@
 depcomp = $(SHELL) $(top_srcdir)/build-scripts/depcomp
@@ -201,6 +201,8 @@ libgame_a_SOURCES = \
 	game.h			\
 	gameinfo.cpp		\
 	gameinfo.h		\
+	gameover.cpp		\
+	gameover.h		\
 	init.cpp		\
 	init.h			\
 	load.cpp		\
@@ -285,6 +287,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fastrand.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/game.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gameinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gameover.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lobby.Po@am__quote@
diff --git a/game/game.cpp b/game/game.cpp
index e17d1cd3..5e662a67 100644
--- a/game/game.cpp
+++ b/game/game.cpp
@@ -55,9 +55,6 @@ int	gFreezeTime;
 Object *gEnemySprite;
 int	gWhenEnemy;
 
-// Local functions used in the game module of Maelstrom
-static void DoGameOver(void);
-
 /* ----------------------------------------------------------------- */
 /* -- Setup the players for a new game */
 
@@ -115,32 +112,6 @@ void NewGame(void)
 #ifdef USE_TOUCHCONTROL
 	ui->ShowPanel("touchcontrol");
 #endif
-
-	/* Play the game, dammit! */
-	while (gGameOn) {
-		ui->Draw();
-
-		/* -- In case we were faded out in DoBonus() */
-		screen->FadeIn();
-
-		/* Timing handling -- Delay the FRAME_DELAY */
-		if ( ! gGameInfo.turbo ) {
-			DelayFrame();
-		}
-	}
-	
-#ifdef USE_TOUCHCONTROL
-	ui->HidePanel("touchcontrol");
-#endif
-	ui->HidePanel(PANEL_GAME);
-
-/* -- Do the game over stuff */
-
-	DoGameOver();
-
-	QuitPlayerControls();
-
-	ui->ShowPanel(PANEL_MAIN);
 }	/* -- NewGame */
 
 bool
@@ -231,6 +202,8 @@ GamePanelDelegate::OnShow()
 void
 GamePanelDelegate::OnHide()
 {
+	gGameOn = 0;
+
 	/* -- Kill any existing sprites */
 	while (gNumSprites > 0)
 		delete gSprites[gNumSprites-1];
@@ -259,7 +232,7 @@ GamePanelDelegate::OnTick()
 
 	/* -- Send Sync! signal to all players, and handle keyboard. */
 	if (!gReplay.HandlePlayback()) {
-		gGameOn = 0;
+		GameOver();
 		return;
 	}
 
@@ -267,7 +240,7 @@ GamePanelDelegate::OnTick()
 
 	// Update state and see if the local player aborted
 	if ( !UpdateGameState() ) {
-		gGameOn = 0;
+		GameOver();
 		return;
 	}
 	switch (syncResult) {
@@ -278,12 +251,12 @@ GamePanelDelegate::OnTick()
 		case SYNC_CORRUPT:
 			// Uh oh...
 			error("Network sync error, game aborted!\r\n");
-			gGameOn = 0;
+			GameOver();
 			return;
 		case SYNC_NETERROR:
 			// Uh oh...
 			error("Network socket error, game aborted!\r\n");
-			gGameOn = 0;
+			GameOver();
 			return;
 		case SYNC_COMPLETE:
 			break;
@@ -677,7 +650,7 @@ GamePanelDelegate::DoHousekeeping()
 		}
 	}
 	if ( !PlayersLeft ) {
-		gGameOn = 0;
+		GameOver();
 	}
 
 }	/* -- DoHousekeeping */
@@ -974,220 +947,15 @@ GamePanelDelegate::NextWave()
 }	/* -- NextWave */
 
 /* ----------------------------------------------------------------- */
-/* -- Do the game over display */
-
-struct FinalScore {
-	int Player;
-	int Score;
-	int Frags;
-};
-
-static int cmp_byscore(const void *_A, const void *_B)
-{
-	const FinalScore *A = static_cast<const FinalScore*>(_A);
-	const FinalScore *B = static_cast<const FinalScore*>(_B);
-	if (A->Score == B->Score) {
-		// Sort lowest player first
-		return A->Player - B->Player;
-	}
-	return B->Score - A->Score;
-}
-
-static int cmp_byfrags(const void *_A, const void *_B)
-{
-	const FinalScore *A = static_cast<const FinalScore*>(_A);
-	const FinalScore *B = static_cast<const FinalScore*>(_B);
-	if (A->Frags == B->Frags) {
-		return cmp_byscore(A, B);
-	}
-	return B->Frags - A->Frags;
-}
+/* -- End the game */
 
-static void DoGameOver(void)
+void
+GamePanelDelegate::GameOver()
 {
-	UIPanel *panel;
-	UIElement *image;
-	UIElement *label;
-	SDL_Event event;
-	int which = -1, i;
-	char handle[MAX_NAMELEN+1];
-	char key;
-	int chars_in_handle = 0;
-	Bool done = false;
-
-	gReplay.HandleGameOver();
-
-	/* Get the final scoring */
-	struct FinalScore *final = new struct FinalScore[MAX_PLAYERS];
-	for ( i=0; i<MAX_PLAYERS; ++i ) {
-		final[i].Player = i+1;
-		final[i].Score = gPlayers[i]->GetScore();
-		final[i].Frags = gPlayers[i]->GetFrags();
-	}
-	if ( gGameInfo.IsDeathmatch() )
-		qsort(final,MAX_PLAYERS,sizeof(struct FinalScore),cmp_byfrags);
-	else
-		qsort(final,MAX_PLAYERS,sizeof(struct FinalScore),cmp_byscore);
-
-	panel = ui->GetPanel(PANEL_GAMEOVER);
-	assert(panel);	// There's cleanup further down we need to do...
-	panel->HideAll();
-
-	image = panel->GetElement<UIElement>("image");
-	if (image) {
-		image->Show();
-	}
-
-	/* Show the player ranking */
-	if ( gGameInfo.IsMultiplayer() ) {
-		int nextLabel = 1;
-		for (i = 0; i < MAX_PLAYERS; ++i) {
-			if (!gPlayers[final[i].Player-1]->IsValid()) {
-				continue;
-			}
-
-			char name[32];
-			char buffer[BUFSIZ], num1[12], num2[12];
-
-			SDL_snprintf(name, sizeof(name), "rank%d", nextLabel);
-			image = panel->GetElement<UIElement>(name);
-			if (image) {
-				SDL_snprintf(name, sizeof(name), "Images/player%d.bmp", final[i].Player);
-				image->SetImage(name);
-				image->Show();
-			}
-
-			SDL_snprintf(name, sizeof(name), "rank%d_label", nextLabel++);
-			label = panel->GetElement<UIElement>(name);
-			if (!label) {
-				continue;
-			}
-			if (gGameInfo.IsDeathmatch()) {
-				SDL_snprintf(num1, sizeof(num1), "%7d", final[i].Score);
-				SDL_snprintf(num2, sizeof(num2), "%3d", final[i].Frags);
-				SDL_snprintf(buffer, sizeof(buffer), "%s Points, %s Frags", num1, num2);
-			} else {
-				SDL_snprintf(num1, sizeof(num1), "%7d", final[i].Score);
-				SDL_snprintf(buffer, sizeof(buffer), "%s Points", num1);
-			}
-			label->SetText(buffer);
-			label->Show();
-		}
-	}
-
+#ifdef USE_TOUCHCONTROL
+	ui->HidePanel("touchcontrol");
+#endif
 	ui->ShowPanel(PANEL_GAMEOVER);
 
-	/* -- Wait for the game over sound */
-	while( sound->Playing() )
-		Delay(SOUND_DELAY);
-
-	/* -- See if they got a high score */
-	if (gReplay.IsRecording() && !gGameInfo.IsMultiplayer() &&
-	    (gGameInfo.wave == 1) && (gGameInfo.lives == 3) &&
-	    TheShip->GetScore() > 0) {
-		for ( i = 0; i<NUM_SCORES; ++i ) {
-			if ( TheShip->GetScore() >= (int)hScores[i].score ) {
-				which = i;
-				break;
-			}
-		}
-	}
-
-	gLastHigh = which;
-
-	if (which != -1) {
-		sound->PlaySound(gBonusShot, 5);
-
-		/* -- Let them enter their name */
-		const char *text = NULL;
-		label = panel->GetEleme

(Patch may be truncated, please check the link at the top of this post.)