diff options
Diffstat (limited to 'src/game.c')
| -rw-r--r-- | src/game.c | 140 |
1 files changed, 122 insertions, 18 deletions
@@ -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); |
