Index: common/Game.cpp
===================================================================
--- common/Game.cpp	(revision 321fbbcd4bc1a950bc6f5ab7ccb3e95550079f91)
+++ common/Game.cpp	(revision b92e6a797b3a06a7df69743ddb9f239cf9c163de)
@@ -6,4 +6,7 @@
    this->id = 0;
    this->name = "";
+   this->blueScore = 0;
+   this->redScore = 0;
+   this->worldMap = NULL;
 }
 
@@ -11,15 +14,35 @@
    this->id = 0;
    this->name = name;
+   this->blueScore = 0;
+   this->redScore = 0;
+   this->worldMap = WorldMap::loadMapFromFile("../data/map.txt");
 }
 
 Game::~Game() {
-}
-
-void Game::setId(int id) {
-   this->id = id;
+   delete this->worldMap;
 }
 
 int Game::getNumPlayers() {
-   return players.size();
+   return this->players.size();
+}
+
+map<unsigned int, Player*>& Game::getPlayers() {
+   return this->players;
+}
+
+int Game::getRedScore() {
+   return this->redScore;
+}
+
+int Game::getBlueScore() {
+   return this->blueScore;
+}
+
+WorldMap* Game::getMap() {
+   return this->worldMap;
+}
+
+void Game::setId(unsigned int id) {
+   this->id = id;
 }
 
@@ -33,5 +56,5 @@
 }
 
-bool Game::removePlayer(int id) {
+bool Game::removePlayer(unsigned int id) {
    if (players.erase(id) == 1)
       return true;
@@ -39,2 +62,10 @@
       return false;
 }
+
+void Game::setRedScore(int score) {
+   this->redScore = score;
+}
+
+void Game::setBlueScore(int score) {
+   this->blueScore = score;
+}
Index: common/Game.h
===================================================================
--- common/Game.h	(revision 321fbbcd4bc1a950bc6f5ab7ccb3e95550079f91)
+++ common/Game.h	(revision b92e6a797b3a06a7df69743ddb9f239cf9c163de)
@@ -15,4 +15,5 @@
 
 #include "Player.h"
+#include "WorldMap.h"
 
 using namespace std;
@@ -20,7 +21,10 @@
 class Game {
 private:
-   int id;
+   unsigned int id;
    string name;
-   map<int, Player*> players;
+   map<unsigned int, Player*> players;
+   WorldMap* worldMap;
+   int blueScore;
+   int redScore;
 
 public:
@@ -31,8 +35,14 @@
 
    int getNumPlayers();
+   map<unsigned int, Player*>& getPlayers();
+   int getBlueScore();
+   int getRedScore();
+   WorldMap* getMap();
 
-   void setId(int id);
+   void setId(unsigned int id);
    bool addPlayer(Player* p);
-   bool removePlayer(int id);
+   bool removePlayer(unsigned int id);
+   void setBlueScore(int score);
+   void setRedScore(int score);
 };
 
Index: common/WorldMap.cpp
===================================================================
--- common/WorldMap.cpp	(revision 321fbbcd4bc1a950bc6f5ab7ccb3e95550079f91)
+++ common/WorldMap.cpp	(revision b92e6a797b3a06a7df69743ddb9f239cf9c163de)
@@ -194,5 +194,5 @@
 WorldMap* WorldMap::loadMapFromFile(string filename)
 {
-    WorldMap* m = NULL;
+   WorldMap* m = NULL;
 
    ifstream file(filename.c_str());
Index: server/server.cpp
===================================================================
--- server/server.cpp	(revision 321fbbcd4bc1a950bc6f5ab7ccb3e95550079f91)
+++ server/server.cpp	(revision b92e6a797b3a06a7df69743ddb9f239cf9c163de)
@@ -935,7 +935,65 @@
          cout << "Game name: " << gameName << endl;
 
+         Player* p = findPlayerByAddr(mapPlayers, from);
+
          mapGames[gameName] = Game(gameName);
-         mapGames[gameName].addPlayer(findPlayerByAddr(mapPlayers, from));
-         int numPlayers = mapGames[gameName].getNumPlayers();
+         Game& g = mapGames[gameName];
+         g.addPlayer(p);
+         int numPlayers = g.getNumPlayers();
+
+         map<unsigned int, Player*>& otherPlayers = g.getPlayers();
+
+         // choose a random team (either 0 or 1)
+         p->team = rand() % 2;
+
+         // tell the new player about all the existing players
+         cout << "Sending other players to new player" << endl;
+
+         map<unsigned int, Player*>::iterator it;
+         for (it = otherPlayers.begin(); it != otherPlayers.end(); it++)
+         {
+            it->second->serialize(serverMsg.buffer);
+
+            cout << "sending info about " << it->second->name  << endl;
+            cout << "sending id " << it->second->id  << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+               error("sendMessage");
+         }
+
+         // tell the new player about all map objects
+         // (currently just the flags)
+
+         serverMsg.type = MSG_TYPE_OBJECT;
+         vector<WorldMap::Object>* vctObjects = g.getMap()->getObjects();
+         vector<WorldMap::Object>::iterator itObjects;
+         cout << "sending items" << endl;
+         for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
+            itObjects->serialize(serverMsg.buffer);
+            cout << "sending item id " << itObjects->id  << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+               error("sendMessage");
+         }
+
+         // send the current score
+         serverMsg.type = MSG_TYPE_SCORE;
+
+         int game_blueScore = g.getBlueScore();
+         int game_redScore = g.getRedScore();
+         memcpy(serverMsg.buffer, &game_blueScore, 4);
+         memcpy(serverMsg.buffer+4, &game_redScore, 4);
+
+         if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+            error("sendMessage");
+
+         serverMsg.type = MSG_TYPE_PLAYER;
+         p->serialize(serverMsg.buffer);
+         cout << "Should be broadcasting the message" << endl;
+
+         for (it = otherPlayers.begin(); it != otherPlayers.end(); it++)
+         {
+            cout << "Sent message back to " << it->second->name << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &(it->second->addr), &outputLog) < 0 )
+               error("sendMessage");
+         }
 
          serverMsg.type = MSG_TYPE_GAME_INFO;
