]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/ammo.qc
Merge branch 'master' into martin-t/dmgtext2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / ammo.qc
1 #include "ammo.qh"
2
3 #include <common/t_items.qh>
4
5 // Ammo (#1)
6
7 void DrawNadeProgressBar(vector myPos, vector mySize, float progress, vector color)
8 {
9         HUD_Panel_DrawProgressBar(
10                 myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
11                 mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
12                 autocvar_hud_panel_ammo_progressbar_name,
13                 progress, 0, 0, color,
14                 autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
15 }
16
17 void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time); // TODO: mutator
18
19 void DrawAmmoItem(vector myPos, vector mySize, .int ammoType, bool isCurrent, bool isInfinite)
20 {
21     TC(bool, isCurrent); TC(bool, isInfinite);
22         if(ammoType == ammo_none)
23                 return;
24
25         // Initialize variables
26
27         int ammo;
28         if(autocvar__hud_configure)
29         {
30                 isCurrent = (ammoType == ammo_rockets); // Rockets always current
31                 ammo = 60;
32         }
33         else
34                 ammo = getstati(GetAmmoStat(ammoType));
35
36         if(!isCurrent)
37         {
38                 float scale = bound(0, autocvar_hud_panel_ammo_noncurrent_scale, 1);
39                 myPos = myPos + (mySize - mySize * scale) * 0.5;
40                 mySize = mySize * scale;
41         }
42
43         vector iconPos, textPos;
44         if(autocvar_hud_panel_ammo_iconalign)
45         {
46                 iconPos = myPos + eX * 2 * mySize.y;
47                 textPos = myPos;
48         }
49         else
50         {
51                 iconPos = myPos;
52                 textPos = myPos + eX * mySize.y;
53         }
54
55         bool isShadowed = (ammo <= 0 && !isCurrent && !isInfinite);
56
57         vector iconColor = isShadowed ? '0 0 0' : '1 1 1';
58         vector textColor;
59         if(isInfinite)
60                 textColor = '0.2 0.95 0';
61         else if(isShadowed)
62                 textColor = '0 0 0';
63         else if(ammo < 10)
64                 textColor = '0.8 0.04 0';
65         else
66                 textColor = '1 1 1';
67
68         float alpha;
69         if(isCurrent)
70                 alpha = panel_fg_alpha;
71         else if(isShadowed)
72                 alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_ammo_noncurrent_alpha, 1) * 0.5;
73         else
74                 alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_ammo_noncurrent_alpha, 1);
75
76         string text = isInfinite ? "\xE2\x88\x9E" : ftos(ammo); // Use infinity symbol (U+221E)
77
78         // Draw item
79
80         if(isCurrent)
81                 drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
82
83         if(ammo > 0 && autocvar_hud_panel_ammo_progressbar)
84                 HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, autocvar_hud_panel_ammo_progressbar_name, ammo/autocvar_hud_panel_ammo_maxammo, 0, 0, textColor, autocvar_hud_progressbar_alpha * alpha, DRAWFLAG_NORMAL);
85
86         if(autocvar_hud_panel_ammo_text)
87                 drawstring_aspect(textPos, text, eX * (2/3) * mySize.x + eY * mySize.y, textColor, alpha, DRAWFLAG_NORMAL);
88
89         drawpic_aspect_skin(iconPos, GetAmmoPicture(ammoType), '1 1 0' * mySize.y, iconColor, alpha, DRAWFLAG_NORMAL);
90 }
91
92 int nade_prevstatus;
93 int nade_prevframe;
94 float nade_statuschange_time;
95
96 void HUD_Ammo()
97 {
98         if(hud != HUD_NORMAL) return;
99         if(!autocvar__hud_configure)
100         {
101                 if((!autocvar_hud_panel_ammo) || (spectatee_status == -1))
102                         return;
103                 if(STAT(HEALTH) < 1 && autocvar_hud_panel_ammo_hide_ondeath)
104                         return;
105         }
106
107         HUD_Panel_LoadCvars();
108
109         draw_beginBoldFont();
110
111         vector pos, mySize;
112         pos = panel_pos;
113         mySize = panel_size;
114
115         if (autocvar_hud_panel_ammo_dynamichud)
116                 HUD_Scale_Enable();
117         else
118                 HUD_Scale_Disable();
119         HUD_Panel_DrawBg();
120         if(panel_bg_padding)
121         {
122                 pos += '1 1 0' * panel_bg_padding;
123                 mySize -= '2 2 0' * panel_bg_padding;
124         }
125
126         int rows = 0, columns, row, column;
127         float nade_cnt = STAT(NADE_BONUS), nade_score = STAT(NADE_BONUS_SCORE);
128         bool draw_nades = (nade_cnt > 0 || nade_score > 0);
129         float nade_statuschange_elapsedtime;
130         int total_ammo_count;
131
132         vector ammo_size;
133         if (autocvar_hud_panel_ammo_onlycurrent)
134                 total_ammo_count = 1;
135         else
136                 total_ammo_count = AMMO_COUNT;
137
138         if(draw_nades)
139         {
140                 ++total_ammo_count;
141                 if (nade_cnt != nade_prevframe)
142                 {
143                         nade_statuschange_time = time;
144                         nade_prevstatus = nade_prevframe;
145                         nade_prevframe = nade_cnt;
146                 }
147         }
148         else
149                 nade_prevstatus = nade_prevframe = nade_statuschange_time = 0;
150
151         rows = HUD_GetRowCount(total_ammo_count, mySize, 3);
152         columns = ceil((total_ammo_count)/rows);
153         ammo_size = vec2(mySize.x / columns, mySize.y / rows);
154
155         vector offset = '0 0 0';
156         float newSize;
157         if(ammo_size.x/ammo_size.y > 3)
158         {
159                 newSize = 3 * ammo_size.y;
160                 offset.x = ammo_size.x - newSize;
161                 pos.x += offset.x/2;
162                 ammo_size.x = newSize;
163         }
164         else
165         {
166                 newSize = 1/3 * ammo_size.x;
167                 offset.y = ammo_size.y - newSize;
168                 pos.y += offset.y/2;
169                 ammo_size.y = newSize;
170         }
171
172         entity wepent = viewmodels[0]; // TODO: unhardcode
173
174         Weapon wep = wepent.switchweapon;
175         int i;
176         bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_WEAPON_AMMO);
177         row = column = 0;
178         if(autocvar_hud_panel_ammo_onlycurrent)
179         {
180                 if(autocvar__hud_configure)
181                 {
182                         DrawAmmoItem(pos, ammo_size, ammo_rockets, true, false);
183                 }
184                 else
185                 {
186                         DrawAmmoItem(
187                                 pos,
188                                 ammo_size,
189                                 wep.ammo_field,
190                                 true,
191                                 infinite_ammo
192                         );
193                 }
194
195                 ++row;
196                 if(row >= rows)
197                 {
198                         row = 0;
199                         column = column + 1;
200                 }
201         }
202         else
203         {
204                 .int ammotype;
205                 row = column = 0;
206                 for(i = 0; i < AMMO_COUNT; ++i)
207                 {
208                         ammotype = GetAmmoFieldFromNum(i);
209                         DrawAmmoItem(
210                                 pos + vec2(column * (ammo_size.x + offset.x), row * (ammo_size.y + offset.y)),
211                                 ammo_size,
212                                 ammotype,
213                                 (wep.ammo_field == ammotype),
214                                 infinite_ammo
215                         );
216
217                         ++row;
218                         if(row >= rows)
219                         {
220                                 row = 0;
221                                 column = column + 1;
222                         }
223                 }
224         }
225
226         if (draw_nades)
227         {
228                 nade_statuschange_elapsedtime = time - nade_statuschange_time;
229
230                 float f = bound(0, nade_statuschange_elapsedtime*2, 1);
231
232                 DrawAmmoNades(pos + vec2(column * (ammo_size.x + offset.x), row * (ammo_size.y + offset.y)), ammo_size, nade_prevstatus < nade_cnt && nade_cnt != 0 && f < 1, f);
233         }
234
235         draw_endBoldFont();
236 }