diff options
Diffstat (limited to 'hud.c')
-rw-r--r-- | hud.c | 124 |
1 files changed, 124 insertions, 0 deletions
@@ -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); +} |