Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gametypes/Dynamicmatch.cc @ 8858

Last change on this file since 8858 was 8858, checked in by landauf, 13 years ago

merged output branch back to trunk.

Changes:

  • you have to include util/Output.h instead of util/Debug.h
  • COUT(x) is now called orxout(level)
  • output levels are now defined by an enum instead of numbers. see util/Output.h for the definition
  • it's possible to use output contexts with orxout(level, context). see util/Output.h for some common contexts. you can define more contexts
  • you must use 'endl' at the end of an output message, '\n' does not flush the message

Output levels:

  • instead of COUT(0) use orxout()
  • instead of COUT(1) use orxout(user_error) or orxout(internal_error)
  • instead of COUT(2) use orxout(user_warning) or orxout(internal_warning)
  • instead of COUT(3) use orxout(user_status/user_info) or orxout(internal_status/internal_info)
  • instead of COUT(4) use orxout(verbose)
  • instead of COUT(5) use orxout(verbose_more)
  • instead of COUT(6) use orxout(verbose_ultra)

Guidelines:

  • user_* levels are for the user, visible in the console and the log-file
  • internal_* levels are for developers, visible in the log-file
  • verbose_* levels are for debugging, only visible if the context of the output is activated

Usage in C++:

  • orxout() << "message" << endl;
  • orxout(level) << "message" << endl;
  • orxout(level, context) << "message" << endl;

Usage in Lua:

  • orxout("message")
  • orxout(orxonox.level.levelname, "message")
  • orxout(orxonox.level.levelname, "context", "message")

Usage in Tcl (and in the in-game-console):

  • orxout levelname message
  • orxout_context levelname context message
  • shortcuts: log message, error message, warning message, status message, info message, debug message
  • Property svn:eol-style set to native
