Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 17, 2015, 3:32:50 PM (9 years ago)
Author:
fvultier
Message:

Different wave types with different enemies. New field type: obstacle. It is impossible to build a tower on a field with an obstacle.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc

    r10589 r10591  
    8787namespace orxonox
    8888{
    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 
    9589    RegisterUnloadableClass(TowerDefense);
    9690
     
    10296        this->player_ = NULL;       
    10397        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;
     98        this->waveNumber_ = 0;
     99        this->timeSinceLastSpawn_ = 0.0;
     100        this->timeUntilNextWave_ = 0.0;
    108101        this->credit_ = 0;
    109102        this->lifes_ = 0;
     103        this->waveSize_ = 0;
     104        offset_ = Vector3(0,0,10);
    110105
    111106        //this->stats_ = new TowerDefensePlayerStats();
    112 
    113         ModifyConsoleCommand(__CC_addTower_name).setObject(this);
    114         ModifyConsoleCommand(__CC_upgradeTower_name).setObject(this);
    115107    }
    116108
    117109    TowerDefense::~TowerDefense()
    118     {        /* Part of a temporary hack to allow the player to add towers */
     110    {
    119111        if (this->isInitialized())
    120112        {
    121             ModifyConsoleCommand(__CC_addTower_name).setObject(NULL);
    122             ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL);
     113
    123114        }
    124115    }
     
    149140
    150141        createFields();
    151 
    152142        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        
    156143
    157144        //set initial credits, lifes and WaveNumber
    158145        this->setCredit(1000);
    159         this->setLifes(100);
     146        this->setLifes(100);       
     147        this->timeSinceLastSpawn_ = 0.0;
     148        this->timeUntilNextWave_ = 5.0;
     149        this->waveSize_ = 0;
    160150        this->setWaveNumber(0);
    161         time = 0.0;
    162151    }
    163152
     
    165154    void TowerDefense::addTowerDefenseEnemy(int templatenr)
    166155    {
    167         orxout() << "addTowerDefenseEnemy" << endl;
    168 
    169156        TowerDefenseEnemy* en1 = new TowerDefenseEnemy(this->center_->getContext());
    170157       
     
    200187        if (controller != NULL && waypoints_.size() > 1)
    201188        {
    202             en1->setPosition(waypoints_.at(0)->getPosition());
     189            en1->setPosition(waypoints_.at(0)->getPosition() + offset_);
    203190            en1->setOrientation(Vector3(0,0,10), Degree(0));
    204191            en1->setDirection(Vector3(0,1,0));
    205             en1->lookAt(waypoints_.at(1)->getPosition());
     192            en1->lookAt(waypoints_.at(1)->getPosition() + offset_);
    206193
    207194            for (unsigned int i = 0; i < waypoints_.size(); ++ i)
    208195            {
    209196                orxonox::WeakPtr<MovableEntity> waypoint = new MovableEntity(this->center_->getContext());
    210                 waypoint->setPosition(waypoints_.at(i)->getPosition());
     197                waypoint->setPosition(waypoints_.at(i)->getPosition() + offset_);
    211198                controller->addWaypoint(waypoint);
    212199            }
     
    229216        assert(player);
    230217        player_ = player;
    231 
    232         orxout() << "spawnPlayer" << endl;
    233218
    234219        if (selecter->getPlayer() == NULL)
     
    287272    void TowerDefense::tick(float dt)
    288273    {
    289         //orxout() << "tick1" << endl;
    290274        SUPER(TowerDefense, tick, dt);
    291         //orxout() << "tick2" << endl;
    292275
    293276        if (hasStarted() == false || player_ == NULL)
     
    295278            return;
    296279        }
    297         time += dt;       
     280        timeUntilNextWave_ -= dt;
     281        timeSinceLastSpawn_ += dt;
    298282
    299283        //build/upgrade tower at selecter position
     
    311295            }           
    312296        }
    313 
    314         if (time >= 1.3 * enemies_.size() && enemies_.size() < 10)
    315         {
    316             //adds different types of enemys depending on the WaveNumber
    317             addTowerDefenseEnemy(this->getWaveNumber() % 3 +1 );
    318         }
    319 
    320         //if ships are at the end they get destroyed
    321 
     297       
    322298        for (std::list<WeakPtr<TowerDefenseEnemy> >::iterator it = enemies_.begin(); it != enemies_.end(); )
    323299        {
     
    326302                // the enemy was destroyed by a tower - remove it from the list
    327303                enemies_.erase(it++);
     304                addCredit(1);
    328305            }
    329306            else
    330307            {
    331                 //destroys enemys at the end of the path and reduces the life by 1. No credits gifted
     308                //if ships are at the end they get destroyed
    332309                Vector3 ship = (*it)->getRVWorldPosition();
    333310                float distance = ship.distance(endpoint_);
    334                 if(distance < 50)
     311                if(distance < 40)
    335312                {
    336                     orxout() << "enemy deleted" << endl;
    337313                    (*it)->destroy();
    338314                    enemies_.erase(it++);
     
    348324                }
    349325            }
    350         }       
    351 
    352         if (enemies_.size() == 0 && !this->nextwaveTimer_.isActive())
    353         {
    354             this->nextwaveTimer_.startTimer();
    355         }
     326        } 
     327
     328        // Add new enemy?
     329        if (timeSinceLastSpawn_ >= 1.0 && waveSize_ > 0)
     330        {
     331            // Add new enemy
     332            timeSinceLastSpawn_ -= 1.0;
     333            -- waveSize_;
     334            addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1);
     335        }
     336        else if (timeUntilNextWave_ <= 0.0 && waveSize_ <= 0)
     337        {
     338            //New wave
     339            ++ waveNumber_;
     340            timeSinceLastSpawn_ = 0.0;
     341
     342            timeUntilNextWave_ = waveNumber_+10;
     343            waveSize_ = waveNumber_+5;
     344        }
     345
    356346    }
    357347
     
    361351        TDCoordinate coord(0,0);
    362352        TDCoordinate startCoord(0,0);
    363 
    364353        std::string fields = center_->getFields();
    365354        int pos = 0;
     
    372361                fields_[i][j]->setCenterpoint(center_);
    373362                center_->attach(fields_[i][j]);
    374                 fields_[i][j]->setPosition(coord.get3dcoordinate());                
    375                 fields_[i][j]->create(fields.at(pos), fields.at(pos+1));           
     363                fields_[i][j]->setPosition(coord.get3dcoordinate());
     364                fields_[i][j]->create(fields.at(pos), fields.at(pos+1));
    376365                pos += 2;
    377366                if (fields_[i][j]->getType() == START)
     
    382371            }
    383372        }
    384 
    385373        //Place waypoints along the street for the waypoint controllers of the enemies
    386374        TDCoordinate* thisCoord = &startCoord;
     
    429417        return NULL;
    430418    }
    431 
    432     /*
    433     void TowerDefense::playerEntered(PlayerInfo* player)
    434     {
    435         TeamDeathmatch::playerEntered(player);
    436 
    437         const std::string& message = player->getName() + " entered the game";
    438         ChatManager::message(message);
    439     }
    440 
    441     bool TowerDefense::playerLeft(PlayerInfo* player)
    442     {
    443         bool valid_player = TeamDeathmatch::playerLeft(player);
    444 
    445         if (valid_player)
    446         {
    447             const std::string& message = player->getName() + " left the game";
    448             ChatManager::message(message);
    449         }
    450 
    451         return valid_player;
    452     }
    453 
    454 
    455     void TowerDefense::pawnKilled(Pawn* victim, Pawn* killer)
    456     {
    457         if (victim && victim->getPlayer())
    458         {
    459             std::string message;
    460             if (killer)
    461             {
    462                 if (killer->getPlayer())
    463                     message = victim->getPlayer()->getName() + " was killed by " + killer->getPlayer()->getName();
    464                 else
    465                     message = victim->getPlayer()->getName() + " was killed";
    466             }
    467             else
    468                 message = victim->getPlayer()->getName() + " died";
    469 
    470             ChatManager::message(message);
    471         }
    472 
    473         TeamDeathmatch::pawnKilled(victim, killer);
    474     }
    475 
    476     void TowerDefense::playerScored(PlayerInfo* player, int score)
    477     {
    478         Gametype::playerScored(player, score);
    479     }*/
    480419}
Note: See TracChangeset for help on using the changeset viewer.