summary refs log tree commit diff
path: root/src/GameLoop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameLoop.cpp')
-rw-r--r--src/GameLoop.cpp291
1 files changed, 61 insertions, 230 deletions
diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp
index a4b4a60..c0caaaf 100644
--- a/src/GameLoop.cpp
+++ b/src/GameLoop.cpp
@@ -19,6 +19,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Black Shades.  If not, see <https://www.gnu.org/licenses/>.
 
+#include "GLFW/glfw3.h"
+
 #include "Game.h"
 
 extern float multiplier;
@@ -106,237 +108,66 @@ void Game::HandleKeyDown(char key)
 	}
 }
 
-static int mapinit = 0;
-static int sdlkeymap[SDLK_LAST];
-static unsigned char ourkeys[16];
-
-static void init_sdlkeymap()
-{
-	int i;
-	for (i = 0; i < SDLK_LAST; i++)
-		sdlkeymap[i] = -1;
-
-	sdlkeymap[SDLK_1] = MAC_1_KEY;
-	sdlkeymap[SDLK_2] = MAC_2_KEY;
-	sdlkeymap[SDLK_3] = MAC_3_KEY;
-	sdlkeymap[SDLK_4] = MAC_4_KEY;
-	sdlkeymap[SDLK_5] = MAC_5_KEY;
-	sdlkeymap[SDLK_6] = MAC_6_KEY;
-	sdlkeymap[SDLK_7] = MAC_7_KEY;
-	sdlkeymap[SDLK_8] = MAC_8_KEY;
-	sdlkeymap[SDLK_9] = MAC_9_KEY;
-	sdlkeymap[SDLK_0] = MAC_0_KEY;
-	sdlkeymap[SDLK_KP1] = MAC_NUMPAD_1_KEY;
-	sdlkeymap[SDLK_KP2] = MAC_NUMPAD_2_KEY;
-	sdlkeymap[SDLK_KP3] = MAC_NUMPAD_3_KEY;
-	sdlkeymap[SDLK_KP4] = MAC_NUMPAD_4_KEY;
-	sdlkeymap[SDLK_KP5] = MAC_NUMPAD_5_KEY;
-	sdlkeymap[SDLK_KP6] = MAC_NUMPAD_6_KEY;
-	sdlkeymap[SDLK_KP7] = MAC_NUMPAD_7_KEY;
-	sdlkeymap[SDLK_KP8] = MAC_NUMPAD_8_KEY;
-	sdlkeymap[SDLK_KP9] = MAC_NUMPAD_9_KEY;
-	sdlkeymap[SDLK_KP0] = MAC_NUMPAD_0_KEY;
-	sdlkeymap[SDLK_a] = MAC_A_KEY;
-	sdlkeymap[SDLK_b] = MAC_B_KEY;
-	sdlkeymap[SDLK_c] = MAC_C_KEY;
-	sdlkeymap[SDLK_d] = MAC_D_KEY;
-	sdlkeymap[SDLK_e] = MAC_E_KEY;
-	sdlkeymap[SDLK_f] = MAC_F_KEY;
-	sdlkeymap[SDLK_g] = MAC_G_KEY;
-	sdlkeymap[SDLK_h] = MAC_H_KEY;
-	sdlkeymap[SDLK_i] = MAC_I_KEY;
-	sdlkeymap[SDLK_j] = MAC_J_KEY;
-	sdlkeymap[SDLK_k] = MAC_K_KEY;
-	sdlkeymap[SDLK_l] = MAC_L_KEY;
-	sdlkeymap[SDLK_m] = MAC_M_KEY;
-	sdlkeymap[SDLK_n] = MAC_N_KEY;
-	sdlkeymap[SDLK_o] = MAC_O_KEY;
-	sdlkeymap[SDLK_p] = MAC_P_KEY;
-	sdlkeymap[SDLK_q] = MAC_Q_KEY;
-	sdlkeymap[SDLK_r] = MAC_R_KEY;
-	sdlkeymap[SDLK_s] = MAC_S_KEY;
-	sdlkeymap[SDLK_t] = MAC_T_KEY;
-	sdlkeymap[SDLK_u] = MAC_U_KEY;
-	sdlkeymap[SDLK_v] = MAC_V_KEY;
-	sdlkeymap[SDLK_w] = MAC_W_KEY;
-	sdlkeymap[SDLK_x] = MAC_X_KEY;
-	sdlkeymap[SDLK_y] = MAC_Y_KEY;
-	sdlkeymap[SDLK_z] = MAC_Z_KEY;
-	sdlkeymap[SDLK_F1] = MAC_F1_KEY;
-	sdlkeymap[SDLK_F2] = MAC_F2_KEY;
-	sdlkeymap[SDLK_F3] = MAC_F3_KEY;
-	sdlkeymap[SDLK_F4] = MAC_F4_KEY;
-	sdlkeymap[SDLK_F5] = MAC_F5_KEY;
-	sdlkeymap[SDLK_F6] = MAC_F6_KEY;
-	sdlkeymap[SDLK_F7] = MAC_F7_KEY;
-	sdlkeymap[SDLK_F8] = MAC_F8_KEY;
-	sdlkeymap[SDLK_F9] = MAC_F9_KEY;
-	sdlkeymap[SDLK_F10] = MAC_F10_KEY;
-	sdlkeymap[SDLK_F11] = MAC_F11_KEY;
-	sdlkeymap[SDLK_F12] = MAC_F12_KEY;
-	sdlkeymap[SDLK_RETURN] = MAC_RETURN_KEY;
-	sdlkeymap[SDLK_KP_ENTER] = MAC_ENTER_KEY;
-	sdlkeymap[SDLK_TAB] = MAC_TAB_KEY;
-	sdlkeymap[SDLK_SPACE] = MAC_SPACE_KEY;
-	sdlkeymap[SDLK_BACKSPACE] = MAC_DELETE_KEY;
-	sdlkeymap[SDLK_ESCAPE] = MAC_ESCAPE_KEY;
-	sdlkeymap[SDLK_LCTRL] = MAC_CONTROL_KEY;
-	sdlkeymap[SDLK_RCTRL] = MAC_CONTROL_KEY;
-	sdlkeymap[SDLK_LSHIFT] = MAC_SHIFT_KEY;
-	sdlkeymap[SDLK_RSHIFT] = MAC_SHIFT_KEY;
-	sdlkeymap[SDLK_CAPSLOCK] = MAC_CAPS_LOCK_KEY;
-	sdlkeymap[SDLK_LALT] = MAC_OPTION_KEY;
-	sdlkeymap[SDLK_RALT] = MAC_OPTION_KEY;
-	sdlkeymap[SDLK_PAGEUP] = MAC_PAGE_UP_KEY;
-	sdlkeymap[SDLK_PAGEDOWN] = MAC_PAGE_DOWN_KEY;
-	sdlkeymap[SDLK_INSERT] = MAC_INSERT_KEY;
-	sdlkeymap[SDLK_DELETE] = MAC_DEL_KEY;
-	sdlkeymap[SDLK_HOME] = MAC_HOME_KEY;
-	sdlkeymap[SDLK_END] = MAC_END_KEY;
-	sdlkeymap[SDLK_LEFTBRACKET] = MAC_LEFT_BRACKET_KEY;
-	sdlkeymap[SDLK_RIGHTBRACKET] = MAC_RIGHT_BRACKET_KEY;
-	sdlkeymap[SDLK_UP] = MAC_ARROW_UP_KEY;
-	sdlkeymap[SDLK_DOWN] = MAC_ARROW_DOWN_KEY;
-	sdlkeymap[SDLK_LEFT] = MAC_ARROW_LEFT_KEY;
-	sdlkeymap[SDLK_RIGHT] = MAC_ARROW_RIGHT_KEY;
-
-	mapinit = 1;
-}
-
-void GetKeys(unsigned long *keys)
-{
-	/* this is just weird */
-	memcpy(keys, ourkeys, sizeof(ourkeys));
-}
-
-static void DoSDLKey(Game *g, SDL_Event *event)
-{
-	if (mapinit == 0)
-		init_sdlkeymap();
-
-	int mackey = sdlkeymap[event->key.keysym.sym];
-	if (mackey != -1) {
-		int index = mackey / 8;
-		int mask = 1 << (mackey % 8);
-
-		if (event->type == SDL_KEYDOWN)
-			ourkeys[index] |= mask;
-		else
-			ourkeys[index] &= ~mask;
-	}
-
-	if (event->key.keysym.unicode
-	    && !(event->key.keysym.unicode & 0xFF80))
-		/* hey, at least it was aleady public */
-		g->HandleKeyDown(event->key.keysym.unicode);
-}
-
-static void ProcessSDLEvents(Game* g)
-{
-	SDL_Event event;
-	while (SDL_PollEvent(&event)) {
-		switch (event.type) {
-		case SDL_KEYDOWN:
-			if (event.key.keysym.sym == SDLK_RETURN
-			    && event.key.keysym.mod & KMOD_ALT) {
-				SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
-				break;
-			} else if (event.key.keysym.sym == SDLK_g
-			           && event.key.keysym.mod & KMOD_CTRL) {
-				if (SDL_WM_GrabInput(SDL_GRAB_QUERY)
-				    == SDL_GRAB_OFF) {
-					SDL_WM_GrabInput(SDL_GRAB_ON);
-					SDL_ShowCursor(SDL_DISABLE);
-				} else {
-					SDL_WM_GrabInput(SDL_GRAB_OFF);
-					SDL_ShowCursor(SDL_ENABLE);
-				}
-				break;
-			}
-		case SDL_KEYUP:
-			DoSDLKey(g, &event);
-			break;
-		case SDL_QUIT:
-			exit(0);
-		}
-	}
-}
-
 void eventLoop(Game* game)
 {
-	unsigned char theKeyMap[16];
-	game->gQuit = false;
-	game->framespersecond = 60.0f;
-
-	while (!game->gQuit) {
-		ProcessSDLEvents(game);
-		game->start = TimerGetTime(&game->theTimer);
-
-		GLfloat oldmult = multiplier;
-		int colaccuracy = min(game->sps,
-			game->sps / game->framespersecond + 1.0f);
-		multiplier /= colaccuracy;
-		for (int i = 0; i < (int) (colaccuracy + 0.5f); i++)
-			game->Tick();
-		if (game->DrawGLScene())
-			SDL_GL_SwapBuffers();
-		else
-			game->gQuit = true;
-		multiplier = oldmult;
-
-		do {
-			game->end = TimerGetTime(&game->theTimer);
-			game->timetaken = game->end - game->start;
-			game->framespersecond = 6e8f / game->timetaken;
-		} while (game->framespersecond > game->maxfps);
-
-		game->multiplier5 = game->multiplier4;
-		game->multiplier4 = game->multiplier3;
-		game->multiplier3 = game->multiplier2;
-		game->multiplier2 = 1 / game->framespersecond;
-		multiplier = (game->multiplier2 + game->multiplier3
-			+ game->multiplier4 + game->multiplier5) / 4.0f;
-		multiplier = min(max(multiplier, 0.00001f), 1.0f);
-		if (visions == 1 && !game->mainmenu)
-			multiplier /= 3;
-		if (slomo)
-			multiplier /= 5;
-		if (game->paused)
-			multiplier = 0;
-
-		GetKeys((unsigned long*) theKeyMap);
-		if (IsKeyDown(theKeyMap, MAC_COMMAND_KEY)
-		    &&IsKeyDown(theKeyMap, MAC_Q_KEY)) {
-			game->gQuit = true;
-			if (game->score > game->highscore) {
-				game->highscore = game->score;
-				/* TODO */
-				ofstream opstream("highscore.txt");
-				opstream << game->highscore;
-				opstream << "\n";
-				opstream << game->beatgame;
-				opstream.close();
-			}
-		}
-
-		if (IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)) {
-			alSourcePause(gSourceID[rainsound]);
-			game->mainmenu = 1;
-			alSourcePlay(gSourceID[souloutsound]);
-			game->flashamount = 1.0f;
-			game->flashr = game->flashg = game->flashb = 1.0f;
-			alSourceStop(gSourceID[visionsound]);
-			game->whichsong = mainmenusong;
-			alSourceStop(gSourceID[knifesong]);
-			alSourceStop(gSourceID[shootsong]);
-			alSourceStop(gSourceID[zombiesong]);
-			alSourceStop(gSourceID[mainmenusong]);
-			alSourcef(gSourceID[knifesong], AL_MIN_GAIN, 0);
-			alSourcef(gSourceID[shootsong], AL_MIN_GAIN, 0);
-			alSourcef(gSourceID[zombiesong], AL_MIN_GAIN, 0);
-			alSourcef(gSourceID[mainmenusong], AL_MIN_GAIN, 0);
-			alSourcePlay(gSourceID[game->whichsong]);
-			alSourcef(gSourceID[game->whichsong], AL_MIN_GAIN, 1);
-		}
+	/*
+	 * SDL_Event event;
+	 * while (SDL_PollEvent(&event)) {
+	 * 	if (event.type == SDL_KEYUP
+	 * 	    && event.key.keysym.unicode
+	 * 	    && !(event.key.keysym.unicode & 0xFF80))
+	 * 		game->HandleKeyDown(event.key.keysym.unicode);
+	 * }
+	 */
+
+	auto start = glfwGetTime();
+	GLfloat oldmult = multiplier;
+	int colaccuracy = min(game->sps,
+		game->sps / game->framespersecond + 1.0f);
+	multiplier /= colaccuracy;
+	for (int i = 0; i < (int) (colaccuracy + 0.5f); i++)
+		game->Tick();
+	auto window = glfwGetCurrentContext();
+	if (game->DrawGLScene())
+		glfwSwapBuffers(window);
+	else
+		glfwSetWindowShouldClose(window, GLFW_TRUE);
+	multiplier = oldmult;
+
+	do game->framespersecond = 1.0 / (glfwGetTime() - start);
+	while (game->framespersecond > game->maxfps);
+
+	game->multiplier5 = game->multiplier4;
+	game->multiplier4 = game->multiplier3;
+	game->multiplier3 = game->multiplier2;
+	game->multiplier2 = 1 / game->framespersecond;
+	multiplier = (game->multiplier2 + game->multiplier3
+		+ game->multiplier4 + game->multiplier5) / 4.0f;
+	multiplier = min(max(multiplier, 0.00001f), 1.0f);
+	if (visions == 1 && !game->mainmenu)
+		multiplier /= 3;
+	if (slomo)
+		multiplier /= 5;
+	if (game->paused)
+		multiplier = 0;
+
+	if (IsKeyDown(GLFW_KEY_ESCAPE)) {
+		alSourcePause(gSourceID[rainsound]);
+		game->mainmenu = 1;
+		alSourcePlay(gSourceID[souloutsound]);
+		game->flashamount = 1.0f;
+		game->flashr = game->flashg = game->flashb = 1.0f;
+		alSourceStop(gSourceID[visionsound]);
+		game->whichsong = mainmenusong;
+		alSourceStop(gSourceID[knifesong]);
+		alSourceStop(gSourceID[shootsong]);
+		alSourceStop(gSourceID[zombiesong]);
+		alSourceStop(gSourceID[mainmenusong]);
+		alSourcef(gSourceID[knifesong], AL_MIN_GAIN, 0);
+		alSourcef(gSourceID[shootsong], AL_MIN_GAIN, 0);
+		alSourcef(gSourceID[zombiesong], AL_MIN_GAIN, 0);
+		alSourcef(gSourceID[mainmenusong], AL_MIN_GAIN, 0);
+		alSourcePlay(gSourceID[game->whichsong]);
+		alSourcef(gSourceID[game->whichsong], AL_MIN_GAIN, 1);
 	}
 }