Esempio n. 1
0
void PlaybackManager::timerTick()
{
    playSounds( editor()->currentFrame() );

    if ( editor()->currentFrame() >= mEndFrame )
    {
        if ( mIsLooping )
        {
            editor()->scrubTo( mStartFrame );
        }
        else
        {
            stop();
        }
    }
    else
    {
        editor()->scrubForward();
    }
}
Esempio n. 2
0
void Game::start()
{
	loadContent();

	initialise();

	sf::Clock clk;
	clk.restart();

	while (window.isOpen())
	{
		Time elapsedTime = clk.getElapsedTime();
		if (clk.getElapsedTime().asMilliseconds()!=0) gettingFPS = 1000 / clk.getElapsedTime().asMilliseconds();

		clk.restart();
		update(elapsedTime);
		draw(elapsedTime);
		playSounds();
	}
}
Esempio n. 3
0
int main(){
	initScreen();
	initSound();
	initLedButtons();
	lcdTest();
	while(1){
		fillBoard();
		printBoard();
		
		for (int i = 0; i < 100; i++){
			setLeds((char)i);
			setFrequency(120*(i%20));
			playerStep();
			printBoard();
			playSounds();
			if (readButtons() & 0x01 > 0) break;
		}
	}
	closeLedButtons();
	closeScreen();
	closeSound();

}
Esempio n. 4
0
void check_mouse ( XEvent *e, Game *game )
{
	static int savex = 0;
	static int savey = 0;
	int i,x,y;
	int lbutton=0;
	static int n = 0;
	if ( e->type == ButtonRelease ) {
		return;
	}
	if ( e->type == ButtonPress ) {
		if ( e->xbutton.button==1 ) {
			//Left button was pressed
			lbutton=0;
			if ( !game->c.isJumping ) {
				game->c.isJumping = true;
				game->c.isStanding = false;
				game->c.velocity[1] = 15.0;
				lbutton=1;
			}
		}
		if ( e->xbutton.button==3 ) {
			//game->windowHeight = 1024;
			//Right button was pressed
			game->rocketSound ^= 1;
			game->frog->toggleRocket();
			game->frog->setFrame ( 0 );
		}
	}
	x = e->xbutton.x;
	y = e->xbutton.y;
	//x = game->windowWidth - x;
	y = game->windowHeight - y;
	//Did the mouse move?
	if ( savex != e->xbutton.x || savey != e->xbutton.y ) {
		savex = e->xbutton.x;
		savey = game->windowHeight - e->xbutton.y;
		if ( ++n < 10 )
			return;
		game->c.newPosX = savex;
		game->c.newPosY = savey;
	}
	for (i=0; i<game->nbuttons; i++) {
		game->button[i].over=0;
		if (x >= game->button[i].r.left &&
				x <= game->button[i].r.right &&
				y >= game->button[i].r.bot &&
				y <= game->button[i].r.top) {
			game->button[i].over=1;
			if (game->button[i].over) {
				if (lbutton) {
					switch (i) {
						case 13:
							//Sound
							game->c.isJumping = false;
							game->c.isStanding = false;
							playSounds ( "./wav/tick.wav",1.0f,
									false, game->muted );
							muteSounds(game);
							break;
						case 14:
							//Help
							playSounds ( "./wav/tick.wav",1.0f,
									false, game->muted );
							game->c.isJumping = false;
							game->c.isStanding = false;
							game->help_menu ^= true;
							break;
					}
				}
			}
		}
	}
}
Esempio n. 5
0
void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
		int16 nextAct, int16 framesCount) {

	if (!obj->goblinStates)
		return;

	movePathFind(obj, 0, 0);
	playSounds(obj);

	Mult::Mult_AnimData *animData = obj->pAnimData;

	framesCount = _vm->_scenery->getAnimLayer(animData->animation, animData->layer)->framesCount;

	if (animData->isPaused == 0)
		animData->frame++;

	switch (animData->stateType) {
	case 0:
	case 1:
		animData->isPaused = 0;
		break;

	case 4:
		if (animData->frame == 0)
			animData->isPaused = 1;
		break;

	case 6:
		if (animData->frame >= framesCount)
			animData->isPaused = 1;
		break;
	}

	switch (animData->state) {
	case 0:
	case 1:
	case 7:
	case 13:
	case 16:
	case 23:
	case 40:
	case 41:
		animData->curLookDir = 0;
		break;

	case 2:
	case 15:
	case 18:
	case 21:
	case 26:
	case 38:
		animData->curLookDir = 2;
		break;

	case 3:
	case 4:
	case 5:
	case 12:
	case 19:
	case 22:
	case 42:
	case 43:
		animData->curLookDir = 4;
		break;

	case 6:
	case 14:
	case 17:
	case 20:
	case 27:
	case 39:
		animData->curLookDir = 6;
		break;

	case 8:
	case 9:
	case 28:
	case 29:
		if (animData->pathExistence == 4)
			animData->pathExistence = 5;
		break;
	}

	if ((animData->newState != -1) && (animData->frame == framesCount) &&
	    (animData->newState != animData->state)) {

		animData->nextState = animData->newState;
		animData->newState  = -1;
		animData->state     = animData->nextState;

		Scenery::AnimLayer *animLayer =
			_vm->_scenery->getAnimLayer(animData->animation, animData->layer);

		*obj->pPosX += animLayer->animDeltaX;
		*obj->pPosY += animLayer->animDeltaY;

		int16 animation = obj->goblinStates[animData->nextState][0].animation;
		int16 layer     = obj->goblinStates[animData->nextState][0].layer;

		animData->layer     = layer;
		animData->animation = animation;
		animData->frame     = 0;

		return;
	}

	if (isMovement(animData->state)) {
		int16 state = animData->nextState;

		if (animData->frame == ((framesCount + 1) / 2)) {
			int16 gobX = obj->goblinX;
			int16 gobY = obj->goblinY + 1;

			advMovement(obj, state);

			if (animData->state != state) {
				int16 animation = obj->goblinStates[state][0].animation;
				int16 layer     = obj->goblinStates[state][0].layer;

				animData->layer     = layer;
				animData->animation = animation;
				animData->frame     = 0;
				animData->state     = state;

				_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
				uint32 gobPosX =  gobX * _vm->_map->getTilesWidth();
				uint32 gobPosY = (gobY * _vm->_map->getTilesHeight()) -
				                 (_vm->_scenery->_animBottom - _vm->_scenery->_animTop);

				if (_vm->_map->hasBigTiles())
					gobPosY -= gobY / 2;

				*obj->pPosX = gobPosX;
				*obj->pPosY = gobPosY;
			}
		}
	}

	if (animData->frame < framesCount)
		return;

	int16 state     = animData->nextState;
	int16 animation = obj->goblinStates[state][0].animation;
	int16 layer     = obj->goblinStates[state][0].layer;

	animData->layer     = layer;
	animData->animation = animation;
	animData->frame     = 0;
	animData->state     = state;

	int16 gobX = obj->goblinX;
	int16 gobY = obj->goblinY + 1;

	advMovement(obj, state);

	_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
	uint32 gobPosX =  gobX * _vm->_map->getTilesWidth();
	uint32 gobPosY = (gobY * _vm->_map->getTilesHeight()) -
	                 (_vm->_scenery->_animBottom - _vm->_scenery->_animTop);

	if (_vm->_map->hasBigTiles())
		gobPosY -= gobY / 2;

	*obj->pPosX = gobPosX;
	*obj->pPosY = gobPosY;
}
Esempio n. 6
0
void collision ( Game *game )
{
	gatorEat = false;
	if ( !game->demo.on ) {
		float gravity = 0.3*game->difficulty;
		if (game->difficulty == 3)
			gravity -= 0.1;
		if ( game->c.isJumping ) {
			game->c.center[1] += game->c.velocity[1];
			game->c.velocity[0] = 0;
			game->c.velocity[1] -= gravity;
			if ( game->c.center[1] <= 0 ) {
				game->c.isJumping = false;
				game->c.isStanding = true;
				game->c.center[1] = 15;
			}
		}
		if ( game->c.center[0] == game->c.newPosX &&
				game->c.center[1] == game->c.newPosY )
			return;
		if ( game->c.center[0] < game->c.newPosX ) {
			if ( game->c.isJumping ) {
				game->c.center[0] += 20.0;
			} else {
				game->c.center[0] += 10.0;
				if ( game->c.velocity[0]<=0 )
					game->c.velocity[0]+=0.2;
			}
			if ( game->c.center[0] > game->c.newPosX )
				game->c.center[0] = game->c.newPosX;
		} else if ( game->c.center[0] > game->c.newPosX ) {
			if ( game->c.isJumping ) {
				game->c.center[0] -= 15.0;
			} else {
				game->c.center[0] -= 10.0;
				if ( game->c.velocity[0]>=0 )
					game->c.velocity[0] -=0.2;
			}
			if ( game->c.center[0] < game->c.newPosX )
				game->c.center[0] = game->c.newPosX;
		}
	}
	if ( game->frog->rocket() && game->frog->getFrame() ==1 ) {
		playSounds ( "./wav/rocket.wav", 1.0f, false, game->muted );
	}
	if ( game->rocketSound )
		playSounds ( "./wav/rocket.wav", 1.0f, false, true );
	// NO collision below this Y value
	if ( game->frog->getYpos() > ( 50+ ( 20*game->difficulty ) ) ) {
		//check for frog(ball)'s collision with lilies
		Lilypad *node = game->ihead;
		if ( game->c.isStanding == false ) {
			while ( node ) {
				float d1 = node->pos[1] - game->c.center[1];
				float d2 = node->pos[0] - game->c.center[0];
				float dist = sqrt ( d1*d1 + d2*d2 );
				if ( dist <= game->c.radius+node->size+15/game->difficulty ) {
					//rejump the ball
					game->c.isJumping = true;
					game->c.velocity[1] = 15.0;
					playSounds ( "./wav/boing2.wav",1.0f, false,game->muted );
					deleteLily ( node,game );
					//basic scoring for now -Kevin
					if (game->stresstest) {
						game->score+=1;
					} else {
						if (game->troll_lilypad &&
								game->difficulty == 1) {
							game->score+=2;
						} else if (game->troll_lilypad &&
								game->difficulty == 2) {
							game->score+=4;
						} else if (game->troll_lilypad &&
								game->difficulty == 3) {
							game->score+=7;
						}
						game->score+=10;
					}
				}
				node = node->next;
			}
		}
		// ========================================
		// collision frog with log
		for ( int i=0; i<4; i++ ) {
			if ( game->frog->getXpos() <= game->log[i]->getXpos()+15 &&
					game->frog->getXpos() >= game->log[i]->getXpos()-15 &&
					game->frog->getYpos() <= game->log[i]->getYpos()+50 &&
					game->frog->getYpos() >= game->log[i]->getYpos()-50 ) {
				game->c.velocity[1]=game->log[i]->getYvel()+15;
				playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
				game->score+=2;
			}
		}
		// ============================================
		// collision frog with golden turtle
		if ( game->turtle->isGolden() ) {
			if ( game->frog->getXpos() <= game->turtle->getXpos()+15 &&
					game->frog->getXpos() >= game->turtle->getXpos()-15 &&
					game->frog->getYpos() <= game->turtle->getYpos()+50 &&
					game->frog->getYpos() >= game->turtle->getYpos()-50 ) {
				game->c.velocity[1] = game->turtle->getYvel()+15;
				playSounds ( "./wav/money.wav",1.0f, false, game->muted );
				game->score+=500;
				game->turtle->notGolden();
			}
		}
		// ============================================
		//Collision between frog and bullet
		float d0, d1, dist;
		Bullet *b = &game->barr[0];
		d0 = b->pos[0] - game->frog->getXpos();
		d1 = b->pos[1] - game->frog->getYpos();
		dist = ( d0*d0 + d1*d1 );
		if ( dist < ( 30.0f * 30.0f ) ) {
			shotMonster = true;
			deleteBullet(game, b);
			gameOver ( game );
		}
		// FLY =====================================================
		int tongue=60/game->difficulty;
		if ( game->frog->getXpos() >= game->fly->getXpos()- tongue &&
				game->frog->getXpos() <= game->fly->getXpos()+ tongue &&
				game->frog->getYpos() <= game->fly->getYpos()+ tongue &&
				game->frog->getYpos() >= game->fly->getYpos()- tongue ) {
			playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
			game->score+=50;
			game->fly->death ( game->frog->getXpos(),game->frog->getYpos() );
			//std::cout<<"dead fly"<<std::endl;
		}
		// SWARM =====================================================
		if ( game->swarmOn ) {
			for ( int i=0; i < game->swarmSize; i++ ) {
				int tongue=30/game->difficulty;
				if ( game->frog->getXpos() >=
						game->swarm[i]->getXpos()-tongue &&
						game->frog->getXpos() <=
						game->swarm[i]->getXpos()+ tongue &&
						game->frog->getYpos() <=
						game->swarm[i]->getYpos()+ tongue &&
						game->frog->getYpos() >=
						game->swarm[i]->getYpos()- tongue ) {
					playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
					game->score+=1;
					game->swarm[i]->death(game->frog->getXpos(),
							game->frog->getYpos());
				}
			}
			//std::cout<<"dead fly"<<std::endl;
		}
		// pickup rocketPack ==================================================
		int reach=50/game->difficulty;
		if ( game->frog->getXpos() >= game->rocketPack->getXpos()- reach &&
				game->frog->getXpos() <= game->rocketPack->getXpos()+ reach &&
				game->frog->getYpos() <= game->rocketPack->getYpos()+ reach &&
				game->frog->getYpos() >= game->rocketPack->getYpos()- reach ) {
			playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
			game->score+=10;
			game->frog->addRocket();
			game->rocketPack->setFrame ( 500 );
			//std::cout<<"dead rocketPack"<<std::endl;
		}
		// collision frog with gator head
		int head = 5 * game->difficulty;
		if ( game->frog->getXpos() <= game->gator->getXpos()- ( 5 + head )  &&
				game->frog->getXpos() >= game->gator->getXpos()-
				( 30 + head ) &&
				game->frog->getYpos() <= game->gator->getYpos()+
				( 5 + head ) &&
				game->frog->getYpos() >= game->gator->getYpos()-
				( 5 + head ) ) {
			game->gator->eat();
			gatorEat = true;
			gameOver ( game );
		}
		// collision frog with gator back
		int back = 90/ game->difficulty;
		if ( game->frog->getXpos() <= game->gator->getXpos()+ back &&
				game->frog->getXpos() >= game->gator->getXpos()-
				( back-head ) &&
				game->frog->getYpos() <= game->gator->getYpos()+ back/2 &&
				game->frog->getYpos() >= game->gator->getYpos()-back/2 ) {
			game->c.isJumping = true;
			game->c.velocity[1] = 15.0;
			playSounds ( "./wav/boing2.wav",1.0f, false,game->muted );
			game->score+=30;
			game->gator->dive();
		}
		// collision gator with log
		for ( int i=0; i<4; i++ ) {
			if ( game->gator->getXpos() <= game->log[i]->getXpos()+80 &&
					game->gator->getXpos() >= game->log[i]->getXpos()-20 &&
					game->gator->getYpos() >= game->log[i]->getYpos()-50 &&
					game->gator->getYpos() <= game->log[i]->getYpos()+50 ) {
				game->gator->move ( game->gator->getXpos()+45,
						game->gator->getYpos()+15,
						game->gator->getXvel(),game->gator->getYvel() );
			}
		}
	}
	//
	// check if frog left bridge
	if ( game->frog->getYpos() > 60 && game->score > 0 ) {
		//move bridge downward
		game->bridge->move ( game->bridge->getXpos(),
				game->bridge->getYpos()-0.5, 0, 0 );
	}
	//fell down
	if ( game->frog->getYpos() <=40 && game->bridge->getYpos() <=100 ) {
		gameOver ( game );
	}
	//frog at bottom
	if ( game->frog->getYpos() <= 40.0 &&
			game->bridge->getYpos() <=100 && game->lives < 1  ) {
		game->highscore[++game->scoreCount] = game->score;
		game->score = 0;
	}
	shotMonster = false;
}
Esempio n. 7
0
void gameOver ( Game *game )
{
	if ( game->demo.on ) {
		return;
	}
	if ( checkHighScore ( game,game->score ) ) {
		game->tempscore = game->score;
	}
	if ( !game->hschecked ) {
		game->hschecked = true;
		initHighScore ( game );
	}
	if ( shotMonster ) {
		// move explosion on screen if offscreen
		if ( game->explosion->getXpos() < 0 ) {
			playSounds ( "./wav/explosion.wav",1.0f, false,game->muted );
			game->explosion->move ( game->frog->getXpos(),
					game->frog->getYpos()+40,0,0 );
			//game->bossGO = false;
		}
		for (int i=0; i<game->nbullets; i++) {
			Bullet *b = &game->barr[i];
			deleteBullet(game, b);
		}
	} else {
		// move splash on screen if offscreen
		if ( game->splash->getXpos() < 0 ) {
			if (gatorEat)
				playSounds ( "./wav/bite.wav", 1.0f, false, game->muted );
			else
				playSounds ( "./wav/fishsplash.wav",1.0f, false,game->muted );
			game->splash->move ( game->frog->getXpos(),
					game->frog->getYpos()+40,0,0 );
		}
		//sendScoresToPHP(game->score, game->difficulty);
	}
	//move frog,logs and gator offscreen
	game->frog->move ( -200,-200,0,0 );
	for ( int i=0; i<4; i++ ) {
		game->log[i]->move ( -200*i,-300,0,0 );
	}
	//game->gator->move ( -200,-200,0,0 );
	// reset lilies
	clearLilies ( game );
	//wait for splash to complete
	if ( game->splash->getFrame() >=195 ) {
		//cout << game->tempscore << endl;
		//move bridge back
		game->bridge->move ( 300,150,0,0 );
		game->lives--;
		for ( int i=0; i<4; i++ ) {
			game->log[i]->move ( 50*i,-100*i,-.15*i,-1 );
		}
		game->gator->move ( -300,400,-2,-.5 );
		game->frog->move ( -100,-800,0,0 );
		game->frog->setYpos ( game->frog->getYpos()-10 );
		game->frog->setXpos ( game->frog->getXpos()-800 );
		game->splash->move ( -200,-200,0,0 );
		if ( checkHighScore ( game,game->tempscore ) && game->lives < 0 ) {
			game->isHighScore = true;
			game->showTaunt = false;
			playSounds ( "./wav/wow.wav", 0.5, false, game->muted );
		} else if (game->lives < 0 ) {
			game->isHighScore = false;
			game->showTaunt = true;
			playSounds ( "./wav/haha.wav", 0.5, false, game->muted );
		}
		if ( game->lives < 0 ) {
			game->gameover = true;
			playSounds ( "./wav/gameoverSound.wav", 1.0f, false, game->muted);
			game->lives = 1;
		}
		game->hschecked = false;
	}
}
Esempio n. 8
0
//Logic
void ce_game::update(){

	//Tick swans
	for (int i=0; i<swans.size(); i++){
		swans[i]->ai_main();
	}

	//Vars
	bool gravity = true;
	bool action = false;

	//Start player jump
	if (key[KEY_SPACE] && !player->isJumping && player->isTouching(cet_wall)){
		player->startJump();
	}
	//Player is already jumping
	if (player->isJumping){

		//Stop playing jumping
		if ((key[KEY_W] || key[KEY_UP]) && player->isTouching(cet_ladder)){
			player->isJumping = false;

		}else{

			player->jump();

			//Perform player walking
			if (player->isWalkingLeft){
				player->walkLeft();
			}else if (player->isWalkingRight){
				player->walkRight();
			}

			action = true;
			gravity = false;

		}
	}

	//Climb Up
	if (!action){
		//Start climbing
		if ((key[KEY_W] || key[KEY_UP]) && player->isTouching(cet_ladder)){
			player->climbUp();
			action = true;
			gravity = false;
		}else{
			//Stop climbing
			if (!player->isTouching(cet_ladder) && player->isClimbing){
				player->isClimbing = false;
				player->isClimbingDown = false;
				player->isClimbingUp = false;
				gravity = true;
				action = true;
			}
			player->isClimbingUp = false;
		}
	}

	//Climb Down
	if (!action){
		if ((key[KEY_S] || key[KEY_DOWN]) && player->isTouching(cet_ladder) && !player->isTouching(cet_wall)){
			player->climbDown();
			action = true;
			gravity = false;
		}else{
			player->isClimbingDown = false;
		}
	}

	//Player Move left
	if (!action){
		if ((key[KEY_A] || key[KEY_LEFT])){
			player->walkLeft();
			action = true;
		}else{
			player->isWalkingLeft = false;
		}
	}

	//Player Move right
	if (!action){
		if ((key[KEY_D] || key[KEY_RIGHT])){
			player->walkRight();
			action = true;
		}else{
			player->isWalkingRight = false;
		}
	}

	//Still climbing
	if (!action){
		if (player->isClimbing){
			player->stopAnimating();
			action = true;
			gravity = false;
		}
	}

	//Apply gravity if not touching a ladder
	if (gravity && !player->isTouching(cet_ladder) && !player->isClimbing){
		player->moveDown(gravity_speed);
	}

	//Clear animation sequence if nothing else is happening
	if (!action){
		player->stopAnimating();
	}

	//Player pickups
	if (player->checkPick()){
		
		//Check if there are any more eggs left
		bool found = false;

		//Loop through each grid reference
		for (int i=0; i<level->grid.size(); i++){
			for (int l=0; l<level->grid[i].size(); l++){
				
				//Check if grid has egg
				ce_actor *actor = level->grid[i][l];
				if (actor->visible && actor->type == cet_egg){
					found = true;
				}
			}
		}

		//No eggs found
		if (!found){
			hasWon = true;
			end_game();
		}
	}

	//Swan pickups
	for (int i=0; i<swans.size(); i++){
		swans[i]->checkPick();
	}

	//Sounds
	playSounds();
}
Esempio n. 9
0
void CSceneMatch::updateClient()
{
    // send position
    UFloatValue uX;
    UFloatValue uY;

    uX.FloatValue = cGame->getTablePositionPlayer1().x;
    uY.FloatValue = cGame->getTablePositionPlayer1().y;

    sUDPBuffer[0] = MSG_MALLET;
    memcpy(sUDPBuffer + 1, uX.CharValue, 4);
    memcpy(sUDPBuffer + 5, uY.CharValue, 4);

    cClient->sendMessage(sUDPBuffer, MSG_SIZE);

    // get game status
    AHPoint pNewPosition;
    int iEvent = 0;

    while(cClient->receiveMessage(sUDPBuffer, MSG_SIZE) > 0)
    {
        switch(sUDPBuffer[0])
        {
        // player position
        case MSG_MALLET:

            memcpy(uX.CharValue, sUDPBuffer + 1, 4);
            memcpy(uY.CharValue, sUDPBuffer + 5, 4);

            pNewPosition.x = -uX.FloatValue;
            pNewPosition.y = -uY.FloatValue;
            cGame->setTablePositionPlayer2(pNewPosition);

            break;

        // puck position
        case MSG_PUCK:

            bPuckVisible = true;

            memcpy(uX.CharValue, sUDPBuffer + 1, 4);
            memcpy(uY.CharValue, sUDPBuffer + 5, 4);

            pNewPosition.x = -uX.FloatValue;
            pNewPosition.y = -uY.FloatValue;
            cGame->setTablePositionPuck(pNewPosition);

            break;

        // time left
        case MSG_TIME:

            iTimeMin = sUDPBuffer[1];
            iTimeSec = sUDPBuffer[2];

            break;

        // event
        case MSG_EVENT:

            iEvent = sUDPBuffer[1];

            break;

        // goal
        case MSG_GOAL:

            bPuckVisible = false;

            cGame->setGoalsPlayer1(sUDPBuffer[1]);
            cGame->setGoalsPlayer2(sUDPBuffer[2]);

            break;

        // end of the match
        case MSG_END:

            endOfTheMatch();
            return;
        }
    }

    // video and audio
    render();
    playSounds(iEvent);
}
Esempio n. 10
0
void CSceneMatch::update()
{
    // replay mode
    if(bReplayMode)
    {
        renderReplay();
        return;
    }

    // multiplayer: wait for connection
    if(sGlobal->bMultiplayer)
    {
        // wait for client
        if(sGlobal->bServer && !bClientReady)
        {
            if(cServer->receiveMessage(&sClientAddress, sUDPBuffer, MSG_SIZE) > 0 && sUDPBuffer[0] == MSG_REQ)
            {
                sUDPBuffer[0] = MSG_ACK;
                cServer->sendMessage(sClientAddress, sUDPBuffer, MSG_SIZE);

                bClientReady = true;
                return;
            }

            sprintf(sMessage, "Waiting for client...");
            render();
            return;
        }

        // wait for server
        if(!sGlobal->bServer && !bServerReady)
        {
            if(cClient->receiveMessage(sUDPBuffer, MSG_SIZE) > 0 && sUDPBuffer[0] == MSG_ACK)
            {
                bServerReady = true;
                return;
            }

            // new request to the server
            if(iCurrentFrame % sGlobal->iFPS == 0)
            {
                sUDPBuffer[0] = MSG_REQ;
                cClient->sendMessage(sUDPBuffer, MSG_SIZE);
            }

            sprintf(sMessage, "Waiting for server...");
            render();
            return;
        }
    }

    sprintf(sMessage, "");
    iCurrentFrame++;

    // set player 1 position
    if(sGlobal->bKinect)
    {
        // check Kinect status
        // two players
        if(sGlobal->iHumanPlayers == 2 && (!kHandPosition.PlayerReady[0] || !kHandPosition.PlayerReady[1]))
        {
            if(!kHandPosition.PlayerReady[0] || !kHandPosition.PlayerReady[1])
            {
                if(!kHandPosition.PlayerReady[0] && !kHandPosition.PlayerReady[1])
                    sprintf(sMessage, "Kinect: waiting for the players...");
                else if(!kHandPosition.PlayerReady[0])
                    sprintf(sMessage, "Kinect: waiting for player 1...");
                else
                    sprintf(sMessage, "Kinect: waiting for player 2...");

                render();
                return;
            }
        }

        // single player
        else if(!kHandPosition.PlayerReady[0])
        {
            sprintf(sMessage, "Kinect: waiting for player...");

            if(!kHandPosition.PlayerReady[0])
            {
                render();
                return;
            }
        }

        // Kinect (two players)
        if(sGlobal->iHumanPlayers == 2)
        {
            cGame->setMouseRatio(-kCalibration.Width * 2 - 50, -50, 
                                 kCalibration.MinimumDistance, kCalibration.MaximumDistance);
            cGame->setMousePositionPlayer1(kHandPosition.x[0], kHandPosition.z[0]);

            cGame->setMouseRatio(kCalibration.Width * 2 + 50, 50, 
                                 kCalibration.MinimumDistance, kCalibration.MaximumDistance);
            cGame->setMousePositionPlayer2(kHandPosition.x[1], kHandPosition.z[1]);
        }

        // Kinect (single player)
        else
        {
            cGame->setMousePositionPlayer1(kHandPosition.x[0], kHandPosition.z[0]);
        }
    }
    else
    {
        // mouse
        cGame->setMousePositionPlayer1((float)iMouseX, (float)iMouseY);
    }

    // multiplayer: client
    if(sGlobal->bMultiplayer && !sGlobal->bServer)
    {
        updateClient();
        return;
    }

    // game time
    if(iCurrentFrame % sGlobal->iFPS == 0)
    {
        iTimeSec--;

        if(iTimeSec < 0)
        {
            iTimeSec = 59;
            iTimeMin--;
        }

        if(iTimeMin < 0)
        {
            iTimeMin = 0;
            iTimeSec = 0;
            endOfTheMatch();
        }

        // send time to client
        if(sGlobal->bMultiplayer)
        {
            sUDPBuffer[0] = MSG_TIME;
            sUDPBuffer[1] = (char)iTimeMin;
            sUDPBuffer[2] = (char)iTimeSec;
            cServer->sendMessage(sClientAddress, sUDPBuffer, MSG_SIZE);
        }
    }

    // set player 2 position (CPU)
    if(sGlobal->iHumanPlayers == 1 && !sGlobal->bMultiplayer)
        cGame->setTablePositionPlayer2(cPlayer2AI->update());
    
    // check goals
    bPuckVisible = true;

    if(cGame->checkEvent() == AH_EVENT_GOAL_P1 || cGame->checkEvent() == AH_EVENT_GOAL_P2)
    {
        bPuckVisible = false;

        // send "goal" to client
        if(sGlobal->bMultiplayer)
        {
            sUDPBuffer[0] = MSG_GOAL;
            sUDPBuffer[1] = (char)cGame->getGoalsPlayer2();
            sUDPBuffer[2] = (char)cGame->getGoalsPlayer1();
            cServer->sendMessage(sClientAddress, sUDPBuffer, MSG_SIZE);
        }

        // automatic replay
        if(sGlobal->bAutomaticReplay && !sGlobal->bMultiplayer)
        {
            // only goals without rebounds
            if((cGame->checkEvent() == AH_EVENT_GOAL_P1 && cGame->getLastPlayerWhoHitThePuck() == 1) ||
               (cGame->checkEvent() == AH_EVENT_GOAL_P2 && cGame->getLastPlayerWhoHitThePuck() == 2))
            {
                replayMode();
                return;
            }
        }

        // pause and then back to the game
        render();
        Sleep(1000);
    }

    // end of the match?
    if(cGame->getGoalsPlayer1() == sGlobal->iGameMaxGoals || cGame->getGoalsPlayer2() == sGlobal->iGameMaxGoals)
    {
        endOfTheMatch();
        return;
    }

    // replay data
    sReplayFrame[iCurrentReplayRecordFrame].PositionPlayer1 = cGame->getRenderPositionPlayer1();
    sReplayFrame[iCurrentReplayRecordFrame].PositionPlayer2 = cGame->getRenderPositionPlayer2();
    sReplayFrame[iCurrentReplayRecordFrame].PositionPuck = cGame->getRenderPositionPuck();
    sReplayFrame[iCurrentReplayRecordFrame].PuckVisible = bPuckVisible;
    sReplayFrame[iCurrentReplayRecordFrame].Interpolate = !(cGame->checkEvent() == AH_EVENT_GOAL_P1 || 
                                                            cGame->checkEvent() == AH_EVENT_GOAL_P2);
    iCurrentReplayRecordFrame++;

    if(iCurrentReplayRecordFrame == REPLAY_FRAMES)
        iCurrentReplayRecordFrame = 0;

    // game status update
    cGame->update();

    // send game data to client
    if(sGlobal->bMultiplayer && (iCurrentFrame % MULTIPLAYER_DATA_RATE) == 0)
        sendDataToClient();

    // video and audio
    render();
    playSounds(cGame->checkEvent());
}