diff --git a/include/game.h b/include/game.h index eb0c6f5..14a7ea3 100644 --- a/include/game.h +++ b/include/game.h @@ -36,7 +36,7 @@ void CreateGameServer(Server* serv,GameData*gd); /** * Creates the Client game loop */ -void RunGameClient(Client* c); +void RunGameClient(Client* c,GameData*gd); /** * Draws the walls based on player 1 or 2 diff --git a/main.c b/main.c index f85a413..f8d7367 100644 --- a/main.c +++ b/main.c @@ -52,7 +52,7 @@ int main(int argc, char* argv[]) printf("Connecting to %s:%i\n", data.domain, data.port); Client c = StartClient(data.domain, data.port); - RunGameClient(&c); + RunGameClient(&c,&data); close(c.client_fd); return 0; diff --git a/src/gameServer.c b/src/gameServer.c index 6c3dfb1..9a011e2 100644 --- a/src/gameServer.c +++ b/src/gameServer.c @@ -1,15 +1,31 @@ #include "../include/game.h" +#include "../include/object.h" +#include "../include/network/packet.h" #include #include #include #include #include +#include #include +long GetCurrentMS() +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + long ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + return ms; +} + void CreateGameServer(Server* serv, GameData* gd) { Server s = *serv; + Paddle paddle = CreatePaddle(gd); + + Ball ball = CreateBall(gd); + long lastBallUpdate = GetCurrentMS(); bool game_running = true; @@ -22,6 +38,11 @@ void CreateGameServer(Server* serv, GameData* gd) SetupTermWin(); DrawWalls(*gd); + DrawPaddle(&paddle); + // DrawBall(&ball); + + GameAlert("Waiting for Client"); + int allowServe = false; while (game_running) { @@ -79,8 +100,10 @@ void CreateGameServer(Server* serv, GameData* gd) snprintf(msg, sizeof(msg), "Client %d says: %s\r", fd, buffer); GameAlert(msg); + ProcessBallPacket(buffer,&ball,gd); + // Example: echo back - send(fd, buffer, bytes, 0); + //send(fd, buffer, bytes, 0); } else if (bytes == 0) { char msg[64]; snprintf(msg, sizeof(msg), "Client %d disconnected\n", fd); @@ -96,38 +119,147 @@ void CreateGameServer(Server* serv, GameData* gd) } } - if (s.client_count < 1) { - char msg[64]; - snprintf(msg, sizeof(msg), "Waiting for other player\n"); - GameAlert(msg); - } else { - // Process Game Data - + char ch = getch(); + if (ch == 'w') + MovePaddleUP(&paddle); + if (ch == 's') + MovePaddleDown(&paddle); + + // Process Ball only if on court + if (ball.visible && s.client_count > 0) { + if (GetCurrentMS() > lastBallUpdate + 10) { + lastBallUpdate = GetCurrentMS(); + UpdateBall(&ball, &paddle); + } + if (CheckBallCourtChange(gd,&ball)) { + GameAlert("Ball is in other court"); + HideBall(&ball); + + char msg[1024]; + snprintf(msg, sizeof(msg), "BTRANS %f %f %f", ball.y,ball.vx,ball.vy); + send(s.clients[0], msg, strlen(msg), 0); + } } + + if (ch == 'q') { + GameAlert("Quitting..."); + sleep(1); + game_running = false; + break; + } + + // if (s.client_count < 1) { + // char msg[64]; + // snprintf(msg, sizeof(msg), "Waiting for other player\n"); + // GameAlert(msg); + // } else { + // // Process Game Data + + // } } CloseTermWin(); } -void RunGameClient(Client* client) +void RunGameClient(Client* client, GameData* gd) { Client c = *client; - // char* msg = "Hello from client, this is a test, I really want to see what happens if I create a really long packet and try to send it. I would imagine it will be some kind of buffer overflow"; - // send(c.client_fd, msg, strlen(msg), 0); + Paddle paddle = CreatePaddle(gd); + Ball ball = CreateBall(gd); - // { - // char buffer[1024] = { 0 }; - // read(c.client_fd, buffer, sizeof(buffer)); - // printf("Server: %s\n", buffer); - // } - sleep(10); - // char* msg2 = "Ok I am leaving now"; - // send(c.client_fd, msg2, strlen(msg2), 0); - // { - // char buffer[1024] = { 0 }; - // read(c.client_fd, buffer, sizeof(buffer)); - // printf("Server: %s\n", buffer); - // } + long lastBallUpdate = GetCurrentMS(); + + bool game_running = true; + + SetupTermWin(); + + GameAlert("Connected to server"); + int allowServe = true; + + DrawWalls(*gd); + DrawPaddle(&paddle); + + while (game_running) { + + fd_set read_fds; + FD_ZERO(&read_fds); + + // Watch server socket + FD_SET(c.client_fd, &read_fds); + + int max_fd = c.client_fd; + + // Small timeout (same idea as server) + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 1000; // 1ms + + int ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv); + + if (ret < 0) { + perror("select"); + break; + } + + // Handle server messages + if (FD_ISSET(c.client_fd, &read_fds)) { + char buffer[1024]; + int bytes = recv(c.client_fd, buffer, sizeof(buffer) - 1, 0); + + if (bytes > 0) { + buffer[bytes] = '\0'; + + char msg[1024]; + snprintf(msg, sizeof(msg), "Server says: %s\r", buffer); + GameAlert(msg); + + ProcessBallPacket(buffer,&ball,gd); + + } else if (bytes == 0) { + GameAlert("Server disconnected"); + break; + } else { + perror("recv"); + break; + } + } + + char ch = getch(); + if (ch == 'w') + MovePaddleUP(&paddle); + if (ch == 's') + MovePaddleDown(&paddle); + + // Process Ball only if on court + if (ball.visible) { + if (GetCurrentMS() > lastBallUpdate + 10) { + lastBallUpdate = GetCurrentMS(); + UpdateBall(&ball, &paddle); + } + if (CheckBallCourtChange(gd,&ball)) { + GameAlert("Ball is in other court"); + HideBall(&ball); + + char msg[1024]; + snprintf(msg, sizeof(msg), "BTRANS %f %f %f", ball.y,ball.vx,ball.vy); + send(c.client_fd, msg, strlen(msg), 0); + } + } + + if (ch == 'q') { + GameAlert("Quitting..."); + sleep(1); + game_running = false; + break; + } + + if (ch == ' ') { + allowServe = false; + ServeBall(&ball,gd); + } + } + + CloseTermWin(); } \ No newline at end of file