void HUD_Weapons(void)
{
- float i, f, screen_ar;
- float center_x, center_y;
- if(hud != HUD_NORMAL) return;
+ // declarations
+ float weapons_stat = getstati(STAT_WEAPONS);
+ float i, f, a, j, factor;
+ float screen_ar, center_x, center_y;
+ float weapon_count, weapon_id, weapon_alpha;
+ float row, column, rows, columns;
+ float aspect = autocvar_hud_panel_weapons_aspect;
+
+ float show_accuracy, panel_weapon_accuracy;
+
+ float timeout = autocvar_hud_panel_weapons_timeout;
+ float timein_effect_length = (autocvar_hud_panel_weapons_timeout_effect ? 0.375 : 0);
+ float timeout_effect_length = (autocvar_hud_panel_weapons_timeout_effect ? 0.75 : 0);
+
+ float ammo_type, ammo_full, ammo_alpha;
+ float barsize_x, barsize_y, baroffset_x, baroffset_y;
+
+ float when = autocvar_hud_panel_weapons_complainbubble_time;
+ float fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
+
+ vector weapon_pos, weapon_size;
+ vector old_panel_size;
+ vector color, ammo_color;
+
+ // check to see if we want to continue
+ if(hud != HUD_NORMAL) { return; }
+
if(!autocvar__hud_configure)
- {
- if(!autocvar_hud_panel_weapons) return;
- if(spectatee_status == -1) return;
- }
+ if((!autocvar_hud_panel_weapons) || (spectatee_status == -1))
+ return;
+ else if(timeout && time >= weapontime + timeout + timeout_effect_length)
+ {
+ weaponprevtime = time;
+ return;
+ }
else
hud_configure_active_panel = HUD_PANEL_WEAPONS;
- float timeout = autocvar_hud_panel_weapons_timeout;
- float timeout_effect_length, timein_effect_length;
- if (autocvar_hud_panel_weapons_timeout_effect == 0)
+ // update generic hud functions
+ HUD_Panel_UpdateCvars(weapons);
+ HUD_Panel_ApplyFadeAlpha();
+
+ // calculate fading effect to weapon images for when the panel is idle
+ if(autocvar_hud_panel_weapons_fade)
{
- timeout_effect_length = 0;
- timein_effect_length = 0;
+ weapon_alpha = 3.2 - 2 * (time - weapontime);
+ weapon_alpha = bound(0.7, weapon_alpha, 1) * panel_fg_alpha;
}
else
- {
- timeout_effect_length = 0.75;
- timein_effect_length = 0.375;
- }
-
- if (timeout && time >= weapontime + timeout + timeout_effect_length && !autocvar__hud_configure)
- {
- weaponprevtime = time;
- return;
- }
+ weapon_alpha = panel_fg_alpha;
- HUD_Panel_UpdateCvars(weapons);
- HUD_Panel_ApplyFadeAlpha();
-
- // TODO make this configurable
+ // figure out weapon order (how the weapons are sorted) // TODO make this configurable
if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
{
float weapon_cnt;
weaponorder_cmp_str = string_null;
}
-
- float when, fadetime;
- when = autocvar_hud_panel_weapons_complainbubble_time;
- fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
- float weapons_st = getstati(STAT_WEAPONS);
- float weapon_count;
+
+ // determine which weapons are going to be shown
if (autocvar_hud_panel_weapons_onlyowned)
{
if(autocvar__hud_configure)
{
- if (weapons_st == 0)
+ if (weapons_stat == 0) // create some fake weapons anyway
for(i = 0; i <= WEP_LAST-WEP_FIRST; i += floor((WEP_LAST-WEP_FIRST)/5))
- weapons_st |= power2of(i);
+ weapons_stat |= power2of(i);
+
if(menu_enabled != 2)
HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
}
-
- vector old_panel_size;
+
+ // do we own this weapon?
for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
- {
- if(weapons_st & weaponorder[i].weapons)
+ if(weapons_stat & weaponorder[i].weapons)
++weapon_count;
- }
- if(!autocvar__hud_configure && (autocvar_hud_panel_weapons_complainbubble && time - complain_weapon_time < when + fadetime))// && complain_weapon >= 0
- ++weapon_count;
- if (weapon_count == 0)
- return;
+
+ // add it anyway if weaponcomplain is shown
+ if((!autocvar__hud_configure)
+ && (autocvar_hud_panel_weapons_complainbubble
+ && time - complain_weapon_time < when + fadetime))
+ ++weapon_count;
+
+ // might as well commit suicide now, no reason to live ;)
+ if (weapon_count == 0) { return; }
+
// reduce size of the panel
if (panel_size_y > panel_size_x)
{
else
weapon_count = WEP_COUNT;
- if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
+ // animation for fading in/out the panel respectively when not in use
+ if(!autocvar__hud_configure)
{
- f = (time - (weapontime + timeout)) / timeout_effect_length;
- if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
- {
- panel_bg_alpha *= (1 - f);
- panel_fg_alpha *= (1 - f);
- }
- if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
+ if (timeout && time >= weapontime + timeout) // apply timeout effect if needed
{
- f *= f; // for a cooler movement
- center_x = panel_pos_x + panel_size_x/2;
- center_y = panel_pos_y + panel_size_y/2;
- screen_ar = vid_conwidth/vid_conheight;
- if (center_x/center_y < screen_ar) //bottom left
+ f = (time - (weapontime + timeout)) / timeout_effect_length;
+ if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
{
- if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
- panel_pos_y += f * (vid_conheight - panel_pos_y);
- else //left
- panel_pos_x -= f * (panel_pos_x + panel_size_x);
+ panel_bg_alpha *= (1 - f);
+ panel_fg_alpha *= (1 - f);
}
- else //top right
+ if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
{
- if ((vid_conwidth - center_x)/center_y < screen_ar) //right
- panel_pos_x += f * (vid_conwidth - panel_pos_x);
- else //top
- panel_pos_y -= f * (panel_pos_y + panel_size_y);
+ f *= f; // for a cooler movement
+ center_x = panel_pos_x + panel_size_x/2;
+ center_y = panel_pos_y + panel_size_y/2;
+ screen_ar = vid_conwidth/vid_conheight;
+ if (center_x/center_y < screen_ar) //bottom left
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
+ panel_pos_y += f * (vid_conheight - panel_pos_y);
+ else //left
+ panel_pos_x -= f * (panel_pos_x + panel_size_x);
+ }
+ else //top right
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //right
+ panel_pos_x += f * (vid_conwidth - panel_pos_x);
+ else //top
+ panel_pos_y -= f * (panel_pos_y + panel_size_y);
+ }
}
+ weaponprevtime = time - (1 - f) * timein_effect_length;
}
- weaponprevtime = time - (1 - f) * timein_effect_length;
- }
- else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure)
- {
- f = (time - weaponprevtime) / timein_effect_length;
- if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
+ else if (timeout && time < weaponprevtime + timein_effect_length) // apply timein effect if needed
{
- panel_bg_alpha *= (f);
- panel_fg_alpha *= (f);
- }
- if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
- {
- f *= f; // for a cooler movement
- f = 1 - f;
- center_x = panel_pos_x + panel_size_x/2;
- center_y = panel_pos_y + panel_size_y/2;
- screen_ar = vid_conwidth/vid_conheight;
- if (center_x/center_y < screen_ar) //bottom left
+ f = (time - weaponprevtime) / timein_effect_length;
+ if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
{
- if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
- panel_pos_y += f * (vid_conheight - panel_pos_y);
- else //left
- panel_pos_x -= f * (panel_pos_x + panel_size_x);
+ panel_bg_alpha *= (f);
+ panel_fg_alpha *= (f);
}
- else //top right
+ if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
{
- if ((vid_conwidth - center_x)/center_y < screen_ar) //right
- panel_pos_x += f * (vid_conwidth - panel_pos_x);
- else //top
- panel_pos_y -= f * (panel_pos_y + panel_size_y);
+ f *= f; // for a cooler movement
+ f = 1 - f;
+ center_x = panel_pos_x + panel_size_x/2;
+ center_y = panel_pos_y + panel_size_y/2;
+ screen_ar = vid_conwidth/vid_conheight;
+ if (center_x/center_y < screen_ar) //bottom left
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
+ panel_pos_y += f * (vid_conheight - panel_pos_y);
+ else //left
+ panel_pos_x -= f * (panel_pos_x + panel_size_x);
+ }
+ else //top right
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //right
+ panel_pos_x += f * (vid_conwidth - panel_pos_x);
+ else //top
+ panel_pos_y -= f * (panel_pos_y + panel_size_y);
+ }
}
}
}
+ // draw the background, then change the virtual size of it to better fit other items inside
HUD_Panel_DrawBg(1);
if(panel_bg_padding)
{
panel_pos += '1 1 0' * panel_bg_padding;
- panel_size -= '2 2 0' * panel_bg_padding;
+ panel_size -= '1 1 0' * panel_bg_padding;
}
- float weapid, wpnalpha;
-
- if(autocvar_hud_panel_weapons_fade)
- {
- wpnalpha = 3.2 - 2 * (time - weapontime);
- wpnalpha = bound(0.7, wpnalpha, 1) * panel_fg_alpha;
- }
- else
- wpnalpha = panel_fg_alpha;
-
- float rows, columns;
- float aspect = autocvar_hud_panel_weapons_aspect;
+ // after the sizing and animations are done, update the other values
rows = panel_size_y/panel_size_x;
rows = bound(1, floor((sqrt(4 * aspect * rows * weapon_count + rows * rows) + rows + 0.5) / 2), weapon_count);
-
columns = ceil(weapon_count/rows);
- float row, column;
-
- float a, type, fullammo;
-
- vector color;
- vector wpnpos;
- vector wpnsize;
-
- vector ammo_color;
- float ammo_alpha;
- wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
- float barsize_x, barsize_y, baroffset_x, baroffset_y;
+ weapon_size = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
+
+ // calculate position/size for visual bar displaying ammount of ammo status
if (autocvar_hud_panel_weapons_ammo)
{
ammo_color = stov(autocvar_hud_panel_weapons_ammo_color);
ammo_alpha = panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha;
-
- if(wpnsize_x/wpnsize_y > aspect)
+ if(weapon_size_x/weapon_size_y > aspect)
{
- barsize_x = aspect * wpnsize_y;
- barsize_y = wpnsize_y;
- baroffset_x = (wpnsize_x - barsize_x) / 2;
+ barsize_x = aspect * weapon_size_y;
+ barsize_y = weapon_size_y;
+ baroffset_x = (weapon_size_x - barsize_x) / 2;
}
else
{
- barsize_y = 1/aspect * wpnsize_x;
- barsize_x = wpnsize_x;
- baroffset_y = (wpnsize_y - barsize_y) / 2;
+ barsize_y = 1/aspect * weapon_size_x;
+ barsize_x = weapon_size_x;
+ baroffset_y = (weapon_size_y - barsize_y) / 2;
}
}
- float show_accuracy;
- float weapon_stats;
if(autocvar_hud_panel_weapons_accuracy && acc_levels)
{
show_accuracy = true;
for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
{
+ // retrieve information about the current weapon to be drawn
self = weaponorder[i];
- if (!self || self.impulse < 0)
- continue;
- if (autocvar_hud_panel_weapons_onlyowned)
- if (!((weapons_st & self.weapons) || (self.weapon == complain_weapon && time - complain_weapon_time < when + fadetime && autocvar_hud_panel_weapons_complainbubble)))
- continue;
- wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y;
-
- weapid = self.impulse;
+ weapon_id = self.impulse;
+
+ // skip if this weapon doesn't exist
+ if (!self || self.impulse < 0) { continue; }
+
+ // skip this weapon if we don't own it (and onlyowned is enabled)-- or if weapons_complainbubble is showing for this weapon
+ if (autocvar_hud_panel_weapons_onlyowned
+ && !((weapons_stat & self.weapons)
+ || (self.weapon == complain_weapon
+ && time - complain_weapon_time < when + fadetime
+ && autocvar_hud_panel_weapons_complainbubble)))
+ continue;
+
+ // figure out the drawing position of weapon
+ weapon_pos = (panel_pos
+ + eX * column * weapon_size_x
+ + eY * row * weapon_size_y);
// draw background behind currently selected weapon
if(self.weapon == switchweapon)
- drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
// draw the weapon accuracy
if(show_accuracy)
{
- weapon_stats = weapon_accuracy[self.weapon-WEP_FIRST];
- if(weapon_stats >= 0)
+ panel_weapon_accuracy = weapon_accuracy[self.weapon-WEP_FIRST];
+ if(panel_weapon_accuracy >= 0)
{
- // find the max level lower than weapon_stats
- float j;
+ // find the max level lower than weapon_accuracy
j = acc_levels-1;
- while ( j && weapon_stats < acc_lev[j] )
+ while ( j && panel_weapon_accuracy < acc_lev[j] )
--j;
- // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
- float factor;
- factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
+ // inject color j+1 in color j, how much depending on how much weapon_accuracy is higher than level j
+ factor = (panel_weapon_accuracy - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
color = acc_col[j];
color = color + factor * (acc_col[j+1] - color);
- drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(weapon_pos, "weapon_accuracy", weapon_size, color, panel_fg_alpha, DRAWFLAG_NORMAL);
}
}
- // draw the weapon icon
- if(weapons_st & self.weapons)
+ // drawing all the weapon items
+ if(weapons_stat & self.weapons)
{
- drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
-
- if(autocvar_hud_panel_weapons_label == 1) // weapon number
- drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- else if(autocvar_hud_panel_weapons_label == 2) // bind
- drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ // draw the weapon image
+ drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
+ // draw weapon label string
+ switch(autocvar_hud_panel_weapons_label)
+ {
+ case 1: // weapon number
+ drawstring(weapon_pos, ftos(weapon_id), '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ break;
+
+ case 2: // bind
+ drawstring(weapon_pos, getcommandkey(ftos(weapon_id), strcat("impulse ", ftos(weapon_id))), '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ break;
+
+ case 3: // weapon name
+ drawstring(weapon_pos, self.netname, '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ break;
+
+ default: // nothing
+ break;
+ }
+
// draw ammo status bar
if(autocvar_hud_panel_weapons_ammo && self.weapon != WEP_TUBA && self.weapon != WEP_LASER && self.weapon != WEP_PORTO)
{
a = 0;
- type = GetAmmoTypeForWep(self.weapon);
- if(type != -1)
- a = getstati(GetAmmoStat(type)); // how much ammo do we have?
+ ammo_type = GetAmmoTypeForWep(self.weapon);
+ if(ammo_type != -1)
+ a = getstati(GetAmmoStat(ammo_type)); // how much ammo do we have?
if(a > 0)
{
- switch(type) {
- case 0: fullammo = autocvar_hud_panel_weapons_ammo_full_shells; break;
- case 1: fullammo = autocvar_hud_panel_weapons_ammo_full_nails; break;
- case 2: fullammo = autocvar_hud_panel_weapons_ammo_full_rockets; break;
- case 3: fullammo = autocvar_hud_panel_weapons_ammo_full_cells; break;
- case 4: fullammo = autocvar_hud_panel_weapons_ammo_full_fuel; break;
- default: fullammo = 60;
+ switch(ammo_type) {
+ case 0: ammo_full = autocvar_hud_panel_weapons_ammo_full_shells; break;
+ case 1: ammo_full = autocvar_hud_panel_weapons_ammo_full_nails; break;
+ case 2: ammo_full = autocvar_hud_panel_weapons_ammo_full_rockets; break;
+ case 3: ammo_full = autocvar_hud_panel_weapons_ammo_full_cells; break;
+ case 4: ammo_full = autocvar_hud_panel_weapons_ammo_full_fuel; break;
+ default: ammo_full = 60;
}
drawsetcliparea(
- wpnpos_x + baroffset_x,
- wpnpos_y + baroffset_y,
- barsize_x * bound(0, a/fullammo, 1),
+ weapon_pos_x + baroffset_x,
+ weapon_pos_y + baroffset_y,
+ barsize_x * bound(0, a/ammo_full, 1),
barsize_y);
- drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, ammo_color, ammo_alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(weapon_pos, "weapon_ammo", weapon_size, ammo_color, ammo_alpha, DRAWFLAG_NORMAL);
drawresetcliparea();
}
}
}
-
- // draw a "ghost weapon icon" if you don't have the weapon
- else
+ else // draw a "ghost weapon icon" if you don't have the weapon
{
- drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
}
-
+
// draw the complain message
if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && autocvar_hud_panel_weapons_complainbubble)
{
if(fadetime)
- {
- if(complain_weapon_time + when > time)
- a = 1;
- else
- a = bound(0, (complain_weapon_time + when + fadetime - time) / fadetime, 1);
- }
+ a = ((complain_weapon_time + when > time) ? 1 : bound(0, (complain_weapon_time + when + fadetime - time) / fadetime, 1));
else
- {
- if(complain_weapon_time + when > time)
- a = 1;
- else
- a = 0;
- }
+ a = ((complain_weapon_time + when > time) ? 1 : 0);
+
string s;
if(complain_weapon_type == 0) {
color = stov(autocvar_hud_panel_weapons_complainbubble_color_unavailable);
}
float padding = autocvar_hud_panel_weapons_complainbubble_padding;
- drawpic_aspect_skin(wpnpos + '1 1 0' * padding, "weapon_complainbubble", wpnsize - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(wpnpos + '1 1 0' * padding, s, wpnsize - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(weapon_pos + '1 1 0' * padding, "weapon_complainbubble", weapon_size - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(weapon_pos + '1 1 0' * padding, s, weapon_size - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
+ // continue with new position for the next weapon
++row;
if(row >= rows)
{
++column;
}
}
-
}
// Ammo (#1)