Changeset 7890 for code/branches/lastmanstanding2/src/orxonox
- Timestamp:
- Feb 14, 2011, 8:29:14 PM (14 years ago)
- Location:
- code/branches/lastmanstanding2/src/orxonox/gametypes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.cc
r7699 r7890 43 43 LastTeamStanding::LastTeamStanding(BaseObject* creator) : TeamDeathmatch(creator) 44 44 { 45 RegisterObject(LastTeamStanding); 46 this->bForceSpawn_=true; 47 this->lives=4; 48 this->teamsAlive=0; 49 this->timeRemaining=15.0f; 50 this->respawnDelay=4.0f; 51 this->bNoPunishment=false; 52 this->bHardPunishment=false; 53 this->punishDamageRate=0.4f; 54 this->setHUDTemplate("LastTeamStandingHUD");//tolowercase:-) 55 this->eachTeamsPlayers = new int[teams_]; 56 this->bMinPlayersReached = false; 45 this->bForceSpawn_ = true; 46 this->lives = 1;//4 47 this->eachTeamsPlayers.reserve(teams_); 48 this->teamsAlive = 0; 49 this->bMinTeamsReached = false; 50 this->bNoPunishment = false; 51 this->bHardPunishment = false; 52 this->punishDamageRate = 0.4f; 53 this->timeRemaining = 15.0f; 54 this->respawnDelay = 4.0f; 57 55 } 58 56 59 57 LastTeamStanding::~LastTeamStanding() 60 58 { 61 delete[] this->eachTeamsPlayers; 59 this->playerLives_.clear(); 60 this->eachTeamsPlayers.clear(); 61 this->timeToAct_.clear(); 62 this->playerDelayTime_.clear(); 63 this->inGame_.clear(); 62 64 } 63 64 void LastTeamStanding::spawnDeadPlayersIfRequested()65 {66 for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)67 if (it->second.state_ == PlayerState::Dead)68 {69 bool alive = (0<playerLives_[it->first]&&(inGame_[it->first]));70 if (alive&&(it->first->isReadyToSpawn() || this->bForceSpawn_))71 {72 this->spawnPlayer(it->first);73 }74 }75 }76 77 78 void LastTeamStanding::setConfigValues()79 {80 SetConfigValue(lives, 4);81 SetConfigValue(timeRemaining, 15.0f);82 SetConfigValue(respawnDelay, 4.0f);83 SetConfigValue(bNoPunishment, false);84 SetConfigValue(bHardPunishment, false);85 }86 87 bool LastTeamStanding::allowPawnDamage(Pawn* victim, Pawn* originator)88 {89 bool allow = TeamDeathmatch::allowPawnDamage(victim, originator);90 if(!allow) {return allow;}91 if (originator && originator->getPlayer())// only for safety92 {93 this->timeToAct_[originator->getPlayer()]=timeRemaining;94 95 std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());96 if (it != this->players_.end())97 {98 if (it->first->getClientID()== CLIENTID_UNKNOWN)99 return true;100 const std::string& message = ""; // resets Camper-Warning-message101 this->gtinfo_->sendFadingMessage(message,it->first->getClientID());102 }103 }104 return allow;105 }106 107 bool LastTeamStanding::allowPawnDeath(Pawn* victim, Pawn* originator)108 {109 if (!victim||!victim->getPlayer())// only for safety110 return true;111 bool allow =TeamDeathmatch::allowPawnDeath(victim, originator);112 if(!allow) {return allow;}113 playerLives_[victim->getPlayer()]=playerLives_[victim->getPlayer()]-1;114 this->inGame_[victim->getPlayer()]=false;//if player dies he, isn't allowed to respawn immediately115 if (playerLives_[victim->getPlayer()]<=0)//if player lost all lives116 {117 this->eachTeamsPlayers[getTeam(victim->getPlayer())]--;118 if(eachTeamsPlayers[getTeam(victim->getPlayer())]==0)//last team member died119 this->teamsAlive--;120 const std::string& message = victim->getPlayer()->getName() + " has lost all lives";121 COUT(0) << message << std::endl;122 Host::Broadcast(message);123 }124 125 return allow;126 }127 128 int LastTeamStanding::getMinLives()129 {130 int min=lives;131 for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)132 {133 if (it->second<=0)134 continue;135 if (it->second<lives)136 min=it->second;137 }138 return min;139 }140 141 void LastTeamStanding::end()//TODO!142 {143 Gametype::end();144 145 for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it)146 {147 if (it->first->getClientID() == CLIENTID_UNKNOWN)148 continue;149 150 if (it->second > 0)151 this->gtinfo_->sendAnnounceMessage("You have won the match!", it->first->getClientID());152 else153 this->gtinfo_->sendAnnounceMessage("You have lost the match!", it->first->getClientID());154 }155 }156 157 int LastTeamStanding::playerGetLives(PlayerInfo* player)158 {159 if (player)160 return playerLives_[player];161 else162 return 0;163 }164 165 int LastTeamStanding::getNumTeamsAlive() const166 {167 return this->teamsAlive;168 }169 65 170 66 void LastTeamStanding::playerEntered(PlayerInfo* player) … … 177 73 else 178 74 playerLives_[player]=getMinLives();//new players only get minimum of lives 179 180 if(this->eachTeamsPlayers[getTeam(player)]==0) 75 76 if(this->eachTeamsPlayers[getTeam(player)]==0) //if a player is the first in his group, a new team is alive 181 77 this->teamsAlive++; 182 this->eachTeamsPlayers[getTeam(player)]++; 78 this->eachTeamsPlayers[getTeam(player)]++; //the number of player in this team is increased 79 183 80 if (teamsAlive>1) // Now the game is allowed to end, since there are at least two teams. 184 bMin PlayersReached=true;185 this->timeToAct_[player] =timeRemaining;186 this->playerDelayTime_[player] =respawnDelay;187 this->inGame_[player] =true;81 bMinTeamsReached = true; // since there are at least two teams, the game is allowed to end 82 this->timeToAct_[player] = timeRemaining; 83 this->playerDelayTime_[player] = respawnDelay; 84 this->inGame_[player] = true; 188 85 } 189 86 … … 193 90 if (valid_player) 194 91 { 195 this->eachTeamsPlayers[getTeam(player)]--; 196 if(this->eachTeamsPlayers[getTeam(player)] ==0)92 this->eachTeamsPlayers[getTeam(player)]--; // a player left the team 93 if(this->eachTeamsPlayers[getTeam(player)] == 0) // if it was the last player a team died 197 94 this->teamsAlive--; 198 this->playerLives_.erase (player); 199 this->playerDelayTime_.erase (player); 200 this->inGame_.erase (player); 95 this->playerLives_.erase(player); 96 this->eachTeamsPlayers.clear(); 201 97 this->timeToAct_.erase(player); 98 this->playerDelayTime_.erase(player); 99 this->inGame_.erase(player); 202 100 } 203 101 204 102 return valid_player; 103 } 104 105 bool LastTeamStanding::allowPawnDeath(Pawn* victim, Pawn* originator) 106 { 107 if (!victim||!victim->getPlayer())// only for safety 108 return true; 109 bool allow = TeamDeathmatch::allowPawnDeath(victim, originator); 110 if(!allow) {return allow;} 111 112 playerLives_[victim->getPlayer()] = playerLives_[victim->getPlayer()] - 1; //player lost a live 113 this->inGame_[victim->getPlayer()] = false; //if player dies, he isn't allowed to respawn immediately 114 if (playerLives_[victim->getPlayer()]<=0) //if player lost all lives 115 { 116 this->eachTeamsPlayers[getTeam(victim->getPlayer())]--; 117 if(eachTeamsPlayers[getTeam(victim->getPlayer())] == 0) //last team member died 118 this->teamsAlive--; 119 const std::string& message = victim->getPlayer()->getName() + " has lost all lives"; 120 COUT(0) << message << std::endl; 121 Host::Broadcast(message); 122 } 123 124 return allow; 125 } 126 127 bool LastTeamStanding::allowPawnDamage(Pawn* victim, Pawn* originator) 128 { 129 bool allow = TeamDeathmatch::allowPawnDamage(victim, originator); 130 if(!allow) {return allow;} 131 if (originator && originator->getPlayer())// only for safety 132 { 133 this->timeToAct_[originator->getPlayer()] = timeRemaining; 134 135 std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer()); 136 if (it != this->players_.end()) 137 { 138 if (it->first->getClientID()== CLIENTID_UNKNOWN) 139 return true; 140 const std::string& message = ""; // resets Camper-Warning-message 141 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 142 } 143 } 144 return allow; 145 } 146 147 void LastTeamStanding::spawnDeadPlayersIfRequested() 148 { 149 for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it) 150 if (it->second.state_ == PlayerState::Dead) 151 { 152 bool alive = (0 < playerLives_[it->first]&&(inGame_[it->first])); 153 if (alive&&(it->first->isReadyToSpawn() || this->bForceSpawn_)) 154 { 155 this->spawnPlayer(it->first); 156 } 157 } 205 158 } 206 159 … … 211 164 TeamDeathmatch::playerStartsControllingPawn(player,pawn); 212 165 213 this->timeToAct_[player] =timeRemaining+3.0f+respawnDelay;//reset timer214 this->playerDelayTime_[player] =respawnDelay;166 this->timeToAct_[player] = timeRemaining + 3.0f + respawnDelay;//reset timer 167 this->playerDelayTime_[player] = respawnDelay; 215 168 216 169 std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player); … … 222 175 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 223 176 } 177 } 178 179 void LastTeamStanding::tick(float dt) 180 { 181 SUPER(LastTeamStanding, tick, dt); 182 if(this->hasStarted()&&(!this->hasEnded())) 183 { 184 if (bMinTeamsReached &&(this->hasStarted()&&(teamsAlive<=1)))//last team remaining -> game will end 185 { 186 this->end(); 187 } 188 for (std::map<PlayerInfo*, float>::iterator it = this->timeToAct_.begin(); it != this->timeToAct_.end(); ++it) 189 { 190 if (playerGetLives(it->first) <= 0)//Players without lives shouldn't be affected by time. 191 continue; 192 it->second -= dt;//Decreases punishment time. 193 if (!inGame_[it->first])//Manages respawn delay - player is forced to respawn after the delaytime is used up. 194 { 195 playerDelayTime_[it->first] -= dt; 196 if (playerDelayTime_[it->first] <= 0) 197 this->inGame_[it->first] = true; 198 199 if (it->first->getClientID()== CLIENTID_UNKNOWN) 200 continue; 201 int output = 1 + playerDelayTime_[it->first]; 202 const std::string& message = "Respawn in " +multi_cast<std::string>(output)+ " seconds." ;//Countdown 203 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 204 } 205 else if (it->second < 0.0f) 206 { 207 it->second = timeRemaining + 3.0f;//reset punishment-timer 208 if (playerGetLives(it->first) > 0) 209 { 210 this->punishPlayer(it->first); 211 if (it->first->getClientID() == CLIENTID_UNKNOWN) 212 return; 213 const std::string& message = ""; // resets Camper-Warning-message 214 this->gtinfo_->sendFadingMessage(message, it->first->getClientID()); 215 } 216 } 217 else if (it->second < timeRemaining/5)//Warning message 218 { 219 if (it->first->getClientID()== CLIENTID_UNKNOWN) 220 continue; 221 const std::string& message = "Camper Warning! Don't forget to shoot."; 222 this->gtinfo_->sendFadingMessage(message, it->first->getClientID()); 223 } 224 } 225 } 226 } 227 228 void LastTeamStanding::end()//TODO: Send the message to the whole team 229 { 230 Gametype::end(); 231 232 for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it) 233 { 234 if (it->first->getClientID() == CLIENTID_UNKNOWN) 235 continue; 236 237 if (it->second > 0) 238 this->gtinfo_->sendAnnounceMessage("You have won the match!", it->first->getClientID()); 239 else 240 this->gtinfo_->sendAnnounceMessage("You have lost the match!", it->first->getClientID()); 241 /*//erase maps: 242 this->playerLives_.erase(it->first); 243 this->playerDelayTime_.erase (it->first); 244 this->inGame_.erase (it->first); 245 this->timeToAct_.erase(it->first);*/ 246 } 247 248 } 249 250 251 int LastTeamStanding::getMinLives() 252 { 253 int min = lives; 254 for (std::map<PlayerInfo*, int>::iterator it = this->playerLives_.begin(); it != this->playerLives_.end(); ++it) 255 { 256 if (it->second <= 0) 257 continue; 258 if (it->second < lives) 259 min = it->second; 260 } 261 return min; 224 262 } 225 263 … … 241 279 { 242 280 pawn->kill(); 243 this->timeToAct_[player] =timeRemaining+3.0f+respawnDelay;//reset timer281 this->timeToAct_[player] = timeRemaining + 3.0f + respawnDelay;//reset timer 244 282 } 245 283 else 246 284 { 247 float damage =pawn->getMaxHealth()*punishDamageRate*0.5;//TODO: Factor 0.5 is hard coded. Where is the ratio between MaxHealth actually defined?285 float damage = pawn->getMaxHealth()*punishDamageRate*0.5;//TODO: Factor 0.5 is hard coded. Where is the ratio between MaxHealth actually defined? 248 286 pawn->removeHealth(damage); 249 this->timeToAct_[player]=timeRemaining;//reset timer 250 } 251 } 252 } 253 254 void LastTeamStanding::tick(float dt) 255 { 256 SUPER(LastTeamStanding, tick, dt); 257 if(this->hasStarted()&&(!this->hasEnded())) 258 { 259 if (bMinPlayersReached &&(this->hasStarted()&&(teamsAlive<=1)))//last team remaining 260 { 261 this->end(); 262 } 263 for (std::map<PlayerInfo*, float>::iterator it = this->timeToAct_.begin(); it != this->timeToAct_.end(); ++it) 264 { 265 if (playerGetLives(it->first)<=0)//Players without lives shouldn't be affected by time. 266 continue; 267 it->second-=dt;//Decreases punishment time. 268 if (!inGame_[it->first])//Manages respawn delay - player is forced to respawn after the delaytime is used up. 269 { 270 playerDelayTime_[it->first]-=dt; 271 if (playerDelayTime_[it->first]<=0) 272 this->inGame_[it->first]=true; 273 274 if (it->first->getClientID()== CLIENTID_UNKNOWN) 275 continue; 276 int output=1+playerDelayTime_[it->first]; 277 const std::string& message = "Respawn in " +multi_cast<std::string>(output)+ " seconds." ;//Countdown 278 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 279 } 280 else if (it->second<0.0f) 281 { 282 it->second=timeRemaining+3.0f;//reset punishment-timer 283 if (playerGetLives(it->first)>0) 284 { 285 this->punishPlayer(it->first); 286 if (it->first->getClientID()== CLIENTID_UNKNOWN) 287 return; 288 const std::string& message = ""; // resets Camper-Warning-message 289 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 290 } 291 } 292 else if (it->second<timeRemaining/5)//Warning message 293 { 294 if (it->first->getClientID()== CLIENTID_UNKNOWN) 295 continue; 296 const std::string& message = "Camper Warning! Don't forget to shoot."; 297 this->gtinfo_->sendFadingMessage(message,it->first->getClientID()); 298 } 299 } 300 } 301 } 302 287 this->timeToAct_[player] = timeRemaining;//reset timer 288 } 289 } 290 } 291 292 int LastTeamStanding::playerGetLives(PlayerInfo* player) 293 { 294 if (player) 295 return playerLives_[player]; 296 else 297 return 0; 298 } 299 300 void LastTeamStanding::setConfigValues() 301 { 302 SetConfigValue(lives, 4); 303 SetConfigValue(timeRemaining, 15.0f); 304 SetConfigValue(respawnDelay, 4.0f); 305 SetConfigValue(bNoPunishment, false); 306 SetConfigValue(bHardPunishment, false); 307 } 303 308 } -
code/branches/lastmanstanding2/src/orxonox/gametypes/LastTeamStanding.h
r7699 r7890 54 54 int lives; //!< Standard amount of lives. Each player starts a game with so many lives. 55 55 std::map< PlayerInfo*, int > playerLives_; //!< Each player's lives are stored here. 56 std::vector<int> eachTeamsPlayers; //!<Number of players in each team. 56 57 int teamsAlive; //!< Counter counting teams with more than one player remaining. 58 //Data for CamperPunishment 57 59 float timeRemaining; //!< Each player has a certain time where he or she has to hit an opponent or will be punished. 58 60 std::map<PlayerInfo*, float> timeToAct_; //!< Each player's time till she/he will be punished is stored here. 61 bool bNoPunishment; //!< Config value to switch off Punishment function if it is set to true. 62 bool bHardPunishment; //!< Switches between damage and death as punishment. 63 float punishDamageRate; //!< Makes Damage adjustable. 64 //Data for RespawnDelay 59 65 float respawnDelay; //!<Time in seconds when a player will respawn after death. 60 66 std::map<PlayerInfo*, float> playerDelayTime_; //!< Stores each Player's delay time. 61 67 std::map<PlayerInfo*, bool> inGame_; //!< Indicates each Player's state. 62 bool bNoPunishment; //!< Config value to switch off Punishment function if it is set to true. 63 bool b HardPunishment; //!< Switches between damage and death as punishment.64 float punishDamageRate; //!< Makes Damage adjustable. 68 69 bool bMinTeamsReached; //!< Lock. Game shouldn't end right at the beginning. 70 65 71 virtual void spawnDeadPlayersIfRequested(); //!< Prevents dead players to respawn. 66 72 virtual int getMinLives(); //!< Returns minimum of each player's lives; players with 0 lives are skipped; 67 int * eachTeamsPlayers; //!<Each teams player's alive.68 bool bMinPlayersReached;69 73 70 74 public: 71 75 LastTeamStanding(BaseObject* creator); //!< Default Constructor. 72 76 virtual ~LastTeamStanding(); //!< Default Destructor. 77 78 virtual void playerEntered(PlayerInfo* player); //!< Initializes values. 79 virtual bool playerLeft(PlayerInfo* player); //!< Manages all local variables. 80 81 virtual bool allowPawnDeath(Pawn* victim, Pawn* originator = 0); //!< Manages each player's lost lives. 82 virtual bool allowPawnDamage(Pawn* victim, Pawn* originator = 0); //!< If a player shoot's an opponent, his punishment countdown will be resetted. 83 virtual void playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn); //!< Resets punishment time and respawn delay. 84 void tick (float dt); //!< used to end the game 85 virtual void end(); //!< Sends an end message. 86 void punishPlayer(PlayerInfo* player); //!< Function in order to kill a player. Punishment for hiding longer than "timeRemaining". 87 int playerGetLives(PlayerInfo* player); //!< getFunction for the map "playerLives_". 88 inline int getNumTeamsAlive() const//!< Returns the number of players that are still alive. 89 {return this->teamsAlive;} 73 90 void setConfigValues(); //!< Makes values configurable. 74 91 75 virtual bool allowPawnDamage(Pawn* victim, Pawn* originator = 0); //!< If a player shoot's an opponent, his punishment countdown will be resetted.76 virtual bool allowPawnDeath(Pawn* victim, Pawn* originator = 0); //!< Manages each players lives.77 78 virtual void end(); //!< Sends an end message.79 int playerGetLives(PlayerInfo* player); //!< getFunction for the map "playerLives_".80 int getNumTeamsAlive() const; //!< Returns the number of players that are still alive.81 virtual void playerEntered(PlayerInfo* player); //!< Initializes values.82 virtual bool playerLeft(PlayerInfo* player); //!< Manages all local variables.83 virtual void playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn); //!< Resets punishment time and respawn delay.84 85 void punishPlayer(PlayerInfo* player); //!< Function in order to kill a player. Punishment for hiding longer than "timeRemaining".86 void tick (float dt); //!< used to end the game87 92 }; 88 93 }
Note: See TracChangeset
for help on using the changeset viewer.