// Event loop handler // Copyright (C) 2002 David Rosen // Copyright (C) 2003 Zachary Jack Slater // Copyright (C) 2003 Steven Fuller // Copyright (C) 2021 Nguyễn Gia Phong // // This file is part of Black Shades. // // Black Shades is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Black Shades is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Black Shades. If not, see . #include "GLFW/glfw3.h" #include "Game.h" extern float multiplier; extern int visions; extern unsigned int gSourceID[100]; extern unsigned int gSampleSet[100]; extern Camera camera; extern float rad2deg; extern Fog fog; extern int environment; extern int slomo; void Game::HandleKeyDown(char key) { if (mainmenu) return; ALfloat pitch; XYZ facing; switch(key) { case 'l': lasersight ^= 1; break; case 'k': if (debug) timeremaining = 0; break; case 'b': if (!debug) break; alSourcePlay(gSourceID[soulinsound]); pitch = (slomo ^= 1) ? 0.5f : 1.0f; alSourcef(gSourceID[knifesong], AL_PITCH, pitch); alSourcef(gSourceID[shootsong], AL_PITCH, pitch); alSourcef(gSourceID[zombiesong], AL_PITCH, pitch); break; case 'B': if (!debug) break; alSourcePlay(gSourceID[soulinsound]); paused = 1 - paused; break; case 'f': if (!debug) break; alSourcePlay(gSourceID[souloutsound]); facing = 0; facing.z = -1; facing = DoRotation(facing, -camera.rotation2, 0, 0); facing = DoRotation(facing, 0, 0 - camera.rotation, 0); for(int i = 1; i < numpeople; i++) { if (person[i].skeleton.free == 1 || findDistancefast(person[i].playercoords, person[0].playercoords) > 1000) continue; person[i].skeleton.free = 1; person[i].longdead = 1; for (auto& joint : person[i].skeleton.joints) { joint.position = DoRotation(joint.position, 0, person[i].playerrotation, 0); joint.position += person[i].playercoords; joint.realoldposition = joint.position; joint.velocity = DoRotation(joint.velocity, 0, person[i].playerrotation, 0); joint.velocity += person[i].velocity; joint.velocity += facing * 50; joint.velocity.x += abs(Random() % 20) - 10; joint.velocity.y += abs(Random() % 20) - 10; joint.velocity.z += abs(Random() % 20) - 10; } } break; case 'X': if (!debug || person[0].grenphase) break; person[0].ammo = -1; person[0].whichgun++; person[0].grenphase = 0; person[0].reloads[person[0].whichgun] = 3; if (person[0].whichgun > 7) person[0].whichgun = 0; break; } } void eventLoop(Game* game) { /* * 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); } }