@@ -953,6 +1011,66 @@
          cout << "Game name: " << gameName << endl;
 
-         mapGames[gameName].addPlayer(findPlayerByAddr(mapPlayers, from));
-         int numPlayers = mapGames[gameName].getNumPlayers();
+         Player* p = findPlayerByAddr(mapPlayers, from);
+
+         Game& g = mapGames[gameName];
+         if (!g.addPlayer(p))
+            cout << "Player " << p->name << " trying to join a game he's already in" << endl;
+         int numPlayers = g.getNumPlayers();
+
+         map<unsigned int, Player*>& otherPlayers = g.getPlayers();
+
+         // choose a random team (either 0 or 1)
+         p->team = rand() % 2;
+
+         // tell the new player about all the existing players
+         cout << "Sending other players to new player" << endl;
+
+         map<unsigned int, Player*>::iterator it;
+         for (it = otherPlayers.begin(); it != otherPlayers.end(); it++)
+         {
+            it->second->serialize(serverMsg.buffer);
+
+            cout << "sending info about " << it->second->name  << endl;
+            cout << "sending id " << it->second->id  << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+               error("sendMessage");
+         }
+
+         // tell the new player about all map objects
+         // (currently just the flags)
+
+         serverMsg.type = MSG_TYPE_OBJECT;
+         vector<WorldMap::Object>* vctObjects = g.getMap()->getObjects();
+         vector<WorldMap::Object>::iterator itObjects;
+         cout << "sending items" << endl;
+         for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
+            itObjects->serialize(serverMsg.buffer);
+            cout << "sending item id " << itObjects->id  << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+               error("sendMessage");
+         }
+
+
+         // send the current score
+         serverMsg.type = MSG_TYPE_SCORE;
+
+         int game_blueScore = g.getBlueScore();
+         int game_redScore = g.getRedScore();
+         memcpy(serverMsg.buffer, &game_blueScore, 4);
+         memcpy(serverMsg.buffer+4, &game_redScore, 4);
+
+         if ( msgProcessor.sendMessage(&serverMsg, sock, &from, &outputLog) < 0 )
+            error("sendMessage");
+
+         serverMsg.type = MSG_TYPE_PLAYER;
+         p->serialize(serverMsg.buffer);
+         cout << "Should be broadcasting the message" << endl;
+
+         for (it = otherPlayers.begin(); it != otherPlayers.end(); it++)
+         {
+            cout << "Sent message back to " << it->second->name << endl;
+            if ( msgProcessor.sendMessage(&serverMsg, sock, &(it->second->addr), &outputLog) < 0 )
+               error("sendMessage");
+         }
 
          serverMsg.type = MSG_TYPE_GAME_INFO;
