about summary refs log tree commit diff homepage
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/server.c b/server.c
index a5b8855..3a27ad4 100644
--- a/server.c
+++ b/server.c
@@ -287,6 +287,33 @@ static bool clientPut(const struct Client *client, uint8_t color, char cell) {
 	return success;
 }
 
+static bool clientMap(const struct Client *client) {
+	int32_t mapY = (int32_t)client->tileY - MAP_ROWS / 2;
+	int32_t mapX = (int32_t)client->tileX - MAP_COLS / 2;
+
+	struct Map map;
+	for (int32_t y = 0; y < MAP_ROWS; ++y) {
+		for (int32_t x = 0; x < MAP_COLS; ++x) {
+			uint32_t tileY = ((mapY + y) % TILE_ROWS + TILE_ROWS) % TILE_ROWS;
+			uint32_t tileX = ((mapX + x) % TILE_COLS + TILE_COLS) % TILE_COLS;
+
+			const struct Tile *tile = &tiles[tileY * TILE_ROWS + tileX];
+			map.tiles[y][x] = (struct MapTile) {
+				.createTime = tile->createTime,
+				.modifyTime = tile->modifyTime,
+				.accessTime = tile->accessTime,
+				.modifyCount = tile->modifyCount,
+				.accessCount = tile->accessCount,
+			};
+		}
+	}
+
+	struct ServerMessage msg = { .type = SERVER_MAP };
+	if (!clientSend(client, msg)) return false;
+	if (0 > send(client->fd, &map, sizeof(map), 0)) return false;
+	return true;
+}
+
 int main() {
 	int error;
 
@@ -362,12 +389,15 @@ int main() {
 		}
 
 		bool success = false;
-		if (msg.type == CLIENT_MOVE) {
-			success = clientMove(client, msg.move.dx, msg.move.dy);
-		} else if (msg.type == CLIENT_PUT) {
-			success = clientPut(client, msg.put.color, msg.put.cell);
-		} else if (msg.type == CLIENT_SPAWN) {
-			success = clientSpawn(client, msg.spawn);
+		switch (msg.type) {
+			break; case CLIENT_MOVE: {
+				success = clientMove(client, msg.move.dx, msg.move.dy);
+			}
+			break; case CLIENT_PUT: {
+				success = clientPut(client, msg.put.color, msg.put.cell);
+			}
+			break; case CLIENT_SPAWN: success = clientSpawn(client, msg.spawn);
+			break; case CLIENT_MAP: success = clientMap(client);
 		}
 		if (!success) clientRemove(client);
 	}