[Orxonox-commit 3197] r7890 - in code/branches/lastmanstanding2/src: modules/overlays/hud orxonox/gametypes

jo at orxonox.net jo at orxonox.net
Mon Feb 14 20:29:14 CET 2011


Author: jo
Date: 2011-02-14 20:29:14 +0100 (Mon, 14 Feb 2011)
New Revision: 7890

Modified:
   code/branches/lastmanstanding2/src/modules/overlays/hud/CMakeLists.txt
   code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.cc
   code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.h
Log:
trying to find a bug

Modified: code/branches/lastmanstanding2/src/modules/overlays/hud/CMakeLists.txt
===================================================================
--- code/branches/lastmanstanding2/src/modules/overlays/hud/CMakeLists.txt	2011-02-14 19:24:00 UTC (rev 7889)
+++ code/branches/lastmanstanding2/src/modules/overlays/hud/CMakeLists.txt	2011-02-14 19:29:14 UTC (rev 7890)
@@ -15,5 +15,5 @@
   GametypeStaticMessage.cc
   GametypeFadingMessage.cc
   LastManStandingInfos.cc
-  LastTeamStandingInfos.cc 
+  LastTeamStandingInfos.cc
 )

Modified: code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.cc
===================================================================
--- code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.cc	2011-02-14 19:24:00 UTC (rev 7889)
+++ code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.cc	2011-02-14 19:29:14 UTC (rev 7890)
@@ -42,80 +42,79 @@
 
     LastTeamStanding::LastTeamStanding(BaseObject* creator) : TeamDeathmatch(creator)
     {
-        RegisterObject(LastTeamStanding);
-        this->bForceSpawn_=true;
-        this->lives=4;
-        this->teamsAlive=0;
-        this->timeRemaining=15.0f;
-        this->respawnDelay=4.0f;
-        this->bNoPunishment=false;
-        this->bHardPunishment=false;
-        this->punishDamageRate=0.4f;
-        this->setHUDTemplate("LastTeamStandingHUD");//tolowercase:-)
-        this->eachTeamsPlayers = new int[teams_];
-        this->bMinPlayersReached = false;
+        this->bForceSpawn_ = true;
+        this->lives = 1;//4
+        this->eachTeamsPlayers.reserve(teams_);
+        this->teamsAlive = 0;
+        this->bMinTeamsReached = false;
+        this->bNoPunishment = false;
+        this->bHardPunishment = false;
+        this->punishDamageRate = 0.4f;
+        this->timeRemaining = 15.0f;
+        this->respawnDelay = 4.0f;
     }
     
     LastTeamStanding::~LastTeamStanding()
     {
-        delete[] this->eachTeamsPlayers;
+        this->playerLives_.clear();
+        this->eachTeamsPlayers.clear();
+        this->timeToAct_.clear();
+        this->playerDelayTime_.clear();
+        this->inGame_.clear();
     }   
 
-    void LastTeamStanding::spawnDeadPlayersIfRequested()
+    void LastTeamStanding::playerEntered(PlayerInfo* player)
     {
-        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
-            if (it->second.state_ == PlayerState::Dead)
-            {
-                bool alive = (0<playerLives_[it->first]&&(inGame_[it->first]));
-                if (alive&&(it->first->isReadyToSpawn() || this->bForceSpawn_))
-                {
-                    this->spawnPlayer(it->first);
-                }
-            }
-    }
+        if (!player)// only for safety
+            return;
+        TeamDeathmatch::playerEntered(player);
+        if (teamsAlive<=1)
+            playerLives_[player]=lives;
+        else
+            playerLives_[player]=getMinLives();//new players only get minimum of lives
+        
+        if(this->eachTeamsPlayers[getTeam(player)]==0) //if a player is the first in his group, a new team is alive
+            this->teamsAlive++;
+        this->eachTeamsPlayers[getTeam(player)]++; //the number of player in this team is increased
 
-
-    void LastTeamStanding::setConfigValues()
-    {
-        SetConfigValue(lives, 4);
-        SetConfigValue(timeRemaining, 15.0f);
-        SetConfigValue(respawnDelay, 4.0f);
-        SetConfigValue(bNoPunishment, false);
-        SetConfigValue(bHardPunishment, false);
+        if (teamsAlive>1) // Now the game is allowed to end, since there are at least two teams.
+            bMinTeamsReached = true; // since there are at least two teams, the game is allowed to end
+        this->timeToAct_[player] = timeRemaining;
+        this->playerDelayTime_[player] = respawnDelay;
+        this->inGame_[player] = true;
     }
 
