#include "asset.h" #include "config.h" #include "render.h" #include "world.h" const int specials_pos[][2] = { #define x(name, x, y) { x, y }, specials_xmacro #undef x }; 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, 29 }; const int special_size[2] = { 16, 8 }; 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 hud_special(Renderer* r, const Bitmap* bm, Special s) { const int y = hud_offset_y + heart_empty_rect.h + charge_empty_rect.h + 5; int x; Rect rect; rect.x = specials_pos[s][0]; rect.y = specials_pos[s][1]; rect.w = special_size[0]; rect.h = special_size[1]; x = hud_offset_x + (background_rect.w >> 1) - (special_size[0] >> 1); ren_map( r, x, y, &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; const Special s = p->spec; hud_clip(r); ren_clear(r); hud_background(r, bm); hud_hp(r, bm, hp); hud_charge(r, bm, c, w->frame); hud_special(r, bm, s); ren_rclip(r); }