/* * ORXONOX - the hottest 3D action shooter ever to exist * > www.orxonox.net < * * * License notice: * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Author: * Florian Zinggeler * Co-authors: * ... * */ /** @file FlappyOrx.cc @brief Implementation of the FlappyOrx class. */ #include "FlappyOrx.h" #include "Highscore.h" #include "core/CoreIncludes.h" #include "core/EventIncludes.h" #include "core/command/Executor.h" #include "core/config/ConfigValueIncludes.h" #include "gamestates/GSLevel.h" #include "chat/ChatManager.h" // ! HACK #include "infos/PlayerInfo.h" #include "FlappyOrxCenterPoint.h" #include "FlappyOrxShip.h" #include "FlappyOrxAsteroid.h" #include "core/command/ConsoleCommand.h" #include "worldentities/ExplosionPart.h" namespace orxonox { RegisterUnloadableClass(FlappyOrx); FlappyOrx::FlappyOrx(Context* context) : Deathmatch(context) { RegisterObject(FlappyOrx); this->numberOfBots_ = 0; //sets number of default bots temporarly to 0 this->center_ = nullptr; bEndGame = false; lives = 1; level = 0; point = 0; bShowLevel = false; multiplier = 1; b_combo = false; this->spawnDistance=300; this->tubeOffsetX=500; this->setHUDTemplate("FlappyOrxHUD"); } void FlappyOrx::updatePlayerPos(int x){ if(this->tubes.size()==0||x-this->tubes.back()-tubeOffsetX>spawnDistance){ spawnTube(); this->tubes.push(x+tubeOffsetX); } if(this->tubes.size()!=0&&x>this->tubes.front()){ this->tubes.pop(); levelUp(); point++; } } void FlappyOrx::levelUp() { level++; toggleShowLevel(); //showLevelTimer.setTimer(3.0f, false, createExecutor(createFunctor(&FlappyOrx::toggleShowLevel, this))); } FlappyOrxShip* FlappyOrx::getPlayer() { if (player == nullptr) { for (FlappyOrxShip* ship : ObjectList()) { player = ship; } } return player; } void FlappyOrx::spawnTube() { int space = 90; int height = (float(rand())/RAND_MAX-0.5)*(280-space); if (getPlayer() == nullptr) return; Vector3 pos = player->getPosition(); asteroidField(pos.x+tubeOffsetX,height-space/2,0.8); asteroidField(pos.x+tubeOffsetX,height+space/2,-0.8); } void FlappyOrx::asteroidField(int x, int y, float slope){ int r = 20; int noadd = 0; ClearAsteroids(); Circle newAsteroid = Circle(); while(r>0){ if(slope>0) newAsteroid.y=float(rand())/RAND_MAX*(150+y)-150; else newAsteroid.y=float(rand())/RAND_MAX*(150-y)+y; newAsteroid.x=x+(float(rand())/RAND_MAX-0.5)*(y-newAsteroid.y)/slope; newAsteroid.r=r; int i = addIfPossible(newAsteroid); if(i==0) noadd++; else if(i==2) r=0; if(noadd>=5){ noadd=0; r-=5; } } } void FlappyOrx::createAsteroid(Circle &c){ orxout() << "created Asteroid at x="<getPoints(); if(score > Highscore::getInstance().getHighestScoreOfGame("Orxonox Arcade")) Highscore::getInstance().storeHighscore("Orxonox Arcade",score); } GSLevel::startMainMenu(); } }