Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Corrected getNumberOfPlayers().

  • Property svn:eol-style set to native
File size: 29.6 KB
Line 
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 */
28//TODO:
29//pig punkte vergeben pro Zeit!
30//killerfarbe schwarz; evtl. eigenes Raumfahrzeug;
31//Low; Codeoptimierung und Dokumentation
32
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
42
43
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.
46*/
47#include "Dynamicmatch.h"
48
49#include "util/Convert.h"
50#include "core/CoreIncludes.h"
51#include "core/command/Executor.h"
52#include "chat/ChatManager.h"
53#include "infos/PlayerInfo.h"
54#include "worldentities/pawns/Pawn.h"
55#include "worldentities/pawns/SpaceShip.h"
56#include "core/ConfigValueIncludes.h"
57#include "interfaces/TeamColourable.h"
58#include "items/Engine.h"
59#include "tools/Timer.h"
60#include "worldentities/TeamSpawnPoint.h"
61
62namespace orxonox
63{
64    CreateUnloadableFactory(Dynamicmatch);
65
66    Dynamicmatch::Dynamicmatch(BaseObject* creator) : Gametype(creator)
67    {
68        RegisterObject(Dynamicmatch);
69        this->gameTime_ = 180;
70        this->setConfigValues();
71        this->chaser=0;
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;
84        this->pointsPerTime=1.0f;
85        this->setHUDTemplate("DynamicmatchHUD");
86    }
87
88    void Dynamicmatch::setConfigValues()
89    {
90        SetConfigValue(gameTime_, 180);
91        SetConfigValue(friendlyfire, true);
92        SetConfigValue(tutorial, true);
93        static ColourValue colours[] =
94        {
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
98        };
99        static std::vector<ColourValue> defaultcolours(colours, colours + sizeof(colours) / sizeof(ColourValue));
100
101        SetConfigValue(partyColours_, defaultcolours);
102    }
103
104    bool Dynamicmatch::allowPawnDamage(Pawn* victim, Pawn* originator)
105    {
106        //TODO: static and fading message for the "human" player's
107        if (!originator||!victim)
108            return false;
109        if (!originator->getPlayer()||!victim->getPlayer())
110            return false;
111        if (victim && victim->getPlayer()) //&& originator && originator->getPlayer() ??
112        {
113            int target = playerParty_[victim->getPlayer()];
114            int source = playerParty_[originator->getPlayer()];
115
116            //Case: Not Enough Pigs: party change (= party management)
117            if (notEnoughPigs)
118            {
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)
123
124                    if(tutorial) //announce party switch
125                    {
126                         std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
127                         if (it2 != this->players_.end())
128                         {
129                              this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it2->first->getClientID(), partyColours_[chaser]);
130                              this->gtinfo_->sendFadingMessage("You're now a victim.",it2->first->getClientID());
131                         }
132                    }
133                    if (notEnoughKillers) //reward the originator
134                    {
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
138                        numberOf[killer]++;
139
140                        if(tutorial) //announce party switch
141                        {
142                             std::map<PlayerInfo*, Player>::iterator it3 = this->players_.find(originator->getPlayer());
143                             if (it3 != this->players_.end())
144                             {
145                                  this->gtinfo_->sendStaticMessage("Take the chasers down.",it3->first->getClientID(), partyColours_[chaser]);
146                                  this->gtinfo_->sendFadingMessage("You're now a killer.",it3->first->getClientID());
147                             }
148                        }
149                    }
150                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
151
152                //Give new pig boost
153                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
154                this->grantPigBoost(spaceship);
155            }
156
157            //Case: notEnoughKillers: party change
158            else if (notEnoughKillers)
159            {
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)
164
165
166                if(tutorial) //announce party switch
167                {
168                     std::map<PlayerInfo*, Player>::iterator it3 = this->players_.find(originator->getPlayer());
169                     if (it3 != this->players_.end())
170                     {
171                          this->gtinfo_->sendStaticMessage("Take the chasers down.",it3->first->getClientID(),partyColours_[chaser]);
172                          this->gtinfo_->sendFadingMessage("You're now a killer.",it3->first->getClientID());
173                     }
174                }
175                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
176            }
177            //Case: notEnoughChasers: party change
178            else if (notEnoughChasers)
179            {
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)
184
185                if(tutorial) //announce party switch
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)
191                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it3->first->getClientID(),partyColours_[piggy]);
192
193                          else
194                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it3->first->getClientID(),partyColours_[piggy]);
195                          this->gtinfo_->sendFadingMessage("You're now a chaser.",it3->first->getClientID());
196                     }
197                }
198                evaluatePlayerParties(); //check if the party change has to trigger futher party changes
199            }
200
201            //Case: chaser vs. killer
202            else if ((source == killer && target == chaser)||(target == killer && source == chaser ))
203            {
204                return true;
205            }
206
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())
212                    {
213                        it->second.frags_++;
214                    }
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;
222
223                //party switch -> colour switch
224                setPlayerColour(victim->getPlayer()); //victim colour
225                setPlayerColour(originator->getPlayer());//originator colour
226
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())
232                     {
233                          if (numberOf[killer]>0)
234                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(), partyColours_[piggy]);
235                          else
236                              this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
237                          this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
238                     }
239                     std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
240                     if (it2 != this->players_.end())
241                     {
242                          this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it2->first->getClientID(),partyColours_[chaser]);
243                          this->gtinfo_->sendFadingMessage("You're now a victim.",it2->first->getClientID());
244                     }
245                }
246                //Give new pig boost
247                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
248                this->grantPigBoost(spaceship);
249            }
250            // killer vs piggy
251            else if (source==killer &&target==piggy) //party and colour switch
252            {
253            playerParty_[victim->getPlayer()]=killer;
254            playerParty_[originator->getPlayer()]=piggy;
255
256            setPlayerColour(victim->getPlayer()); //victim colour
257            setPlayerColour(originator->getPlayer()); //originator colour
258
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                 {
264                      this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
265                      this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
266                 }
267                 std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(victim->getPlayer());
268                 if (it2 != this->players_.end())
269                 {
270                      this->gtinfo_->sendStaticMessage("Take the chasers down.",it2->first->getClientID(),partyColours_[chaser]);
271                      this->gtinfo_->sendFadingMessage("You're now a killer.",it2->first->getClientID());
272                 }
273                }
274            }
275            //Case: friendly fire
276            else if (friendlyfire && (source == target))
277            {
278                    this->playerScored(originator->getPlayer(), -1);
279            }
280        }
281        return false; //default: no damage
282    }
283
284
285
286    bool Dynamicmatch::allowPawnDeath(Pawn* victim, Pawn* originator)
287    {
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        {
292            if (playerParty_[originator->getPlayer()] == killer) //reward the killer
293            {
294                    this->playerScored(originator->getPlayer(), 25);
295            }
296            return true;
297        }
298        else return false;
299    }
300
301    /**
302    @brief
303        Grant the victim a boost.
304    @param spaceship
305        The SpaceShip to give the boost.
306    */
307    void Dynamicmatch::grantPigBoost(SpaceShip* spaceship)
308    {
309        // Give victim boost
310        if (spaceship)
311        {
312            WeakPtr<SpaceShip>* ptr = new WeakPtr<SpaceShip>(spaceship);
313            if(ptr == NULL)
314                return;
315            spaceship->addSpeedFactor(5);
316            ExecutorPtr executor = createExecutor(createFunctor(&Dynamicmatch::resetSpeedFactor, this));
317            executor->setDefaultValue(0, ptr);
318            new Timer(10, false, executor, true);
319        }
320    }
321
322    void Dynamicmatch::playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn) //set party + colouring
323    {
324        if (!player)
325            return;
326
327        Dynamicmatch::setPlayerColour(player); //Set playercolour
328        evaluatePlayerParties();
329    }
330
331    void Dynamicmatch::playerEntered(PlayerInfo* player) //standardfunction
332    {
333        if (!player)// only for safety
334            return;
335        playerParty_[player]=chaser; //Set playerparty
336        numberOf[chaser]++;
337        Gametype::playerEntered(player);
338        const std::string& message = player->getName() + " entered the game";
339        ChatManager::message(message);
340    }
341
342    bool Dynamicmatch::playerLeft(PlayerInfo* player) //standardfunction
343    {
344        bool valid_player = Gametype::playerLeft(player);
345        if (valid_player)
346        {
347            switch (playerParty_[player])
348            {
349            case 0: numberOf[chaser]--; break;
350            case 1: numberOf[piggy]--; break;
351            case 2: numberOf[killer]--; break;
352            }
353            const std::string& message = player->getName() + " left the game";
354            ChatManager::message(message);
355            //remove player from map
356            playerParty_.erase (player);
357            //adjust player parties
358            evaluatePlayerParties();
359        }
360
361        return valid_player;
362    }
363
364
365    void Dynamicmatch::tick(float dt)
366    {
367        SUPER(Dynamicmatch, tick, dt);
368
369        if (this->hasStarted() && !gameEnded_)
370        {
371            pointsPerTime = pointsPerTime + dt; //increase points
372            gameTime_ = gameTime_ - dt; // decrease game time
373            if (pointsPerTime > 2.0f) //hard coded points for victim! should be changed
374            {
375                pointsPerTime = 0.0f;
376                rewardPig();
377            }
378            if (gameTime_<= 0)
379            {
380                this->gameEnded_ = true;
381                this->end();
382            }
383            if ( gameTime_ <= timesequence_ && gameTime_ > 0)
384            {
385                const std::string& message = multi_cast<std::string>(timesequence_) + " seconds left!";
386
387                this->gtinfo_->sendAnnounceMessage(message);
388
389                if (timesequence_ >= 30 && timesequence_ <= 60)
390                {
391                    timesequence_ = timesequence_ - 10;
392                }
393                else if (timesequence_ <= 30)
394                {
395                    timesequence_ = timesequence_ - 5;
396                }
397                else
398                {
399                    timesequence_ = timesequence_ - 30;
400                }
401            }
402        }
403    }
404
405/**
406    @brief The reward function is called every 2 seconds via the tick function and makes the victim score points.
407*/
408    void Dynamicmatch::rewardPig()
409    {
410        for (std::map< PlayerInfo*, int >::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it) //durch alle Spieler iterieren und alle piggys finden
411        {
412            if (it->second==piggy)//Spieler mit der Pig-party frags++
413            {
414                 this->playerScored(it->first);
415            }
416        }
417    }
418    void Dynamicmatch::setPlayerColour(PlayerInfo* player) // sets a player's colour
419    {
420        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
421        Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
422            if (pawn)
423            {
424                pawn->setRadarObjectColour(this->partyColours_[it_player->second]);
425
426                std::set<WorldEntity*> pawnAttachments = pawn->getAttachedObjects();
427                for (std::set<WorldEntity*>::iterator it = pawnAttachments.begin(); it != pawnAttachments.end(); ++it)
428                {
429                    if ((*it)->isA(Class(TeamColourable)))
430                    {
431                        TeamColourable* tc = orxonox_cast<TeamColourable*>(*it);
432                        tc->setTeamColour(this->partyColours_[it_player->second]);
433                    }
434                }
435            }
436    }
437
438    void Dynamicmatch::evaluatePlayerParties() //manages the notEnough booleans (here the percentage of special players is implemented)
439    {
440        //pigs: 1 + every 6th player is a pig
441        if ( (1 + getPlayerCount()/6) > numberOf[piggy])
442        {
443            notEnoughPigs=true;
444            if (tutorial) // Announce selectionphase
445            {
446             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
447                {
448                    if (!it->first)//in order to catch nullpointer
449                        continue;
450                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
451                        continue;
452                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
453                }
454            }
455        }
456        else
457        {
458             notEnoughPigs=false;
459             if(tutorial&&(!notEnoughKillers)&&(!notEnoughChasers)) //Selection phase over
460             {
461                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
462                  {
463                       if (!it->first)//in order to catch nullpointer
464                           continue;
465                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
466                           continue;
467                       else if (it->second==chaser)
468                       {
469                           if (numberOf[killer]>0)
470                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
471                           else
472                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
473                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
474                       }
475                       else if (it->second==piggy)
476                       {
477                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
478                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
479                       }
480                       else if (it->second==killer)
481                       {
482                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
483                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
484                       }
485                  }
486
487             }
488        }
489        //killers: every 4th player is a killer
490        if ( static_cast<unsigned int>(getPlayerCount()/4) > numberOf[killer])
491        {
492            notEnoughKillers=true;
493            if (tutorial) // Announce selectionphase
494            {
495             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
496                {
497                    if (!it->first)//in order to catch nullpointer
498                        continue;
499                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
500                        continue;
501                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
502                }
503            }
504        }
505        else
506        {
507            notEnoughKillers=false;
508            if(tutorial&&(!notEnoughPigs)&&(!notEnoughChasers)) //Selection phase over
509             {
510                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
511                  {
512                       if (!it->first)
513                           continue;
514                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
515                           continue;
516                       else if (it->second==chaser)
517                       {
518                           if (numberOf[killer]>0)
519                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
520                           else
521                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
522                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
523                       }
524                       else if (it->second==piggy)
525                       {
526                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[piggy]);
527                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
528                       }
529                       else if (it->second==killer)
530                       {
531                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[piggy]);
532                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
533                       }
534                  }
535
536             }
537
538        }
539        //chasers: there are more chasers than killers + pigs
540        if (numberOf[piggy]+numberOf[killer] > numberOf[chaser])
541        {
542            notEnoughChasers=true;
543            if (tutorial) // Announce selectionphase
544            {
545             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
546                {
547                    if (!it->first)//in order to catch nullpointer
548                        continue;
549                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
550                        continue;
551                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
552                }
553            }
554        }
555        else
556        {
557             notEnoughChasers=false;
558             if(tutorial&&(!notEnoughPigs)&&(!notEnoughKillers)) //Selection phase over
559             {
560                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
561                  {
562                       if (!it->first)
563                           continue;
564                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
565                           continue;
566                       else if (it->second==chaser)
567                       {
568                           if (numberOf[killer]>0)
569                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
570                           else
571                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
572                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
573                       }
574                       else if (it->second==piggy)
575                       {
576                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
577                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
578                       }
579                       else if (it->second==killer)
580                       {
581                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
582                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
583                       }
584                  }
585
586             }
587        }
588    }
589
590    int Dynamicmatch::getParty(PlayerInfo* player) // helper function for ArtificialController
591    {
592        return this->playerParty_[player];
593    }
594
595    void Dynamicmatch::resetSpeedFactor(WeakPtr<SpaceShip>* ptr)// helper function
596    {
597        if (*ptr)
598        {
599            (*ptr)->addSpeedFactor(1.0f/5.0f);
600        }
601        delete ptr;
602    }
603
604    bool Dynamicmatch::playerChangedName(PlayerInfo* player) //standardfunction
605    {
606        bool valid_player = Gametype::playerChangedName(player);
607        if (valid_player)
608        {
609            const std::string& message = player->getOldName() + " changed name to " + player->getName();
610            ChatManager::message(message);
611        }
612
613        return valid_player;
614    }
615
616    void Dynamicmatch::start()
617    {
618        Gametype::start();
619        if(!tutorial)
620        {
621            std::string message("Dynamicmatch started!");
622            ChatManager::message(message);
623        }
624        else if(tutorial) // Announce selectionphase
625        {
626            for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
627            {
628                if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
629                    continue;
630                this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
631            }
632        }
633    }
634
635    /*void Dynamicmatch::instructions()
636    {
637        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!");
638        ChatManager::message(message);
639        callInstructions_.setTimer(10, false, createExecutor(createFunctor(&Dynamicmatch::furtherInstructions, this)));
640    }
641
642    void Dynamicmatch::furtherInstructions()
643    {
644        std::string message("After 3 Minutes the game is over.");
645        ChatManager::message(message);
646    }*/
647    void Dynamicmatch::end()
648    {
649        Gametype::end();
650
651        std::string message("Time out. Press F2 to see the points you scored.");
652        ChatManager::message(message);
653    }
654    SpawnPoint* Dynamicmatch::getBestSpawnPoint(PlayerInfo* player) const
655    {
656        int desiredTeamNr = -1;
657        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
658        if (it_player != this->playerParty_.end())
659            desiredTeamNr = it_player->second;
660
661        // Only use spawnpoints of the own team (or non-team-spawnpoints)
662        std::set<SpawnPoint*> teamSpawnPoints = this->spawnpoints_;
663        for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
664        {
665            if ((*it)->isA(Class(TeamSpawnPoint)))
666            {
667                TeamSpawnPoint* tsp = orxonox_cast<TeamSpawnPoint*>(*it);
668                if (tsp && static_cast<int>(tsp->getTeamNumber()) != desiredTeamNr)//getTeamNumber!!
669                {
670                    teamSpawnPoints.erase(it++);
671                    continue;
672                }
673            }
674
675            ++it;
676        }
677
678        if (teamSpawnPoints.size() > 0)
679        {
680            unsigned int randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
681            unsigned int index = 0;
682            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
683            {
684                if (index == randomspawn)
685                    return (*it);
686
687                ++index;
688            }
689        }
690
691        return 0;
692    }
693
694}
Note: See TracBrowser for help on using the repository browser.