src/Network/Client.cc
changeset 408 e6cfc44266af
parent 406 a2e35ca66c74
child 417 c503e0c6a740
--- a/src/Network/Client.cc	Tue Jan 20 23:24:04 2009 +0200
+++ b/src/Network/Client.cc	Tue Jan 20 23:30:18 2009 +0200
@@ -7,34 +7,39 @@
 
 #include <cassert>
 
-NetworkClient::NetworkClient (Engine &engine, GameState &state, const NetworkEndpoint &connect_to) : 
-    engine(engine), state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)),
-    controller(*this)
+/*
+ * NetworkClientConnect
+ */
+NetworkClientConnect::NetworkClientConnect (Engine &engine, const NetworkEndpoint &connect_to) :
+    engine(engine), netsession(NETWORK_MAGIC_ID)
 {
+    // connect NetworkSession to get server node (this is still blocking)
+    server = netsession.connect(connect_to);
+    
     // connect slots
-    slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array);
-    slots.connect(server->sig_disconnected(), this, &NetworkClient::on_disconnected);
+    slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClientConnect::on_terrain_array);
+    slots.connect(server->sig_disconnected(), this, &NetworkClientConnect::on_disconnected);
+    
+    // then we must wait for the terrain data
 }
-        
-void NetworkClient::on_disconnected (void) {
+
+void NetworkClientConnect::on_disconnected (void) {
     Engine::log(ERROR, "client.on_disconnect") << "Disconnected from server";
     engine.stop();
 }
 
-void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
+void NetworkClientConnect::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
     // ignore if not from server
     if (node != server)
         return;
-
-    Terrain &terrain = state.world;
-
+    
     // read map width/height
     PixelDimension map_w = pkt.read_uint32();
     PixelDimension map_h = pkt.read_uint32();
 
     // the terrain byte array
     size_t terrain_size = map_w * map_h;
-    uint8_t terrain_buf[map_w * map_h];
+    TerrainPixel *terrain_buf = new TerrainPixel[map_w * map_h];
 
     // read uncompressed terrain data
     size_t inflate_size = pkt.read_uncompressed(terrain_buf, terrain_size);
@@ -43,12 +48,29 @@
     if (inflate_size != terrain_size)
         throw Error("Corrupt terrain data");
 
-    // XXX: rework access
-    if (terrain.getDimensions() != PixelCoordinate(map_w, map_h))
-        throw Error("terrain is of the wrong size");
+    // create the terrain object that we then use, and hand over terrain_buf to it
+    Terrain *terrain = new Terrain(map_w, map_h, terrain_buf);
 
-    // load into terrain
-    terrain.loadFromBuffer(terrain_buf);
+    // execute connectDone
+    connectDone(terrain);
+}
+
+void NetworkClientConnect::connectDone (Terrain *terrain) {
+    // pass Terrain to engine to create game
+    GameState &gs = engine.setupGame(terrain);
+
+    // create our new NetworkClient object
+    client = new NetworkClient(engine, gs, netsession, server);
+}
+ 
+/*
+ * NetworkClient
+ */
+NetworkClient::NetworkClient (Engine &engine, GameState &state, NetworkSession &netsession, NetworkNode *server) : 
+    engine(engine), state(state), netsession(netsession), server(server),
+    controller(*this)
+{
+
 }
         
 void NetworkClient::player_quit (NetworkClientRemotePlayer *player) {