void PlaybackManager::timerTick() { playSounds( editor()->currentFrame() ); if ( editor()->currentFrame() >= mEndFrame ) { if ( mIsLooping ) { editor()->scrubTo( mStartFrame ); } else { stop(); } } else { editor()->scrubForward(); } }
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(); } }
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(); }
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; } } } } } }
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; }
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; }
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; } }
//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(); }
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); }
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()); }