]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/healtharmor.qc
Update default video settings
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / healtharmor.qc
1 #include "healtharmor.qh"
2
3 #include <client/draw.qh>
4 #include <common/deathtypes/all.qh>
5
6 // Health/armor (#3)
7
8 void HUD_HealthArmor_Export(int fh)
9 {
10         // allow saving cvars that aesthetically change the panel into hud skin files
11         HUD_Write_Cvar("hud_panel_healtharmor_combined");
12         HUD_Write_Cvar("hud_panel_healtharmor_flip");
13         HUD_Write_Cvar("hud_panel_healtharmor_iconalign");
14         HUD_Write_Cvar("hud_panel_healtharmor_baralign");
15         HUD_Write_Cvar("hud_panel_healtharmor_progressbar");
16         HUD_Write_Cvar("hud_panel_healtharmor_progressbar_health");
17         HUD_Write_Cvar("hud_panel_healtharmor_progressbar_armor");
18         HUD_Write_Cvar("hud_panel_healtharmor_progressbar_gfx");
19         HUD_Write_Cvar("hud_panel_healtharmor_progressbar_gfx_smooth");
20         HUD_Write_Cvar("hud_panel_healtharmor_text");
21 }
22
23 void HUD_HealthArmor()
24 {
25         int armor, health, fuel, air_time;
26         if(!autocvar__hud_configure)
27         {
28                 if((!autocvar_hud_panel_healtharmor) || (spectatee_status == -1))
29                         return;
30                 if(hud != HUD_NORMAL) return;
31
32                 health = STAT(HEALTH);
33                 if(health <= 0)
34                 {
35                         health = 0;
36                         prev_health = -1;
37                         if(autocvar_hud_panel_healtharmor_hide_ondeath)
38                                 return;
39                 }
40                 armor = STAT(ARMOR);
41
42                 // code to check for spectatee_status changes is in ENT_CLIENT_CLIENTDATA
43                 // prev_p_health and prev_health can be set to -1 there
44
45                 if (prev_p_health == -1)
46                 {
47                         // no effect
48                         health_beforedamage = 0;
49                         armor_beforedamage = 0;
50                         health_damagetime = 0;
51                         armor_damagetime = 0;
52                         prev_health = health;
53                         prev_armor = armor;
54                         old_p_health = health;
55                         old_p_armor = armor;
56                         prev_p_health = health;
57                         prev_p_armor = armor;
58                 }
59                 else if (prev_health == -1)
60                 {
61                         //start the load effect
62                         health_damagetime = 0;
63                         armor_damagetime = 0;
64                         prev_health = 0;
65                         prev_armor = 0;
66                 }
67                 fuel = STAT(FUEL);
68                 air_time = bound(0, STAT(AIR_FINISHED) - time, 10);
69         }
70         else
71         {
72                 health = 150;
73                 armor = 75;
74                 fuel = 20;
75                 air_time = 6;
76         }
77
78         HUD_Panel_LoadCvars();
79
80         draw_beginBoldFont();
81
82         vector pos, mySize;
83         pos = panel_pos;
84         mySize = panel_size;
85
86         if (autocvar_hud_panel_healtharmor_dynamichud)
87                 HUD_Scale_Enable();
88         else
89                 HUD_Scale_Disable();
90         HUD_Panel_DrawBg();
91         if(panel_bg_padding)
92         {
93                 pos += '1 1 0' * panel_bg_padding;
94                 mySize -= '2 2 0' * panel_bg_padding;
95         }
96
97         float air_alpha;
98         if (!STAT(AIR_FINISHED))
99                 air_alpha = 0;
100         else if (time > STAT(AIR_FINISHED))
101         {
102                 air_alpha = blink_synced(0.5, 0.5, 7, STAT(AIR_FINISHED), -1);
103                 air_time = 10;
104         }
105         else
106         {
107                 float fade_time = 10 / 2;
108                 float start_alpha = autocvar_hud_panel_healtharmor_oxygenbar_startalpha;
109                 float f = (STAT(AIR_FINISHED) - time - fade_time) / fade_time;
110                 air_alpha = bound(0, start_alpha + (1 - start_alpha) * (1 - f), 1);
111         }
112
113         float fuel_alpha;
114         if (!fuel)
115                 fuel_alpha = 0;
116         else
117         {
118                 float start_alpha = autocvar_hud_panel_healtharmor_fuelbar_startalpha;
119                 float f = (100 - fuel) / 50;
120                 fuel_alpha = bound(0, start_alpha + (1 - start_alpha) * f, 1);
121         }
122
123         int baralign = autocvar_hud_panel_healtharmor_baralign;
124         int iconalign = autocvar_hud_panel_healtharmor_iconalign;
125
126         int maxhealth = autocvar_hud_panel_healtharmor_maxhealth;
127         int maxarmor = autocvar_hud_panel_healtharmor_maxarmor;
128         if(autocvar_hud_panel_healtharmor_combined) // combined health and armor display
129         {
130                 vector v = healtharmor_maxdamage(health, armor, armorblockpercent, DEATH_WEAPON.m_id);
131                 float hp = floor(v.x + 1);
132
133                 float maxtotal = maxhealth + maxarmor;
134                 string biggercount;
135                 if(v.z) // NOT fully armored
136                 {
137                         biggercount = "health";
138                         if(autocvar_hud_panel_healtharmor_progressbar)
139                                 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_health, hp/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
140                         if(armor && autocvar_hud_panel_healtharmor_text)
141                                 drawpic_aspect_skin(pos + eX * mySize.x - eX * 0.5 * mySize.y, "armor", '0.5 0.5 0' * mySize.y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL);
142                 }
143                 else
144                 {
145                         biggercount = "armor";
146                         if(autocvar_hud_panel_healtharmor_progressbar)
147                                 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, hp/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
148                         if(health && autocvar_hud_panel_healtharmor_text)
149                                 drawpic_aspect_skin(pos + eX * mySize.x - eX * 0.5 * mySize.y, "health", '0.5 0.5 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
150                 }
151                 if(autocvar_hud_panel_healtharmor_text)
152                         DrawNumIcon(pos, mySize, hp, biggercount, false, false, iconalign, HUD_Get_Num_Color(hp, maxtotal, true), 1);
153
154                 if(fuel)
155                         HUD_Panel_DrawProgressBar(pos, vec2(mySize.x, 0.2 * mySize.y), "progressbar", fuel / 100, 0, (baralign == 1 || baralign == 3), autocvar_hud_progressbar_fuel_color, fuel_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
156                 if(air_time)
157                         HUD_Panel_DrawProgressBar(pos + eY * 0.8 * mySize.y, vec2(mySize.x, 0.2 * mySize.y), "progressbar", air_time / 10, 0, (baralign == 1 || baralign == 3), autocvar_hud_progressbar_oxygen_color, air_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
158         }
159         else
160         {
161                 float panel_ar = mySize.x/mySize.y;
162                 bool is_vertical = (panel_ar < 1);
163                 vector health_offset = '0 0 0', armor_offset = '0 0 0';
164                 if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
165                 {
166                         mySize.x *= 0.5;
167                         if (autocvar_hud_panel_healtharmor_flip)
168                                 health_offset.x = mySize.x;
169                         else
170                                 armor_offset.x = mySize.x;
171                 }
172                 else
173                 {
174                         mySize.y *= 0.5;
175                         if (autocvar_hud_panel_healtharmor_flip)
176                                 health_offset.y = mySize.y;
177                         else
178                                 armor_offset.y = mySize.y;
179                 }
180
181                 bool health_baralign, armor_baralign, fuel_baralign, air_align;
182                 bool health_iconalign, armor_iconalign;
183                 if (autocvar_hud_panel_healtharmor_flip)
184                 {
185                         armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
186                         health_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
187                         air_align = fuel_baralign = health_baralign;
188                         armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
189                         health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
190                 }
191                 else
192                 {
193                         health_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
194                         armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
195                         air_align = fuel_baralign = armor_baralign;
196                         health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
197                         armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
198                 }
199
200                 //if(health)
201                 {
202                         if(autocvar_hud_panel_healtharmor_progressbar)
203                         {
204                                 float p_health, pain_health_alpha;
205                                 p_health = health;
206                                 pain_health_alpha = 1;
207                                 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
208                                 {
209                                         if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
210                                         {
211                                                 if (fabs(prev_health - health) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
212                                                 {
213                                                         if (time - old_p_healthtime < 1)
214                                                                 old_p_health = prev_p_health;
215                                                         else
216                                                                 old_p_health = prev_health;
217                                                         old_p_healthtime = time;
218                                                 }
219                                                 if (time - old_p_healthtime < 1)
220                                                 {
221                                                         p_health += (old_p_health - health) * (1 - (time - old_p_healthtime));
222                                                         prev_p_health = p_health;
223                                                 }
224                                         }
225                                         if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
226                                         {
227                                                 if (prev_health - health >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
228                                                 {
229                                                         if (time - health_damagetime >= 1)
230                                                                 health_beforedamage = prev_health;
231                                                         health_damagetime = time;
232                                                 }
233                                                 if (time - health_damagetime < 1)
234                                                 {
235                                                         float health_damagealpha = 1 - (time - health_damagetime)*(time - health_damagetime);
236                                                         HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, health_beforedamage/maxhealth, is_vertical, health_baralign, autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * health_damagealpha, DRAWFLAG_NORMAL);
237                                                 }
238                                         }
239                                         prev_health = health;
240
241                                         if (health <= autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth)
242                                         {
243                                                 pain_health_alpha = blink(0.85, 0.15, 9);
244                                         }
245                                 }
246                                 HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, p_health/maxhealth, is_vertical, health_baralign, autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * pain_health_alpha, DRAWFLAG_NORMAL);
247                         }
248                         if(autocvar_hud_panel_healtharmor_text)
249                                 DrawNumIcon(pos + health_offset, mySize, health, "health", is_vertical, false, health_iconalign, HUD_Get_Num_Color(health, maxhealth, true), 1);
250                 }
251
252                 //if(armor)
253                 {
254                         float p_armor = armor;
255                         if(autocvar_hud_panel_healtharmor_progressbar)
256                         {
257                                 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
258                                 {
259                                         if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
260                                         {
261                                                 if (fabs(prev_armor - armor) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
262                                                 {
263                                                         if (time - old_p_armortime < 1)
264                                                                 old_p_armor = prev_p_armor;
265                                                         else
266                                                                 old_p_armor = prev_armor;
267                                                         old_p_armortime = time;
268                                                 }
269                                                 if (time - old_p_armortime < 1)
270                                                 {
271                                                         p_armor += (old_p_armor - armor) * (1 - (time - old_p_armortime));
272                                                         prev_p_armor = p_armor;
273                                                 }
274                                         }
275                                         if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
276                                         {
277                                                 if (prev_armor - armor >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
278                                                 {
279                                                         if (time - armor_damagetime >= 1)
280                                                                 armor_beforedamage = prev_armor;
281                                                         armor_damagetime = time;
282                                                 }
283                                                 if (time - armor_damagetime < 1)
284                                                 {
285                                                         float armor_damagealpha = 1 - (time - armor_damagetime)*(time - armor_damagetime);
286                                                         HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, armor_beforedamage/maxarmor, is_vertical, armor_baralign, autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * armor_damagealpha, DRAWFLAG_NORMAL);
287                                                 }
288                                         }
289                                         prev_armor = armor;
290                                 }
291                                 if(p_armor)
292                                         HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, p_armor/maxarmor, is_vertical, armor_baralign, autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
293                         }
294                         if(!autocvar_hud_panel_healtharmor_progressbar || p_armor)
295                         if(autocvar_hud_panel_healtharmor_text)
296                                 DrawNumIcon(pos + armor_offset, mySize, armor, "armor", is_vertical, false, armor_iconalign, HUD_Get_Num_Color(armor, maxarmor, true), 1);
297                 }
298
299                 vector cell_size = mySize;
300                 if (fuel || air_time)
301                 {
302                         if (is_vertical)
303                                 mySize.x *= 0.2 / 2; //if vertical always halve x to not cover too much numbers with 3 digits
304                         else
305                                 mySize.y *= 0.2;
306                         if (panel_ar >= 4)
307                                 mySize.x *= 2; //restore full panel size
308                         else if (panel_ar < 1/4)
309                                 mySize.y *= 2; //restore full panel size
310                         if (fuel)
311                                 HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel / 100, is_vertical, fuel_baralign, autocvar_hud_progressbar_fuel_color, fuel_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
312                         if (air_time)
313                         {
314                                 if (panel_ar > 1 && panel_ar < 4)
315                                         pos.y += cell_size.y;
316                                 else if (panel_ar > 1/4 && panel_ar <= 1)
317                                         pos.x += cell_size.x;
318                                 if (is_vertical)
319                                         pos.x += cell_size.x - mySize.x;
320                                 else
321                                         pos.y += cell_size.y - mySize.y;
322                                 HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", air_time / 10, is_vertical, air_align, autocvar_hud_progressbar_oxygen_color, air_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
323                         }
324                 }
325         }
326
327         draw_endBoldFont();
328 }