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 } |