File size: 29.9 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/*
34short gaming manual:
35There are three different parties a player can belong to: victim, chaser or killer
36Every 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.
37In order to win you have to earn as much points as possible:
38- as victim by escaping the chasers
39- as chaser by shooting the victim
40- as killer by killing the chasers
41
42
43What you shouldn't do is shooting at players of your own party. By doing so your score will decrease.
44P.S: If you don't want to be a victim: Get rid of your part by shooting a chaser.
45*/
46#include "Dynamicmatch.h"
47
48#include "util/Convert.h"
49#include "core/CoreIncludes.h"
50#include "core/command/Executor.h"
51#include "chat/ChatManager.h"
52#include "infos/PlayerInfo.h"
53#include "worldentities/pawns/Pawn.h"
54#include "worldentities/pawns/SpaceShip.h"
55#include "core/ConfigValueIncludes.h"
56#include "interfaces/TeamColourable.h"
57#include "items/Engine.h"
58#include "tools/Timer.h"
59#include "worldentities/TeamSpawnPoint.h"
60
61namespace orxonox
62{
63    CreateUnloadableFactory(Dynamicmatch);
64
65    Dynamicmatch::Dynamicmatch(BaseObject* creator) : Gametype(creator)
66    {
67        RegisterObject(Dynamicmatch);
68        this->gameTime_ = 180;
69        this->setConfigValues();
70        this->chaser=0;
71        this->piggy=1;
72        this->killer=2;
73        this->notEnoughPigs=false;
74        this->notEnoughKillers=false;
75        this->notEnoughChasers=false;
76        this->gameEnded_ =false;
77        this->timesequence_ = static_cast<int>(this->gameTime_);
78        this->friendlyfire=true;
79        this->numberOf[chaser]=0;
80        this->numberOf[piggy]=0;
81        this->numberOf[killer]=0;
82        this->tutorial=true;
83        this->pointsPerTime=0.0f;
84        this->setHUDTemplate("DynamicmatchHUD");
85    }
86
87    void Dynamicmatch::setConfigValues()
88    {
89        SetConfigValue(gameTime_, 180);
90        SetConfigValue(friendlyfire, true);
91        SetConfigValue(tutorial, true);
92        static ColourValue colours[] =
93        {
94            ColourValue(1.0f, 0.3f, 0.3f),  //chasercolour
95            ColourValue(0.3f, 0.3f, 1.0f),  //piggycolour
96            ColourValue(0.3f, 1.0f, 0.3f)   //killercolour  what about black: 0.0f, 0.0f, 0.0f
97
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 = dynamic_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 = dynamic_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 piggy a boost.
312    @param spaceship
313        The SpaceShip to give the boost.
314    */
315    void Dynamicmatch::grantPigBoost(SpaceShip* spaceship)
316    {
317        // Give pig 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        {   pointsPerTime =pointsPerTime + dt;
377            gameTime_ = gameTime_ - dt;
378            if (pointsPerTime > 2.0f)//hard coded!! should be changed
379            {
380                pointsPerTime=0.0f;
381                rewardPig();
382            }
383            if (gameTime_<= 0)
384            {
385                this->gameEnded_ = true;
386                this->end();
387            }
388            if ( gameTime_ <= timesequence_ && gameTime_ > 0)
389            {
390                const std::string& message = multi_cast<std::string>(timesequence_) + " seconds left!";
391
392                this->gtinfo_->sendAnnounceMessage(message);
393
394                if (timesequence_ >= 30 && timesequence_ <= 60)
395                {
396                    timesequence_ = timesequence_ - 10;
397                }
398                else if (timesequence_ <= 30)
399                {
400                    timesequence_ = timesequence_ - 5;
401                }
402                else
403                {
404                    timesequence_ = timesequence_ - 30;
405                }
406            }
407        }
408    }
409
410    void Dynamicmatch::rewardPig()
411    {
412        for (std::map< PlayerInfo*, int >::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it) //durch alle Spieler iterieren und alle piggys finden
413        {
414            if (it->second==piggy)
415            {
416                 //Spieler mit der Pig-party frags++
417                 std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(it->first);// still not sure if right syntax
418                 if (it2 != this->players_.end())
419                 {
420                     it2->second.frags_++;
421                 }
422            }
423        }
424    }
425    void Dynamicmatch::setPlayerColour(PlayerInfo* player) // sets a player's colour
426    {
427        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
428        Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
429            if (pawn)
430            {
431                pawn->setRadarObjectColour(this->partyColours_[it_player->second]);
432
433                std::set<WorldEntity*> pawnAttachments = pawn->getAttachedObjects();
434                for (std::set<WorldEntity*>::iterator it = pawnAttachments.begin(); it != pawnAttachments.end(); ++it)
435                {
436                    if ((*it)->isA(Class(TeamColourable)))
437                    {
438                        TeamColourable* tc = orxonox_cast<TeamColourable*>(*it);
439                        tc->setTeamColour(this->partyColours_[it_player->second]);
440                    }
441                }
442            }
443    }
444
445    void Dynamicmatch::evaluatePlayerParties() //manages the notEnough booleans (here the percentage of special players is implemented)
446    {
447        //pigs: 1 + every 6th player is a pig
448        if ( (1+this->getNumberOfPlayers()/6) > numberOf[piggy])
449        {
450            notEnoughPigs=true;
451            if (tutorial) // Announce selectionphase
452            {
453             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
454                {
455                    if (!it->first)//in order to catch nullpointer
456                        continue;
457                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
458                        continue;
459                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
460                }
461            }
462        }
463        else
464        {
465             notEnoughPigs=false;
466             if(tutorial&&(!notEnoughKillers)&&(!notEnoughChasers)) //Selection phase over
467             {
468                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
469                  {
470                       if (!it->first)//in order to catch nullpointer
471                           continue;
472                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
473                           continue;
474                       else if (it->second==chaser)
475                       {
476                           if (numberOf[killer]>0)
477                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
478                           else
479                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
480                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
481                       }
482                       else if (it->second==piggy)
483                       {
484                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
485                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
486                       }
487                       else if (it->second==killer)
488                       {
489                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
490                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
491                       }
492                  }
493
494             }
495        }
496        //killers: every 4th player is a killer
497        if (getNumberOfPlayers()/4 > numberOf[killer])
498        {
499            notEnoughKillers=true;
500            if (tutorial) // Announce selectionphase
501            {
502             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
503                {
504                    if (!it->first)//in order to catch nullpointer
505                        continue;
506                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
507                        continue;
508                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
509                }
510            }
511        }
512        else
513        {
514            notEnoughKillers=false;
515            if(tutorial&&(!notEnoughPigs)&&(!notEnoughChasers)) //Selection phase over
516             {
517                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
518                  {
519                       if (!it->first)
520                           continue;
521                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
522                           continue;
523                       else if (it->second==chaser)
524                       {
525                           if (numberOf[killer]>0)
526                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
527                           else
528                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
529                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
530                       }
531                       else if (it->second==piggy)
532                       {
533                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[piggy]);
534                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
535                       }
536                       else if (it->second==killer)
537                       {
538                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[piggy]);
539                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
540                       }
541                  }
542
543             }
544
545        }
546        //chasers: there are more chasers than killers + pigs
547        if (numberOf[piggy]+numberOf[killer] > numberOf[chaser])
548        {
549            notEnoughChasers=true;
550            if (tutorial) // Announce selectionphase
551            {
552             for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
553                {
554                    if (!it->first)//in order to catch nullpointer
555                        continue;
556                    if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
557                        continue;
558                    this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
559                }
560            }
561        }
562        else
563        {
564             notEnoughChasers=false;
565             if(tutorial&&(!notEnoughPigs)&&(!notEnoughKillers)) //Selection phase over
566             {
567                  for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
568                  {
569                       if (!it->first)
570                           continue;
571                       if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
572                           continue;
573                       else if (it->second==chaser)
574                       {
575                           if (numberOf[killer]>0)
576                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible. Defend yourself against the killers.",it->first->getClientID(),partyColours_[piggy]);
577                           else
578                               this->gtinfo_->sendStaticMessage("Shoot at the victim as often as possible.",it->first->getClientID(),partyColours_[piggy]);
579                           //this->gtinfo_->sendFadingMessage("You're now a chaser.",it->first->getClientID());
580                       }
581                       else if (it->second==piggy)
582                       {
583                           this->gtinfo_->sendStaticMessage("Either hide or shoot a chaser.",it->first->getClientID(),partyColours_[chaser]);
584                           //this->gtinfo_->sendFadingMessage("You're now a victim.",it->first->getClientID());
585                       }
586                       else if (it->second==killer)
587                       {
588                           this->gtinfo_->sendStaticMessage("Take the chasers down.",it->first->getClientID(),partyColours_[chaser]);
589                           //this->gtinfo_->sendFadingMessage("You're now a killer.",it->first->getClientID());
590                       }
591                  }
592
593             }
594        }
595    }
596
597    int Dynamicmatch::getParty(PlayerInfo* player) // helper function for ArtificialController
598    {
599        return this->playerParty_[player];
600    }
601
602    void Dynamicmatch::resetSpeedFactor(WeakPtr<SpaceShip>* ptr)// helper function
603    {
604        if (*ptr)
605        {
606            (*ptr)->addSpeedFactor(1.0f/5.0f);
607        }
608        delete ptr;
609    }
610
611    bool Dynamicmatch::playerChangedName(PlayerInfo* player) //standardfunction
612    {
613        bool valid_player = Gametype::playerChangedName(player);
614        if (valid_player)
615        {
616            const std::string& message = player->getOldName() + " changed name to " + player->getName();
617            ChatManager::message(message);
618        }
619
620        return valid_player;
621    }
622
623    void Dynamicmatch::start()
624    {
625        Gametype::start();
626        if(!tutorial)
627        {
628            std::string message("Dynamicmatch started!");
629            ChatManager::message(message);
630        }
631        else if(tutorial) // Announce selectionphase
632        {
633            for (std::map<PlayerInfo*, int>::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it)
634            {
635                if (it->first->getClientID() == NETWORK_PEER_ID_UNKNOWN)
636                    continue;
637                this->gtinfo_->sendStaticMessage("Selection phase: Shoot at everything that moves.",it->first->getClientID(),ColourValue(1.0f, 1.0f, 0.5f));
638            }
639        }
640    }
641
642    /*void Dynamicmatch::instructions()
643    {
644        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!");
645        ChatManager::message(message);
646        callInstructions_.setTimer(10, false, createExecutor(createFunctor(&Dynamicmatch::furtherInstructions, this)));
647    }
648
649    void Dynamicmatch::furtherInstructions()
650    {
651        std::string message("After 3 Minutes the game is over.");
652        ChatManager::message(message);
653    }*/
654    void Dynamicmatch::end()
655    {
656        Gametype::end();
657
658        std::string message("Time out. Press F2 to see the points you scored.");
659        ChatManager::message(message);
660    }
661    SpawnPoint* Dynamicmatch::getBestSpawnPoint(PlayerInfo* player) const
662    {
663        int desiredTeamNr = -1;
664        std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
665        if (it_player != this->playerParty_.end())
666            desiredTeamNr = it_player->second;
667
668        // Only use spawnpoints of the own team (or non-team-spawnpoints)
669        std::set<SpawnPoint*> teamSpawnPoints = this->spawnpoints_;
670        for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
671        {
672            if ((*it)->isA(Class(TeamSpawnPoint)))
673            {
674                TeamSpawnPoint* tsp = orxonox_cast<TeamSpawnPoint*>(*it);
675                if (tsp && static_cast<int>(tsp->getTeamNumber()) != desiredTeamNr)//getTeamNumber!!
676                {
677                    teamSpawnPoints.erase(it++);
678                    continue;
679                }
680            }
681
682            ++it;
683        }
684
685        if (teamSpawnPoints.size() > 0)
686        {
687            unsigned int randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
688            unsigned int index = 0;
689            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
690            {
691                if (index == randomspawn)
692                    return (*it);
693
694                ++index;
695            }
696        }
697
698        return 0;
699    }
700
701}
Note: See TracBrowser for help on using the repository browser.