]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
Merge remote branch 'origin/master' into samual/menu_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index ce9c29cd4068c4190ee0722f195a59f2288d19f4..02558c7ea5977809d47e7e078d09743d63cfc7e5 100644 (file)
@@ -988,7 +988,7 @@ void HUD_Ammo(void)
        }
 }
 
-void DrawNumIcon(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float theAlpha)
+void DrawNumIcon_expanding(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float theAlpha, float fadelerp)
 {
        vector newPos, newSize;
        vector picpos, numpos;
@@ -1061,32 +1061,39 @@ void DrawNumIcon(vector myPos, vector mySize, float x, string icon, float vertic
                picpos = newPos;
        }
 
-       drawstring_aspect(numpos, ftos(x), '2 1 0' * newSize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
-       drawpic_aspect_skin(picpos, icon, '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
+       // FIXME newSize_x is unused, is that right?
+
+       drawstring_aspect_expanding(numpos, ftos(x), '2 1 0' * newSize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, fadelerp);
+       drawpic_aspect_skin_expanding(picpos, icon, '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, fadelerp);
 }
 
-void DrawNumIcon_expanding(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float fadelerp)
+void DrawNumIcon(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float theAlpha)
 {
-       float sz;
-       sz = expandingbox_sizefactor_from_fadelerp(fadelerp);
-
-       DrawNumIcon(myPos + expandingbox_resize_centered_box_offset(sz, mySize, 1), mySize * sz, x, icon, vertical, icon_right_align, color, (1 - fadelerp));
+       DrawNumIcon_expanding(myPos, mySize, x, icon, vertical, icon_right_align, color, theAlpha, 0);
 }
 
 // Powerups (#2)
 //
 void HUD_Powerups(void)
 {
-       float strength_time, shield_time;
+       float strength_time, shield_time, superweapons_time;
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_powerups) return;
                if(spectatee_status == -1) return;
-               if not(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE)) return;
+               if not(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE | IT_SUPERWEAPON)) return;
                if (getstati(STAT_HEALTH) <= 0) return;
 
                strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99);
                shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99);
+               superweapons_time = bound(0, getstatf(STAT_SUPERWEAPONS_FINISHED) - time, 99);
+
+               if (getstati(STAT_ITEMS, 0, 24) & IT_UNLIMITED_SUPERWEAPONS)
+                       superweapons_time = 99; // force max
+
+               // prevent stuff to show up on mismatch that will be fixed next frame
+               if (!(getstati(STAT_ITEMS, 0, 24) & IT_SUPERWEAPON))
+                       superweapons_time = 0;
        }
        else
        {
@@ -1094,6 +1101,7 @@ void HUD_Powerups(void)
 
                strength_time = 15;
                shield_time = 27;
+               superweapons_time = 13;
        }
 
        HUD_Panel_UpdateCvars(powerups);
@@ -1102,7 +1110,7 @@ void HUD_Powerups(void)
        pos = panel_pos;
        mySize = panel_size;
 