-    bool LastTeamStanding::allowPawnDamage(Pawn* victim, Pawn* originator)
+    bool LastTeamStanding::playerLeft(PlayerInfo* player)
     {
-        bool allow = TeamDeathmatch::allowPawnDamage(victim, originator);
-        if(!allow) {return allow;}
-        if (originator && originator->getPlayer())// only for safety
+        bool valid_player = TeamDeathmatch::playerLeft(player);
+        if (valid_player)
         {
-            this->timeToAct_[originator->getPlayer()]=timeRemaining;
+            this->eachTeamsPlayers[getTeam(player)]--;       // a player left the team
+            if(this->eachTeamsPlayers[getTeam(player)] == 0) // if it was the last player a team died
+                 this->teamsAlive--;
+            this->playerLives_.erase(player);
+            this->eachTeamsPlayers.clear();
+            this->timeToAct_.erase(player);
+            this->playerDelayTime_.erase(player);
+            this->inGame_.erase(player);
+        }
 
-            std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
-            if (it != this->players_.end())
-            {
-                if (it->first->getClientID()== CLIENTID_UNKNOWN)
-                    return true;
-                const std::string& message = ""; // resets Camper-Warning-message
-                this->gtinfo_->sendFadingMessage(message,it->first->getClientID());
-            }    
-        }
-        return allow;
+        return valid_player;
     }
 
     bool LastTeamStanding::allowPawnDeath(Pawn* victim, Pawn* originator)
     {
         if (!victim||!victim->getPlayer())// only for safety
             return true;
-        bool allow =TeamDeathmatch::allowPawnDeath(victim, originator);
+        bool allow = TeamDeathmatch::allowPawnDeath(victim, originator);
         if(!allow) {return allow;}
-        playerLives_[victim->getPlayer()]=playerLives_[victim->getPlayer()]-1;
-        this->inGame_[victim->getPlayer()]=false;//if player dies he, isn't allowed to respawn immediately
-        if (playerLives_[victim->getPlayer()]<=0)//if player lost all lives
+        
+        playerLives_[victim->getPlayer()] = playerLives_[victim->getPlayer()] - 1; //player lost a live
+        this->inGame_[victim->getPlayer()] = false; //if player dies, he isn't allowed to respawn immediately
+        if (playerLives_[victim->getPlayer()]<=0) //if player lost all lives
         {
             this->eachTeamsPlayers[getTeam(victim->getPlayer())]--;
-            if(eachTeamsPlayers[getTeam(victim->getPlayer())]==0)//last team member died
+            if(eachTeamsPlayers[getTeam(victim->getPlayer())] == 0) //last team member died
                 this->teamsAlive--;
             const std::string& message = victim->getPlayer()->getName() + " has lost all lives";
             COUT(0) << message << std::endl;
@@ -125,93 +124,47 @@
         return allow;
     }
 
-    int LastTeamStanding::getMinLives()
+    bool LastTeamStanding::allowPawnDamage(Pawn* victim, Pawn* originator)
     {
-        int min=lives;
-        for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)
+        bool allow = TeamDeathmatch::allowPawnDamage(victim, originator);
+        if(!allow) {return allow;}
+        if (originator && originator->getPlayer())// only for safety
         {
-            if (it->second<=0)
-                continue;
-            if (it->second<lives)
-                min=it->second;
-        }
-        return min;
-    }
+            this->timeToAct_[originator->getPlayer()] = timeRemaining;
 
-    void LastTeamStanding::end()//TODO!
-    {
-        Gametype::end();
-        
-        for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)
-        {
-            if (it->first->getClientID() == CLIENTID_UNKNOWN)
-                continue;
-
-            if (it->second > 0)
-                this->gtinfo_->sendAnnounceMessage("You have won the match!", it->first->getClientID());
-            else
-                this->gtinfo_->sendAnnounceMessage("You have lost the match!", it->first->getClientID());
+            std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
+            if (it != this->players_.end())
+            {
+                if (it->first->getClientID()== CLIENTID_UNKNOWN)
+                    return true;
+                const std::string& message = ""; // resets Camper-Warning-message
+                this->gtinfo_->sendFadingMessage(message,it->first->getClientID());
+            }    
         }
