diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | hud.c | 124 | ||||
-rw-r--r-- | intermediate/hud.bmp | bin | 0 -> 5022 bytes | |||
-rw-r--r-- | obj.h | 2 | ||||
-rw-r--r-- | world.c | 1 |
5 files changed, 130 insertions, 1 deletions
@@ -48,6 +48,7 @@ sources = \ asset.c \ deathzone.c \ enemy.c \ + hud.c \ map.c \ maths.c \ memory.c \ @@ -61,10 +62,11 @@ sources = \ image_sources = \ $(int_dir)/arms.bmp \ - $(int_dir)/npc.bmp \ $(int_dir)/guy.bmp \ + $(int_dir)/hud.bmp \ $(int_dir)/map.bmp \ $(int_dir)/mask.bmp \ + $(int_dir)/npc.bmp \ anim_sources = \ $(int_dir)/demon_fly_left.anm \ @@ -0,0 +1,124 @@ +#include "asset.h" +#include "config.h" +#include "render.h" +#include "world.h" + +const Rect heart_empty_rect = { 0, 0, 7, 6 }; +const Rect heart_half_rect = { 7, 0, 7, 6 }; +const Rect heart_full_rect = { 14, 0, 7, 6 }; +const Rect charge_empty_rect = { 0, 6, 7, 7 }; +const Rect charge_full_rect = { 7, 6, 7, 7 }; +const Rect background_rect = { 0, 13, 37, 20 }; + +const int hud_offset_x = 4; +const int hud_offset_y = 4; + +void hud_clip(Renderer* r) { + Rect clip; + clip.x = hud_offset_x; + clip.y = hud_offset_y; + clip.w = background_rect.w; + clip.h = background_rect.h; + ren_clip(r, &clip); +} + +void hud_background(Renderer* r, const Bitmap* bm) { + ren_map( + r, + hud_offset_x, + hud_offset_y, + &background_rect, + bm + ); +} + +void hud_hp(Renderer* r, const Bitmap* bm, int h) { + const int rmd = h & 1; + const int hh = h >> 1; + const int hmh = player_health >> 1; + int i; + int x = hud_offset_x + 3; + const int y = hud_offset_y + 3; + const int s = heart_empty_rect.w + 1; + for (i = 0; i < hh; i++, x += s) { + ren_map( + r, + x, + y, + &heart_full_rect, + bm + ); + } + if (rmd) { + ren_map( + r, + x, + y, + &heart_half_rect, + bm + ); + i++; + x += s; + } + for (; i < hmh; i++, x += s) + ren_map( + r, + x, + y, + &heart_empty_rect, + bm + ); +} + +void hud_charge(Renderer* r, const Bitmap* bm, int c, int f) { + int x = hud_offset_x + 3; + const int y = hud_offset_y + heart_empty_rect.h + 4; + if (c >= player_special_hits) { + int tx, ty; + Rect rect; + rect.x = x; + rect.y = y; + rect.w = + charge_empty_rect.w * + player_special_hits + + player_special_hits - 1; + rect.h = charge_empty_rect.h; + tx = rect.x + (rect.w >> 1) - 13 + ((f & 4) == 0); + ty = rect.y + (rect.h >> 1) - 2 + ((f & 6) == 0); + ren_text(r, tx, ty, "SPECIAL"); + ren_rect(r, &rect); + } else { + const int s = charge_empty_rect.w + 1; + int i; + for (i = 0; i < c; i++, x += s) + ren_map( + r, + x, + y, + &charge_full_rect, + bm + ); + for (; i < player_special_hits; i++, x += s) { + ren_map( + r, + x, + y, + &charge_empty_rect, + bm + ); + } + } +} + +void ren_hud(const World* w, Renderer* r) { + const Bitmap* bm = get_bitmap(asset_id_hud_img); + const Player* p = &w->player; + const int hp = p->hp; + const int c = p->charge; + hud_clip(r); + ren_clear(r); + hud_background(r, bm); + hud_hp(r, bm, hp); + hud_charge(r, bm, c, w->frame); + ren_rclip(r); +} diff --git a/intermediate/hud.bmp b/intermediate/hud.bmp Binary files differnew file mode 100644 index 0000000..c1850bd --- /dev/null +++ b/intermediate/hud.bmp @@ -79,4 +79,6 @@ void init_deathzone( ); int update_deathzone(Deathzone* d); +void ren_hud(const struct World* w, struct Renderer* r); + #endif @@ -75,4 +75,5 @@ void ren_world(const World* w, struct Renderer* r) { ren_particle(&w->particles[i], r); for (i = 0; i < w->enemy_count; i++) ren_enemy(&w->enemies[i], r); + ren_hud(w, r); } |