--- 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) {