Changeset 10586 for code/branches/towerdefenseFabien/src/modules
- Timestamp:
- Sep 15, 2015, 2:20:34 PM (9 years ago)
- Location:
- code/branches/towerdefenseFabien/src/modules/towerdefense
- Files:
-
- 4 added
- 7 deleted
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/towerdefenseFabien/src/modules/towerdefense/CMakeLists.txt
r10258 r10586 2 2 TowerDefense.cc 3 3 TowerDefenseTower.cc 4 TowerTurret.cc5 4 TowerDefenseCenterpoint.cc 6 5 TowerDefenseHUDController.cc … … 8 7 TDCoordinate.cc 9 8 TowerDefenseEnemy.cc 10 9 TowerDefenseSelecter.cc 10 TowerDefenseField.cc 11 TDCoordinate.cc 11 12 ) 12 13 … … 17 18 orxonox 18 19 overlays 20 objects 19 21 SOURCE_FILES ${TOWERDEFENSE_SRC_FILES} 20 22 ) -
code/branches/towerdefenseFabien/src/modules/towerdefense/TDCoordinate.cc
r10258 r10586 8 8 namespace orxonox 9 9 { 10 //RegisterClass(TDCoordinate);11 12 10 /** 13 11 @brief 14 Constructor. Registers and initializes the object.12 Constructor. Sets the default coordinates: (0,0) 15 13 */ 16 14 TDCoordinate::TDCoordinate() 17 15 { 18 //RegisterObject(TDCoordinate); 19 x=0; 20 y=0; 21 16 Set(0,0); 22 17 } 23 18 24 19 TDCoordinate::TDCoordinate(int x, int y) 25 { 26 this->x=x; 27 this->y=y; 20 { 21 Set(x,y); 22 } 23 24 void TDCoordinate::Set(int x, int y) 25 { 26 if (x < 0) 27 { 28 _x = 0; 29 } 30 else if (x > 15) 31 { 32 _x = 15; 33 } 34 else 35 { 36 _x = x; 37 } 38 39 if (y < 0) 40 { 41 _y = 0; 42 } 43 else if (y > 15) 44 { 45 _y = 15; 46 } 47 else 48 { 49 _y = y; 50 } 51 } 52 53 int TDCoordinate::GetX() 54 { 55 return _x; 56 } 57 58 int TDCoordinate::GetY() 59 { 60 return _y; 28 61 } 29 62 … … 34 67 35 68 Vector3 *coord = new Vector3(); 36 coord->x= ( x-8) * tileScale;37 coord->y= ( y-8) * tileScale;38 coord->z= 100;69 coord->x= (_x-8) * tileScale; 70 coord->y= (_y-8) * tileScale; 71 coord->z=0; 39 72 40 73 return *coord; -
code/branches/towerdefenseFabien/src/modules/towerdefense/TDCoordinate.h
r10258 r10586 13 13 //Class to save the Coordinates in a class instead of struct 14 14 //Convert 2d coordinates to 3d in order to set waypoints 15 class _TowerDefenseExport TDCoordinate : public OrxonoxClass15 class _TowerDefenseExport TDCoordinate 16 16 { 17 17 public: 18 int x; 19 int y; 18 TDCoordinate(); 19 TDCoordinate(int x, int y); 20 virtual ~TDCoordinate() {}; 21 virtual void Set(int x, int y); 22 virtual int GetX(); 23 virtual int GetY(); 24 virtual Vector3 get3dcoordinate(); 20 25 21 TDCoordinate(); 22 23 Vector3 get3dcoordinate(); 24 25 virtual ~TDCoordinate() {}; 26 27 TDCoordinate(int x, int y); 26 private: 27 int _x; 28 int _y; 28 29 }; 29 30 -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc
r10258 r10586 37 37 * 38 38 * 39 *40 39 *TIPP: Eclipse hilft euch schnell auf bereits vorhanden Funktionen zuzugreifen: 41 40 * einfach "this->" eingeben und kurz warten. Dann tauch eine Liste mit Vorschlägen auf. Wenn ihr jetzt weiter … … 76 75 #include "TowerDefenseTower.h" 77 76 #include "TowerDefenseCenterpoint.h" 78 //#include "TDCoordinate.h"79 #include "TowerTurret.h"80 77 #include "worldentities/SpawnPoint.h" 81 #include "worldentities/pawns/Pawn.h"82 #include "worldentities/pawns/SpaceShip.h"83 78 #include "controllers/WaypointController.h" 84 79 #include "graphics/Model.h" … … 89 84 #include "core/command/ConsoleCommand.h" 90 85 86 91 87 namespace orxonox 92 88 { 89 static const std::string __CC_addTower_name = "addTower"; 90 static const std::string __CC_upgradeTower_name = "upgradeTower"; 91 92 SetConsoleCommand("TowerDefense", __CC_addTower_name, &TowerDefense::addTower ).addShortcut().defaultValues(1); 93 SetConsoleCommand("TowerDefense", __CC_upgradeTower_name, &TowerDefense::upgradeTower).addShortcut().defaultValues(0); 94 93 95 RegisterUnloadableClass(TowerDefense); 94 96 95 TowerDefense::TowerDefense(Context* context) : Deathmatch(context)97 TowerDefense::TowerDefense(Context* context) : TeamDeathmatch(context) 96 98 { 97 99 RegisterObject(TowerDefense); 98 /* 99 for (int i=0; i < 16 ; i++){ 100 for (int j = 0; j< 16 ; j++){ 101 towermatrix[i][j] = NULL; 102 } 103 }*/ 104 100 101 selecter = NULL; 102 this->player_ = NULL; 105 103 this->setHUDTemplate("TowerDefenseHUD"); 104 this->nextwaveTimer_.setTimer(10, false, createExecutor(createFunctor(&TowerDefense::nextwave, this))); 105 this->nextwaveTimer_.stopTimer(); 106 this->waves_ = 0; 107 this->time = 0; 108 this->credit_ = 0; 109 this->lifes_ = 0; 106 110 107 111 //this->stats_ = new TowerDefensePlayerStats(); 108 112 109 /* Temporary hack to allow the player to add towers and upgrade them */ 110 this->dedicatedAddTower_ = createConsoleCommand( "addTower", createExecutor( createFunctor(&TowerDefense::addTower, this) ) ); 111 this->dedicatedUpgradeTower_ = createConsoleCommand( "upgradeTower", createExecutor( createFunctor(&TowerDefense::upgradeTower, this) ) ); 113 ModifyConsoleCommand(__CC_addTower_name).setObject(this); 114 ModifyConsoleCommand(__CC_upgradeTower_name).setObject(this); 112 115 } 113 116 114 117 TowerDefense::~TowerDefense() 115 { 116 /* Part of a temporary hack to allow the player to add towers */ 118 { /* Part of a temporary hack to allow the player to add towers */ 117 119 if (this->isInitialized()) 118 120 { 119 if( this->dedicatedAddTower_ )120 delete this->dedicatedAddTower_;121 ModifyConsoleCommand(__CC_addTower_name).setObject(NULL); 122 ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL); 121 123 } 122 124 } … … 124 126 void TowerDefense::setCenterpoint(TowerDefenseCenterpoint *centerpoint) 125 127 { 126 orxout() << "Centerpoint now setting..." << endl;127 128 this->center_ = centerpoint; 128 orxout() << "Centerpoint now set..." << endl;129 129 } 130 130 131 131 void TowerDefense::start() 132 { 133 134 Deathmatch::start(); 135 136 // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path 137 for (int i=0; i < 16 ; i++){ 138 for (int j = 0; j< 16 ; j++){ 139 towermatrix[i][j] = false; 140 } 141 } 142 143 for (int k=0; k<3; k++) 144 towermatrix[1][k]=true; 145 for (int l=1; l<11; l++) 146 towermatrix[l][3]=true; 147 for (int m=3; m<12; m++) 148 towermatrix[10][m]=true; 149 for (int n=10; n<14; n++) 150 towermatrix[n][11]=true; 151 for (int o=13; o<16; o++) 152 towermatrix[13][o]=true; 132 { 133 if (center_ != NULL) // There needs to be a TowerDefenseCenterpoint, i.e. the area the game takes place. 134 { 135 if (selecter == NULL) 136 { 137 selecter = new TowerDefenseSelecter(this->center_->getContext()); 138 } 139 selecter->addTemplate(center_->getSelecterTemplate()); 140 center_->attach(selecter); 141 } 142 else // If no centerpoint was specified, an error is thrown and the level is exited. 143 { 144 orxout(internal_error) << "Jump: No Centerpoint specified." << endl; 145 return; 146 } 147 148 enemies_.clear(); 149 150 createFields(); 151 152 TeamDeathmatch::start(); 153 154 // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path 155 153 156 154 157 //set initial credits, lifes and WaveNumber 155 this->setCredit( 200);156 this->setLifes( 50);158 this->setCredit(1000); 159 this->setLifes(100); 157 160 this->setWaveNumber(0); 158 time=0.0; 159 160 //adds initial towers 161 for (int i=0; i <7; i++){ 162 addTower(i+3,4); 163 }/* 164 for (int j=0; j < 7; j++){ 165 addTower(9,j+5); 166 }*/ 161 time = 0.0; 167 162 } 168 163 169 164 // Generates a TowerDefenseEnemy. Uses Template "enemytowerdefense". Sets position at first waypoint of path. 170 void TowerDefense::addTowerDefenseEnemy(std::vector<TDCoordinate*> path, int templatenr){ 171 165 void TowerDefense::addTowerDefenseEnemy(int templatenr) 166 { 167 orxout() << "addTowerDefenseEnemy" << endl; 172 168 173 169 TowerDefenseEnemy* en1 = new TowerDefenseEnemy(this->center_->getContext()); … … 185 181 en1->setScale(2); 186 182 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 187 // en1->setShieldHealth(en1->getShield() = this->getWaveNumber()*2))188 183 break; 189 184 … … 193 188 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 194 189 break; 195 } 196 197 en1->getController(); 198 en1->setPosition(path.at(0)->get3dcoordinate()); 199 TowerDefenseEnemyvector.push_back(en1); 200 201 for(unsigned int i = 0; i < path.size(); ++i) 202 { 203 en1->addWaypoint((path.at(i))); 204 } 190 } 191 192 en1->setTeam(2); 193 194 //orxonox::WeakPtr<WaypointController> controller = new WaypointController(this->center_->getContext()); 195 //controller->setControllableEntity(en1); 196 //en1->setController(controller); 197 198 WaypointController* controller = (WaypointController*)(en1->getXMLController()); 199 200 if (controller != NULL && waypoints_.size() > 1) 201 { 202 en1->setPosition(waypoints_.at(0)->getPosition()); 203 en1->setOrientation(Vector3(0,0,10), Degree(0)); 204 en1->setDirection(Vector3(0,1,0)); 205 en1->lookAt(waypoints_.at(1)->getPosition()); 206 207 for (unsigned int i = 0; i < waypoints_.size(); ++ i) 208 { 209 orxonox::WeakPtr<MovableEntity> waypoint = new MovableEntity(this->center_->getContext()); 210 waypoint->setPosition(waypoints_.at(i)->getPosition()); 211 controller->addWaypoint(waypoints_.at(i)); 212 } 213 } 214 215 enemies_.push_back(en1); 205 216 } 206 217 … … 209 220 { 210 221 211 Deathmatch::end();222 TeamDeathmatch::end(); 212 223 ChatManager::message("Match is over! Gameover!"); 213 224 214 225 } 215 226 227 void TowerDefense::spawnPlayer(PlayerInfo* player) 228 { 229 assert(player); 230 player_ = player; 231 232 orxout() << "spawnPlayer" << endl; 233 234 if (selecter->getPlayer() == NULL) 235 { 236 player_->startControl(selecter); 237 players_[player].state_ = PlayerState::Alive; 238 } 239 } 240 241 /** 242 @brief 243 Get the player. 244 @return 245 Returns a pointer to the player. If there is no player, NULL is returned. 246 */ 247 PlayerInfo* TowerDefense::getPlayer(void) const 248 { 249 return this->player_; 250 } 251 216 252 //not working yet 217 void TowerDefense::upgradeTower(int x,int y) 218 {/* 219 const int upgradeCost = 20; 220 221 if (!this->hasEnoughCreditForTower(upgradeCost)) 222 { 223 orxout() << "not enough credit: " << (this->getCredit()) << " available, " << upgradeCost << " needed."; 224 return; 225 } 226 227 if (towermatrix [x][y] == NULL) 228 { 229 orxout() << "no tower on this position" << endl; 230 return; 231 } 232 233 else 234 { 235 (towermatrix [x][y])->upgradeTower(); 236 }*/ 253 void TowerDefense::addTower(int x,int y) 254 { 255 TDCoordinate* coord = new TDCoordinate(x,y); 256 x = coord->GetX(); 257 y = coord->GetY(); 258 259 int cost = center_->getTowerCost(1); 260 261 if (fields_[x][y]->isFree() == true && getCredit() >= cost) 262 { 263 payCredit(cost); 264 fields_[x][y]->createTower(1); 265 } 237 266 } 238 267 239 268 /*adds Tower at Position (x,y) and reduces credit and adds the point to the towermatrix. template ("towerturret") 240 269 so towers have ability if the turrets 241 242 270 */ 243 void TowerDefense::addTower(int x, int y) 244 { 245 const int towerCost = 20; 246 247 if (!this->hasEnoughCreditForTower(towerCost)) 248 { 249 orxout() << "not enough credit: " << (this->getCredit()) << " available, " << towerCost << " needed."; 271 272 void TowerDefense::upgradeTower(int x, int y) 273 { 274 TDCoordinate* coord = new TDCoordinate(x,y); 275 x = coord->GetX(); 276 y = coord->GetY(); 277 278 int cost = center_->getTowerCost(fields_[x][y]->getUpgrade() + 1); 279 280 if (fields_[x][y]->isFree() == false && fields_[x][y]->canUpgrade() == true && getCredit() >= cost) 281 { 282 payCredit(cost); 283 fields_[x][y]->upgrade(); 284 } 285 } 286 287 void TowerDefense::tick(float dt) 288 { 289 //orxout() << "tick1" << endl; 290 SUPER(TowerDefense, tick, dt); 291 //orxout() << "tick2" << endl; 292 293 if (hasStarted() == false || player_ == NULL) 294 { 250 295 return; 251 296 } 252 253 if (towermatrix [x][y]==true) 254 { 255 orxout() << "not possible to put tower here!!" << endl; 256 return; 257 } 258 259 /* 260 unsigned int width = this->center_->getWidth(); 261 unsigned int height = this->center_->getHeight(); 262 */ 263 264 int tileScale = (int) this->center_->getTileScale(); 265 266 if (x > 15 || y > 15 || x < 0 || y < 0) 267 { 268 //Hard coded: TODO: let this depend on the centerpoint's height, width and fieldsize (fieldsize doesn't exist yet) 269 orxout() << "Can not add Tower: x and y should be between 0 and 15" << endl; 270 return; 271 } 272 273 orxout() << "Will add tower at (" << (x-8) * tileScale << "," << (y-8) * tileScale << ")" << endl; 274 275 //Reduce credit 276 this->buyTower(towerCost); 277 towermatrix [x][y]=true; 278 279 //Creates tower 280 TowerDefenseTower* towernew = new TowerDefenseTower(this->center_->getContext()); 281 towernew->addTemplate("towerturret"); 282 towernew->setPosition(static_cast<float>((x-8) * tileScale), static_cast<float>((y-8) * tileScale), 75); 283 towernew->setGame(this); 284 } 285 286 bool TowerDefense::hasEnoughCreditForTower(int towerCost) 287 { 288 return ((this->getCredit()) >= towerCost); 289 } 290 291 292 bool TowerDefense::hasEnoughCreditForUpgrade() 293 { 294 return true; 295 } 296 297 298 void TowerDefense::tick(float dt) 299 { 300 SUPER(TowerDefense, tick, dt); 301 time +=dt; 302 303 TDCoordinate* coord1 = new TDCoordinate(1,1); 304 std::vector<TDCoordinate*> path; 305 path.push_back(coord1); 306 if(time>1 && TowerDefenseEnemyvector.size() < 30) 297 time += dt; 298 299 //build/upgrade tower at selecter position 300 if (selecter != NULL && selecter->buildTower_ == true) 301 { 302 selecter->buildTower_ = false; 303 304 if (getField(selecter->selectedPos_)->canUpgrade() == true) 305 { 306 upgradeTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY()); 307 } 308 else 309 { 310 addTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY()); 311 } 312 } 313 314 if (time >= 1.3 * enemies_.size() && enemies_.size() < 10) 307 315 { 308 316 //adds different types of enemys depending on the WaveNumber 309 addTowerDefenseEnemy(path, this->getWaveNumber() % 3 +1 ); 310 time = time-1; 311 } 312 313 Vector3* endpoint = new Vector3(500, 700, 150); 317 addTowerDefenseEnemy(this->getWaveNumber() % 3 +1 ); 318 } 319 314 320 //if ships are at the end they get destroyed 315 for(unsigned int i =0; i < TowerDefenseEnemyvector.size(); ++i) 316 { 317 if(TowerDefenseEnemyvector.at(i) != NULL && TowerDefenseEnemyvector.at(i)->isAlive()) 318 { 319 //destroys enemys at the end of teh path and reduces the life by 1. no credits gifted 320 321 Vector3 ship = TowerDefenseEnemyvector.at(i)->getRVWorldPosition(); 322 float distance = ship.distance(*endpoint); 323 324 if(distance <50){ 325 TowerDefenseEnemyvector.at(i)->destroy(); 326 this->reduceLifes(1); 327 this->buyTower(1); 328 if (this->getLifes()==0) 329 { 330 this->end(); 331 } 321 322 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itBegin = enemies_.begin(); 323 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator it = itBegin; 324 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itEnd = enemies_.end(); 325 326 while(it != itEnd) 327 { 328 //destroys enemys at the end of the path and reduces the life by 1. No credits gifted 329 Vector3 ship = (*it)->getRVWorldPosition(); 330 float distance = ship.distance(endpoint_); 331 if(distance < 50) 332 { 333 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itTemp = it; 334 ++ it; 335 orxout() << "enemy deleted" << endl; 336 enemies_.erase(itTemp); 337 (*itTemp)->destroy(); 338 this->reduceLifes(1); 339 if (this->getLifes() == 0) 340 { 341 this->end(); 332 342 } 333 343 } 334 } 335 //goes thorugh vector to see if an enemy is still alive. if not next wave is launched 336 int count= 0; 337 for(unsigned int i =0; i < TowerDefenseEnemyvector.size(); ++i) 338 { 339 if(TowerDefenseEnemyvector.at(i)!= NULL) 340 { 341 ++count; 342 } 343 } 344 345 if(count== 0) 346 { 347 time2 +=dt; 348 if(time2 > 10) 349 { 350 TowerDefenseEnemyvector.clear(); 351 this->nextwave(); 352 time=0; 353 time2=0; 354 } 355 } 356 357 358 } 359 360 // Function to test if we can add waypoints using code only. Doesn't work yet 361 362 // THE PROBLEM: WaypointController's getControllableEntity() returns null, so it won't track. How do we get the controlableEntity to NOT BE NULL??? 363 /* 364 void TowerDefense::addWaypointsAndFirstEnemy() 365 { 366 SpaceShip *newShip = new SpaceShip(this->center_); 367 newShip->addTemplate("spaceshipassff"); 368 369 WaypointController *newController = new WaypointController(newShip); 370 newController->setAccuracy(3); 371 372 Model *wayPoint1 = new Model(newController); 373 wayPoint1->setMeshSource("crate.mesh"); 374 wayPoint1->setPosition(7,-7,5); 375 wayPoint1->setScale(0.2); 376 377 Model *wayPoint2 = new Model(newController); 378 wayPoint2->setMeshSource("crate.mesh"); 379 wayPoint2->setPosition(7,7,5); 380 wayPoint2->setScale(0.2); 381 382 newController->addWaypoint(wayPoint1); 383 newController->addWaypoint(wayPoint2); 384 385 // The following line causes the game to crash 386 387 newShip->setController(newController); 388 // newController -> getPlayer() -> startControl(newShip); 389 newShip->setPosition(-7,-7,5); 390 newShip->setScale(0.1); 391 //newShip->addSpeed(1); 392 393 394 395 // this->center_->attach(newShip); 396 } 397 */ 344 else 345 { 346 ++ it; 347 } 348 } 349 350 if (enemies_.size() == 0 && !this->nextwaveTimer_.isActive()) 351 { 352 this->nextwaveTimer_.startTimer(); 353 } 354 } 355 356 void TowerDefense::createFields() 357 { 358 assert(center_); 359 TDCoordinate coord(0,0); 360 TDCoordinate startCoord(0,0); 361 362 std::string fields = center_->getFields(); 363 int pos = 0; 364 for (int j = 15; j >= 0; --j) 365 { 366 for (int i = 0; i < 16; ++i) 367 { 368 coord.Set(i,j); 369 fields_[i][j] = new TowerDefenseField(center_->getContext()); 370 fields_[i][j]->setCenterpoint(center_); 371 center_->attach(fields_[i][j]); 372 fields_[i][j]->setPosition(coord.get3dcoordinate()); 373 fields_[i][j]->create(fields.at(pos), fields.at(pos+1)); 374 pos += 2; 375 if (fields_[i][j]->getType() == START) 376 { 377 startCoord.Set(i,j); 378 waypoints_.push_back(fields_[i][j]); 379 } 380 } 381 } 382 383 //Place waypoints along the street for the waypoint controllers of the enemies 384 TDCoordinate* thisCoord = &startCoord; 385 TDCoordinate* nextCoord; 386 while ((nextCoord = getNextStreetCoord(thisCoord)) != NULL) 387 { 388 waypoints_.push_back(fields_[nextCoord->GetX()][nextCoord->GetY()]); 389 thisCoord = nextCoord; 390 endpoint_ = nextCoord->get3dcoordinate(); 391 } 392 393 } 394 395 TDCoordinate* TowerDefense::getNextStreetCoord(TDCoordinate* thisCoord) 396 { 397 TowerDefenseField* thisField = fields_[thisCoord->GetX()][thisCoord->GetY()]; 398 TDCoordinate* nextCoord = new TDCoordinate(0,0); 399 400 if (thisField->getType() != STREET && thisField->getType() != START) 401 { 402 return NULL; 403 } 404 405 if (thisField->getAngle() == 0) 406 { 407 nextCoord->Set(thisCoord->GetX(), thisCoord->GetY() - 1); 408 } 409 else if (thisField->getAngle() == 1) 410 { 411 nextCoord->Set(thisCoord->GetX() + 1, thisCoord->GetY()); 412 } 413 else if (thisField->getAngle() == 2) 414 { 415 nextCoord->Set(thisCoord->GetX(), thisCoord->GetY() + 1); 416 } 417 else if (thisField->getAngle() == 3) 418 { 419 nextCoord->Set(thisCoord->GetX() - 1, thisCoord->GetY()); 420 } 421 422 if (thisCoord->GetX() != nextCoord->GetX() || thisCoord->GetY() != nextCoord->GetY()) 423 { 424 return nextCoord; 425 } 426 427 return NULL; 428 } 429 398 430 /* 399 431 void TowerDefense::playerEntered(PlayerInfo* player) 400 432 { 401 Deathmatch::playerEntered(player);433 TeamDeathmatch::playerEntered(player); 402 434 403 435 const std::string& message = player->getName() + " entered the game"; … … 407 439 bool TowerDefense::playerLeft(PlayerInfo* player) 408 440 { 409 bool valid_player = Deathmatch::playerLeft(player);441 bool valid_player = TeamDeathmatch::playerLeft(player); 410 442 411 443 if (valid_player) … … 437 469 } 438 470 439 Deathmatch::pawnKilled(victim, killer);471 TeamDeathmatch::pawnKilled(victim, killer); 440 472 } 441 473 -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.h
r10258 r10586 38 38 #define _TowerDefense_H__ 39 39 #include "TDCoordinate.h" 40 #include "TowerDefenseSelecter.h" 40 41 #include "towerdefense/TowerDefensePrereqs.h" 41 #include "gametypes/ Deathmatch.h"42 #include "gametypes/TeamDeathmatch.h" 42 43 #include "TowerDefenseEnemy.h" 43 44 #include "util/Output.h" 44 #include " core/object/WeakPtr.h"45 #include "TowerDefenseField.h" 45 46 46 47 namespace orxonox 47 48 { 48 class _TowerDefenseExport TowerDefense : public Deathmatch49 class _TowerDefenseExport TowerDefense : public TeamDeathmatch 49 50 { 50 51 public: 51 52 TowerDefense(Context* context); 52 virtual ~TowerDefense(); 53 54 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> > TowerDefenseEnemyvector; 55 bool towermatrix[16][16]; 56 void addTowerDefenseEnemy(std::vector<TDCoordinate*> path, int templatenr); 53 virtual ~TowerDefense(); 54 void addTowerDefenseEnemy(int templatenr); 57 55 virtual void start(); //<! The function is called when the gametype starts 58 56 virtual void end(); 59 57 virtual void tick(float dt); 60 //virtual void playerEntered(PlayerInfo* player); 61 //virtual bool playerLeft(PlayerInfo* player); 62 //Player Stats (set,get, reduce) 58 virtual void spawnPlayer(PlayerInfo* player); 59 PlayerInfo* getPlayer(void) const; 63 60 int getCredit(){ return this->credit_; } 61 void payCredit(int pay){ this->credit_ -= pay; } 64 62 int getLifes(){ return this->lifes_; } 65 63 int getWaveNumber(){ return this->waves_; } … … 69 67 void buyTower(int cost){ credit_ -= cost;} 70 68 void addCredit(int credit) { credit_+=credit; } 71 void nextwave(){ waves_++;}69 void nextwave(){ enemies_.clear(); waves_++; time=0;} 72 70 int reduceLifes(int NumberofLifes){ return lifes_-=NumberofLifes; } 71 TowerDefenseField* getField(TDCoordinate* coord){ return fields_[coord->GetX()][coord->GetY()]; } 72 /* Called by TowerDefenseCenterpoint upon game start 73 The centerpoint is used to create towers 74 */ 75 void setCenterpoint(TowerDefenseCenterpoint* centerpoint); 76 /* Adds a tower at x, y in the playfield */ 77 void addTower(int x, int y); 78 void upgradeTower(int x, int y); 79 virtual TDCoordinate* getNextStreetCoord(TDCoordinate*); 73 80 74 81 //virtual void pawnKilled(Pawn* victim, Pawn* killer = 0); 75 82 //virtual void playerScored(PlayerInfo* player, int score); 76 83 77 78 /* Called by TowerDefenseCenterpoint upon game start 79 The centerpoint is used to create towers 80 */ 81 void setCenterpoint(TowerDefenseCenterpoint *centerpoint); 82 83 /* Adds a tower at x, y in the playfield */ 84 void addTower(int x, int y); 85 86 void upgradeTower(int x, int y); 87 /* Part of a temporary hack to allow the player to add towers */ 88 ConsoleCommand* dedicatedAddTower_; 89 ConsoleCommand* dedicatedUpgradeTower_; 84 TowerDefenseSelecter* selecter; 90 85 91 86 //TODO: void spawnNewWave() … … 93 88 // or spawn a new wave when the old wave has been killed (event driven) 94 89 95 96 90 private: 97 TowerDefenseCenterpoint *center_;98 float time;99 float time 2;91 orxonox::WeakPtr<TowerDefenseCenterpoint> center_; 92 PlayerInfo* player_; 93 float time; 100 94 int credit_; 101 95 int waves_; 102 96 int lifes_; 97 Timer nextwaveTimer_; 98 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> > enemies_; 99 TowerDefenseField* fields_[16][16]; 100 std::vector<orxonox::WeakPtr<TowerDefenseField> > waypoints_; 101 Vector3 endpoint_; 103 102 104 /* handles stats */ 105 bool hasEnoughCreditForTower(int towerCost); 106 bool hasEnoughCreditForUpgrade(); 107 108 109 110 std::vector<TowerTurret*> towers_; 103 void createFields(); 111 104 }; 112 105 } -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseCenterpoint.cc
r9667 r10586 53 53 this->width_ = 15; 54 54 this->height_ = 15; 55 this->towerTemplate_ = "";56 55 57 56 //this->setCollisionType(Static); … … 72 71 XMLPortParam(TowerDefenseCenterpoint, "height", setHeight, getHeight, xmlelement, mode); 73 72 XMLPortParam(TowerDefenseCenterpoint, "tileScale", setTileScale, getTileScale, xmlelement, mode); 74 XMLPortParam(TowerDefenseCenterpoint, "towerTemplate", setTowerTemplate, getTowerTemplate, xmlelement, mode); 73 XMLPortParam(TowerDefenseCenterpoint, "selecterTemplate", setSelecterTemplate, getSelecterTemplate, xmlelement, mode); 74 XMLPortParam(TowerDefenseCenterpoint, "tower1Template", setTower1Template, getTower1Template, xmlelement, mode); 75 XMLPortParam(TowerDefenseCenterpoint, "tower2Template", setTower2Template, getTower2Template, xmlelement, mode); 76 XMLPortParam(TowerDefenseCenterpoint, "tower3Template", setTower3Template, getTower3Template, xmlelement, mode); 77 XMLPortParam(TowerDefenseCenterpoint, "tower4Template", setTower4Template, getTower4Template, xmlelement, mode); 78 XMLPortParam(TowerDefenseCenterpoint, "tower5Template", setTower5Template, getTower5Template, xmlelement, mode); 79 XMLPortParam(TowerDefenseCenterpoint, "fields", setFields, getFields, xmlelement, mode); 80 XMLPortParam(TowerDefenseCenterpoint, "tower1Cost", setTower1Cost, getTower1Cost, xmlelement, mode); 81 XMLPortParam(TowerDefenseCenterpoint, "tower2Cost", setTower2Cost, getTower2Cost, xmlelement, mode); 82 XMLPortParam(TowerDefenseCenterpoint, "tower3Cost", setTower3Cost, getTower3Cost, xmlelement, mode); 83 XMLPortParam(TowerDefenseCenterpoint, "tower4Cost", setTower4Cost, getTower4Cost, xmlelement, mode); 84 XMLPortParam(TowerDefenseCenterpoint, "tower5Cost", setTower5Cost, getTower5Cost, xmlelement, mode); 75 85 76 86 //TODO: add XMLPortObject(TowerDefenseCenterpoint, WorldEntity, "waypoints", addWaypoint, getWaypoint, xmlelement, mode); … … 107 117 } 108 118 } 119 120 /** 121 @brief 122 Removes all blanks, tabs and returns from the string passed. 123 */ 124 void TowerDefenseCenterpoint::trimString(std::string* str) 125 { 126 std::string* trimmed = new std::string(""); 127 int length = str->size(); 128 char temp; 129 for (int i = 0; i < length; ++ i) 130 { 131 temp = str->at(i); 132 if (temp != ' ' && temp != '\t' && temp != '\n') 133 { 134 trimmed->push_back(temp); 135 } 136 } 137 138 *str = *trimmed; 139 } 140 141 const int TowerDefenseCenterpoint::getTowerCost(int upgrade) const 142 { 143 return towerCosts_[(upgrade%5)]; 144 } 109 145 } -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseCenterpoint.h
r9667 r10586 41 41 #include <string> 42 42 #include <util/Math.h> 43 43 #include "TowerDefenseTower.h" 44 44 #include "worldentities/MobileEntity.h" 45 45 … … 60 60 void setWidth(unsigned int width) 61 61 { this->width_ = width; } 62 63 62 unsigned int getWidth(void) const 64 63 { return this->width_; } 65 66 64 void setHeight(unsigned int height) 67 65 { this->height_ = height; } 68 69 66 unsigned int getHeight(void) const 70 67 { return this->height_; } 68 void setFields(const std::string& newFields) 69 { this->fields_ = newFields; trimString(&fields_); } 70 const std::string& getFields() const 71 { return this->fields_; } 72 void setSelecterTemplate(const std::string& newTemplate) 73 { this->selecterTemplate_ = newTemplate; } 74 const std::string& getSelecterTemplate() const 75 { return this->selecterTemplate_; } 76 77 void setTower1Template(const std::string& newTemplate) 78 { this->towerTemplates_[0] = newTemplate;} 79 const std::string& getTower1Template() const 80 { return this->towerTemplates_[0]; } 81 void setTower2Template(const std::string& newTemplate) 82 { this->towerTemplates_[1] = newTemplate; } 83 const std::string& getTower2Template() const 84 { return this->towerTemplates_[1]; } 85 void setTower3Template(const std::string& newTemplate) 86 { this->towerTemplates_[2] = newTemplate; } 87 const std::string& getTower3Template() const 88 { return this->towerTemplates_[2]; } 89 void setTower4Template(const std::string& newTemplate) 90 { this->towerTemplates_[3] = newTemplate; } 91 const std::string& getTower4Template() const 92 { return this->towerTemplates_[3]; } 93 void setTower5Template(const std::string& newTemplate) 94 { this->towerTemplates_[4] = newTemplate; } 95 const std::string& getTower5Template() const 96 { return this->towerTemplates_[4]; } 97 98 void setTower1Cost(const int& newCost) 99 { this->towerCosts_[0] = newCost;} 100 const int& getTower1Cost() const 101 { return this->towerCosts_[0]; } 102 void setTower2Cost(const int& newCost) 103 { this->towerCosts_[1] = newCost; } 104 const int& getTower2Cost() const 105 { return this->towerCosts_[1]; } 106 void setTower3Cost(const int& newCost) 107 { this->towerCosts_[2] = newCost; } 108 const int& getTower3Cost() const 109 { return this->towerCosts_[2]; } 110 void setTower4Cost(const int& newCost) 111 { this->towerCosts_[3] = newCost; } 112 const int& getTower4Cost() const 113 { return this->towerCosts_[3]; } 114 void setTower5Cost(const int& newCost) 115 { this->towerCosts_[4] = newCost; } 116 const int& getTower5Cost() const 117 { return this->towerCosts_[4]; } 118 119 const int getTowerCost(int upgrade) const; 120 71 121 72 122 /** … … 79 129 { return this->tileScale_; } 80 130 81 /**82 @brief Set the template for the towers.83 @param template The template name to be applied to each tower.84 */85 void setTowerTemplate(const std::string& templateName)86 { this->towerTemplate_ = templateName; }87 88 const std::string& getTowerTemplate(void) const89 { return this->towerTemplate_; }90 91 131 private: 92 132 void checkGametype(); 93 133 void trimString(std::string*); 134 std::string selecterTemplate_; 135 std::string towerTemplates_[5]; 136 int towerCosts_[5]; 137 std::string fields_; 94 138 unsigned int width_; 95 139 unsigned int height_; 96 140 unsigned int tileScale_; 97 98 std::string towerTemplate_;99 141 }; 100 142 } -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.cc
r10258 r10586 30 30 //needed to keep track of the PlayerStats coded in TowerDefense.h 31 31 this->td = orxonox_cast<TowerDefense*>(this->getGametype().get()); 32 once_=false; 33 34 } 35 //add credit if enemy is destroyed 36 TowerDefenseEnemy::~TowerDefenseEnemy(){ 37 //this->td->addCredit(1); 32 once_ = false; 38 33 } 39 34 40 void TowerDefenseEnemy::addWaypoint(TDCoordinate* coord)35 TowerDefenseEnemy::~TowerDefenseEnemy() 41 36 { 42 this->Waypointsvector_.push_back(coord);37 orxout() << "TowerDefenseEnemy::~TowerDefenseEnemy" << endl; 43 38 } 44 39 45 46 40 void TowerDefenseEnemy::tick(float dt) 47 { 41 { 42 //orxout() << "TDE tick1" << endl; 48 43 SUPER(TowerDefenseEnemy, tick, dt); 44 //orxout() << "TDE tick2" << endl; 49 45 } 50 46 … … 61 57 void TowerDefenseEnemy::damage(float damage, float healthdamage, float shielddamage, Pawn* originator) 62 58 { 59 orxout() << "TowerDefenseEnemy::damage" << endl; 63 60 Pawn::damage(damage, healthdamage, shielddamage, originator); 64 61 if (getGame() && once_ == false && getHealth() <= 0) … … 68 65 } 69 66 } 70 /*71 void TowerDefenseEnemy::popWaypoint()72 {73 if(Waypointsvector_.size()>0)74 Waypointsvector_.pop_back();75 }76 77 TDCoordinate TowerDefenseEnemy::peekWaypoint()78 {79 if(Waypointsvector_.size()<=0){80 TDCoordinate* coord = TDCoordinate(-1,-1);81 return coord;82 }else{83 return Waypointsvector_.at(Waypointsvector_.size()-1);84 85 }86 87 88 }89 */90 91 67 } -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.h
r10258 r10586 39 39 40 40 virtual void tick(float dt); 41 void addWaypoint(TDCoordinate* coord);42 void popWaypoint();43 TDCoordinate peekWaypoint();44 45 41 virtual void damage(float damage, float healthdamage, float shielddamage, Pawn* originator); 46 47 42 48 43 private: … … 51 46 TowerDefense* td; 52 47 bool once_; 53 std::vector<TDCoordinate*> Waypointsvector_;54 55 48 }; 56 49 -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseTower.cc
r10258 r10586 22 22 Constructor. Registers and initializes the object. 23 23 */ 24 TowerDefenseTower::TowerDefenseTower(Context* context) : Pawn(context)24 TowerDefenseTower::TowerDefenseTower(Context* context) : Turret(context) 25 25 { 26 26 RegisterObject(TowerDefenseTower); 27 28 this->setCollisionType(WorldEntity:: Dynamic);29 upgrade = 0;27 game_ =NULL; 28 this->setCollisionType(WorldEntity::None); 29 upgrade = 1; 30 30 31 31 //this->removeAllEngines(); … … 38 38 } 39 39 40 /* 40 41 void TowerDefenseTower::setOrientation(const Quaternion& orientation) 41 42 { … … 53 54 { 54 55 } 56 */ 55 57 56 58 bool TowerDefenseTower::upgradeTower() 57 59 { 58 if(upgrade < 3)60 if(upgrade < 5) 59 61 { 60 62 upgrade++; 61 63 float reloadrate = getReloadRate(); 62 64 float reloadwaittime = getReloadWaitTime(); 63 this->setDamageMultiplier( 5000);64 65 this->setDamageMultiplier((upgrade+1)*2); 66 //this->setRotationThrust(2*this->getRotationThrust()); 65 67 reloadrate = 0.5f*reloadrate; 66 68 reloadwaittime = 0.5f*reloadwaittime; 67 69 setReloadRate(reloadrate); 68 70 setReloadWaitTime(reloadwaittime); 69 this->addTemplate("towerturret1");71 //this->addTemplate("towerturret1"); 70 72 } 71 73 else -
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseTower.h
r10258 r10586 19 19 20 20 #include "towerdefense/TowerDefensePrereqs.h" 21 #include " worldentities/pawns/SpaceShip.h"21 #include "objects/Turret.h" 22 22 23 23 24 24 namespace orxonox 25 25 { 26 class _TowerDefenseExport TowerDefenseTower : public Pawn26 class _TowerDefenseExport TowerDefenseTower : public Turret 27 27 { 28 28 public: … … 37 37 38 38 // Overriding these to stop TowerDefenseTowers from spasing out 39 void setOrientation(const Quaternion& orientation);40 virtual void rotateYaw(const Vector2& value);41 virtual void rotatePitch(const Vector2& value);42 virtual void rotateRoll(const Vector2& value);39 //void setOrientation(const Quaternion& orientation); 40 //virtual void rotateYaw(const Vector2& value); 41 //virtual void rotatePitch(const Vector2& value); 42 //virtual void rotateRoll(const Vector2& value); 43 43 virtual bool upgradeTower(); 44 44
Note: See TracChangeset
for help on using the changeset viewer.