aboutsummaryrefslogblamecommitdiff
path: root/Source/GameLoop.cpp
blob: ff0df156973200ddefdbe17d7bc9dd6223798592 (plain) (tree)













































































































































































                                                                                                                                                             
          






























                                                                                                                                                                          
      
 
















































































                                                            





                                          
          
                                      
      












                                      
          


                                                         
     
                                       
      



























                                                     
          
                                                         
     
                                             
      






















































                                                                                                 





                                                                      






















































                                                                           
 
#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;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 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);

		}

	}

}