Index: server/DataAccess.cpp
===================================================================
--- server/DataAccess.cpp	(revision 5b1e31e39f3ea0090e0c657ccf06a11efeedd5de)
+++ server/DataAccess.cpp	(revision c76134b649c8642dc32a25d3f703e75387b50cc0)
@@ -84,4 +84,5 @@
       cout << "Creating a new player" << endl;
       p = new Player(string(row[1]), string(row[2]));
+      cout << "Created new player" << endl;
    }else {
       cout << "Returned no results for some reason" << endl;
Index: server/server.cpp
===================================================================
--- server/server.cpp	(revision 5b1e31e39f3ea0090e0c657ccf06a11efeedd5de)
+++ server/server.cpp	(revision c76134b649c8642dc32a25d3f703e75387b50cc0)
@@ -43,4 +43,5 @@
 void updateUnusedPlayerId(unsigned int& id, map<unsigned int, Player>& mapPlayers);
 void updateUnusedProjectileId(unsigned int& id, map<unsigned int, Projectile>& mapProjectiles);
+void damagePlayer(Player *p, int damage);
 
 // this should probably go somewhere in the common folder
@@ -150,4 +151,44 @@
          // set targets for all chasing players (or make them attack if they're close enough)
          for (it = mapPlayers.begin(); it != mapPlayers.end(); it++) {
+            // check if it's time to revive dead players
+            if (it->second.isDead) {
+               if (getCurrentMillis() - it->second.timeDied >= 10000) {
+                  it->second.isDead = false;
+
+                  POSITION spawnPos;
+ 
+                  switch (it->second.team) {
+                  case 0:// blue team
+                     spawnPos = gameMap->getStructureLocation(WorldMap::STRUCTURE_BLUE_FLAG);
+                     break;
+                  case 1:// red team
+                     spawnPos = gameMap->getStructureLocation(WorldMap::STRUCTURE_RED_FLAG);
+                     break;
+                  default:
+                     // should never go here
+                     cout << "Error: Invalid team" << endl;
+                     break;
+                  }
+
+                  // spawn the player to the right of their flag location
+                  spawnPos.x = (spawnPos.x+1) * 25 + 12;
+                  spawnPos.y = spawnPos.y * 25 + 12;
+
+                  it->second.pos = spawnPos.toFloat();
+
+                  serverMsg.type = MSG_TYPE_PLAYER;
+                  it->second.serialize(serverMsg.buffer);
+
+                  map<unsigned int, Player>::iterator it2;
+                  for (it2 = mapPlayers.begin(); it2 != mapPlayers.end(); it2++)
+                  {
+                     if ( sendMessage(&serverMsg, sock, &(it2->second.addr)) < 0 )
+                        error("sendMessage");
+                  }
+               }
+
+               continue;
+            }
+
             if (it->second.updateTarget(mapPlayers)) {
                serverMsg.type = MSG_TYPE_PLAYER;
@@ -364,8 +405,5 @@
 
                   Player* target = &mapPlayers[it->second.targetPlayer];
-
-                  target->health -= it->second.damage;
-                  if (target->health < 0)
-                     target->health = 0;
+                  damagePlayer(target, it->second.damage);
 
                   serverMsg.type = MSG_TYPE_PLAYER;
@@ -408,4 +446,5 @@
          map<unsigned int, Projectile>::iterator itProj;
          for (itProj = mapProjectiles.begin(); itProj != mapProjectiles.end(); itProj++) {
+            cout << "About to call projectile move" << endl;
             if (itProj->second.move(mapPlayers)) {
                // send a REMOVE_PROJECTILE message
@@ -427,7 +466,5 @@
                Player* target = &mapPlayers[itProj->second.target];
 
-               target->health -= itProj->second.damage;
-               if (target->health < 0)
-                  target->health = 0;
+               damagePlayer(target, itProj->second.damage);
 
                serverMsg.type = MSG_TYPE_PLAYER;
@@ -441,4 +478,5 @@
                }
             }
+            cout << "Projectile was not moved" << endl;
          }
       }
@@ -860,2 +898,12 @@
       id++;
 }
+
+void damagePlayer(Player *p, int damage) {
+   p->health -= damage;
+   if (p->health < 0)
+      p->health = 0;
+   if (p->health == 0) {
+      p->isDead = true;
+      p->timeDied = getCurrentMillis();
+   }
+}
