summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--data/imgs/ui/stats_overlay.pngbin0 -> 24958 bytes
-rw-r--r--data/psd/stats_overlay.psdbin0 -> 137671 bytes
-rw-r--r--include/asset_defs.h1
-rw-r--r--include/game.h1
-rw-r--r--include/guns.h2
-rw-r--r--src/asset_defs.c1
-rw-r--r--src/game.c129
-rw-r--r--src/overlay.c88
-rw-r--r--src/pathfinding.c6
-rw-r--r--src/players.c8
-rw-r--r--src/rounds.c1
-rw-r--r--src/zombies.c19
13 files changed, 188 insertions, 72 deletions
diff --git a/Makefile b/Makefile
index 5a676d0..8f88f9e 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ main:
cp -a "data/." "build/data"
gcc -m64 -g -Wl,--stack,4194304 -DMODE_DEBUG main.c -o build/zombies.exe -lSDL2_mixer -lSDL2
cp -a "build/." "C:/Manually installed programs/zombieshooter"
- ./build/zombies.exe -ip 127.0.0.1 -port 27015
+ gdb -ex run --args ./build/zombies.exe -ip 127.0.0.1 -port 27015
menu:
rm -rf "build/"
@@ -12,7 +12,7 @@ menu:
cp -a "data/." "build/data"
gcc -m64 -g -Wl,--stack,4194304 -DMODE_DEBUG main.c -o build/zombies.exe -lSDL2_mixer -lSDL2
cp -a "build/." "C:/Manually installed programs/zombieshooter"
- ./build/zombies.exe
+ gdb -ex run ./build/zombies.exe
debug_client:
./build/zombies.exe -ip 127.0.0.1 -port 27015 &
diff --git a/data/imgs/ui/stats_overlay.png b/data/imgs/ui/stats_overlay.png
new file mode 100644
index 0000000..e2c22be
--- /dev/null
+++ b/data/imgs/ui/stats_overlay.png
Binary files differ
diff --git a/data/psd/stats_overlay.psd b/data/psd/stats_overlay.psd
new file mode 100644
index 0000000..8d2d4fa
--- /dev/null
+++ b/data/psd/stats_overlay.psd
Binary files differ
diff --git a/include/asset_defs.h b/include/asset_defs.h
index 0d27bbe..8379656 100644
--- a/include/asset_defs.h
+++ b/include/asset_defs.h
@@ -35,6 +35,7 @@ image* img_red_border;
image* img_heart;
image* img_hurt_overlay_left;
image* img_hurt_overlay_right;
+image* img_stats_overlay;
// Icons
image* img_icon_bullets;
diff --git a/include/game.h b/include/game.h
index 333f076..2884a92 100644
--- a/include/game.h
+++ b/include/game.h
@@ -39,6 +39,7 @@ typedef struct t_game {
scene_state global_scene_state = SCENE_MAIN_MENU;
game global_state = {GAMESTATE_IDLE,DISCONNECTED,0,0};
+bool game_is_paused = false;
pathfinding_request active_requests[SERVER_PATHFINDING_THREADS] = {0};
void init_game();
diff --git a/include/guns.h b/include/guns.h
index 1765159..dd0a91d 100644
--- a/include/guns.h
+++ b/include/guns.h
@@ -23,7 +23,7 @@ typedef struct t_gun {
gun guns[GUN_ALL] = {
{GUN_DESERTEAGLE, "Desert Eagle", 8, 64, 0.0f, 1, 4.0f, 350, 1.0f},
- {GUN_MP5, "MP5", 30, 120, 0.05f, 1, 10.0f, 150, 1.0f},
+ {GUN_MP5, "MP5", 30, 120, 0.05f, 1, 20.0f, 150, 1.0f},
{GUN_NOVA, "Nova", 12, 80, 0.1f, 3, 1.2f, 600, 1.0f},
};
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);
}
}