summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2024-01-07 14:01:37 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2024-01-07 14:01:37 +0100
commit843440d1e382f909d066c82d2269df67251b35f9 (patch)
treef462ce23f15cf204b4e066d61c6ebab3487b9020
parent7cc854e55d7312c8ddcad42935271ebd9d5751a2 (diff)
player damage indicator and health regen
-rw-r--r--data/imgs/objects/plants.png (renamed from data/imgs/plants.png)bin9545 -> 9545 bytes
-rw-r--r--data/imgs/objects/wall1.png (renamed from data/imgs/wall1.png)bin4613 -> 4613 bytes
-rw-r--r--data/imgs/player.pngbin81870 -> 0 bytes
-rw-r--r--data/imgs/ui/red_border.pngbin0 -> 686 bytes
-rw-r--r--include/asset_defs.h3
-rw-r--r--include/players.h4
-rw-r--r--include/sprite.h1
-rw-r--r--src/asset_defs.c7
-rw-r--r--src/audio.c4
-rw-r--r--src/overlay.c43
-rw-r--r--src/players.c10
-rw-r--r--src/sprite.c12
12 files changed, 79 insertions, 5 deletions
diff --git a/data/imgs/plants.png b/data/imgs/objects/plants.png
index fc936a8..fc936a8 100644
--- a/data/imgs/plants.png
+++ b/data/imgs/objects/plants.png
Binary files differ
diff --git a/data/imgs/wall1.png b/data/imgs/objects/wall1.png
index 980513f..980513f 100644
--- a/data/imgs/wall1.png
+++ b/data/imgs/objects/wall1.png
Binary files differ
diff --git a/data/imgs/player.png b/data/imgs/player.png
deleted file mode 100644
index 06d4cae..0000000
--- a/data/imgs/player.png
+++ /dev/null
Binary files differ
diff --git a/data/imgs/ui/red_border.png b/data/imgs/ui/red_border.png
new file mode 100644
index 0000000..ef14a72
--- /dev/null
+++ b/data/imgs/ui/red_border.png
Binary files differ
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;