+        return allow;
     }
 
-    int LastTeamStanding::playerGetLives(PlayerInfo* player)
+    void LastTeamStanding::spawnDeadPlayersIfRequested()
     {
-        if (player)
-            return  playerLives_[player];
-        else
-            return 0;
+        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+            if (it->second.state_ == PlayerState::Dead)
+            {
+                bool alive = (0 < playerLives_[it->first]&&(inGame_[it->first]));
+                if (alive&&(it->first->isReadyToSpawn() || this->bForceSpawn_))
+                {
+                    this->spawnPlayer(it->first);
+                }
+            }
     }
-    
-    int LastTeamStanding::getNumTeamsAlive() const
-    {
-        return this->teamsAlive;
-    }
 
-    void LastTeamStanding::playerEntered(PlayerInfo* player)
-    {
-        if (!player)// only for safety
-            return;
-        TeamDeathmatch::playerEntered(player);
-        if (teamsAlive<=1)
-            playerLives_[player]=lives;
-        else
-            playerLives_[player]=getMinLives();//new players only get minimum of lives
-            
-        if(this->eachTeamsPlayers[getTeam(player)]==0)
-            this->teamsAlive++;
-        this->eachTeamsPlayers[getTeam(player)]++;
-        if (teamsAlive>1) // Now the game is allowed to end, since there are at least two teams.
-            bMinPlayersReached=true;
-        this->timeToAct_[player]=timeRemaining;
-        this->playerDelayTime_[player]=respawnDelay;
-        this->inGame_[player]=true;
-    }
-
-    bool LastTeamStanding::playerLeft(PlayerInfo* player)
-    {
-        bool valid_player = TeamDeathmatch::playerLeft(player);
-        if (valid_player)
-        {
-            this->eachTeamsPlayers[getTeam(player)]--;
-            if(this->eachTeamsPlayers[getTeam(player)]==0)
-                 this->teamsAlive--;
-            this->playerLives_.erase (player);
-            this->playerDelayTime_.erase (player);
-            this->inGame_.erase (player);
-            this->timeToAct_.erase(player);
-        }
-
-        return valid_player;
-    }
-
     void LastTeamStanding::playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn)
     {
         if (!player)
             return;
         TeamDeathmatch::playerStartsControllingPawn(player,pawn);
         
-        this->timeToAct_[player]=timeRemaining+3.0f+respawnDelay;//reset timer
-        this->playerDelayTime_[player]=respawnDelay;
+        this->timeToAct_[player] = timeRemaining + 3.0f + respawnDelay;//reset timer
+        this->playerDelayTime_[player] = respawnDelay;
         
         std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player);
         if (it != this->players_.end())
@@ -223,81 +176,133 @@
         }  
     }
 
