summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game.c113
-rw-r--r--src/objects.c3
-rw-r--r--src/pathfinding.c3
-rw-r--r--src/protocol.c27
-rw-r--r--src/zombies.c1
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);