Changeset 12190 for code/trunk/src/modules/towerdefense/TowerDefense.cc
- Timestamp:
- Feb 21, 2019, 3:02:00 PM (6 years ago)
- Location:
- code/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk
- Property svn:mergeinfo changed
/code/branches/TowerDefense_HS18 (added) merged: 12025,12038,12125-12126,12137,12153,12165
- Property svn:mergeinfo changed
-
code/trunk/src/modules/towerdefense/TowerDefense.cc
r11716 r12190 76 76 #include "TowerDefenseCenterpoint.h" 77 77 #include "worldentities/SpawnPoint.h" 78 #include "controllers/WaypointController.h" 78 #include "worldentities/StaticEntity.h" 79 #include "TowerDefenseController.h" //muss ich noch in den richtigen Ordner verschieben 79 80 #include "graphics/Model.h" 80 81 #include "infos/PlayerInfo.h" … … 82 83 #include "core/CoreIncludes.h" 83 84 #include "Highscore.h" 85 #include "util/Output.h" 86 #include "TowerDefenseRangeViewer.h" 87 84 88 85 89 namespace orxonox … … 92 96 93 97 selecter = nullptr; 98 rangeViewer = nullptr; 94 99 this->player_ = nullptr; 95 100 this->setHUDTemplate("TowerDefenseHUD"); … … 124 129 selecter = new TowerDefenseSelecter(this->center_->getContext()); 125 130 } 131 if(rangeViewer == nullptr){ 132 rangeViewer = new TowerDefenseRangeViewer(this->center_->getContext()); 133 } 126 134 selecter->addTemplate(center_->getSelecterTemplate()); 135 rangeViewer->addTemplate("therangeviewer"); 136 rangeViewer->setPosition(-10000,0,-500); 127 137 center_->attach(selecter); 138 center_->attach(rangeViewer); 128 139 } 129 140 else // If no centerpoint was specified, an error is thrown and the level is exited. … … 136 147 137 148 createFields(); 149 138 150 TeamDeathmatch::start(); 139 151 … … 157 169 en1->addTemplate("enemytowerdefense1"); 158 170 en1->setScale(3); 159 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 171 en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.5*(en1->getHealth())); 172 en1->setShieldHealth(en1->getShieldHealth() + this->getWaveNumber()*1/3*0.5*(en1->getShieldHealth())); 160 173 break; 161 174 … … 163 176 en1->addTemplate("enemytowerdefense2"); 164 177 en1->setScale(2); 165 en1->setHealth(en1->getHealth() + this->getWaveNumber()* 4);178 en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.3*(en1->getHealth())); 166 179 break; 167 180 … … 169 182 en1->addTemplate("enemytowerdefense3"); 170 183 en1->setScale(1); 171 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 184 en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.2*(en1->getHealth())); 185 en1->setShieldHealth(en1->getShieldHealth() + this->getWaveNumber()*1/3*0.5*(en1->getShieldHealth())); 172 186 break; 173 187 } … … 175 189 en1->setTeam(2); 176 190 177 WaypointController* controller = (WaypointController*)(en1->getXMLController()); 178 179 if (controller != nullptr && waypoints_.size() > 1) 191 //Jedem Enemy wird ein eigener Controller uebergeben 192 TowerDefenseController* controller = new TowerDefenseController(this->center_->getContext()); 193 controller->setControllableEntity(en1); 194 en1->setController(controller); 195 196 if (waypoints_.size() > 1) 180 197 { 181 198 en1->setPosition(waypoints_.at(0)->getPosition() + offset_); … … 192 209 } 193 210 194 enemies_.push_back(en1); 211 auto pair = std::make_pair(orxonox::WeakPtr<TowerDefenseEnemy>(en1), controller); 212 enemies_.push_back(pair); 195 213 } 196 214 … … 277 295 timeSinceLastSpawn_ += dt; 278 296 297 if(selecter != nullptr && getField(selecter->selectedPos_)->canUpgrade() == true ){ 298 rangeViewer->setPosition(((selecter->selectedPos_->GetX())-8)*100, ((selecter->selectedPos_->GetY())-8)*100, 200); 299 } else { 300 rangeViewer->setPosition(-10000,0,-500); 301 } 302 279 303 //build/upgrade tower at selecter position 280 304 if (selecter != nullptr && selecter->buildTower_ == true) … … 291 315 } 292 316 } 317 293 318 294 for (std::list<WeakPtr<TowerDefenseEnemy>>::iterator it = enemies_.begin(); it != enemies_.end(); ) 295 { 296 if (*it == nullptr) 297 { 298 // the enemy was destroyed by a tower - remove it from the list 299 enemies_.erase(it++); 300 addCredit(1); 319 for (EnemyList::iterator it = enemies_.begin(); it != enemies_.end(); ) 320 { 321 WeakPtr<TowerDefenseEnemy> enemy = it->first; 322 TowerDefenseController* ctrl = it->second; 323 324 if (enemy == nullptr) 325 { 326 327 // the enemy was destroyed by a tower - remove it from the list AND destroy the corresponding controler 328 ctrl->destroy(); 329 it = enemies_.erase(it); 330 331 int currentType = this->getWaveNumber() % 3 + 1; 332 switch (currentType){ //Entscheidet, wie viele Credits vergeben werden sollen 333 case 1: //currently boss wave 334 addCredit(100); 335 if (this->getLifes() <= 90) 336 { 337 this->setLifes(this->getLifes() + 10); 338 } 339 break; 340 341 case 2: //currently mass wave 342 addCredit(5); 343 break; 344 345 case 3: //currently moderate wave 346 addCredit(10); 347 break; 348 } 301 349 } 302 350 else 303 351 { 304 352 //if ships are at the end they get destroyed 305 Vector3 ship = (*it)->getRVWorldPosition();353 Vector3 ship = enemy->getRVWorldPosition(); 306 354 float distance = ship.distance(endpoint_); 307 355 if(distance < 40) 308 356 { 309 (*it)->destroy(); 310 enemies_.erase(it++); 357 enemy->getController()->destroy(); 358 enemy->destroy(); 359 360 it = enemies_.erase(it); 311 361 this->reduceLifes(1); 312 362 if (this->getLifes() == 0) … … 328 378 timeSinceLastSpawn_ -= 1.0; 329 379 -- waveSize_; 330 addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1); 380 addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1); //Gegnertyp rotiert durch die 3 moeglichen, er beginnt bei Typ 2!!! 331 381 } 332 382 else if (timeUntilNextWave_ <= 0.0 && waveSize_ <= 0) 333 383 { 384 int currentType = this->getWaveNumber() % 3 + 1; 334 385 //New wave 335 386 ++ waveNumber_; … … 337 388 338 389 timeUntilNextWave_ = waveNumber_+20.0f; 339 waveSize_ = waveNumber_+5; 390 // Entscheidung, wie gross die einzelnen waves sein sollen. 391 switch (currentType){ 392 case 1: //currently boss wave 393 waveSize_ = waveNumber_+10; 394 break; 395 396 case 2: //currently mass wave 397 waveSize_ = (waveNumber_+10)/2; 398 break; 399 400 case 3: //currently moderate wave 401 waveSize_ = 1; 402 break; 403 } 340 404 } 341 405 … … 349 413 std::string fields = center_->getFields(); 350 414 int pos = 0; 351 for (int j = 15; j >= 0; --j) 352 { 353 for (int i = 0; i < 16; ++i)415 for (int j = 15; j >= 0; --j) //Vertical number of rows 416 { 417 for (int i = 0; i <= 15; ++i) //Horizontal number of rows 354 418 { 355 419 coord.Set(i,j); … … 412 476 } 413 477 478 //Falls kein anliegender Weg gefunden wurde. 414 479 delete nextCoord; 415 480 return nullptr;
Note: See TracChangeset
for help on using the changeset viewer.