Index: common/Game.cpp
===================================================================
--- common/Game.cpp	(revision 1d96513b80d281afb2ab33ce592970675bd51c8c)
+++ common/Game.cpp	(revision 45734ffbdc402a252cd6cb03ff255cd673cfce55)
@@ -37,6 +37,38 @@
 }
 
+bool Game::addPlayer(Player* p) {
+   if (players.find(p->id) == players.end()) {
+      players[p->id] = p;
+      return true;
+   }
+   else
+      return false;
+}
+
+bool Game::removePlayer(unsigned int id) {
+   if (players.erase(id) == 1)
+      return true;
+   else
+      return false;
+}
+
 map<unsigned int, Projectile>& Game::getProjectiles() {
    return this->projectiles;
+}
+
+bool Game::addProjectile(Projectile p) {
+   if (projectiles.find(p.id) == projectiles.end()) {
+      projectiles[p.id] = p;
+      return true;
+   }
+   else
+      return false;
+}
+
+bool Game::removeProjectile(unsigned int id) {
+   if (projectiles.erase(id) == 1)
+      return true;
+   else
+      return false;
 }
 
@@ -63,20 +95,4 @@
 void Game::setBlueScore(int score) {
    this->blueScore = score;
-}
-
-bool Game::addPlayer(Player* p) {
-   if (players.find(p->id) == players.end()) {
-      players[p->id] = p;
-      return true;
-   }
-   else
-      return false;
-}
-
-bool Game::removePlayer(unsigned int id) {
-   if (players.erase(id) == 1)
-      return true;
-   else
-      return false;
 }
 
@@ -159,17 +175,11 @@
 }
 
-bool Game::addProjectile(Projectile p) {
-   if (projectiles.find(p.id) == projectiles.end()) {
-      projectiles[p.id] = p;
-      return true;
-   }
-   else
-      return false;
+void Game::assignProjectileId(Projectile* p) {
+   p->id = unusedProjectileId;
+   updateUnusedProjectileId();
 }
 
-bool Game::removeProjectile(unsigned int id) {
-   if (projectiles.erase(id) == 1)
-      return true;
-   else
-      return false;
+void Game::updateUnusedProjectileId() {
+   while (projectiles.find(unusedProjectileId) != projectiles.end())
+      unusedProjectileId++;
 }
Index: common/Game.h
===================================================================
--- common/Game.h	(revision 1d96513b80d281afb2ab33ce592970675bd51c8c)
+++ common/Game.h	(revision 45734ffbdc402a252cd6cb03ff255cd673cfce55)
@@ -26,4 +26,5 @@
    int blueScore;
    int redScore;
+   unsigned int unusedProjectileId;
 
 public:
@@ -35,6 +36,4 @@
    string getName();
    int getNumPlayers();
-   map<unsigned int, Player*>& getPlayers();
-   map<unsigned int, Projectile>& getProjectiles();
    int getBlueScore();
    int getRedScore();
@@ -45,12 +44,18 @@
    void setRedScore(int score);
 
+   map<unsigned int, Player*>& getPlayers();
    bool addPlayer(Player* p);
    bool removePlayer(unsigned int id);
+
+   map<unsigned int, Projectile>& getProjectiles();
+   bool addProjectile(Projectile p);
+   bool removeProjectile(unsigned int id);
+
    bool startPlayerMovement(unsigned int id, int x, int y);
    bool processPlayerMovement(Player* p, FLOAT_POSITION oldPos);
    int processFlagPickupRequest(Player* p);
 
-   bool addProjectile(Projectile p);
-   bool removeProjectile(unsigned int id);
+   void assignProjectileId(Projectile* p);
+   void updateUnusedProjectileId();
 };
 
Index: server/server.cpp
===================================================================
--- server/server.cpp	(revision 1d96513b80d281afb2ab33ce592970675bd51c8c)
+++ server/server.cpp	(revision 45734ffbdc402a252cd6cb03ff255cd673cfce55)
@@ -48,5 +48,4 @@
 
 void updateUnusedPlayerId(unsigned int& id, map<unsigned int, Player*>& mapPlayers);
-void updateUnusedProjectileId(unsigned int& id, map<unsigned int, Projectile>& mapProjectiles);
 Player *findPlayerByName(map<unsigned int, Player*> &m, string name);
 Player *findPlayerByAddr(map<unsigned int, Player*> &m, const sockaddr_in &addr);
@@ -476,10 +475,10 @@
 
                   Projectile proj(p->pos.x, p->pos.y, p->targetPlayer, p->damage);
-                  proj.id = unusedProjectileId;
-                  updateUnusedProjectileId(unusedProjectileId, mapProjectiles);
-                  mapProjectiles[proj.id] = proj;
-
-                  int x = it->second->pos.x;
-                  int y = it->second->pos.y;
+                  p->currentGame->assignProjectileId(&proj);
+                  
+                  p->currentGame->addProjectile(proj);
+
+                  int x = p->pos.x;
+                  int y = p->pos.y;
 
                   serverMsg.type = MSG_TYPE_PROJECTILE;
@@ -487,5 +486,5 @@
                   memcpy(serverMsg.buffer+4, &x, 4);
                   memcpy(serverMsg.buffer+8, &y, 4);
-                  memcpy(serverMsg.buffer+12, &it->second->targetPlayer, 4);
+                  memcpy(serverMsg.buffer+12, &p->targetPlayer, 4);
                }
                else
@@ -507,4 +506,5 @@
          // move all projectiles
          // see if this can be moved inside the game class
+         // this method can be moved when I add a MessageProcessor to the Game class
          map<unsigned int, Projectile>::iterator itProj;
          for (itProj = mapProjectiles.begin(); itProj != mapProjectiles.end(); itProj++)
@@ -1198,10 +1198,4 @@
 }
 
-void updateUnusedProjectileId(unsigned int& id, map<unsigned int, Projectile>& mapProjectiles)
-{
-   while (mapProjectiles.find(id) != mapProjectiles.end())
-      id++;
-}
-
 Player *findPlayerByName(map<unsigned int, Player*> &m, string name)
 {
