4 #include "Config.hh" |
4 #include "Config.hh" |
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 #include <zlib.h> |
|
10 |
9 |
11 NetworkServer::NetworkServer (GameState &state, const NetworkEndpoint &listen_addr) : |
10 NetworkServer::NetworkServer (GameState &state, const NetworkEndpoint &listen_addr) : |
12 state(state), netsession(NETWORK_MAGIC_ID), controller(netsession, NETCHAN_CORE) { |
11 state(state), netsession(NETWORK_MAGIC_ID), controller(netsession, NETCHAN_CORE) { |
13 |
12 |
14 // connect slots |
13 // connect slots |
248 for (PixelDimension y = 0; y < map.y; y++) { |
247 for (PixelDimension y = 0; y < map.y; y++) { |
249 terrain_buf[x][y] = (uint8_t) terrain.terrain[x][y]; |
248 terrain_buf[x][y] = (uint8_t) terrain.terrain[x][y]; |
250 } |
249 } |
251 } |
250 } |
252 |
251 |
253 // compress the terrain buffer |
|
254 unsigned long deflate_size = compressBound(terrain_size); |
|
255 uint8_t deflate_buf[deflate_size]; |
|
256 |
|
257 // and compress |
|
258 if (compress(deflate_buf, &deflate_size, (const uint8_t *) terrain_buf, terrain_size) != Z_OK) |
|
259 throw Error("compress failed"); |
|
260 |
|
261 // allocate our packet... |
252 // allocate our packet... |
262 BigNetworkPacket pkt ( |
253 BigNetworkPacket pkt ( |
263 NETWORK_SESSION_HEADER_SIZE // NetworkChannel header |
254 // NetworkChannel header |
264 + 3 * sizeof(uint32_t) // our own header |
255 NETWORK_SESSION_HEADER_SIZE |
265 + deflate_size // compressed terrain buffer |
256 |
|
257 // our own header |
|
258 + 2 * sizeof(uint32_t) |
|
259 |
|
260 // compressed terrain buffer |
|
261 + NetworkPacketOutput::write_compressed_size(terrain_size) |
266 ); |
262 ); |
267 |
263 |
268 // write netsession header |
264 // write netsession header |
269 node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY); |
265 node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY); |
270 |
266 |
271 // write terrain dimensions |
267 // write terrain dimensions |
272 pkt.write_uint32(map.x); |
268 pkt.write_uint32(map.x); |
273 pkt.write_uint32(map.y); |
269 pkt.write_uint32(map.y); |
274 |
270 |
275 // write compressed data |
271 // write compressed terrain data |
276 pkt.write(deflate_buf, deflate_size); |
272 pkt.write_compressed(terrain_buf, terrain_size); |
277 |
273 |
278 // send |
274 // send |
279 node->send_raw(pkt, true); |
275 node->send_raw(pkt, true); |
280 } |
276 } |
281 |
277 |