diff options
| author | Aldrik Ramaekers <aldrik@amftech.nl> | 2022-12-12 15:31:26 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@amftech.nl> | 2022-12-12 15:31:26 +0100 |
| commit | 10ae402862df4337772fe8e35f68ee8ab5bfc224 (patch) | |
| tree | 1ac5fda82a2dd01f7f5ffdc2b337947c569afc15 /src | |
| parent | ec3796faff12ba7bf5f775d757ac25834549903d (diff) | |
networking
Diffstat (limited to 'src')
| -rw-r--r-- | src/game.c | 113 | ||||
| -rw-r--r-- | src/objects.c | 3 | ||||
| -rw-r--r-- | src/pathfinding.c | 3 | ||||
| -rw-r--r-- | src/protocol.c | 27 | ||||
| -rw-r--r-- | src/zombies.c | 1 |
5 files changed, 141 insertions, 6 deletions
diff --git a/src/game.c b/src/game.c new file mode 100644 index 0000000..55d64a4 --- /dev/null +++ b/src/game.c @@ -0,0 +1,113 @@ +#include "../include/game.h" +#include "../include/pathfinding.h" + +u32 current_id = 0; + +void start_server(char* port) { + messages_received_on_server = array_create(sizeof(protocol_generic_message*)); + array_reserve(&messages_received_on_server, 100); + + global_state.server = networking_create_server(); + global_state.server->on_message = server_on_message_received; +} + +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; + + if (global_state.client->is_connected) { + global_state.network_state = WAITING_FOR_ID; + + network_message message = create_protocol_get_id_up(); + network_client_send(global_state.client, message); + } +} + +void load_map() { + global_state.state = GAMESTATE_LOADING_MAP; + + load_map_from_data(); + create_objects(); + + pathfinding_init(); + + thread t = thread_start(pathfinding_thread, 0); + thread_detach(&t); + + global_state.state = GAMESTATE_PLAYING; + log_info("Done loading map"); +} + +void init_game() { + global_state.state = IDLE; + global_state.network_state = DISCONNECTED; + + load_map(); +} + +void destroy_game() { + if (global_state.server) networking_destroy_server(global_state.server); + if (global_state.client) network_client_close(global_state.client); +} + +void update_server() { + 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) + { + 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; + } + + array_remove_at(&messages_received_on_server, i); + i--; + } +} + +void update_client() { + 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); + + switch (msg->type) + { + case MESSAGE_GET_ID_DOWNSTREAM: { + 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"); + } break; + + default: + log_info("Unhandled message received"); + break; + } + + array_remove_at(&messages_received_on_client, i); + i--; + } +} + +void update_game(platform_window* window) { + if (global_state.server) { + update_server(); + } + + update_client(); + + if (global_state.network_state == CONNECTED) { + draw_grid(window); + draw_spawners(window); + } +}
\ No newline at end of file diff --git a/src/objects.c b/src/objects.c index efa128b..ae65af2 100644 --- a/src/objects.c +++ b/src/objects.c @@ -85,7 +85,4 @@ void create_objects() { create_box(14, 10, 0); create_box(13, 10, 0); create_box(11, 10, 0); - - spawn_player(my_id); - //spawn_player(my_id+1); }
\ No newline at end of file diff --git a/src/pathfinding.c b/src/pathfinding.c index 16e5261..effca06 100644 --- a/src/pathfinding.c +++ b/src/pathfinding.c @@ -281,10 +281,7 @@ void* pathfinding_thread(void *args) else { mutex_unlock(&global_pathfinding_queue.mutex); - continue; } - - //thread_sleep(100); } return 0; diff --git a/src/protocol.c b/src/protocol.c new file mode 100644 index 0000000..256e85d --- /dev/null +++ b/src/protocol.c @@ -0,0 +1,27 @@ +#include "../include/protocol.h" + +network_message create_protocol_get_id_up() { + protocol_get_id_upstream* buf = (protocol_get_id_upstream*)network_buffer; + buf->type = MESSAGE_GET_ID_UPSTREAM; + return network_create_message(network_buffer, sizeof(protocol_get_id_upstream), MAX_NETWORK_BUFFER_SIZE); +} + +network_message create_protocol_get_id_down(u32 id) { + protocol_get_id_downstream* buf = (protocol_get_id_downstream*)network_buffer; + buf->type = MESSAGE_GET_ID_DOWNSTREAM; + buf->id = id; + return network_create_message(network_buffer, sizeof(protocol_get_id_downstream), MAX_NETWORK_BUFFER_SIZE); +} + +void server_on_message_received(u8* buffer, u32 length, network_client client) { + u8* allocated_buf = mem_alloc(length + sizeof(network_client)); + memcpy(allocated_buf, &client, sizeof(network_client)); + memcpy(allocated_buf + sizeof(network_client), buffer + 4, length-4); + array_push(&messages_received_on_server, (u8*)&allocated_buf); +} + +void client_on_message_received(u8* buffer, u32 length) { + u8* allocated_buf = mem_alloc(length); + memcpy(allocated_buf, buffer+4, length-4); + array_push(&messages_received_on_client, (u8*)&allocated_buf); +} diff --git a/src/zombies.c b/src/zombies.c index 4bbcf40..3685355 100644 --- a/src/zombies.c +++ b/src/zombies.c @@ -35,6 +35,7 @@ void spawn_zombie(int x, int y) { zombies[i].position = (vec3f){x,y, 0}; zombies[i].size = (vec3f){0.4, 0.4, 1}; zombies[i].time_since_last_path = 0.0f; + zombies[i].request.to_fill = &zombies[i].next_path; zombies[i].request.mutex = mutex_create(); player closest_player = get_closest_player_to_tile(x, y); |