-       HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time), 1));
+       HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time, superweapons_time), 1));
        if(panel_bg_padding)
        {
                pos += '1 1 0' * panel_bg_padding;
@@ -1111,26 +1119,73 @@ void HUD_Powerups(void)
 
        float panel_ar = mySize_x/mySize_y;
        float is_vertical = (panel_ar < 1);
-       vector shield_offset, strength_offset;
-       if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
+       vector shield_offset, strength_offset, superweapons_offset;
+
+       float superweapons_is = -1;
+
+       if(superweapons_time)
        {
-               mySize_x *= 0.5;
-               if (autocvar_hud_panel_powerups_flip)
-                       shield_offset_x = mySize_x;
+               if(strength_time)
+               {
+                       if(shield_time)
+                               superweapons_is = 0;
+                       else
+                               superweapons_is = 2;
+               }
                else
-                       strength_offset_x = mySize_x;
+               {
+                       if(shield_time)
+                               superweapons_is = 1;
+                       else
+                               superweapons_is = 2;
+               }
+       }
+
+       // FIXME handle superweapons here
+       if(superweapons_is == 0)
+       {
+               if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
+               {
+                       mySize_x *= (1.0 / 3.0);
+                       superweapons_offset_x = mySize_x;
+                       if (autocvar_hud_panel_powerups_flip)
+                               shield_offset_x = 2*mySize_x;
+                       else
+                               strength_offset_x = 2*mySize_x;
+               }
+               else
+               {
+                       mySize_y *= (1.0 / 3.0);
+                       superweapons_offset_y = mySize_y;
+                       if (autocvar_hud_panel_powerups_flip)
+                               shield_offset_y = 2*mySize_y;
+                       else
+                               strength_offset_y = 2*mySize_y;
+               }
        }
        else
        {
-               mySize_y *= 0.5;
-               if (autocvar_hud_panel_powerups_flip)
-                       shield_offset_y = mySize_y;
+               if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
+               {
+                       mySize_x *= 0.5;
+                       if (autocvar_hud_panel_powerups_flip)
+                               shield_offset_x = mySize_x;
+                       else
+                               strength_offset_x = mySize_x;
+               }
                else
-                       strength_offset_y = mySize_y;
+               {
+                       mySize_y *= 0.5;
+                       if (autocvar_hud_panel_powerups_flip)
+                               shield_offset_y = mySize_y;
+                       else
+                               strength_offset_y = mySize_y;
+               }
        }
 
-       float shield_baralign, strength_baralign;
-       float shield_iconalign, strength_iconalign;
+       float shield_baralign, strength_baralign, superweapons_baralign;
+       float shield_iconalign, strength_iconalign, superweapons_iconalign;
+
        if (autocvar_hud_panel_powerups_flip)
        {
                strength_baralign = (autocvar_hud_panel_powerups_baralign == 2 || autocvar_hud_panel_powerups_baralign == 1);
@@ -1146,6 +1201,24 @@ void HUD_Powerups(void)
                strength_iconalign = (autocvar_hud_panel_powerups_iconalign == 3 || autocvar_hud_panel_powerups_iconalign == 1);
        }
 
+       if(superweapons_is == 0)
+       {
+               superweapons_iconalign = strength_iconalign;
+               superweapons_baralign = 2;
+       }
+       else if(superweapons_is == 1)
+       {
+               superweapons_offset = strength_offset;
+               superweapons_iconalign = strength_iconalign;
+               superweapons_baralign = strength_baralign;
+       }
+       else if(superweapons_is == 2)
+       {
+               superweapons_offset = shield_offset;
+               superweapons_iconalign = shield_iconalign;
+               superweapons_baralign = shield_baralign;
+       }
+
        if(shield_time)
        {
                const float maxshield = 30;
@@ -1160,7 +1233,7 @@ void HUD_Powerups(void)
                        if(shield > 1)
                                DrawNumIcon(pos + shield_offset, mySize, shield, "shield", is_vertical, shield_iconalign, '1 1 1', 1);
                        if(shield <= 5)
-                               DrawNumIcon_expanding(pos + shield_offset, mySize, shield, "shield", is_vertical, shield_iconalign, '1 1 1', bound(0, (shield - shield_time) / 0.5, 1));
+                               DrawNumIcon_expanding(pos + shield_offset, mySize, shield, "shield", is_vertical, shield_iconalign, '1 1 1', 1, bound(0, (shield - shield_time) / 0.5, 1));
                }
        }
 
@@ -1178,7 +1251,25 @@ void HUD_Powerups(void)
                        if(strength > 1)
                                DrawNumIcon(pos + strength_offset, mySize, strength, "strength", is_vertical, strength_iconalign, '1 1 1', 1);
                        if(strength <= 5)
-                               DrawNumIcon_expanding(pos + strength_offset, mySize, strength, "strength", is_vertical, strength_iconalign, '1 1 1', bound(0, (strength - strength_time) / 0.5, 1));
+                               DrawNumIcon_expanding(pos + strength_offset, mySize, strength, "strength", is_vertical, strength_iconalign, '1 1 1', 1, bound(0, (strength - strength_time) / 0.5, 1));
+               }
+       }
+
+       if(superweapons_time)
+       {
+               const float maxsuperweapons = 30;
+               float superweapons = ceil(superweapons_time);
+               if(autocvar_hud_panel_powerups_progressbar)
+               {
+                       HUD_Panel_GetProgressBarColor(superweapons);
+                       HUD_Panel_DrawProgressBar(pos + superweapons_offset, mySize, autocvar_hud_panel_powerups_progressbar_superweapons, superweapons/maxsuperweapons, is_vertical, superweapons_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+               }
+               if(autocvar_hud_panel_powerups_text)
+               {
+                       if(superweapons > 1)
+                               DrawNumIcon(pos + superweapons_offset, mySize, superweapons, "superweapons", is_vertical, superweapons_iconalign, '1 1 1', 1);
+                       if(superweapons <= 5)
+                               DrawNumIcon_expanding(pos + superweapons_offset, mySize, superweapons, "superweapons", is_vertical, superweapons_iconalign, '1 1 1', 1, bound(0, (superweapons - superweapons_time) / 0.5, 1));
                }
        }
 }
@@ -2690,6 +2781,7 @@ void HUD_Score(void)
        string sign;
        vector distribution_color;
        entity tm, pl, me;
+
 #ifdef COMPAT_XON050_ENGINE
        me = (spectatee_status > 0) ? playerslots[spectatee_status - 1] : playerslots[player_localentnum - 1];
 #else
@@ -4320,9 +4412,12 @@ void HUD_Physics(void)
                // 1 m/s = 0.0254 qu/s; 1 g = 9.80665 m/s^2
                f = time - acc_prevtime;
                if(autocvar_hud_panel_physics_acceleration_vertical)
-                       acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed)) * (1 / f) * (0.0254 / 9.80665);
+                       acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed));
                else
-                       acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)) * (1 / f) * (0.0254 / 9.80665);
+                       acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z));
+               
+               acceleration = acceleration * (1 / max(0.0001, f)) * (0.0254 / 9.80665);
+               
                acc_prevspeed = pmove_vel;
                acc_prevtime = time;