summaryrefslogtreecommitdiff
path: root/src/game.c
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2022-12-12 18:06:53 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2022-12-12 18:06:53 +0100
commit9528c0c69dba57117f38f84f576af2c81a3b435b (patch)
tree14f3b21a19f3733e05d64e1fc4113af52516a441 /src/game.c
parent10ae402862df4337772fe8e35f68ee8ab5bfc224 (diff)
multiplayer
Diffstat (limited to 'src/game.c')
-rw-r--r--src/game.c140
1 files changed, 122 insertions, 18 deletions
diff --git a/src/game.c b/src/game.c
index 55d64a4..d3ec30b 100644
--- a/src/game.c
+++ b/src/game.c
@@ -14,7 +14,7 @@ void start_server(char* port) {
void connect_to_server(char* ip, char* port) {
messages_received_on_client = array_create(sizeof(protocol_generic_message*));
array_reserve(&messages_received_on_client, 100);
-
+
global_state.network_state = CONNECTING;
global_state.client = network_connect_to_server(ip, port);
global_state.client->on_message = client_on_message_received;
@@ -54,28 +54,119 @@ void destroy_game() {
if (global_state.client) network_client_close(global_state.client);
}
-void update_server() {
+static void broadcast_to_clients(network_message message) {
+ if (!global_state.server || !global_state.server->is_open) return;
+ for (int i = 0; i < global_state.server->clients.length; i++) {
+ network_client* client = array_at(&global_state.server->clients, i);
+ network_client_send(client, message);
+ }
+}
+
+static void rotate_user(platform_window* window, protocol_user_look *message) {
+ player* p = get_player_by_id(message->id);
+ if (p == 0) {
+ log_info("Unknown user rotated");
+ return;
+ }
+
+ p->gunx = message->gunx;
+ p->guny = message->guny;
+}
+
+static void move_user(platform_window* window, protocol_move *message) {
+ float speed = 0.1f;
+ float pad_between_player_and_obj = 0.01f;
+
+ player* p = get_player_by_id(message->id);
+ if (p == 0) {
+ log_info("Unknown user moved");
+ return;
+ }
+
+ if (message->move == MOVE_UP) {
+ float newy = p->playery - speed;
+ if (is_in_bounds(p->playerx, newy)) {
+ p->playery = newy;
+ object o = check_if_player_collided_with_object(window, *p);
+ if (o.active) p->playery = o.position.y+o.size.y - get_player_size_in_tile() + pad_between_player_and_obj;
+ }
+ }
+
+ if (message->move == MOVE_DOWN) {
+ float newy = p->playery + speed;
+ if (is_in_bounds(p->playerx, newy)) {
+ p->playery = newy;
+ object o = check_if_player_collided_with_object(window, *p);
+ if (o.active) p->playery = o.position.y - get_player_size_in_tile() - pad_between_player_and_obj;
+ }
+ }
+
+ if (message->move == MOVE_LEFT) {
+ float newx = p->playerx - speed;
+ if (is_in_bounds(newx, p->playery)) {
+ p->playerx = newx;
+ object o = check_if_player_collided_with_object(window, *p);
+ if (o.active) p->playerx = o.position.x+o.size.x + pad_between_player_and_obj;
+ }
+ }
+
+ if (message->move == MOVE_RIGHT) {
+ float newx = p->playerx + speed;
+ if (is_in_bounds(newx, p->playery)) {
+ p->playerx = newx;
+ object o = check_if_player_collided_with_object(window, *p);
+ if (o.active) p->playerx = o.position.x-get_player_size_in_tile() - pad_between_player_and_obj;
+ }
+ }
+}
+
+float update_timer = 0.0f;
+void update_server(platform_window* window) {
+ update_spawners();
+ update_zombies_server(window);
+
for (int i = 0; i < messages_received_on_server.length; i++) {
protocol_generic_message* msg = *(protocol_generic_message**)array_at(&messages_received_on_server, i);
- switch (msg->type)
+ switch (msg->message->type)
{
- case MESSAGE_GET_ID_UPSTREAM: {
- network_client_send(&msg->client, create_protocol_get_id_down(current_id));
- current_id++;
- } break;
-
- default:
- log_info("Unhandled message received");
- break;
+ case MESSAGE_GET_ID_UPSTREAM: {
+ network_client_send(&msg->client, create_protocol_get_id_down(current_id));
+ spawn_player(current_id);
+ current_id++;
+ log_info("Player connected to server");
+ } break;
+
+ case MESSAGE_USER_MOVED: {
+ move_user(window, (protocol_move*)msg->message);
+ } break;
+
+ case MESSAGE_USER_LOOK: {
+ rotate_user(window, (protocol_user_look*)msg->message);
+ } break;
+
+ default:
+ log_info("Unhandled message received");
+ break;
}
+ mem_free(msg->message);
+ mem_free(msg);
array_remove_at(&messages_received_on_server, i);
i--;
}
+
+ broadcast_to_clients(create_protocol_user_list());
+
+ if (update_timer > 0.05f) {
+ broadcast_to_clients(create_protocol_zombie_list());
+ update_timer = 0.0f;
+ }
+
+ update_timer += update_delta;
}
-void update_client() {
+void update_client(platform_window* window) {
for (int i = 0; i < messages_received_on_client.length; i++) {
protocol_generic_client_message* msg = *(protocol_generic_client_message**)array_at(&messages_received_on_client, i);
@@ -85,27 +176,40 @@ void update_client() {
protocol_get_id_downstream* msg_id = (protocol_get_id_downstream*)msg;
my_id = msg_id->id;
global_state.network_state = CONNECTED;
- spawn_player(my_id);
- log_info("Id received, spawning player");
+ printf("Received id: %d\n", my_id);
+ log_info("Id received");
+ } break;
+
+ case MESSAGE_USER_LIST: {
+ protocol_user_list* msg_players = (protocol_user_list*)msg;
+ memcpy(players, msg_players->players, sizeof(players));
+ } break;
+ case MESSAGE_ZOMBIE_LIST: {
+ if (global_state.server) break; // zombies are simulated on server so dont overwrite data.
+ protocol_zombie_list* msg_zombies = (protocol_zombie_list*)msg;
+ memcpy(zombies, msg_zombies->zombies, sizeof(zombies));
} break;
-
default:
log_info("Unhandled message received");
break;
}
+ mem_free(msg);
array_remove_at(&messages_received_on_client, i);
i--;
}
+
+ if (!global_state.server) {
+ update_zombies_client(window);
+ }
}
void update_game(platform_window* window) {
+ update_client(window);
if (global_state.server) {
- update_server();
+ update_server(window);
}
- update_client();
-
if (global_state.network_state == CONNECTED) {
draw_grid(window);
draw_spawners(window);