Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Trying to find quick fixes for dynamic match. Somehow gametypes getNumberOfPlayer() function is broken, so I created a new, local function. Furthermore the rocket usage is in conflict with colouring spaceships, so I changed the spaceship model. Surprisingly the usage of spaceshipswallow and adding 7 bots caused my system to freeze some seconds after the gametype started.

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