-    void LastTeamStanding::punishPlayer(PlayerInfo* player)
-    {
-        if(!player)
-            return;
-        if(bNoPunishment)
-            return;
-        std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player);
-        if (it != this->players_.end())
-        {
-            if(!player->getControllableEntity())
-                return;
-            Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
-            if(!pawn)
-                return;
-            if(bHardPunishment)
-            {
-                pawn->kill();
-                this->timeToAct_[player]=timeRemaining+3.0f+respawnDelay;//reset timer
-            }
-            else
-            {
-                float damage=pawn->getMaxHealth()*punishDamageRate*0.5;//TODO: Factor 0.5 is hard coded. Where is the ratio between MaxHealth actually defined?
-                pawn->removeHealth(damage);
-                this->timeToAct_[player]=timeRemaining;//reset timer
-            }
-        }
-    }
-
     void LastTeamStanding::tick(float dt)
     {
         SUPER(LastTeamStanding, tick, dt);
         if(this->hasStarted()&&(!this->hasEnded()))
         {
-            if (bMinPlayersReached &&(this->hasStarted()&&(teamsAlive<=1)))//last team remaining
+            if (bMinTeamsReached &&(this->hasStarted()&&(teamsAlive<=1)))//last team remaining -> game will end
             {
                 this->end();
             }
             for (std::map<PlayerInfo*, float>::iterator it = this->timeToAct_.begin(); it != this->timeToAct_.end(); ++it)
             {   
-                if (playerGetLives(it->first)<=0)//Players without lives shouldn't be affected by time.
+                if (playerGetLives(it->first) <= 0)//Players without lives shouldn't be affected by time.
                     continue;     
-                it->second-=dt;//Decreases punishment time.
+                it->second -= dt;//Decreases punishment time.
                 if (!inGame_[it->first])//Manages respawn delay - player is forced to respawn after the delaytime is used up. 
                 {
-                    playerDelayTime_[it->first]-=dt;
-                    if (playerDelayTime_[it->first]<=0)
-                    this->inGame_[it->first]=true;
+                    playerDelayTime_[it->first] -= dt;
+                    if (playerDelayTime_[it->first] <= 0)
+                    this->inGame_[it->first] = true;
 
                     if (it->first->getClientID()== CLIENTID_UNKNOWN)
                         continue;
-                    int output=1+playerDelayTime_[it->first];
+                    int output = 1 + playerDelayTime_[it->first];
                     const std::string& message = "Respawn in " +multi_cast<std::string>(output)+ " seconds." ;//Countdown
                     this->gtinfo_->sendFadingMessage(message,it->first->getClientID());
                 }
-                else if (it->second<0.0f)
+                else if (it->second < 0.0f)
                 {
-                    it->second=timeRemaining+3.0f;//reset punishment-timer
-                    if (playerGetLives(it->first)>0)
+                    it->second = timeRemaining + 3.0f;//reset punishment-timer
+                    if (playerGetLives(it->first) > 0)
                     {
                         this->punishPlayer(it->first);
-                        if (it->first->getClientID()== CLIENTID_UNKNOWN)
+                        if (it->first->getClientID() == CLIENTID_UNKNOWN)
                             return;
                         const std::string& message = ""; // resets Camper-Warning-message
-                        this->gtinfo_->sendFadingMessage(message,it->first->getClientID());
+                        this->gtinfo_->sendFadingMessage(message, it->first->getClientID());
                     }
                 }
-                else if (it->second<timeRemaining/5)//Warning message
+                else if (it->second < timeRemaining/5)//Warning message
                 {
                     if (it->first->getClientID()== CLIENTID_UNKNOWN)
                         continue;
                     const std::string& message = "Camper Warning! Don't forget to shoot.";
-                    this->gtinfo_->sendFadingMessage(message,it->first->getClientID());
+                    this->gtinfo_->sendFadingMessage(message, it->first->getClientID());
                 }
             }
         }
     }
 
+    void LastTeamStanding::end()//TODO: Send the message to the whole team
+    {
+        Gametype::end();
+        
+        for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)
+        {
+            if (it->first->getClientID() == CLIENTID_UNKNOWN)
+                continue;
+
+            if (it->second > 0)
+                this->gtinfo_->sendAnnounceMessage("You have won the match!", it->first->getClientID());
+            else
+                this->gtinfo_->sendAnnounceMessage("You have lost the match!", it->first->getClientID());
+        /*//erase maps:
+            this->playerLives_.erase(it->first);
+            this->playerDelayTime_.erase (it->first);
+            this->inGame_.erase (it->first);
+            this->timeToAct_.erase(it->first);*/
+        }
+
+    }
+
+
+    int LastTeamStanding::getMinLives()
+    {
+        int min = lives;
+        for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)
+        {
+            if (it->second <= 0)
+                continue;
+            if (it->second < lives)
+                min = it->second;
+        }
+        return min;
+    }
+
+    void LastTeamStanding::punishPlayer(PlayerInfo* player)
+    {
+        if(!player)
+            return;
+        if(bNoPunishment)
+            return;
+        std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player);
+        if (it != this->players_.end())
+        {
+            if(!player->getControllableEntity())
+                return;
+            Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
+            if(!pawn)
+                return;
+            if(bHardPunishment)
+            {
+                pawn->kill();
+                this->timeToAct_[player] = timeRemaining + 3.0f + respawnDelay;//reset timer
+            }
+            else
+            {
+                float damage = pawn->getMaxHealth()*punishDamageRate*0.5;//TODO: Factor 0.5 is hard coded. Where is the ratio between MaxHealth actually defined?
+                pawn->removeHealth(damage);
+                this->timeToAct_[player] = timeRemaining;//reset timer
+            }
+        }
+    }
+
+    int LastTeamStanding::playerGetLives(PlayerInfo* player)
+    {
+        if (player)
+            return  playerLives_[player];
+        else
+            return 0;
+    }
+    
+    void LastTeamStanding::setConfigValues()
+    {
+        SetConfigValue(lives, 4);
+        SetConfigValue(timeRemaining, 15.0f);
+        SetConfigValue(respawnDelay, 4.0f);
+        SetConfigValue(bNoPunishment, false);
+        SetConfigValue(bHardPunishment, false);
+    }
 }

