From f06351b8a04d0a68628b05bed884832840998c6c Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Fri, 17 May 2024 21:44:00 +0200 Subject: stat overlay --- src/asset_defs.c | 1 + src/game.c | 129 +++++++++++++++++++++++++++++------------------------- src/overlay.c | 88 ++++++++++++++++++++++++++++++++++++- src/pathfinding.c | 6 +-- src/players.c | 8 ++-- src/rounds.c | 1 + src/zombies.c | 19 +++++++- 7 files changed, 183 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/asset_defs.c b/src/asset_defs.c index c814355..495f064 100644 --- a/src/asset_defs.c +++ b/src/asset_defs.c @@ -35,6 +35,7 @@ void load_assets() { // Assets loaded at match start. img_heart = assets_load_image_from_file("data/imgs/ui/heart.png"); img_hurt_overlay_left = assets_load_image_from_file("data/imgs/ui/hurt_overlay_left.png"); img_hurt_overlay_right = assets_load_image_from_file("data/imgs/ui/hurt_overlay_right.png"); + img_stats_overlay = assets_load_image_from_file("data/imgs/ui/stats_overlay.png"); // Icons img_icon_bullets = assets_load_image_from_file("data/imgs/bullets.png"); diff --git a/src/game.c b/src/game.c index fab513a..967db19 100644 --- a/src/game.c +++ b/src/game.c @@ -278,51 +278,55 @@ void update_server(platform_window* window) { protocol_generic_message* msg = *(protocol_generic_message**)array_at(&messages_received_on_server, i); set_ping_for_player(msg); - switch (msg->message->type) + // Ignore all messages except join request when game is paused. + if (!game_is_paused || msg->message->type == MESSAGE_GET_ID_UPSTREAM) { - case MESSAGE_PING_UPSTREAM: { - add_message_to_outgoing_queuex(create_protocol_ping_downstream(), msg->client); - - } break; - case MESSAGE_GET_ID_UPSTREAM: { - protocol_get_id_upstream* m = (protocol_get_id_upstream*)msg->message; - u32 new_id = get_id_from_ip(msg->client); - - if (player_has_old_session(new_id)) { - rejoin_player(new_id, msg->client); - log_infox("Player rejoined session / ip: %s id: %d", msg->client.ip, new_id); - } - else { - spawn_player(new_id, msg->client); - log_infox("Player connected to session / ip: %s id: %d", msg->client.ip, new_id); - } + switch (msg->message->type) + { + case MESSAGE_PING_UPSTREAM: { + add_message_to_outgoing_queuex(create_protocol_ping_downstream(), msg->client); + + } break; + case MESSAGE_GET_ID_UPSTREAM: { + protocol_get_id_upstream* m = (protocol_get_id_upstream*)msg->message; + u32 new_id = get_id_from_ip(msg->client); + + if (player_has_old_session(new_id)) { + rejoin_player(new_id, msg->client); + log_infox("Player rejoined session / ip: %s id: %d", msg->client.ip, new_id); + } + else { + spawn_player(new_id, msg->client); + log_infox("Player connected to session / ip: %s id: %d", msg->client.ip, new_id); + } + + add_message_to_outgoing_queuex(create_protocol_get_id_down(new_id), msg->client); + + } break; + + case MESSAGE_USER_THROW: { + protocol_user_throw* throw_msg = (protocol_user_throw*)msg->message; + throw_throwable(throw_msg->id, throw_msg->throwable, throw_msg->dirx, throw_msg->diry); + } break; + + case MESSAGE_USER_MOVED: { + protocol_move* move_msg = (protocol_move*)msg->message; + if (move_msg->id != player_id) move_user(window, move_msg->id, move_msg->move, move_msg->delta); + } break; + + case MESSAGE_USER_LOOK: { + rotate_user(window, (protocol_user_look*)msg->message); + } break; + + case MESSAGE_USER_SHOOT: { + protocol_user_shoot* shoot_msg = (protocol_user_shoot*)msg->message; + shoot(window, shoot_msg->id, shoot_msg->dirx, shoot_msg->diry); + } break; - add_message_to_outgoing_queuex(create_protocol_get_id_down(new_id), msg->client); - - } break; - - case MESSAGE_USER_THROW: { - protocol_user_throw* throw_msg = (protocol_user_throw*)msg->message; - throw_throwable(throw_msg->id, throw_msg->throwable, throw_msg->dirx, throw_msg->diry); - } break; - - case MESSAGE_USER_MOVED: { - protocol_move* move_msg = (protocol_move*)msg->message; - if (move_msg->id != player_id) move_user(window, move_msg->id, move_msg->move, move_msg->delta); - } break; - - case MESSAGE_USER_LOOK: { - rotate_user(window, (protocol_user_look*)msg->message); - } break; - - case MESSAGE_USER_SHOOT: { - protocol_user_shoot* shoot_msg = (protocol_user_shoot*)msg->message; - shoot(window, shoot_msg->id, shoot_msg->dirx, shoot_msg->diry); - } break; - - default: - log_info("Unhandled message received"); - break; + default: + log_info("Unhandled message received"); + break; + } } array_remove_at(&messages_received_on_server, i); @@ -339,22 +343,25 @@ void update_server(platform_window* window) { update_bullets_server(window); if (update_timer >= SERVER_TICK_RATE) { // send at 60 ticks - update_spawners_server(); - update_drops_server(); - //update_wallitems_server(); - update_throwables_server(); - update_zombie_chunks_server(); - update_round_server(); - update_points_animation_server(); - update_glass_doors_server(); - - broadcast_players = platform_get_time(TIME_FULL, TIME_NS); - update_players_server(); - broadcast_players = platform_get_time(TIME_FULL, TIME_NS) - broadcast_players; - - broadcast_zombies = platform_get_time(TIME_FULL, TIME_NS); - update_zombies_server(window); - broadcast_zombies = platform_get_time(TIME_FULL, TIME_NS) - broadcast_zombies; + if (!game_is_paused) { + update_spawners_server(); + update_drops_server(); + //update_wallitems_server(); + update_throwables_server(); + update_zombie_chunks_server(); + update_round_server(); + update_points_animation_server(); + update_glass_doors_server(); + + + broadcast_players = platform_get_time(TIME_FULL, TIME_NS); + update_players_server(); + broadcast_players = platform_get_time(TIME_FULL, TIME_NS) - broadcast_players; + + broadcast_zombies = platform_get_time(TIME_FULL, TIME_NS); + update_zombies_server(window); + broadcast_zombies = platform_get_time(TIME_FULL, TIME_NS) - broadcast_zombies; + } broadcast_stamp = platform_get_time(TIME_FULL, TIME_NS); broadcast_to_clients(create_protocol_user_list()); @@ -469,7 +476,9 @@ void update_client(platform_window* window) { mutex_unlock(&messages_received_on_client.mutex); logic_update_time = platform_get_time(TIME_FULL, TIME_NS) - logic_update_time; - update_zombies_client(window); + if (!game_is_paused) { + update_zombies_client(window); + } } static void move_camera(platform_window* window) { diff --git a/src/overlay.c b/src/overlay.c index 75c465a..185173e 100644 --- a/src/overlay.c +++ b/src/overlay.c @@ -9,6 +9,51 @@ static void draw_gun_info(platform_window* window) { player *p = get_player_by_id(player_id); if (!p) return; + // Overlay background. + int overlay_w = window->width / 4; + int overlay_h = overlay_w*(img_stats_overlay->height/(float)img_stats_overlay->width); + + int overlay_x = _global_camera.x + window->width/2 - overlay_w/2; + int overlay_y = _global_camera.y + window->height - overlay_h; + + renderer->render_image(img_stats_overlay, overlay_x, overlay_y, overlay_w, overlay_h); + + // Round text. + { + font* round_fnt = get_font(window, 2.0f); + char round_text[30]; + sprintf(round_text, "%d", _current_round.round_nr); + int round_text_x = _global_camera.x + window->width / 2 - renderer->calculate_text_width(round_fnt, round_text)/2; + int round_text_y = overlay_y + overlay_h/1.35f - round_fnt->px_h/2; + + renderer->render_text(round_fnt, round_text_x+1, round_text_y-1, round_text, rgb(0,0,0)); + renderer->render_text(round_fnt, round_text_x, round_text_y, round_text, rgb(255,255,255)); + + round_fnt = get_font(window, 1.5f); + sprintf(round_text, "%s", "Round"); + round_text_x = _global_camera.x + window->width / 2 - renderer->calculate_text_width(round_fnt, round_text)/2; + round_text_y = overlay_y + overlay_h/3.0f - round_fnt->px_h/2; + + renderer->render_text(round_fnt, round_text_x+1, round_text_y-1, round_text, rgb(0,0,0)); + renderer->render_text(round_fnt, round_text_x, round_text_y, round_text, rgb(255,255,255)); + } + + // Ammo. + { + gun g = get_gun_by_type(p->guntype); + font* round_fnt = get_font(window, 1.5f); + char ammo_txt[50]; + sprintf(ammo_txt, "%d/%d", p->ammo_in_mag, p->total_ammo); + int ammo_text_x = _global_camera.x + window->width / 2 - renderer->calculate_text_width(round_fnt, ammo_txt)/2 - overlay_w/3.2f; + int ammo_text_y = overlay_y + overlay_h/1.35f - round_fnt->px_h/2; + + renderer->render_text(round_fnt, ammo_text_x+1, ammo_text_y-1, ammo_txt, rgb(0,0,0)); + renderer->render_text(round_fnt, ammo_text_x, ammo_text_y, ammo_txt, rgb(255,255,255)); + } + + + /* + gun g = get_gun_by_type(p->guntype); int y = window->height - fnt_32->px_h - EDGE_PADDING; @@ -45,7 +90,7 @@ static void draw_gun_info(platform_window* window) { offset_x += icon_h/3; } } - + */ } static void draw_leaderboard_entry(int x, int y, int w, int h, char* name, char* kills, char* deaths, char* ping, bool highlighted, bool disconnected) { @@ -72,6 +117,29 @@ static void draw_leaderboard_entry(int x, int y, int w, int h, char* name, char* } } +static void draw_pause_button(platform_window* window, int x, int y) { + int btn_w = 200; + int btn_h = 50; + color bg_c = rgba(255,100,100,160); + + if (_global_mouse.x + _global_camera.x > x && + _global_mouse.x + _global_camera.x < x + btn_w && + _global_mouse.y + _global_camera.y > y && + _global_mouse.y + _global_camera.y < y + btn_h) + { + bg_c = rgba(255,100,100,220); + if (is_left_clicked()) { + game_is_paused = !game_is_paused; + } + } + + char* text = game_is_paused ? "Unpause Game" : "Pause Game"; + int text_w = renderer->calculate_text_width(fnt_20, text); + + renderer->render_rectangle(x, y, btn_w, btn_h, bg_c); + renderer->render_text(fnt_20, x + (btn_w/2)-(text_w/2), y+(btn_h/2)-(fnt_20->px_h/2), text, rgb(255,255,255)); +} + static void draw_leaderboard(platform_window* window) { if (keyboard_is_key_down(KEY_TAB)) { int minimum_width = 300; @@ -98,6 +166,11 @@ static void draw_leaderboard(platform_window* window) { draw_leaderboard_entry(x, y + ((i+1)*height_per_row), actual_width, height_per_row, get_player_name_by_player_index(i), kills, deaths, ping, players[i].id == player_id, players[i].connection_state == DISCONNECTED); } + + + if (global_state.server) { + draw_pause_button(window, x, y + height_total + 20); + } } } @@ -229,10 +302,23 @@ static void draw_hurt_borders(platform_window* window) { */ } +static void draw_global_message(platform_window* window) { + if (!game_is_paused) return; + char* text = "Game is paused"; + int text_w = renderer->calculate_text_width(fnt_52, text); + + int x = _global_camera.x; + int y = _global_camera.y + 80; + + renderer->render_text(fnt_52, x + (window->width/2)-(text_w/2)+1, y-1, text, rgb(0,0,0)); + renderer->render_text(fnt_52, x + (window->width/2)-(text_w/2), y, text, rgb(255,255,255)); +} + void draw_overlay(platform_window* window) { draw_hurt_borders(window); draw_gun_info(window); draw_points(window); draw_leaderboard(window); draw_debug_stats(window); + draw_global_message(window); } \ No newline at end of file diff --git a/src/pathfinding.c b/src/pathfinding.c index 77572ed..a6b08d5 100644 --- a/src/pathfinding.c +++ b/src/pathfinding.c @@ -1,6 +1,6 @@ #include "../include/pathfinding.h" -static float distance_between(vec2f v1, vec2f v2) +float distance_between(vec2f v1, vec2f v2) { return ((v1.x-v2.x)*(v1.x-v2.x)+(v1.y-v2.y)*(v1.y-v2.y)); } @@ -314,8 +314,8 @@ void* pathfinding_thread(void *args) void make_pathfinding_request(vec2f start, vec2f end, array *to_fill, pathfinding_request *request) { - start.x = (int)start.x; - start.y = (int)start.y; + start.x = (int)nearbyint(start.x); + start.y = (int)nearbyint(start.y); end.x = (int)end.x; end.y = (int)end.y; diff --git a/src/players.c b/src/players.c index b5d0666..59fca4c 100644 --- a/src/players.c +++ b/src/players.c @@ -69,9 +69,9 @@ void spawn_player(u32 id, network_client client) { players[i].sprite_death = create_sprite(img_gunner_blue_run, 8, 48, 48, 0.1f); players[i].sprite_idle = create_sprite(img_gunner_blue_idle, 5, 48, 48, 0.1f); players[i].sprite_death.loop = false; - players[i].sprite.zoom = 1.1f; - players[i].sprite_death.zoom = 1.1f; - players[i].sprite_idle.zoom = 1.1f; + players[i].sprite.zoom = 1.0f; + players[i].sprite_death.zoom = 1.0f; + players[i].sprite_idle.zoom = 1.0f; players[i].health = 500; players[i].max_health = 500; @@ -244,6 +244,8 @@ void take_player_input(platform_window* window) { player* p = get_player_by_id(player_id); if (!p) return; + if (game_is_paused) return; + #ifdef MODE_DEBUG update_editor(window); #endif diff --git a/src/rounds.c b/src/rounds.c index 67fa2b5..4d69aff 100644 --- a/src/rounds.c +++ b/src/rounds.c @@ -40,6 +40,7 @@ static float get_round_text_opacity() { static int round_text_len = 0; void draw_round(platform_window* window) { + return; if (_current_round.round_nr == 0) return; char round_text[30]; diff --git a/src/zombies.c b/src/zombies.c index 6c87098..946641f 100644 --- a/src/zombies.c +++ b/src/zombies.c @@ -316,7 +316,7 @@ static vec2f get_direction_to_next_tile(zombie o) { } static bool is_within_tile(zombie o, vec2f dest) { - if (fabs(o.position.x - dest.x) < 0.05f && fabs(o.position.y - dest.y) < 0.1f) { + if (fabs(o.position.x - dest.x) < 0.2f && fabs(o.position.y - dest.y) < 0.2f) { return true; } return false; @@ -379,6 +379,7 @@ static void update_zombie_attacks_server(zombie *zombie) { } } +float distance_between(vec2f v1, vec2f v2); void update_zombies_server(platform_window* window) { #ifdef MODE_DEBUG if (is_editing_map) return; @@ -423,6 +424,20 @@ void update_zombies_server(platform_window* window) { array_destroy(&zombies[i].path); zombies[i].path = array_copy(zombies[i].request.to_fill); + + // Zombie is between 1st and 2nd tile in path, remove first target. (pathfinding snaps to closest tile so zombie might bug between 2 tiles). + /* + if (o.path.length > 1) { + vec2f* pos0 = array_at(&o.path, 0); + vec2f* pos1 = array_at(&o.path, 1); + float dist1 = distance_between((vec2f){pos0->x, pos0->y}, (vec2f){zombies[i].position.x, zombies[i].position.y}); + float dist2 = distance_between((vec2f){pos1->x, pos1->y}, (vec2f){zombies[i].position.x, zombies[i].position.y}); + float dist3 = distance_between((vec2f){pos1->x, pos1->y}, (vec2f){pos0->x, pos0->y}); + if (abs(dist1+dist2-dist3) < 0.05f) + { + log_info("Zombie is tripping!"); + } + }*/ player closest_player = get_closest_player_to_tile(o.position.x, o.position.y); @@ -529,7 +544,7 @@ void draw_zombies(platform_window* window, uint32_t ystart, uint32_t yend) { renderer->render_rectangle(zombie_pos.x + (zombie_size/2) - (bar_w/2), zombie_pos.y - bar_h, bar_w*percentage, bar_h, rgb(100,0,0)); } - if (global_state.server) draw_path_of_zombie(window, o); + //if (global_state.server) draw_path_of_zombie(window, o); } } -- cgit v1.2.3-70-g09d2