diff options
| author | Aldrik Ramaekers <aldrik@amftech.nl> | 2024-01-07 14:01:37 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@amftech.nl> | 2024-01-07 14:01:37 +0100 |
| commit | 843440d1e382f909d066c82d2269df67251b35f9 (patch) | |
| tree | f462ce23f15cf204b4e066d61c6ebab3487b9020 | |
| parent | 7cc854e55d7312c8ddcad42935271ebd9d5751a2 (diff) | |
player damage indicator and health regen
| -rw-r--r-- | data/imgs/objects/plants.png (renamed from data/imgs/plants.png) | bin | 9545 -> 9545 bytes | |||
| -rw-r--r-- | data/imgs/objects/wall1.png (renamed from data/imgs/wall1.png) | bin | 4613 -> 4613 bytes | |||
| -rw-r--r-- | data/imgs/player.png | bin | 81870 -> 0 bytes | |||
| -rw-r--r-- | data/imgs/ui/red_border.png | bin | 0 -> 686 bytes | |||
| -rw-r--r-- | include/asset_defs.h | 3 | ||||
| -rw-r--r-- | include/players.h | 4 | ||||
| -rw-r--r-- | include/sprite.h | 1 | ||||
| -rw-r--r-- | src/asset_defs.c | 7 | ||||
| -rw-r--r-- | src/audio.c | 4 | ||||
| -rw-r--r-- | src/overlay.c | 43 | ||||
| -rw-r--r-- | src/players.c | 10 | ||||
| -rw-r--r-- | src/sprite.c | 12 |
12 files changed, 79 insertions, 5 deletions
diff --git a/data/imgs/plants.png b/data/imgs/objects/plants.png Binary files differindex fc936a8..fc936a8 100644 --- a/data/imgs/plants.png +++ b/data/imgs/objects/plants.png diff --git a/data/imgs/wall1.png b/data/imgs/objects/wall1.png Binary files differindex 980513f..980513f 100644 --- a/data/imgs/wall1.png +++ b/data/imgs/objects/wall1.png diff --git a/data/imgs/player.png b/data/imgs/player.png Binary files differdeleted file mode 100644 index 06d4cae..0000000 --- a/data/imgs/player.png +++ /dev/null diff --git a/data/imgs/ui/red_border.png b/data/imgs/ui/red_border.png Binary files differnew file mode 100644 index 0000000..ef14a72 --- /dev/null +++ b/data/imgs/ui/red_border.png diff --git a/include/asset_defs.h b/include/asset_defs.h index 1f652d4..bf98710 100644 --- a/include/asset_defs.h +++ b/include/asset_defs.h @@ -17,6 +17,9 @@ font* fnt_12; font* fnt_8; font* fnt_4; +// UI +image* img_red_border; + // Icons image* img_icon_bullets; image* img_icon_nova; diff --git a/include/players.h b/include/players.h index b9b5710..efafd2b 100644 --- a/include/players.h +++ b/include/players.h @@ -12,8 +12,9 @@ #define MAX_PLAYERS 5 #define MAX_POINT_ANIMATIONS 10 - +#define PLAYER_HEAL_DELAY 2.0f #define GUN_OFFSET_FROM_PLAYER 0.8f +#define PLAYER_HEALTH_REGEN_PER_SEC 200 typedef enum t_player_interact_state { INTERACT_IDLE, @@ -47,6 +48,7 @@ typedef struct t_player { s32 health; s32 max_health; float sec_since_last_shot; + float sec_since_last_damage_taken; player_interact_state interact_state; float sec_since_interact_state_change; float playerx; diff --git a/include/sprite.h b/include/sprite.h index c203595..2775b62 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -27,6 +27,7 @@ sprite create_sprite(image* img, int frame_count, int fwidth, int fheight, float void update_sprite(sprite* sprite); void sprite_set_current_frame(sprite* sprite, int index); sprite_frame sprite_swap_frame_horizontally(sprite_frame frame); +sprite_frame sprite_swap_rotate_90(sprite_frame frame); sprite_frame sprite_get_frame(image* img, sprite* sprite); #endif
\ No newline at end of file diff --git a/src/asset_defs.c b/src/asset_defs.c index 5dc18f8..3c6f328 100644 --- a/src/asset_defs.c +++ b/src/asset_defs.c @@ -19,6 +19,9 @@ void load_assets() { fnt_8 = assets_load_font(Aleo_Regular, Aleo_Regular + Aleo_Regular_Size, 8); fnt_4 = assets_load_font(Aleo_Regular, Aleo_Regular + Aleo_Regular_Size, 4); + // UI + img_red_border = assets_load_image_from_file("data/imgs/ui/red_border.png"); + // Icons img_icon_bullets = assets_load_image_from_file("data/imgs/bullets.png"); img_icon_nova = assets_load_image_from_file("data/imgs/nova.png"); @@ -41,8 +44,8 @@ void load_assets() { // Objects img_spawner = assets_load_image_from_file("data/imgs/spawner.png"); - img_obj_plants = assets_load_image_from_file("data/imgs/plants.png"); - img_obj_wall1 = assets_load_image_from_file("data/imgs/wall1.png"); + img_obj_plants = assets_load_image_from_file("data/imgs/objects/plants.png"); + img_obj_wall1 = assets_load_image_from_file("data/imgs/objects/wall1.png"); img_metal_wall = assets_load_image_from_file("data/imgs/objects/metal_wall.png"); img_metal_wall2 = assets_load_image_from_file("data/imgs/objects/metal_wall2.png"); diff --git a/src/audio.c b/src/audio.c index fa405d1..43a403d 100644 --- a/src/audio.c +++ b/src/audio.c @@ -153,6 +153,8 @@ void play_music(Mix_Music* music) { } void play_positioned_sound(int channel, Mix_Chunk* wav, vec3f pos, float max_audible_dist) { + player* p = get_player_by_id(player_id); + if (!p) return; // calculate volume int tiles_between_throwable_and_player = distance_between_3f((vec3f){.x = p->playerx, .y = p->playery, .z = p->height}, pos); @@ -160,8 +162,6 @@ void play_positioned_sound(int channel, Mix_Chunk* wav, vec3f pos, float max_aud if (volume > 1.0f) volume = 1.0f; if (volume < 0.0f) volume = 0.0f; - //player* p = get_player_by_id(player_id); - //if (!p) return; // calculate angle /* float dirx = (throwables[i].position.x - p->playerx); diff --git a/src/overlay.c b/src/overlay.c index 79cc7cc..2dfbb9c 100644 --- a/src/overlay.c +++ b/src/overlay.c @@ -156,7 +156,50 @@ void draw_points(platform_window* window) { } } +static void draw_hurt_borders(platform_window* window) { + player* p = get_player_by_id(player_id); + if (!p) return; + + int width = window->width * 0.1f; + float opacity = 1.0f - (p->health/(float)p->max_health); + if (opacity < 0.0f) opacity = 0.0f; + if (opacity > 1.0f) opacity = 1.0f; + + color c = rgba(255,255,255,255*opacity); + + // left + renderer->render_image_tint(img_red_border, _global_camera.x, _global_camera.y, width, window->height, c); + + // top + sprite_frame top = {.tl = (vec2f){.x = 0.0f, .y = 0.0f}, .tr = (vec2f){.x = 1.0f, .y = 0.0f}, .bl = (vec2f){.x = 0.0f, .y = 1.0f}, .br = (vec2f){.x = 1.0f, .y = 1.0f}, }; + top = sprite_swap_rotate_90(top); + renderer->render_image_quad_partial_tint(img_red_border, + _global_camera.x, _global_camera.y, + _global_camera.x, _global_camera.y + width, + _global_camera.x + window->width, _global_camera.y + width, + _global_camera.x + window->width, _global_camera.y, + top.tl, top.tr, top.bl, top.br, c); + + + top = sprite_swap_rotate_90(top); + renderer->render_image_quad_partial_tint(img_red_border, + _global_camera.x + window->width - width, _global_camera.y, + _global_camera.x + window->width, _global_camera.y + window->height, + _global_camera.x + window->width - width, _global_camera.y + window->height, + _global_camera.x + window->width, _global_camera.y, + top.tl, top.tr, top.bl, top.br, c); + + top = sprite_swap_rotate_90(top); + renderer->render_image_quad_partial_tint(img_red_border, + _global_camera.x, _global_camera.y + window->height - width, + _global_camera.x, _global_camera.y + window->height, + _global_camera.x + window->width, _global_camera.y + window->height, + _global_camera.x + window->width, _global_camera.y + window->height - width, + top.tl, top.tr, top.bl, top.br, c); +} + void draw_overlay(platform_window* window) { + draw_hurt_borders(window); draw_gun_info(window); draw_points(window); draw_leaderboard(window); diff --git a/src/players.c b/src/players.c index 6ea5205..627918c 100644 --- a/src/players.c +++ b/src/players.c @@ -50,6 +50,7 @@ void spawn_player(u32 id, network_client client) { if (players[i].active) continue; players[i].active = true; players[i].sec_since_last_shot = 10.0f; + players[i].sec_since_last_damage_taken = 10.0f; players[i].playerx = 3; players[i].playery = 3; players[i].gunx = 0.0f; @@ -362,6 +363,7 @@ void hurt_player(u32 id, u32 damage) { } p->health -= damage; + p->sec_since_last_damage_taken = 0.0f; add_audio_event_to_queue(EVENT_PLAYERHURT, p->id, (vec3f){.x = p->playerx, .y = p->playery, .z = p->height}); } @@ -371,7 +373,9 @@ void update_players_server() { players[i].sec_since_last_shot += SERVER_TICK_RATE; players[i].sec_since_interact_state_change += SERVER_TICK_RATE; players[i].sec_since_last_step += SERVER_TICK_RATE; + players[i].sec_since_last_damage_taken += SERVER_TICK_RATE; + // Reloading gun g = get_gun_by_type(players[i].guntype); if (players[i].interact_state == INTERACT_RELOADING && players[i].sec_since_interact_state_change >= g.reload_time) { int amount_to_reload = g.magazine_size; @@ -381,6 +385,12 @@ void update_players_server() { players[i].interact_state = INTERACT_IDLE; } + + // Health regen + if (players[i].sec_since_last_damage_taken >= PLAYER_HEAL_DELAY) { + players[i].health += PLAYER_HEALTH_REGEN_PER_SEC * SERVER_TICK_RATE; + if (players[i].health >= players[i].max_health) players[i].health = players[i].max_health; + } } update_players_client(); diff --git a/src/sprite.c b/src/sprite.c index 5818ebf..3aeb047 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -60,6 +60,18 @@ sprite_frame sprite_get_frame(image* img, sprite* sprite) { return frame; } +sprite_frame sprite_swap_rotate_90(sprite_frame frame) { + vec2f tl = frame.bl; + vec2f tr = frame.tl; + vec2f bl = frame.br; + vec2f br = frame.tr; + frame.tl = tl; + frame.tr = tr; + frame.bl = bl; + frame.br = br; + return frame; +} + sprite_frame sprite_swap_frame_horizontally(sprite_frame frame) { vec2f tl = frame.tr; vec2f tr = frame.tl; |