Modified: code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.h
===================================================================
--- code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.h	2011-02-14 19:24:00 UTC (rev 7889)
+++ code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.h	2011-02-14 19:29:14 UTC (rev 7890)
@@ -53,37 +53,42 @@
         protected:
             int lives; //!< Standard amount of lives. Each player starts a game with so many lives.
             std::map< PlayerInfo*, int > playerLives_; //!< Each player's lives are stored here.
+            std::vector<int> eachTeamsPlayers; //!<Number of players in each team.
             int teamsAlive; //!< Counter counting teams with more than one player remaining.
+//Data for CamperPunishment
             float timeRemaining; //!< Each player has a certain time where he or she has to hit an opponent or will be punished.
             std::map<PlayerInfo*, float> timeToAct_; //!< Each player's time till she/he will be punished is stored here.
+            bool bNoPunishment; //!< Config value to switch off Punishment function if it is set to true.
+            bool bHardPunishment; //!< Switches between damage and death as punishment.
+            float punishDamageRate; //!< Makes Damage adjustable.
+//Data for RespawnDelay
             float respawnDelay; //!<Time in seconds when a player will respawn after death.
             std::map<PlayerInfo*, float> playerDelayTime_; //!< Stores each Player's delay time.
             std::map<PlayerInfo*, bool> inGame_; //!< Indicates each Player's state.
-            bool bNoPunishment; //!< Config value to switch off Punishment function if it is set to true.
-            bool bHardPunishment; //!< Switches between damage and death as punishment.
-            float punishDamageRate; //!< Makes Damage adjustable.
+
+            bool bMinTeamsReached; //!< Lock. Game shouldn't end right at the beginning.
+
             virtual void spawnDeadPlayersIfRequested(); //!< Prevents dead players to respawn.
             virtual int getMinLives(); //!< Returns minimum of each player's lives; players with 0 lives are skipped;
-            int * eachTeamsPlayers; //!<Each teams player's alive.
-            bool bMinPlayersReached;
 
         public:
             LastTeamStanding(BaseObject* creator); //!< Default Constructor.
             virtual ~LastTeamStanding(); //!< Default Destructor.
-            void setConfigValues(); //!< Makes values configurable.
 
+            virtual void playerEntered(PlayerInfo* player); //!< Initializes values.
+            virtual bool playerLeft(PlayerInfo* player); //!< Manages all local variables.
+
+            virtual bool allowPawnDeath(Pawn* victim, Pawn* originator = 0); //!< Manages each player's lost lives.
             virtual bool allowPawnDamage(Pawn* victim, Pawn* originator = 0); //!< If a player shoot's an opponent, his punishment countdown will be resetted.
-            virtual bool allowPawnDeath(Pawn* victim, Pawn* originator = 0); //!< Manages each players lives.
-
+            virtual void playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn); //!< Resets punishment time and respawn delay.
+            void tick (float dt); //!< used to end the game
             virtual void end(); //!< Sends an end message.
+            void punishPlayer(PlayerInfo* player); //!< Function in order to kill a player. Punishment for hiding longer than "timeRemaining".
             int playerGetLives(PlayerInfo* player); //!< getFunction for the map "playerLives_".
-            int getNumTeamsAlive() const; //!< Returns the number of players that are still alive.
-            virtual void playerEntered(PlayerInfo* player); //!< Initializes values.
-            virtual bool playerLeft(PlayerInfo* player); //!< Manages all local variables.
-            virtual void playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn); //!< Resets punishment time and respawn delay.
+            inline int getNumTeamsAlive() const//!< Returns the number of players that are still alive.
+            {return this->teamsAlive;}
+            void setConfigValues(); //!< Makes values configurable.
 
-            void punishPlayer(PlayerInfo* player); //!< Function in order to kill a player. Punishment for hiding longer than "timeRemaining".
-            void tick (float dt); //!< used to end the game
     };
 }
 




More information about the Orxonox-commit mailing list