Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/orxonox/gametypes/Dynamicmatch.cc @ 10557

Last change on this file since 10557 was 10557, checked in by landauf, 9 years ago

cleanup: no need to pass/return WeakPtrs to/from functions. normal pointers are enough.

  • Property svn:eol-style set to native
File size: 29.5 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/config/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    RegisterUnloadableClass(Dynamicmatch);
65
66    Dynamicmatch::Dynamicmatch(Context* context) : Gametype(context)
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            spaceship->addSpeedFactor(5);
313            ExecutorPtr executor = createExecutor(createFunctor(&Dynamicmatch::resetSpeedFactor, this));
314            executor->setDefaultValue(0, spaceship);
315            new Timer(10, false, executor, true);
316        }
317    }
318
319    void Dynamicmatch::playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn) //set party + colouring
320    {
321        if (!player)
322            return;
323
324        Dynamicmatch::setPlayerColour(player); //Set playercolour
325        evaluatePlayerParties();
326    }
327
328    void Dynamicmatch::playerEntered(PlayerInfo* player) //standardfunction
329    {
330        if (!player)// only for safety
331            return;
332        playerParty_[player]=chaser; //Set playerparty
333        numberOf[chaser]++;
334        Gametype::playerEntered(player);
335        const std::string& message = player->getName() + " entered the game";
336        ChatManager::message(message);
337    }
338
339    bool Dynamicmatch::playerLeft(PlayerInfo* player) //standardfunction
340    {
341        bool valid_player = Gametype::playerLeft(player);
342        if (valid_player)
343        {
344            switch (playerParty_[player])
345            {
346            case 0: numberOf[chaser]--; break;
347            case 1: numberOf[piggy]--; break;
348            case 2: numberOf[killer]--; break;
349            }
350            const std::string& message = player->getName() + " left the game";
351            ChatManager::message(message);
352            //remove player from map
353            playerParty_.erase (player);
354            //adjust player parties
355            evaluatePlayerParties();
356        }
357
358        return valid_player;
359    }
360
361
362    void Dynamicmatch::tick(float dt)
363    {
364        SUPER(Dynamicmatch, tick, dt);
365
366        if (this->hasStarted() && !gameEnded_)
367        {
368            pointsPerTime = pointsPerTime + dt; //increase points
369            gameTime_ = gameTime_ - dt; // decrease game time
370            if (pointsPerTime > 2.0f) //hard coded points for victim! should be changed
371            {
372                pointsPerTime = 0.0f;
373                rewardPig();
374            }
375            if (gameTime_<= 0)
376            {
377                this->gameEnded_ = true;
378                this->end();
379            }
380            if ( gameTime_ <= timesequence_ && gameTime_ > 0)
381            {
382                const std::string& message = multi_cast<std::string>(timesequence_) + " seconds left!";
383
384                this->gtinfo_->sendAnnounceMessage(message);
385
386                if (timesequence_ >= 30 && timesequence_ <= 60)
387                {
388                    timesequence_ = timesequence_ - 10;
389                }
390                else if (timesequence_ <= 30)
391                {
392                    timesequence_ = timesequence_ - 5;
393                }
394                else
395                {
396                    timesequence_ = timesequence_ - 30;
397                }
398            }
399        }
400    }
401
402/**
403    @brief The reward function is called every 2 seconds via the tick function and makes the victim score points.
404*/
405    void Dynamicmatch::rewardPig()
406    {
407        for (std::map< PlayerInfo*, int >::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it) //durch alle Spieler iterieren und alle piggys finden
408        {
409            if (it->second==piggy)//Spieler mit der Pig-party frags++
410            {
411                 this->playerScored(it->first);
412            }
413        }
414    }
415    void Dynamicmatch::setPlayerColour(PlayerInfo* player) // sets a player's colour
416    {
417        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
418        Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
419            if (pawn)
420            {
421                pawn->setRadarObjectColour(this->partyColours_[it_player->second]);
422
423                std::set<WorldEntity*> pawnAttachments = pawn->getAttachedObjects();
424                for (std::set<WorldEntity*>::iterator it = pawnAttachments.begin(); it != pawnAttachments.end(); ++it)
425                {
426                    if ((*it)->isA(Class(TeamColourable)))
427                    {
428                        TeamColourable* tc = orxonox_cast<TeamColourable*>(*it);
429                        tc->setTeamColour(this->partyColours_[it_player->second]);
430                    }
431                }
432            }
433    }
434
435    void Dynamicmatch::evaluatePlayerParties() //manages the notEnough booleans (here the percentage of special players is implemented)
436    {
437        //pigs: 1 + every 6th player is a pig
438        if ( (1 + getPlayerCount()/6) > numberOf[piggy])
439        {
440            notEnoughPigs=true;
441            if (tutorial) // Announce selectionphase
442            {
443             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
444                {
445                    if (!it->first)//in order to catch nullpointer
446                        continue;
447                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
448                        continue;
449                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
450                }
451            }
452        }
453        else
454        {
455             notEnoughPigs=false;
456             if(tutorial&&(!notEnoughKillers)&&(!notEnoughChasers)) //Selection phase over
457             {
458                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
459                  {
460                       if (!it->first)//in order to catch nullpointer
461                           continue;
462                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
463                           continue;
464                       else if (it->second==chaser)
465                       {
466                           if (numberOf[killer]>0)
467                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
468                           else
469                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
470                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
471                       }
472                       else if (it->second==piggy)
473                       {
474                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
475                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
476                       }
477                       else if (it->second==killer)
478                       {
479                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
480                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
481                       }
482                  }
483
484             }
485        }
486        //killers: every 4th player is a killer
487        if ( static_cast<unsigned int>(getPlayerCount()/4) > numberOf[killer])
488        {
489            notEnoughKillers=true;
490            if (tutorial) // Announce selectionphase
491            {
492             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
493                {
494                    if (!it->first)//in order to catch nullpointer
495                        continue;
496                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
497                        continue;
498                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
499                }
500            }
501        }
502        else
503        {
504            notEnoughKillers=false;
505            if(tutorial&&(!notEnoughPigs)&&(!notEnoughChasers)) //Selection phase over
506             {
507                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
508                  {
509                       if (!it->first)
510                           continue;
511                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
512                           continue;
513                       else if (it->second==chaser)
514                       {
515                           if (numberOf[killer]>0)
516                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
517                           else
518                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
519                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
520                       }
521                       else if (it->second==piggy)
522                       {
523                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[piggy]);
524                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
525                       }
526                       else if (it->second==killer)
527                       {
528                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[piggy]);
529                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
530                       }
531                  }
532
533             }
534
535        }
536        //chasers: there are more chasers than killers + pigs
537        if (numberOf[piggy]+numberOf[killer] > numberOf[chaser])
538        {
539            notEnoughChasers=true;
540            if (tutorial) // Announce selectionphase
541            {
542             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
543                {
544                    if (!it->first)//in order to catch nullpointer
545                        continue;
546                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
547                        continue;
548                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
549                }
550            }
551        }
552        else
553        {
554             notEnoughChasers=false;
555             if(tutorial&&(!notEnoughPigs)&&(!notEnoughKillers)) //Selection phase over
556             {
557                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
558                  {
559                       if (!it->first)
560                           continue;
561                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
562                           continue;
563                       else if (it->second==chaser)
564                       {
565                           if (numberOf[killer]>0)
566                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
567                           else
568                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
569                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
570                       }
571                       else if (it->second==piggy)
572                       {
573                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
574                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
575                       }
576                       else if (it->second==killer)
577                       {
578                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
579                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
580                       }
581                  }
582
583             }
584        }
585    }
586
587    int Dynamicmatch::getParty(PlayerInfo* player) // helper function for ArtificialController
588    {
589        return this->playerParty_[player];
590    }
591
592    void Dynamicmatch::resetSpeedFactor(SpaceShip* spaceship)// helper function
593    {
594        if (spaceship)
595        {
596            spaceship->addSpeedFactor(1.0f/5.0f);
597        }
598    }
599
600    bool Dynamicmatch::playerChangedName(PlayerInfo* player) //standardfunction
601    {
602        bool valid_player = Gametype::playerChangedName(player);
603        if (valid_player)
604        {
605            const std::string& message = player->getOldName() + " changed name to " + player->getName();
606            ChatManager::message(message);
607        }
608
609        return valid_player;
610    }
611
612    void Dynamicmatch::start()
613    {
614        Gametype::start();
615        if(!tutorial)
616        {
617            std::string message("Dynamicmatch started!");
618            ChatManager::message(message);
619        }
620        else if(tutorial) // Announce selectionphase
621        {
622            for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
623            {
624                if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
625                    continue;
626                this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
627            }
628        }
629    }
630
631    /*void Dynamicmatch::instructions()
632    {
633        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!");
634        ChatManager::message(message);
635        callInstructions_.setTimer(10, false, createExecutor(createFunctor(&Dynamicmatch::furtherInstructions, this)));
636    }
637
638    void Dynamicmatch::furtherInstructions()
639    {
640        std::string message("After 3 Minutes the game is over.");
641        ChatManager::message(message);
642    }*/
643    void Dynamicmatch::end()
644    {
645        Gametype::end();
646
647        std::string message("Time out. Press F2 to see the points you scored.");
648        ChatManager::message(message);
649    }
650    SpawnPoint* Dynamicmatch::getBestSpawnPoint(PlayerInfo* player) const
651    {
652        int desiredTeamNr = -1;
653        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
654        if (it_player != this->playerParty_.end())
655            desiredTeamNr = it_player->second;
656
657        // Only use spawnpoints of the own team (or non-team-spawnpoints)
658        std::set<SpawnPoint*> teamSpawnPoints = this->spawnpoints_;
659        for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
660        {
661            if ((*it)->isA(Class(TeamSpawnPoint)))
662            {
663                TeamSpawnPoint* tsp = orxonox_cast<TeamSpawnPoint*>(*it);
664                if (tsp && static_cast<int>(tsp->getTeamNumber()) != desiredTeamNr)//getTeamNumber!!
665                {
666                    teamSpawnPoints.erase(it++);
667                    continue;
668                }
669            }
670
671            ++it;
672        }
673
674        if (teamSpawnPoints.size() > 0)
675        {
676            unsigned int randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
677            unsigned int index = 0;
678            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
679            {
680                if (index == randomspawn)
681                    return (*it);
682
683                ++index;
684            }
685        }
686
687        return 0;
688    }
689
690}
Note: See TracBrowser for help on using the repository browser.