aboutsummaryrefslogtreecommitdiff
path: root/hud.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2024-10-01 20:40:29 +1000
committerquou <quou@disroot.org>2024-10-01 20:40:29 +1000
commit61d70551166de46cfda7ee5d6212817859153335 (patch)
treec8cf645f0e46d22c4f3e4b7cb0baaaa3622381cf /hud.c
parent5ae0a01f81f98b6bed04ec6e3c6a687317489d91 (diff)
hud
Diffstat (limited to 'hud.c')
-rw-r--r--hud.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/hud.c b/hud.c
new file mode 100644
index 0000000..1e014cb
--- /dev/null
+++ b/hud.c
@@ -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);
+}