Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2012merge/src/orxonox/gametypes/Dynamicmatch.cc @ 9340

Last change on this file since 9340 was 9340, checked in by jo, 12 years ago

On the way of repairing a bug that was caused by manual refactoring of gametype's playerScored function.

  • Property svn:eol-style set to native
File size: 29.9 KB
RevLine 
[6586]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Johannes Ritz
24 *   Co-authors:
25 *      ...
26 *
27 */
[6921]28//TODO:
[6812]29//pig punkte vergeben pro Zeit!
30//killerfarbe schwarz; evtl. eigenes Raumfahrzeug;
31//Low; Codeoptimierung und Dokumentation
[6586]32
[9286]33/**
34@brief
35    Short Gaming Manual:
36    There are three different parties a player can belong to: victim, chaser or killer
37    Every player starts as chaser. As long as there are not enough victims and killers, you can change your and other player's parties by shooting them.
38    In order to win you have to earn as much points as possible:
39    - as victim by escaping the chasers
40    - as chaser by shooting the victim
41    - as killer by killing the chasers
[6812]42
43
[9286]44    What you shouldn't do is shooting at players of your own party. By doing so your score will decrease.
45    P.S: If you don't want to be a victim: Get rid of your part by shooting a chaser.
[6812]46*/
[6586]47#include "Dynamicmatch.h"
48
[6686]49#include "util/Convert.h"
[6586]50#include "core/CoreIncludes.h"
[8729]51#include "core/command/Executor.h"
[8858]52#include "chat/ChatManager.h"
[6586]53#include "infos/PlayerInfo.h"
54#include "worldentities/pawns/Pawn.h"
[6697]55#include "worldentities/pawns/SpaceShip.h"
[6686]56#include "core/ConfigValueIncludes.h"
57#include "interfaces/TeamColourable.h"
[6697]58#include "items/Engine.h"
59#include "tools/Timer.h"
[6848]60#include "worldentities/TeamSpawnPoint.h"
[6697]61
[6586]62namespace orxonox
63{
64    CreateUnloadableFactory(Dynamicmatch);
65
66    Dynamicmatch::Dynamicmatch(BaseObject* creator) : Gametype(creator)
67    {
68        RegisterObject(Dynamicmatch);
[6812]69        this->gameTime_ = 180;
70        this->setConfigValues();
[6686]71        this->chaser=0;
[6812]72        this->piggy=1;
73        this->killer=2;
74        this->notEnoughPigs=false;
75        this->notEnoughKillers=false;
76        this->notEnoughChasers=false;
77        this->gameEnded_ =false;
78        this->timesequence_ = static_cast<int>(this->gameTime_);
79        this->friendlyfire=true;
80        this->numberOf[chaser]=0;
81        this->numberOf[piggy]=0;
82        this->numberOf[killer]=0;
83        this->tutorial=true;
[9338]84        this->pointsPerTime=1.0f;
[6921]85        this->setHUDTemplate("DynamicmatchHUD");
[6586]86    }
87
[6697]88    void Dynamicmatch::setConfigValues()
89    {
[6812]90        SetConfigValue(gameTime_, 180);
91        SetConfigValue(friendlyfire, true);
92        SetConfigValue(tutorial, true);
93        static ColourValue colours[] =
[6697]94        {
[7076]95            ColourValue(1.0f, 0.3f, 0.3f),  //chasercolour
96            ColourValue(0.3f, 0.3f, 1.0f),  //piggycolour
97            ColourValue(0.3f, 1.0f, 0.3f)   //killercolour  what about black: 0.0f, 0.0f, 0.0f
[6697]98        };
99        static std::vector<ColourValue> defaultcolours(colours, colours + sizeof(colours) / sizeof(ColourValue));
100
101        SetConfigValue(partyColours_, defaultcolours);
102    }
103
[6848]104    bool Dynamicmatch::allowPawnDamage(Pawn* victim, Pawn* originator)
[7162]105    {
106        //TODO: static and fading message for the "human" player's
[6812]107        if (!originator||!victim)
[6921]108            return false;
[6959]109        if (!originator->getPlayer()||!victim->getPlayer())
[6921]110            return false;
[6812]111        if (victim && victim->getPlayer()) //&& originator && originator->getPlayer() ??
112        {
[9286]113            int target = playerParty_[victim->getPlayer()];
114            int source = playerParty_[originator->getPlayer()];
[6812]115
116            //Case: Not Enough Pigs: party change (= party management)
117            if (notEnoughPigs)
[6686]118            {
[7076]119                numberOf[target]--; //decrease numberof victims's party
120                playerParty_[victim->getPlayer()]=piggy; //victim's new party: pig
121                setPlayerColour(victim->getPlayer()); //victim's new colour
122                numberOf[piggy]++; //party switch: number of players is not affected (decrease and increase)
[7062]123
[7076]124                    if(tutorial) //announce party switch
[6921]125                    {
126                         std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
127                         if (it2 != this->players_.end())
128                         {
[7062]129                              this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it2->first->getClientID(), partyColours_[chaser]);
[6987]130                              this->gtinfo_->sendFadingMessage("You're now a victim.",it2->first->getClientID());
[6921]131                         }
132                    }
[7076]133                    if (notEnoughKillers) //reward the originator
[6686]134                    {
[7076]135                        numberOf[source]--; //decrease numberof originator's party
136                        playerParty_[originator->getPlayer()]=killer; //originator's new party: killer
137                        setPlayerColour(originator->getPlayer()); //originator's new colour
[6812]138                        numberOf[killer]++;
[7063]139
[7076]140                        if(tutorial) //announce party switch
[6921]141                        {
142                             std::map<PlayerInfo*, Player>::iterator it3 = this->players_.find(originator->getPlayer());
143                             if (it3 != this->players_.end())
144                             {
[7062]145                                  this->gtinfo_->sendStaticMessage("Take the chasers down.",it3->first->getClientID(), partyColours_[chaser]);
[6987]146                                  this->gtinfo_->sendFadingMessage("You're now a killer.",it3->first->getClientID());
[6921]147                             }
148                        }
[6686]149                    }
[7076]150                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
151
[6812]152                //Give new pig boost
[9279]153                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
[8727]154                this->grantPigBoost(spaceship);
[6686]155            }
[6586]156
[6812]157            //Case: notEnoughKillers: party change
158            else if (notEnoughKillers)
159            {
[7076]160                numberOf[source]--; //decrease numberof originator's party
161                playerParty_[originator->getPlayer()]=killer; //originator's new party: killer
162                setPlayerColour(originator->getPlayer()); //originator colour
163                numberOf[killer]++; //party switch: number of players is not affected (decrease and increase)
[7062]164
[7063]165
[7076]166                if(tutorial) //announce party switch
[6921]167                {
168                     std::map<PlayerInfo*, Player>::iterator it3 = this->players_.find(originator->getPlayer());
169                     if (it3 != this->players_.end())
170                     {
[7062]171                          this->gtinfo_->sendStaticMessage("Take the chasers down.",it3->first->getClientID(),partyColours_[chaser]);
[6987]172                          this->gtinfo_->sendFadingMessage("You're now a killer.",it3->first->getClientID());
[6921]173                     }
174                }
[7076]175                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
[6812]176            }
177            //Case: notEnoughChasers: party change
178            else if (notEnoughChasers)
179            {
[7076]180                numberOf[target]--; //decrease numberof victims's party
181                playerParty_[victim->getPlayer()]=chaser; //victim's new party: chaser
182                setPlayerColour(victim->getPlayer()); //victim colour
183                numberOf[chaser]++; //party switch: number of players is not affected (decrease and increase)
[7062]184
[7076]185                if(tutorial) //announce party switch
[6921]186                {
187                     std::map<PlayerInfo*, Player>::iterator it3 = this->players_.find(originator->getPlayer());
188                     if (it3 != this->players_.end())
189                     {
190                          if (numberOf[killer]>0)
[7062]191                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it3->first->getClientID(),partyColours_[piggy]);
[7076]192
[6921]193                          else
[7062]194                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it3->first->getClientID(),partyColours_[piggy]);
[6987]195                          this->gtinfo_->sendFadingMessage("You're now a chaser.",it3->first->getClientID());
[6921]196                     }
197                }
[7076]198                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
[6812]199            }
[6586]200
[6812]201            //Case: chaser vs. killer
202            else if ((source == killer && target == chaser)||(target == killer && source == chaser ))
203            {
204                return true;
205            }
[6586]206
[6812]207            //Case: a chaser hits piggy
208            else if ((source==chaser)&&(target==piggy))
209            {
210                std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
211                if (it != this->players_.end())
[6686]212                    {
213                        it->second.frags_++;
214                    }
[6812]215            }
216            //Case: piggy hits chaser
217            else if (source==piggy&&target==chaser)
218            {
219                //partyswitch: victim bcomes piggy and the originator(piggy) becomes chaser
220                playerParty_[victim->getPlayer()]=piggy;
221                playerParty_[originator->getPlayer()]=chaser;
[6697]222
[7076]223                //party switch -> colour switch
[6812]224                setPlayerColour(victim->getPlayer()); //victim colour
225                setPlayerColour(originator->getPlayer());//originator colour
[7076]226
[6921]227                //Announce pary switch
228                if(tutorial)
229                {
230                     std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
231                     if (it != this->players_.end())
[7076]232                     {
[6921]233                          if (numberOf[killer]>0)
[7062]234                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(), partyColours_[piggy]);
[6921]235                          else
[7062]236                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
[6987]237                          this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
[6921]238                     }
239                     std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
240                     if (it2 != this->players_.end())
241                     {
[7062]242                          this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it2->first->getClientID(),partyColours_[chaser]);
[6987]243                          this->gtinfo_->sendFadingMessage("You're now a victim.",it2->first->getClientID());
[6921]244                     }
245                }
[6812]246                //Give new pig boost
[9279]247                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
[8727]248                this->grantPigBoost(spaceship);
[6812]249            }
[6848]250            // killer vs piggy
[7076]251            else if (source==killer &&target==piggy) //party and colour switch
[6812]252            {
253            playerParty_[victim->getPlayer()]=killer;
254            playerParty_[originator->getPlayer()]=piggy;
[6697]255
[7076]256            setPlayerColour(victim->getPlayer()); //victim colour
257            setPlayerColour(originator->getPlayer()); //originator colour
[7062]258
[6921]259            if(tutorial) //Announce pary switch
260            {
261                 std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
262                 if (it != this->players_.end())
263                 {
[7062]264                      this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
[6987]265                      this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
[6921]266                 }
267                 std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
268                 if (it2 != this->players_.end())
269                 {
[7062]270                      this->gtinfo_->sendStaticMessage("Take the chasers down.",it2->first->getClientID(),partyColours_[chaser]);
[6987]271                      this->gtinfo_->sendFadingMessage("You're now a killer.",it2->first->getClientID());
[6921]272                 }
273                }
[6812]274            }
275            //Case: friendly fire
276            else if (friendlyfire && (source == target))
277            {
[9339]278                    this->playerScored(originator->getPlayer(), -1);
[6812]279            }
[9339]280        }
[6812]281        return false; //default: no damage
[6686]282    }
[6586]283
[6686]284
285
[6812]286    bool Dynamicmatch::allowPawnDeath(Pawn* victim, Pawn* originator)
[7076]287    {
[6812]288        //killers can kill chasers and killers can be killed by chasers
289        if ((playerParty_[originator->getPlayer()] == killer && playerParty_[victim->getPlayer()] == chaser)||(playerParty_[victim->getPlayer()] == killer &&
290        playerParty_[originator->getPlayer()] == chaser ))
291        {
[7076]292            if (playerParty_[originator->getPlayer()] == killer) //reward the killer
[6812]293            {
[9339]294                    this->playerScored(originator->getPlayer(), 25);
[6812]295            }
[9339]296            return true;
[6812]297        }
298        else return false;
[6586]299    }
[7076]300
[8727]301    /**
302    @brief
[9286]303        Grant the victim a boost.
[8727]304    @param spaceship
305        The SpaceShip to give the boost.
306    */
307    void Dynamicmatch::grantPigBoost(SpaceShip* spaceship)
[8706]308    {
[9286]309        // Give victim boost
[8706]310        if (spaceship)
311        {
[9340]312            WeakPtr<SpaceShip>* ptr = new WeakPtr<SpaceShip>(spaceship);
313            if(ptr == NULL)
314                return;
[8727]315            spaceship->addSpeedFactor(5);
[8706]316            ExecutorPtr executor = createExecutor(createFunctor(&Dynamicmatch::resetSpeedFactor, this));
317            executor->setDefaultValue(0, ptr);
318            new Timer(10, false, executor, true);
319        }
320    }
321
[6812]322    void Dynamicmatch::playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn) //set party + colouring
[6586]323    {
[6686]324        if (!player)
325            return;
[7076]326
327        Dynamicmatch::setPlayerColour(player); //Set playercolour
[6812]328        evaluatePlayerParties();
[6686]329    }
330
[6692]331    void Dynamicmatch::playerEntered(PlayerInfo* player) //standardfunction
[6686]332    {
[6812]333        if (!player)// only for safety
[6686]334            return;
[7076]335        playerParty_[player]=chaser; //Set playerparty
[6848]336        numberOf[chaser]++;
[6586]337        Gametype::playerEntered(player);
[9339]338        orxout() << "# Players(2) : " << this->getNumberOfPlayers() <<endl;
339        orxout() << "# Players(3): " << this->getPlayerCount() <<endl;
[8858]340        const std::string& message = player->getName() + " entered the game";
341        ChatManager::message(message);
[6586]342    }
343
[6686]344    bool Dynamicmatch::playerLeft(PlayerInfo* player) //standardfunction
[6586]345    {
346        bool valid_player = Gametype::playerLeft(player);
347        if (valid_player)
348        {
[6812]349            switch (playerParty_[player])
350            {
351            case 0: numberOf[chaser]--; break;
352            case 1: numberOf[piggy]--; break;
353            case 2: numberOf[killer]--; break;
354            }
[6586]355            const std::string& message = player->getName() + " left the game";
[8858]356            ChatManager::message(message);
[7076]357            //remove player from map
[6812]358            playerParty_.erase (player);
[9339]359            orxout() << "# Players(2) : " << this->getNumberOfPlayers() <<endl;
360            orxout() << "# Players(3): " << this->getPlayerCount() <<endl;
[7076]361            //adjust player parties
[6812]362            evaluatePlayerParties();
[6586]363        }
364
365        return valid_player;
366    }
367
368
[6812]369    void Dynamicmatch::tick(float dt)
[6586]370    {
[6848]371        SUPER(Dynamicmatch, tick, dt);
[6686]372
373        if (this->hasStarted() && !gameEnded_)
[9286]374        {
375            pointsPerTime = pointsPerTime + dt; //increase points
376            gameTime_ = gameTime_ - dt; // decrease game time
377            if (pointsPerTime > 2.0f) //hard coded points for victim! should be changed
[6812]378            {
[9286]379                pointsPerTime = 0.0f;
[6921]380                rewardPig();
[6812]381            }
[6686]382            if (gameTime_<= 0)
[6586]383            {
[6686]384                this->gameEnded_ = true;
[7076]385                this->end();
[6586]386            }
[7076]387            if ( gameTime_ <= timesequence_ && gameTime_ > 0)
[6686]388            {
389                const std::string& message = multi_cast<std::string>(timesequence_) + " seconds left!";
[6586]390
[6686]391                this->gtinfo_->sendAnnounceMessage(message);
[6586]392
[6686]393                if (timesequence_ >= 30 && timesequence_ <= 60)
394                {
395                    timesequence_ = timesequence_ - 10;
396                }
397                else if (timesequence_ <= 30)
398                {
399                    timesequence_ = timesequence_ - 5;
400                }
401                else
402                {
403                    timesequence_ = timesequence_ - 30;
404                }
405            }
[7076]406        }
[6586]407    }
[6812]408
[9286]409/**
410    @brief The reward function is called every 2 seconds via the tick function and makes the victim score points.
411*/
[6812]412    void Dynamicmatch::rewardPig()
413    {
[6921]414        for (std::map< PlayerInfo*, int >::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it) //durch alle Spieler iterieren und alle piggys finden
415        {
[9339]416            if (it->second==piggy)//Spieler mit der Pig-party frags++
[6921]417            {
[9339]418                 this->playerScored(it->first);
[6921]419            }
420        }
[6812]421    }
[7062]422    void Dynamicmatch::setPlayerColour(PlayerInfo* player) // sets a player's colour
[6812]423    {
424        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
[9279]425        Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
[6812]426            if (pawn)
427            {
[6921]428                pawn->setRadarObjectColour(this->partyColours_[it_player->second]);
[6812]429
430                std::set<WorldEntity*> pawnAttachments = pawn->getAttachedObjects();
431                for (std::set<WorldEntity*>::iterator it = pawnAttachments.begin(); it != pawnAttachments.end(); ++it)
432                {
433                    if ((*it)->isA(Class(TeamColourable)))
434                    {
435                        TeamColourable* tc = orxonox_cast<TeamColourable*>(*it);
436                        tc->setTeamColour(this->partyColours_[it_player->second]);
437                    }
438                }
439            }
[7076]440    }
[6812]441
442    void Dynamicmatch::evaluatePlayerParties() //manages the notEnough booleans (here the percentage of special players is implemented)
443    {
444        //pigs: 1 + every 6th player is a pig
[9338]445        if ( (1 + getPlayerCount()/6) > numberOf[piggy])
[6921]446        {
447            notEnoughPigs=true;
448            if (tutorial) // Announce selectionphase
449            {
450             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
451                {
452                    if (!it->first)//in order to catch nullpointer
453                        continue;
[8327]454                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]455                        continue;
[7062]456                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
[6921]457                }
458            }
459        }
460        else
461        {
462             notEnoughPigs=false;
463             if(tutorial&&(!notEnoughKillers)&&(!notEnoughChasers)) //Selection phase over
464             {
465                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
466                  {
467                       if (!it->first)//in order to catch nullpointer
468                           continue;
[8327]469                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]470                           continue;
471                       else if (it->second==chaser)
472                       {
473                           if (numberOf[killer]>0)
[7062]474                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
[6921]475                           else
[7062]476                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
[6987]477                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
[6921]478                       }
479                       else if (it->second==piggy)
[6987]480                       {
[7062]481                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
[6987]482                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
483                       }
[6921]484                       else if (it->second==killer)
[6987]485                       {
[7062]486                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
[6987]487                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
488                       }
[6921]489                  }
[7076]490
[6921]491             }
492        }
[6812]493        //killers: every 4th player is a killer
[9340]494        if ( static_cast<unsigned int>(getPlayerCount()/4) > numberOf[killer])
[6921]495        {
496            notEnoughKillers=true;
497            if (tutorial) // Announce selectionphase
498            {
499             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
500                {
501                    if (!it->first)//in order to catch nullpointer
502                        continue;
[8327]503                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]504                        continue;
[7062]505                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
[6921]506                }
507            }
508        }
509        else
510        {
511            notEnoughKillers=false;
512            if(tutorial&&(!notEnoughPigs)&&(!notEnoughChasers)) //Selection phase over
513             {
514                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
515                  {
516                       if (!it->first)
517                           continue;
[8327]518                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]519                           continue;
520                       else if (it->second==chaser)
521                       {
522                           if (numberOf[killer]>0)
[7062]523                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
[6921]524                           else
[7062]525                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
[6987]526                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
[6921]527                       }
528                       else if (it->second==piggy)
[6987]529                       {
[7062]530                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[piggy]);
[6987]531                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
532                       }
[6921]533                       else if (it->second==killer)
[6987]534                       {
[7062]535                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[piggy]);
[6987]536                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
537                       }
[6921]538                  }
[7076]539
[6921]540             }
[7076]541
[6921]542        }
[6812]543        //chasers: there are more chasers than killers + pigs
[6921]544        if (numberOf[piggy]+numberOf[killer] > numberOf[chaser])
545        {
546            notEnoughChasers=true;
547            if (tutorial) // Announce selectionphase
548            {
549             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
550                {
551                    if (!it->first)//in order to catch nullpointer
552                        continue;
[8327]553                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]554                        continue;
[7062]555                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
[6921]556                }
557            }
558        }
559        else
560        {
561             notEnoughChasers=false;
562             if(tutorial&&(!notEnoughPigs)&&(!notEnoughKillers)) //Selection phase over
563             {
564                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
565                  {
566                       if (!it->first)
567                           continue;
[8327]568                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]569                           continue;
570                       else if (it->second==chaser)
571                       {
572                           if (numberOf[killer]>0)
[7062]573                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
[6921]574                           else
[7062]575                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
[6987]576                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
[6921]577                       }
578                       else if (it->second==piggy)
[6987]579                       {
[7062]580                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
[6987]581                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
582                       }
[6921]583                       else if (it->second==killer)
[6987]584                       {
[7062]585                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
[6987]586                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
587                       }
[6921]588                  }
[7076]589
[6921]590             }
[7076]591        }
[6812]592    }
593
594    int Dynamicmatch::getParty(PlayerInfo* player) // helper function for ArtificialController
595    {
596        return this->playerParty_[player];
597    }
598
[8706]599    void Dynamicmatch::resetSpeedFactor(WeakPtr<SpaceShip>* ptr)// helper function
[6812]600    {
601        if (*ptr)
602        {
[8727]603            (*ptr)->addSpeedFactor(1.0f/5.0f);
[6812]604        }
605        delete ptr;
606    }
607
608    bool Dynamicmatch::playerChangedName(PlayerInfo* player) //standardfunction
609    {
610        bool valid_player = Gametype::playerChangedName(player);
611        if (valid_player)
612        {
613            const std::string& message = player->getOldName() + " changed name to " + player->getName();
[8858]614            ChatManager::message(message);
[6812]615        }
616
617        return valid_player;
618    }
619
[7076]620    void Dynamicmatch::start()
621    {
[6812]622        Gametype::start();
623        if(!tutorial)
624        {
[6921]625            std::string message("Dynamicmatch started!");
[8858]626            ChatManager::message(message);
[6812]627        }
[6921]628        else if(tutorial) // Announce selectionphase
[6812]629        {
[6921]630            for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
631            {
[8327]632                if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
[6921]633                    continue;
[7062]634                this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
[6921]635            }
[6812]636        }
[7076]637    }
[6812]638
[6921]639    /*void Dynamicmatch::instructions()
[6812]640    {
641        std::string message("Earn points:\n\n\n\tIf you're red: Chase the blue player!\n\n\tIf you're blue shoot at a red player or hide.\n\n\tIf you're green: You've got the licence to kill red players!");
[8858]642        ChatManager::message(message);
[6812]643        callInstructions_.setTimer(10, false, createExecutor(createFunctor(&Dynamicmatch::furtherInstructions, this)));
644    }
645
646    void Dynamicmatch::furtherInstructions()
647    {
648        std::string message("After 3 Minutes the game is over.");
[8858]649        ChatManager::message(message);
[6921]650    }*/
[6812]651    void Dynamicmatch::end()
652    {
653        Gametype::end();
654
655        std::string message("Time out. Press F2 to see the points you scored.");
[8858]656        ChatManager::message(message);
[6812]657    }
[6848]658    SpawnPoint* Dynamicmatch::getBestSpawnPoint(PlayerInfo* player) const
659    {
660        int desiredTeamNr = -1;
661        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
662        if (it_player != this->playerParty_.end())
663            desiredTeamNr = it_player->second;
[6812]664
[6848]665        // Only use spawnpoints of the own team (or non-team-spawnpoints)
666        std::set<SpawnPoint*> teamSpawnPoints = this->spawnpoints_;
667        for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
668        {
669            if ((*it)->isA(Class(TeamSpawnPoint)))
670            {
671                TeamSpawnPoint* tsp = orxonox_cast<TeamSpawnPoint*>(*it);
672                if (tsp && static_cast<int>(tsp->getTeamNumber()) != desiredTeamNr)//getTeamNumber!!
673                {
674                    teamSpawnPoints.erase(it++);
675                    continue;
676                }
677            }
678
679            ++it;
680        }
681
682        if (teamSpawnPoints.size() > 0)
683        {
684            unsigned int randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
685            unsigned int index = 0;
686            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
687            {
688                if (index == randomspawn)
689                    return (*it);
690
691                ++index;
692            }
693        }
694
695        return 0;
696    }
697
[6586]698}
Note: See TracBrowser for help on using the repository browser.