src/Network/Client.cc
changeset 408 e6cfc44266af
parent 406 a2e35ca66c74
child 417 c503e0c6a740
equal deleted inserted replaced
407:443f6f7abcfb 408:e6cfc44266af
     5 #include "../Engine.hh"
     5 #include "../Engine.hh"
     6 #include "../Logger.hh"
     6 #include "../Logger.hh"
     7 
     7 
     8 #include <cassert>
     8 #include <cassert>
     9 
     9 
    10 NetworkClient::NetworkClient (Engine &engine, GameState &state, const NetworkEndpoint &connect_to) : 
    10 /*
    11     engine(engine), state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)),
    11  * NetworkClientConnect
    12     controller(*this)
    12  */
    13 {
    13 NetworkClientConnect::NetworkClientConnect (Engine &engine, const NetworkEndpoint &connect_to) :
       
    14     engine(engine), netsession(NETWORK_MAGIC_ID)
       
    15 {
       
    16     // connect NetworkSession to get server node (this is still blocking)
       
    17     server = netsession.connect(connect_to);
       
    18     
    14     // connect slots
    19     // connect slots
    15     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array);
    20     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClientConnect::on_terrain_array);
    16     slots.connect(server->sig_disconnected(), this, &NetworkClient::on_disconnected);
    21     slots.connect(server->sig_disconnected(), this, &NetworkClientConnect::on_disconnected);
    17 }
    22     
    18         
    23     // then we must wait for the terrain data
    19 void NetworkClient::on_disconnected (void) {
    24 }
       
    25 
       
    26 void NetworkClientConnect::on_disconnected (void) {
    20     Engine::log(ERROR, "client.on_disconnect") << "Disconnected from server";
    27     Engine::log(ERROR, "client.on_disconnect") << "Disconnected from server";
    21     engine.stop();
    28     engine.stop();
    22 }
    29 }
    23 
    30 
    24 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
    31 void NetworkClientConnect::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
    25     // ignore if not from server
    32     // ignore if not from server
    26     if (node != server)
    33     if (node != server)
    27         return;
    34         return;
    28 
    35     
    29     Terrain &terrain = state.world;
       
    30 
       
    31     // read map width/height
    36     // read map width/height
    32     PixelDimension map_w = pkt.read_uint32();
    37     PixelDimension map_w = pkt.read_uint32();
    33     PixelDimension map_h = pkt.read_uint32();
    38     PixelDimension map_h = pkt.read_uint32();
    34 
    39 
    35     // the terrain byte array
    40     // the terrain byte array
    36     size_t terrain_size = map_w * map_h;
    41     size_t terrain_size = map_w * map_h;
    37     uint8_t terrain_buf[map_w * map_h];
    42     TerrainPixel *terrain_buf = new TerrainPixel[map_w * map_h];
    38 
    43 
    39     // read uncompressed terrain data
    44     // read uncompressed terrain data
    40     size_t inflate_size = pkt.read_uncompressed(terrain_buf, terrain_size);
    45     size_t inflate_size = pkt.read_uncompressed(terrain_buf, terrain_size);
    41     
    46     
    42     // invalid data?
    47     // invalid data?
    43     if (inflate_size != terrain_size)
    48     if (inflate_size != terrain_size)
    44         throw Error("Corrupt terrain data");
    49         throw Error("Corrupt terrain data");
    45 
    50 
    46     // XXX: rework access
    51     // create the terrain object that we then use, and hand over terrain_buf to it
    47     if (terrain.getDimensions() != PixelCoordinate(map_w, map_h))
    52     Terrain *terrain = new Terrain(map_w, map_h, terrain_buf);
    48         throw Error("terrain is of the wrong size");
    53 
    49 
    54     // execute connectDone
    50     // load into terrain
    55     connectDone(terrain);
    51     terrain.loadFromBuffer(terrain_buf);
    56 }
       
    57 
       
    58 void NetworkClientConnect::connectDone (Terrain *terrain) {
       
    59     // pass Terrain to engine to create game
       
    60     GameState &gs = engine.setupGame(terrain);
       
    61 
       
    62     // create our new NetworkClient object
       
    63     client = new NetworkClient(engine, gs, netsession, server);
       
    64 }
       
    65  
       
    66 /*
       
    67  * NetworkClient
       
    68  */
       
    69 NetworkClient::NetworkClient (Engine &engine, GameState &state, NetworkSession &netsession, NetworkNode *server) : 
       
    70     engine(engine), state(state), netsession(netsession), server(server),
       
    71     controller(*this)
       
    72 {
       
    73 
    52 }
    74 }
    53         
    75         
    54 void NetworkClient::player_quit (NetworkClientRemotePlayer *player) {
    76 void NetworkClient::player_quit (NetworkClientRemotePlayer *player) {
    55     (void) player;
    77     (void) player;
    56 }
    78 }