aboutsummaryrefslogtreecommitdiff
path: root/src/GameLoop.cpp
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2021-06-17 14:20:54 +0700
committerNguyễn Gia Phong <mcsinyx@disroot.org>2021-06-17 14:22:53 +0700
commit602a0c5951050e7cce645534cb4f136cf9f4fee4 (patch)
treee70e63b0b0058830e58c244ad917bc892c10418f /src/GameLoop.cpp
parent094e12df1ebb81d304803be4b274546384ec117c (diff)
downloadblackshades-602a0c5951050e7cce645534cb4f136cf9f4fee4.tar.gz
Rename source and build directory1.1.1
Diffstat (limited to 'src/GameLoop.cpp')
-rw-r--r--src/GameLoop.cpp573
1 files changed, 573 insertions, 0 deletions
diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp
new file mode 100644
index 0000000..8a72b4b
--- /dev/null
+++ b/src/GameLoop.cpp
@@ -0,0 +1,573 @@
+#include "Game.h"
+
+
+
+extern double 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;
+
+/********************> HandleKeyDown() <*****/
+
+void Game::HandleKeyDown( char theChar )
+
+{
+
+ XYZ facing;
+
+
+
+ if(!mainmenu){
+
+ switch( theChar )
+
+ {
+
+ case 'l':
+ if(!lasersight==1){lasersight=1;}else{lasersight=0;}
+
+ break;
+
+ case 'k':
+
+ if(debug)timeremaining=0;
+
+ break;
+
+
+
+ case 'b':
+
+ if(debug){
+
+ alSourcePlay(gSourceID[soulinsound]);
+
+ if(!slomo)slomo=1;
+
+ else slomo=0;}
+
+ if(slomo){
+
+ alSourcef(gSourceID[knifesong], AL_PITCH, (ALfloat)(.5));
+
+ alSourcef(gSourceID[shootsong], AL_PITCH, (ALfloat)(.5));
+
+ alSourcef(gSourceID[zombiesong], AL_PITCH, (ALfloat)(.5));
+
+ }
+
+ if(!slomo){
+
+ alSourcef(gSourceID[knifesong], AL_PITCH, (ALfloat)(1));
+
+ alSourcef(gSourceID[shootsong], AL_PITCH, (ALfloat)(1));
+
+ alSourcef(gSourceID[zombiesong], AL_PITCH, (ALfloat)(1));
+
+ }
+
+ break;
+
+ case 'B':
+
+ if(debug){
+
+ alSourcePlay(gSourceID[soulinsound]);
+
+ paused=1-paused;}
+
+ break;
+
+ case 'f':
+
+ if(debug){
+
+ alSourcePlay(gSourceID[souloutsound]);
+
+ //Facing
+
+ 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){
+
+ if(findDistancefast(person[i].playercoords,person[0].playercoords)<1000){
+
+ person[i].skeleton.free=1;
+
+ person[i].longdead=1;
+
+ for(int j=0;j<person[i].skeleton.num_joints;j++){
+
+ person[i].skeleton.joints[j].position=DoRotation(person[i].skeleton.joints[j].position,0,person[i].playerrotation,0);
+
+ person[i].skeleton.joints[j].position+=person[i].playercoords;
+
+ person[i].skeleton.joints[j].realoldposition=person[i].skeleton.joints[j].position;
+
+ person[i].skeleton.joints[j].velocity=DoRotation(person[i].skeleton.joints[j].velocity,0,person[i].playerrotation,0);
+
+ person[i].skeleton.joints[j].velocity+=person[i].velocity;
+
+ person[i].skeleton.joints[j].velocity+=facing*50;
+
+ person[i].skeleton.joints[j].velocity.x+=abs(Random()%20)-10;
+
+ person[i].skeleton.joints[j].velocity.y+=abs(Random()%20)-10;
+
+ person[i].skeleton.joints[j].velocity.z+=abs(Random()%20)-10;
+
+ }}}
+
+ }}
+
+ break;
+
+ case 'X':
+
+ if(debug){
+
+ if(person[0].grenphase==0){
+
+ 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;
+
+ }
+
+ }
+
+}
+
+
+
+/********************> DoEvent() <*****/
+
+#ifdef OS9
+void Game::DoEvent( EventRecord *event )
+
+{
+
+
+
+ char theChar;
+
+
+
+ switch ( event->what )
+
+ {
+
+ case keyDown:
+
+ case autoKey:
+
+ theChar = event->message & charCodeMask; // Get the letter of the key pressed from the event message
+
+ HandleKeyDown( theChar ); // Only some key presses are handled here because it is slower and less responsive
+
+ break;
+
+ }
+
+
+
+
+
+}
+#endif
+
+#ifndef OS9
+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)
+{
+ int press = (event->type == SDL_KEYDOWN) ? 1 : 0;
+ int mackey;
+ int index;
+ int mask;
+
+
+ if (mapinit == 0) {
+ init_sdlkeymap();
+ }
+
+ mackey = sdlkeymap[event->key.keysym.sym];
+
+ if (mackey != -1) {
+ index = mackey / 8;
+ mask = 1 << (mackey % 8);
+
+ if (press) {
+ 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;
+
+ if (SDL_PollEvent(&event)) {
+ do {
+ 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;
+ }
+ 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);
+ }
+ } while (SDL_PollEvent(&event));
+ }
+}
+
+#endif
+
+/********************> EventLoop() <*****/
+
+void Game::EventLoop( void )
+
+{
+
+#ifdef OS9
+ EventRecord event;
+#endif
+
+ unsigned char theKeyMap[16];
+
+ int colaccuracy,i;
+
+ GLfloat oldmult;
+
+ gQuit = false;
+
+ while ( gQuit == false )
+
+ {
+
+#ifdef OS9
+ if ( GetNextEvent( everyEvent, &event ) )
+
+ DoEvent( &event );
+#else
+ ProcessSDLEvents(this);
+#endif
+
+
+ start=TimerGetTime(&theTimer);
+
+
+
+ colaccuracy=sps/framespersecond+1;
+
+ if(colaccuracy>sps){colaccuracy=sps;}
+
+
+
+ oldmult=multiplier;
+
+ multiplier/=colaccuracy;
+
+ for(i=0;i<(int)(colaccuracy+.5);i++){
+
+ Tick();
+
+ }
+
+ multiplier=oldmult;
+
+
+
+ if ( DrawGLScene())
+
+#ifdef OS9
+ aglSwapBuffers( gOpenGLContext );
+#else
+ SDL_GL_SwapBuffers();
+#endif
+
+ else
+
+ gQuit = true;
+
+ oldmult=multiplier;
+
+
+
+ end=TimerGetTime(&theTimer);
+
+ timetaken=end-start;
+
+ framespersecond=600000000/timetaken;
+
+ while(framespersecond>maxfps){
+
+ end=TimerGetTime(&theTimer);
+
+ timetaken=end-start;
+
+ framespersecond=600000000/timetaken;
+
+ }
+
+ multiplier5=multiplier4;
+
+ multiplier4=multiplier3;
+
+ multiplier3=multiplier2;
+
+ multiplier2=1/framespersecond;
+
+ multiplier=(multiplier2+multiplier3+multiplier4+multiplier5)/4;
+
+ if(multiplier>1)multiplier=1;
+
+ if(multiplier<.00001)multiplier=.00001;
+
+ if(visions==1&&mainmenu==0)multiplier/=3;
+
+ if(slomo)multiplier*=.2;
+
+ if(paused)multiplier=0;
+
+ GetKeys( ( unsigned long * )theKeyMap );
+
+ if ( IsKeyDown( theKeyMap, MAC_COMMAND_KEY )&&IsKeyDown( theKeyMap, MAC_Q_KEY )){
+
+ gQuit = true;
+
+ if(score>highscore){
+
+ highscore=score;
+
+#ifdef OS9
+ ofstream opstream(":Data:Highscore");
+#else
+ /* TODO */
+ ofstream opstream("Data/Highscore");
+#endif
+
+ opstream << highscore;
+
+ opstream << "\n";
+
+ opstream << beatgame;
+
+ opstream.close();
+
+ }
+
+ }
+
+ if ( IsKeyDown( theKeyMap, MAC_ESCAPE_KEY )){
+
+ alSourcePause(gSourceID[rainsound]);
+
+
+
+ mainmenu=1;
+
+ alSourcePlay(gSourceID[souloutsound]);
+
+ flashamount=1;
+
+ flashr=1;flashg=1;flashb=1;
+
+ alSourceStop(gSourceID[visionsound]);
+
+ 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[whichsong]);
+
+ alSourcef(gSourceID[whichsong], AL_MIN_GAIN, 1);
+
+ }
+
+ }
+
+}