void mainGameTimer(int x) { #define MAX_DAMAGE 10 for(int i = 0; i < ships.size(); i++) { Ship * s = ships[i]; if (s->getIsHit()) { bool isStillDying = s->animateDeath(); if (isStillDying) { // leaving this unfinished for the ships for now } } else { s->move(); } } bool allWalkersAreInactive = true; // assume true unless otherwise proven for(int i = 0; i < walkers.size(); i++) { Walker * w = walkers[i]; if (w->getIsInactive()) { // do nothing } else if (w->getIsDying()) { setStatusBarText("You've taken down a walker!"); bool isStillDying = w->animateDeath(); if (isStillDying) { allWalkersAreInactive = false; } } else { w->walk(0); allWalkersAreInactive = false; #define MAX_GAMEOVER_COUNTER 700 if (w->getPositionOfHead()[2] > 0 && _gameOverCounter == 0) { setStatusBarText("You've let a walker get through. GAME OVER"); for(int i = 0; i < 3; i++) light_level_during_gameover[i] = 0.5; _gameOverCounter++; } } } if(_gameOverCounter == 0 && _damageCounter > MAX_DAMAGE) { setStatusBarText("A walker has killed you... GAME OVER"); _gameOverCounter = 1; } if (_gameOverCounter > 0) { // fade out the lights for(int i = 0; i<3; i++) light_level_during_gameover[i] -= 0.001; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_level_during_gameover); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_level_during_gameover); glLightfv(GL_LIGHT0, GL_SPECULAR, light_level_during_gameover); glLightfv(GL_LIGHT1, GL_DIFFUSE, light_level_during_gameover); glLightfv(GL_LIGHT1, GL_SPECULAR, light_level_during_gameover); _gameOverCounter++; if (_gameOverCounter > MAX_GAMEOVER_COUNTER) newGame(); } /* if we killed them all, then go to the next round */ if (allWalkersAreInactive) { for(int i = 0; i < walkers.size(); i++) { Walker * w = walkers[i]; w->resetToStartPosition(); w->start(); } _gameRound++; _damageCounter = 0; // RESET DAMAGE EACH ROUND glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient); // reset the ambient light if (_gameRound < 10) addWalker(); // don't add too many enemies or it will be impossible } for(std::vector<Projectile*>::iterator itr = walkerProjectiles.begin(); itr != walkerProjectiles.end(); ++itr) { Projectile * p = *itr; if (p->fireContinued()) { if (p->isColliding(cannon->getPosition())) { stringstream s; s << "You've been hit!!! Your damage level is " << _damageCounter << " out of " << MAX_DAMAGE << endl; setStatusBarText(s.str()); _damageCounter++; p->setIsFiring(false); #define DAMAGE_COLOR_CHANGE 0.05 if (_damageCounter == 1) { // reset the temp ambient light array so we can use it to fade to red for(int i = 0; i < 3; i++) light_level_while_damaged[i] = model_ambient[i]; } else { light_level_while_damaged[0] += DAMAGE_COLOR_CHANGE; light_level_while_damaged[1] -= DAMAGE_COLOR_CHANGE*0.5; light_level_while_damaged[2] -= DAMAGE_COLOR_CHANGE*0.5; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_level_while_damaged); } } } } for(std::vector<Projectile*>::iterator itr = shipsProjectiles.begin(); itr != shipsProjectiles.end(); ++itr) { Projectile * p = *itr; if (p->fireContinued()) { // ships won't hit anything } } for(std::vector<Projectile*>::iterator itr = cannonProjectiles.begin(); itr != cannonProjectiles.end(); ++itr) { Projectile * p = *itr; if (p->fireContinued()) { for(int i = 0; i < walkers.size(); i++) { Walker * w = walkers[i]; if (!w->getIsInactive() && p->isColliding(w->getPositionOfHead())) { walkers[i]->setIsHit(); p->setIsFiring(false); setStatusBarText("You've hit a walker! Watch out, he's firing at you!"); break; // can only hit one at a time really } } for(int i = 0; i < ships.size(); i++) { GLfloat shipX, shipY, shipZ; ships[i]->getPosition(&shipX, &shipY, &shipZ); GLfloat pos[3]; pos[0] = shipX; pos[1] = shipY; pos[2] = shipZ; if (p->isColliding(pos)) { ships[i]->setIsHit(); p->setIsFiring(false); setStatusBarText("You've taken down a tie fighter!"); break; // can only hit one at a time really } } } } cannon->recoilContinue(); #define STATUS_BAR_DURATION 300 fireCannonFlashLight(); _statusBarTextRemoveCounter++; if (_statusBarTextRemoveCounter > STATUS_BAR_DURATION) { setStatusBarText(""); } glutPostRedisplay(); glutTimerFunc(10, mainGameTimer, 0); }