]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
teamradar: fix clip fail
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index bb9e985210f4ae47be340b56fa0026954ab5e6c6..222823039d2007bda59887eb887826557901575f 100644 (file)
@@ -566,7 +566,7 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize)
                        mySize_x = max(mySize_y * 0.7, mySize_x); // at least 0.7 * height
                        break;
                case 2: 
-                       mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+                       mySize_x = max(mySize_y * 1.5, mySize_x); // at least 2 * height
                        break;
                case 3: 
                        mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
@@ -574,6 +574,9 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize)
                case 5: 
                        mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
                        break;
+               case 7: 
+                       mySize_y = (1/4) * mySize_x; // 1/4 * width
+                       break;
                case 8: 
                        mySize_y = (1/4) * mySize_x; // 1/4 * width
                        break;
@@ -598,7 +601,12 @@ float HUD_Panel_CheckActive(float id)
 // return size of given panel
 vector HUD_Panel_GetSize(float id)
 {
-       return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+       vector mySize;
+       mySize = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+
+       mySize = eX * mySize_x * vid_conwidth + eY * mySize_y * vid_conheight;
+
+       return mySize;
 }
 
 // return pos of given panel
@@ -607,6 +615,8 @@ vector HUD_Panel_GetPos(float id)
        vector pos;
        pos = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_pos")));
 
+       pos = eX * pos_x * vid_conwidth + eY * pos_y * vid_conheight;
+
        if (pos_x < 0)
                pos_x = vid_conwidth + pos_x;
        if (pos_y < 0)
@@ -614,25 +624,46 @@ vector HUD_Panel_GetPos(float id)
        return pos;
 }
 
-float HUD_Panel_GetMarigin(float id)
+float HUD_Panel_GetBorder(float id)
 {
-       return bound(1, MARIGIN_MULTIPLIER * cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_border"), 30), 200);
+       float border;
+       border = cvar(strcat("hud_", HUD_Panel_GetName(id), "_bg_border"));
+       if(!border)
+               border = cvar("hud_bg_border");
+       return border;
 }
 
-vector HUD_Panel_GetColor(float id)
+// draw the background/borders
+void HUD_Panel_DrawBg(float id, vector pos, vector mySize)
 {
-       if(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")) != "")
-               return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")));
-       else
-               return stov(cvar_string("hud_color"));
-}
+       if(!cvar("_hud_configure") && cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg")) == "0")
+               return;
 
-float HUD_Panel_GetBgActive(float id)
-{
-       if(cvar("_hud_configure"))
-               return 1;
+       string bg;
+       bg = cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg"));
+       if(bg == "")
+               bg = cvar_string("hud_bg");
 
-       return cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_bg"), 1);
+       if(bg != "0")
+       {
+               float border;
+               border = HUD_Panel_GetBorder(id);
+
+               vector color;
+               if(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg_color")) != "")
+                       color = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg_color")));
+               else
+                       color = stov(cvar_string("hud_bg_color"));
+
+               float alpha;
+               alpha = cvar(strcat("hud_", HUD_Panel_GetName(id), "_bg_alpha"));
+               if(!alpha)
+                       alpha = cvar("hud_bg_alpha");
+               if(cvar("_hud_configure"))
+                       alpha = max(cvar("hud_configure_bg_minalpha"), alpha);
+
+               draw_BorderPicture(pos - '1 1 0' * border, strcat("gfx/hud/", bg), mySize + '1 1 0' * 2 * border, color, alpha, '1 1 0' * (border/BORDER_MULTIPLIER));
+       }
 }
 
 vector HUD_Panel_GetProgressBarColor(string item)
@@ -661,8 +692,8 @@ vector HUD_Panel_CheckResize(float id, vector myPos, vector mySize)
                targPos = HUD_Panel_GetPos(i);
                targSize = HUD_Panel_GetSize(i);
 
-               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
-               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetBorder(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetBorder(id);
 
                if(myPos_y + mySize_y < targPos_y)
                        continue;
@@ -728,7 +759,8 @@ float HUD_Panel_SetSize(float id, vector mySize)
        myPos = HUD_Panel_GetPos(id);
 
        // check for collisions
-       mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize);
+       if(cvar("hud_configure_checkcollisions"))
+               mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize);
 
        mySize_x = bound(0.025 * vid_conwidth, mySize_x, vid_conwidth - myPos_x);
        mySize_y = bound(0.025 * vid_conheight, mySize_y, vid_conheight - myPos_y);
@@ -749,7 +781,7 @@ float HUD_Panel_SetSize(float id, vector mySize)
                didntresize = 1; // resized X
 
        string s;
-       s = strcat(ftos(mySize_x), " ", ftos(mySize_y));
+       s = strcat(ftos(mySize_x/vid_conwidth), " ", ftos(mySize_y/vid_conheight));
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_size"), s);
        return didntresize;
 }
@@ -771,8 +803,8 @@ vector HUD_Panel_CheckMove(float id, vector myPos, vector mySize)
                if(i == id || !HUD_Panel_CheckActive(i))
                        continue;
 
-               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
-               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetBorder(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetBorder(id);
 
                if(myPos_y + mySize_y < targPos_y)
                        continue;
@@ -840,7 +872,8 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize)
        vector mySize;
        mySize = HUD_Panel_GetSize(id);
 
-       pos = HUD_Panel_CheckMove(id, pos, mySize);
+       if(cvar("hud_configure_checkcollisions"))
+               pos = HUD_Panel_CheckMove(id, pos, mySize);
 
        pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
        pos_y = bound(0, pos_y, vid_conheight - mySize_y);
@@ -851,7 +884,7 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize)
                pos_y = pos_y - vid_conheight;
 
        string s;
-       s = strcat(ftos(pos_x), " ", ftos(pos_y));
+       s = strcat(ftos(pos_x/vid_conwidth), " ", ftos(pos_y/vid_conheight));
 
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
 }
