1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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);
}
|