#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 ) { ALint tempInt; XYZ facing; if(!mainmenu){ switch( theChar ) { 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;i7)person[0].whichgun=0; }} break; } } } /********************> DoEvent() <*****/ #ifdef MAC 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 MAC static int mapinit = 0; static int sdlkeymap[SDLK_LAST]; static unsigned char ourkeys[16]; static void init_sdlkeymap() { sdlkeymap[SDLK_1] = MAC_1_KEY; sdlkeymap[SDLK_2] = MAC_2_KEY; sdlkeymap[SDLK_a] = MAC_A_KEY; sdlkeymap[SDLK_d] = MAC_D_KEY; sdlkeymap[SDLK_s] = MAC_S_KEY; sdlkeymap[SDLK_w] = MAC_W_KEY; sdlkeymap[SDLK_SPACE] = MAC_SPACE_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]; 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: case SDL_KEYUP: DoSDLKey(g, &event); break; case SDL_QUIT: exit(0); } } while (SDL_PollEvent(&event)); } } #endif /********************> EventLoop() <*****/ void Game::EventLoop( void ) { #ifdef MAC EventRecord event; #endif unsigned char theKeyMap[16]; int colaccuracy,i; GLfloat oldmult; gQuit = false; while ( gQuit == false ) { #ifdef MAC 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 MAC 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 MAC 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); } } }