@@ -905,7 +938,7 @@ void HUD_Panel_Mouse()
                {
                        panelPos = HUD_Panel_GetPos(i);
                        panelSize = HUD_Panel_GetSize(i);
-                       border = HUD_Panel_GetMarigin(i);
+                       border = HUD_Panel_GetBorder(i);
                        if(prevMouseClicked == 0) {
                                // move
                                if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
@@ -1022,14 +1055,12 @@ float weaponorder_cmp(float i, float j, entity pass)
 
 void HUD_WeaponIcons()
 {
-       float alpha, height, border, accuracybar_height, stat_weapons; // "constants"
-       vector pos, mySize, mysize, mypos, color, accuracy_color;
+       float alpha, height, accuracybar_height, stat_weapons; // "constants"
+       vector pos, mySize, mysize, mypos, accuracy_color;
        float i, id, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
 
-       border = HUD_Panel_GetMarigin(0);
        pos = HUD_Panel_GetPos(0);
        mySize = HUD_Panel_GetSize(0);
-       color = HUD_Panel_GetColor(0);
        accuracybar_height = cvar_or("hud_weaponicons_accuracybar_height", 3);
 
        stat_weapons = getstati(STAT_WEAPONS);
@@ -1044,8 +1075,7 @@ void HUD_WeaponIcons()
        }
        heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
 
-       if(HUD_Panel_GetBgActive(0) && weapon_cnt)
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(0, pos, mySize);
 
        // hits
        weapon_stats = getstati(STAT_DAMAGE_HITS);
@@ -1086,7 +1116,7 @@ void HUD_WeaponIcons()
                        weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
 
                        if(self.weapon == activeweapon)
-                               drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), color, fade * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
                        drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("gfx/hud/inv_weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
 
                        if(cvar_or("hud_weaponicons_number", 1))
@@ -1160,16 +1190,12 @@ void HUD_Inventory()
 {
        float i;
        float stat_items;
-       float border;
 
-       vector pos, mySize, mysize, mypos, color;
-       border = HUD_Panel_GetMarigin(1);
+       vector pos, mySize, mysize, mypos;
        pos = HUD_Panel_GetPos(1);
        mySize = HUD_Panel_GetSize(1);
-       color = HUD_Panel_GetColor(1);
 
-       if(HUD_Panel_GetBgActive(1))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(1, pos, mySize);
 
        // ammo
        stat_items = getstati(STAT_ITEMS);
@@ -1179,14 +1205,14 @@ void HUD_Inventory()
                if(cvar("_hud_configure"))
                        a = 100;
 
-               if(cvar("hud_ammo_onlycurrent")) {
+               if(cvar("hud_inventory_onlycurrent")) {
                        if (stat_items & GetAmmoItemCode(i)) {
-                               drawpic(pos - '1 1 0' * border, "gfx/hud/sb_ammobg", mysize + '1 1 0' * border, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-                               drawpic(pos + eX * mysize_x * 1.7, GetAmmoPicture(i), '24 24 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos, "gfx/hud/sb_ammobg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos + eY * 0.05 * mySize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
                                if(a < 10)
-                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       HUD_DrawXNum(pos + eX * 0.8 * mySize_y + eY * 0.25 * mySize_y, a, strlen(ftos(a)), 0, 0.5 * mySize_y, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                                else
-                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       HUD_DrawXNum(pos + eX * 0.8 * mySize_y + eY * 0.25 * mySize_y, a, strlen(ftos(a)), 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                        }
                } else {
                        if (a > 0) {
@@ -1236,20 +1262,6 @@ void HUD_Inventory()
                        }
                }
        }
-
-       // fuel ammo
-       a = getstati(GetAmmoStat(4)); // how much fuel do we have?
-
-       if (a > 0) { // if we have fuel, draw the amount
-               if(pos_x + 0.5 * mySize_x > 0.5 * vid_conwidth)
-                       mypos_x += pos_x + mySize_x - 0; // TODO!
-
-               drawpic(mypos - '0 2 0' + '52 0 0', GetAmmoPicture(4), '20 20 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-               if (a > 10)
-                       HUD_DrawXNum(mypos, a, 3, 0, 16, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-               else
-                       HUD_DrawXNum(mypos, a, 3, 0, 16, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-       }
 }
 
 
@@ -1270,54 +1282,38 @@ void HUD_Powerups() {
                        return;
        }
 
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(2);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(2);
        mySize = HUD_Panel_GetSize(2);
-       color = HUD_Panel_GetColor(2);
-
-       if(HUD_Panel_GetBgActive(2))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
 
+       HUD_Panel_DrawBg(2, pos, mySize);
 
        float strength_time, shield_time;
 
-       strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 999);
-       shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 999);
-
-       strength_maxtime = max(strength_maxtime, strength_time);
-       shield_maxtime = max(shield_maxtime, shield_time);
+       strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 99);
+       shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 99);
 
        if(cvar("_hud_configure"))
        {
                strength_time = 15;
                shield_time = 27;
-               strength_maxtime = 30;
-               shield_maxtime = 30;
        }
 
        string leftname, rightname;
        float leftcnt, rightcnt;
        float leftalpha, rightalpha;
-       float leftcnt_max, rightcnt_max;
        if (cvar(strcat("hud_", HUD_Panel_GetName(2), "_flip"))) {
                leftname = "strength";
                leftcnt = strength_time;
-               leftcnt_max = strength_maxtime;
 
                rightname = "shield";
                rightcnt = shield_time;
-               rightcnt_max = shield_maxtime;
        } else {
                leftname = "shield";
                leftcnt = shield_time;
-               leftcnt_max = shield_maxtime;
 
                rightname = "strength";
                rightcnt = strength_time;
-               rightcnt_max = strength_maxtime;
        }
        leftalpha = bound(0, leftcnt, 1);
        rightalpha = bound(0, rightcnt, 1);
@@ -1329,14 +1325,14 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic(pos, "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/leftcnt_max) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos, "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos, strcat("gfx/hud/sb_", leftname), '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * mySize_y + eY * 0.25 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
 
                if(rightcnt)
                {
-                       drawpic(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/rightcnt_max), "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/rightcnt_max) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos + eX * mySize_x - eX * mySize_y, strcat("gfx/hud/sb_", rightname), '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * mySize_x - eX * 2.5 * mySize_y + eY * 0.25 * mySize_y, rightcnt, 3, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
@@ -1347,7 +1343,7 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/leftcnt_max), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/leftcnt_max), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos + eX * 0.4 * mySize_y, strcat("gfx/hud/sb_", leftname), '0.7 0.7 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
@@ -1356,7 +1352,7 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(rightcnt));
                        
-                       drawpic(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/rightcnt_max), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/rightcnt_max), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("gfx/hud/sb_", rightname), '0.7 0.7 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * mySize_x - eX * len * 0.5 * mySize_y - eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
@@ -1367,7 +1363,7 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, leftcnt/leftcnt_max) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos, strcat("gfx/hud/sb_", leftname), '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * 0.5 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
@@ -1376,7 +1372,7 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(rightcnt));
 
-                       drawpic(pos + eY * 0.5 * mySize_y, "gfx/hud/statusbar", eX * mySize_x * min(1, rightcnt/rightcnt_max) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eY * 0.5 * mySize_y, "gfx/hud/statusbar", eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
                        drawpic(pos + eY * 0.5 * mySize_y, strcat("gfx/hud/sb_", rightname), '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                        HUD_DrawXNum(pos + eX * 0.5 * mySize_y + eY * 0.5 * mySize_y, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
@@ -1435,16 +1431,11 @@ void HUD_Powerups() {
 //
 void HUD_HealthArmor(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(3);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(3);
        mySize = HUD_Panel_GetSize(3);
-       color = HUD_Panel_GetColor(3);
 
-       if(HUD_Panel_GetBgActive(3))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(3, pos, mySize);
 
        float armor, health, x;
        armor = getstati(STAT_ARMOR);
@@ -1492,7 +1483,7 @@ void HUD_HealthArmor(void)
                float leftactive, rightactive;
                float leftalpha, rightalpha;
                // TODO!
-               if (cvar(strcat("hud_", HUD_Panel_GetName(3), "_flip"))) { // old style layout with armor left of health
+               if (cvar(strcat("hud_", HUD_Panel_GetName(3), "_flip"))) { // old style layout with armor left/top of health
                        leftname = "armor";
                        leftcnt = armor;
                        if(leftcnt)
@@ -1516,6 +1507,8 @@ void HUD_HealthArmor(void)
                        rightalpha = min((armor+10)/55, 1);
                }
 
+               float fuel;
+               fuel = getstati(GetAmmoStat(4)); // how much fuel do we have?
 
                if (mySize_x/mySize_y > 5)
                {
@@ -1534,6 +1527,9 @@ void HUD_HealthArmor(void)
                                drawpic(pos + eX * mySize_x - eX * mySize_y, strcat("gfx/hud/sb_", rightname), '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                                HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * 2.5 * mySize_y + eY * 0.25 * mySize_y, rightcnt, 3, 0.5 * mySize_y, hud_alpha_fg);
                        }
+
+                       if(fuel)
+                               drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
                }
                else if (mySize_x/mySize_y > 3.2)
                {
@@ -1554,6 +1550,9 @@ void HUD_HealthArmor(void)
                                drawpic(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("gfx/hud/sb_", rightname), '0.7 0.7 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                                HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * len * 0.5 * mySize_y - eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg);
                        }
+
+                       if(fuel)
+                               drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.15 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
                }
                else
                {
@@ -1574,6 +1573,9 @@ void HUD_HealthArmor(void)
                                drawpic(pos + eY * 0.5 * mySize_y, strcat("gfx/hud/sb_", rightname), '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
                                HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y + eY * 0.5 * mySize_y, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg);
                        }
+
+                       if(fuel)
+                               drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
                }
        }
 }
@@ -1582,18 +1584,14 @@ void HUD_HealthArmor(void)
 //
 void HUD_Score()
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(7);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(7);
        mySize = HUD_Panel_GetSize(7);
-       color = HUD_Panel_GetColor(7);
 
-       if(HUD_Panel_GetBgActive(7))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(7, pos, mySize);
 
        float score, distribution, leader;
+       float score_len, distr_len;
        vector score_pos, secondary_score_pos, distribution_color;
        entity tm, pl, me;
        me = (spectatee_status > 0) ? playerslots[spectatee_status - 1] : playerslots[player_localentnum - 1];
@@ -1604,12 +1602,16 @@ void HUD_Score()
                if(pl == me)
                        pl = pl.sort_next;
 
-               if(pl)
+               if(cvar("_hud_configure"))
+                       distribution = 42;
+               else if(pl)
                        distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
                else
                        distribution = 0;
 
                score = me.(scores[ps_primary]);
+               if(cvar("_hud_configure"))
+                       score = 123;
 
                if(distribution >= 5) {
                        distribution_color = eY;
@@ -1622,17 +1624,27 @@ void HUD_Score()
                else
                        distribution_color = eX;
 
-               HUD_DrawXNum(pos + eX * mySize_x - eX * 6 * 0.3  * mySize_y, distribution, 6, 3, 0.3 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-               HUD_DrawXNum(pos + eX * mySize_x - eX * 6 * 0.75 * mySize_y + eY * 0.35 * mySize_y, score, 6, 0, 0.75 * mySize_y, distribution_color, leader, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               score_len = strlen(ftos(score));
+               distr_len = strlen(ftos(distribution));
+
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y, distribution, 3, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               if (leader)
+                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
        } else { // teamgames
                float max_fragcount;
-               max_fragcount = -999;
+               max_fragcount = -99;
 
+               float teamnum;
                for(tm = teams.sort_next; tm; tm = tm.sort_next) {
-                       if(tm.team == COLOR_SPECTATOR || !tm.team_size) // no players? don't display
+                       if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !cvar("_hud_configure"))) // no players? don't display
                                continue;
                        score = tm.(teamscores[ts_primary]);
+                       if(cvar("_hud_configure"))
+                               score = 123;
                        leader = 0;
+                       
+                       score_len = strlen(ftos(score));
 
                        if (score > max_fragcount)
                                max_fragcount = score;
@@ -1640,12 +1652,16 @@ void HUD_Score()
                        if(tm.team == myteam) {
                                if (max_fragcount == score)
                                        leader = 1;
-                               HUD_DrawXNum(score_pos, score, 4, 0, 34, GetTeamRGB(tm.team) * 0.8, leader, 1, hud_alpha_fg, DRAWFLAG_NORMAL);
+                               if (leader)
+                                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                        } else {
                                if (max_fragcount == score)
                                        leader = 1;
-                               HUD_DrawXNum(secondary_score_pos, score, 6, 0, 16, GetTeamRGB(tm.team) * 0.8, leader, 1, hud_alpha_fg, DRAWFLAG_NORMAL);
-                               secondary_score_pos = secondary_score_pos + '0 16 0';
+                               if (leader)
+                                       drawpic(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 3, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                               teamnum += 1;
                        }
                }
        }
@@ -1654,16 +1670,11 @@ void HUD_Score()
 // Race timer (#8)
 //
 void HUD_RaceTimer (void) {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(8);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(8);
        mySize = HUD_Panel_GetSize(8);
-       color = HUD_Panel_GetColor(8);
 
-       if(HUD_Panel_GetBgActive(8))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(8, pos, mySize);
 
        drawfont = hud_bigfont;
        float a, t;
@@ -1782,16 +1793,11 @@ void HUD_RaceTimer (void) {
 // Notification area (#4)
 void HUD_Notify (void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(4);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(4);
        mySize = HUD_Panel_GetSize(4);
-       color = HUD_Panel_GetColor(4);
 
-       if(HUD_Panel_GetBgActive(4))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(4, pos, mySize);
 
        string s;
        entity tm;
@@ -1923,13 +1929,9 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(9);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(9);
        mySize = HUD_Panel_GetSize(9);
-       color = HUD_Panel_GetColor(9);
 
        string s;
        float a;
@@ -1951,8 +1953,7 @@ void HUD_VoteWindow(void)
                vote_needed = 4;
        }
 
-       if(HUD_Panel_GetBgActive(9))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg * vote_alpha, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(9, pos, mySize);
 
        if(vote_alpha) {
                a = vote_alpha * bound(cvar_or("hud_vote_alreadyvoted_alpha", 0.75), 1 - vote_highlighted, 1);
@@ -2482,16 +2483,11 @@ void CSQC_race_hud(void)
 //
 void HUD_Timer()
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(5);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(5);
        mySize = HUD_Panel_GetSize(5);
-       color = HUD_Panel_GetColor(5);
 
-       if(HUD_Panel_GetBgActive(5))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(5, pos, mySize);
 
        float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft;
 
@@ -2559,16 +2555,11 @@ void HUD_Timer()
 
 void HUD_Radar(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(6);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(6);
        mySize = HUD_Panel_GetSize(6);
-       color = HUD_Panel_GetColor(6);
 
-       if(HUD_Panel_GetBgActive(6))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(6, pos, mySize);
 
        local float color1, color2; // color already declared as a global in hud.qc
        local vector rgb;
@@ -2614,21 +2605,7 @@ void HUD_Radar(void)
        scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
        teamradar_size2d = mySize;
 
-       teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0';
-       if(pos == eX * vid_conwidth)
-       {
-               if(cl_teamradar_nohudhack < 2)
-                       pos_y += 25;
-               if(cl_teamradar_nohudhack < 1)
-                       teamradar_extraclip_mins_y -= 25;
-       }
-       else if(pos == eY * vid_conheight || pos == eX * vid_conwidth + eY * vid_conheight)
-       {
-               if(cl_teamradar_nohudhack < 2)
-                       pos_y -= 50;
-               //if(cl_teamradar_nohudhack < 1)
-                       //teamradar_extraclip_size_y += 50; // don't, the HUD looks nice
-       }
+       teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0'; // we always center
 
        // pixels per world qu to match the teamradar_size2d_x range in the longest dimension
        if(cl_teamradar_rotation == 0)
@@ -2671,8 +2648,8 @@ void HUD_Radar(void)
        drawsetcliparea(
                pos_x,
                pos_y,
-               pos_x + mySize_x,
-               pos_y + mySize_y
+               mySize_x,
+               mySize_y
        );
 
        draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha);
@@ -2722,16 +2699,11 @@ Main HUD system
 
 void HUD_DrawPressedKeys(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(10);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(10);
        mySize = HUD_Panel_GetSize(10);
-       color = HUD_Panel_GetColor(10);
 
-       if(HUD_Panel_GetBgActive(10))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(10, pos, mySize);
 
        float pressedkeys;
 
@@ -2852,7 +2824,7 @@ void HUD_Reset (void)
 
 void HUD_Main (void)
 {
-       hud_alpha_bg = cvar_or("hud_alpha_bg", 0.8) * (1 - cvar("_menu_alpha"));
+       hud_alpha_bg = cvar_or("hud_bg_alpha", 0.8) * (1 - cvar("_menu_alpha"));
        hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5);
        hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5);
        hud_color_bg_team = cvar("hud_color_bg_team");
@@ -2860,6 +2832,9 @@ void HUD_Main (void)
        hud_fontsize = HUD_GetFontsize("hud_fontsize");
        hud_fontsize_spec = HUD_GetFontsize("hud_fontsize_spec");
 
+       if(cvar_string("hud_dock") != "0")
+               drawpic('0 0 0', strcat("gfx/hud/", cvar_string("hud_dock")), eX * vid_conwidth + eY * vid_conheight, stov(cvar_string("hud_dock_color")), cvar("hud_dock_alpha"), DRAWFLAG_NORMAL);
+
        if(HUD_Panel_CheckActive(0))
                HUD_WeaponIcons();
        if(HUD_Panel_CheckActive(1))