[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