]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
make the id constants a variable instead for more consistency
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index 52c70eb513560187ffcfb30aaa5f8efd79d95864..8f20c6d6c8a99e43251cfb877c3046d22950bd19 100644 (file)
@@ -573,7 +573,6 @@ void HUD_Panel_ExportCfg(string cfgname)
                fputs(fh, strcat("seta hud_bg_alpha ", ftos(cvar("hud_bg_alpha")), "\n"));
                fputs(fh, strcat("seta hud_bg_border ", ftos(cvar("hud_bg_border")), "\n"));
                fputs(fh, strcat("seta hud_fg_alpha ", ftos(cvar("hud_fg_alpha")), "\n"));
-               fputs(fh, strcat("seta hud_accuracy_yellow ", ftos(cvar("hud_accuracy_yellow")), "\n"));
                fputs(fh, "\n");
 
                fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n"));
@@ -610,9 +609,11 @@ void HUD_Panel_ExportCfg(string cfgname)
                                        break;
                                case 2:
                                        fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_flip ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_flip"))), "\n"));
+                                       fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_mirror ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_mirror"))), "\n"));
                                        break;
                                case 3:
                                        fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_flip ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_flip"))), "\n"));
+                                       fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_mirror ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_mirror"))), "\n"));
                                        break;
                                case 9:
                                        fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_alreadyvoted_alpha ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_alreadyvoted_alpha"))), "\n"));
@@ -636,14 +637,14 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize)
                case 1: 
                        mySize_x = max(mySize_y * 0.7, mySize_x); // at least 0.7 * height
                        break;
-               case 2: 
-                       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
-                       break;
+               //case 2: 
+               //      mySize_x = max(mySize_y * 1.5, mySize_x); // at least 1.5 * height
+               //      break;
+               //case 3: 
+               //      mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+               //      break;
                case 5: 
-                       mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+                       mySize_y = (1/4.1) * mySize_x; // 1/4.1 * width, trial and error...
                        break;
                case 7: 
                        mySize_y = (1/4) * mySize_x; // 1/4 * width
@@ -997,7 +998,7 @@ void HUD_Panel_Mouse()
        mousepos_x = bound(0, mousepos_x, vid_conwidth);
        mousepos_y = bound(0, mousepos_y, vid_conheight);
 
-       drawpic_skin(mousepos, "gfx/menu/default/cursor.tga", '32 32 0', '1 1 1', 1, hud_alpha_fg);
+       drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
 
        if(mouseClicked)
        {
@@ -1126,12 +1127,13 @@ float weaponorder_cmp(float i, float j, entity pass)
 
 void HUD_WeaponIcons()
 {
+       float id = 0;
        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
+       float i, weapid, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
 
-       pos = HUD_Panel_GetPos(0);
-       mySize = HUD_Panel_GetSize(0);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
        accuracybar_height = cvar_or("hud_weaponicons_accuracy_height", 3);
 
        stat_weapons = getstati(STAT_WEAPONS);
@@ -1146,7 +1148,7 @@ void HUD_WeaponIcons()
        }
        heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
 
-       HUD_Panel_DrawBg(0, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        // hits
        weapon_stats = getstati(STAT_DAMAGE_HITS);
@@ -1179,7 +1181,7 @@ void HUD_WeaponIcons()
                self = weaponorder[i];
                if((self.weapons && (self.impulse >= 0) && (stat_weapons & self.weapons)) || hud_configure)
                {
-                       id = self.impulse;
+                       weapid = self.impulse;
 
                        alpha = (self.weapon == activeweapon) ? 1 : 0.6;
 
@@ -1187,11 +1189,11 @@ void HUD_WeaponIcons()
                        weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
 
                        if(self.weapon == activeweapon)
-                               drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "weapon_current_bg", 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/weapons/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))
-                               drawstring(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), ftos(id), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawstring(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), ftos(weapid), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
 
                        // draw the weapon accuracy on the HUD
                        if(hud_accuracy_hud && !(gametype == GAME_RACE || gametype == GAME_CTS))
@@ -1248,25 +1250,26 @@ string GetAmmoPicture(float i)
 {
        switch(i)
        {
-               case 0: return "shells";
-               case 1: return "bullets";
-               case 2: return "rocket";
-               case 3: return "cells";
-               case 4: return "fuel";
+               case 0: return "ammo_shells";
+               case 1: return "ammo_bullets";
+               case 2: return "ammo_rocket";
+               case 3: return "ammo_cells";
+               case 4: return "ammo_fuel";
                default: return "";
        }
 }
 
 void HUD_Inventory()
 {
+       float id = 1;
        float i;
        float stat_items;
 
        vector pos, mySize, mysize, mypos;
-       pos = HUD_Panel_GetPos(1);
-       mySize = HUD_Panel_GetSize(1);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(1, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        // ammo
        stat_items = getstati(STAT_ITEMS);
@@ -1278,7 +1281,7 @@ void HUD_Inventory()
 
                if(cvar("hud_inventory_onlycurrent")) {
                        if (stat_items & GetAmmoItemCode(i)) {
-                               drawpic_skin(pos, "ammobg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic_skin(pos, "ammo_current_bg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
                                drawpic_skin(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 + 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);
@@ -1317,7 +1320,7 @@ void HUD_Inventory()
                                }
 
                                if (stat_items & GetAmmoItemCode(i))
-                                       drawpic_skin(mypos, "ammobg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       drawpic_skin(mypos, "ammo_current_bg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
                                drawpic_skin(mypos + 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) {
                                        if(stat_items & GetAmmoItemCode(i))
@@ -1340,6 +1343,7 @@ void HUD_Inventory()
 float shield_maxtime;
 float strength_maxtime;
 void HUD_Powerups() {
+       float id = 2;
        float stat_items;
        stat_items = getstati(STAT_ITEMS);
 
@@ -1354,10 +1358,10 @@ void HUD_Powerups() {
        }
 
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(2);
-       mySize = HUD_Panel_GetSize(2);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(2, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        float strength_time, shield_time;
 
@@ -1370,10 +1374,16 @@ void HUD_Powerups() {
                shield_time = 27;
        }
 
+       float len;
+
+       vector barpos, barsize;
+       vector picpos;
+       vector numpos;
+
        string leftname, rightname;
        float leftcnt, rightcnt;
        float leftalpha, rightalpha;
-       if (cvar(strcat("hud_", HUD_Panel_GetName(2), "_flip"))) {
+       if (cvar(strcat("hud_", HUD_Panel_GetName(id), "_flip"))) {
                leftname = "strength";
                leftcnt = strength_time;
 
@@ -1389,43 +1399,93 @@ void HUD_Powerups() {
        leftalpha = bound(0, leftcnt, 1);
        rightalpha = bound(0, rightcnt, 1);
 
-       float len;
-       if (mySize_x/mySize_y > 5)
+       // TODO: tile statusbars?
+       if (mySize_x/mySize_y > 4)
        {
                if(leftcnt)
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos, "statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos, strcat("", 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(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/30);
+                               barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
+                               picpos = pos + eX * 0.5 * mySize_x - eX * mySize_y;
+                               numpos = picpos - eX * 2 * 0.5 * mySize_y + eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y;
+                       } else {
+                               barpos = pos;
+                               barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
+                               picpos = pos;
+                               numpos = picpos + eX * mySize_y - eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, leftcnt, 2, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
 
                if(rightcnt)
                {
-                       drawpic_skin(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30), "statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * mySize_x - eX * mySize_y, strcat("", 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);
+                       len = strlen(ftos(rightcnt));
+
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y;
+                               picpos = pos + eX * 0.5 * mySize_x;
+                               numpos = picpos + eX * mySize_y - eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y;
+                       } else {
+                               barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30);
+                               barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * mySize_y;
+                               numpos = picpos - eX * mySize_y + eY * 0.25 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, rightcnt, 2, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
        }
-       else if (mySize_x/mySize_y > 3.2)
+       else if (mySize_x/mySize_y > 1.5)
        {
                if(leftcnt)
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * 0.4 * mySize_y, strcat("", 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);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/30);
+                               barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y;
+                               numpos = picpos - eX * len * 0.5 * mySize_y;
+                       } else {
+                               barpos = pos;
+                               barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y;
+                               picpos = pos;
+                               numpos = picpos + eX * 0.5 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
 
                if(rightcnt)
                {
                        len = strlen(ftos(rightcnt));
-                       
-                       drawpic_skin(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("", 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);
+
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
+                               barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y + eY * 0.5 * mySize_y;
+                               numpos = picpos - eX * len * 0.5 * mySize_y;
+                       } else {
+                               barpos = pos + eY * 0.5 * mySize_y;
+                               barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
+                               picpos = pos + eY * 0.5 * mySize_y;
+                               numpos = picpos + eX * 0.5 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
        }
        else
@@ -1434,22 +1494,46 @@ void HUD_Powerups() {
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos, strcat("", 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);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
+                               picpos = pos + eX * 0.05 * mySize_x;
+                               numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x;
+                       } else {
+                               barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30);
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
+                               picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.65 * mySize_x;
+                               numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.25 * mySize_x;
+                       }
+
+                       drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, leftcnt, len, 0, 0.25 * mySize_x, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
 
                if(rightcnt)
                {
                        len = strlen(ftos(rightcnt));
 
-                       drawpic_skin(pos + eY * 0.5 * mySize_y, "statusbar", eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eY * 0.5 * mySize_y, strcat("", 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);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30);
+                               picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
+                               numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
+                       } else {
+                               barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30) + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30);
+                               picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.65 * mySize_x + eX * 0.5 * mySize_x;
+                               numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x;
+                       }
+
+                       drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(numpos, rightcnt, len, 0, 0.25 * mySize_x, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                }
        }
 
-       /* TODO: add expand!
+       /* TODO: add expand from old code!
        //strength
        if (strength_time) {
                dt = strength_time - time;
@@ -1502,19 +1586,25 @@ void HUD_Powerups() {
 //
 void HUD_HealthArmor(void)
 {
+       float id = 3;
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(3);
-       mySize = HUD_Panel_GetSize(3);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(3, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        float armor, health, x;
        armor = getstati(STAT_ARMOR);
        health = getstati(STAT_HEALTH);
+
+       float fuel;
+       fuel = getstati(GetAmmoStat(4)); // how much fuel do we have?
+
        if(hud_configure)
        {
                armor = 150;
                health = 100;
+               fuel = 70;
        }
 
        if(health <= 0)
@@ -1551,12 +1641,16 @@ void HUD_HealthArmor(void)
        else
        {
        */
+       vector barpos, barsize;
+       vector picpos;
+       vector numpos;
+
        string leftname, rightname;
        float leftcnt, rightcnt;
        float leftactive, rightactive;
        float leftalpha, rightalpha;
        // TODO!
-       if (cvar(strcat("hud_", HUD_Panel_GetName(3), "_flip"))) { // old style layout with armor left/top of health
+       if (cvar(strcat("hud_", HUD_Panel_GetName(id), "_flip"))) { // old style layout with armor left/top of health
                leftname = "armor";
                leftcnt = armor;
                if(leftcnt)
@@ -1580,52 +1674,107 @@ void HUD_HealthArmor(void)
                rightalpha = min((armor+10)/55, 1);
        }
 
-       float fuel;
-       fuel = getstati(GetAmmoStat(4)); // how much fuel do we have?
-
+       // TODO: tile statusbars?
        if (mySize_x/mySize_y > 5)
        {
                if(leftactive)
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos, "statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos, strcat("", leftname), '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
-                       HUD_DrawXNum_Colored(pos + eX * mySize_y + eY * 0.25 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/200);
+                               barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
+                               picpos = pos + eX * 0.5 * mySize_x - eX * mySize_y;
+                               numpos = picpos - eX * 3 * 0.5 * mySize_y + eX * (3-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y;
+                       } else {
+                               barpos = pos;
+                               barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
+                               picpos = pos;
+                               numpos = picpos + eX * mySize_y + eY * 0.25 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg);
                }
 
                if(rightactive)
                {
-                       drawpic_skin(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200), "statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * mySize_x - eX * mySize_y, strcat("", 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);
+                       len = strlen(ftos(rightcnt));
+
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y;
+                               picpos = pos + eX * 0.5 * mySize_x;
+                               numpos = picpos + eX * mySize_y - eX * (3-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y;
+                       } else {
+                               barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200);
+                               barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * mySize_y;
+                               numpos = picpos - eX * 1.5 * mySize_y + eY * 0.25 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, rightcnt, 3, 0.5 * mySize_y, hud_alpha_fg);
                }
 
                if(fuel)
                        drawpic_skin(pos, "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)
+       else if (mySize_x/mySize_y > 2)
        {
                if(leftactive)
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * 0.4 * mySize_y, strcat("", leftname), '0.7 0.7 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
-                       HUD_DrawXNum_Colored(pos + eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200);
+                               barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y;
+                               numpos = picpos - eX * len * 0.5 * mySize_y;
+                       } else {
+                               barpos = pos;
+                               barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
+                               picpos = pos;
+                               numpos = picpos + eX * 0.5 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg);
                }
 
                if(rightactive)
                {
                        len = strlen(ftos(rightcnt));
-                       
-                       drawpic_skin(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("", 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(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+                               barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+                               picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y + eY * 0.5 * mySize_y;
+                               numpos = picpos - eX * len * 0.5 * mySize_y;
+                       } else {
+                               barpos = pos + eY * 0.5 * mySize_y;
+                               barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+                               picpos = pos + eY * 0.5 * mySize_y;
+                               numpos = picpos + eX * 0.5 * mySize_y;
+                       }
+
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg);
                }
 
+               if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                       barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
+                       barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y;
+               } else {
+                       barpos = pos;
+                       barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y;
+               }
                if(fuel)
-                       drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.15 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
+                       drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
        }
        else
        {
@@ -1633,136 +1782,489 @@ void HUD_HealthArmor(void)
                {
                        len = strlen(ftos(leftcnt));
 
-                       drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos, strcat("", leftname), '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
-                       HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg);
+                       if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200);
+                               picpos = pos + eX * 0.05 * mySize_x;
+                               numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x;
+                       } else {
+                               barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200);
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200);
+                               picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.566 * mySize_x;
+                               numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.166 * mySize_x;
+                       }
+
+                       drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.166 * mySize_x, hud_alpha_fg);
                }
 
                if(rightactive)
                {
                        len = strlen(ftos(rightcnt));
 
-                       drawpic_skin(pos + eY * 0.5 * mySize_y, "statusbar", eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eY * 0.5 * mySize_y, strcat("", 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(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                               barpos = pos + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200);
+                               picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
+                               numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
+                       } else {
+                               barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200) + eX * 0.5 * mySize_x;
+                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200);
+                               picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.566 * mySize_x + eX * 0.5 * mySize_x;
+                               numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.166 * mySize_x + eX * 0.5 * mySize_x;
+                       }
+
+                       drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL);
+                       drawpic_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(numpos, rightcnt, len, 0.166 * mySize_x, hud_alpha_fg);
                }
 
+               if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) {
+                       barpos = pos;
+                       barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100);
+               } else {
+                       barpos = pos + eY * mySize_y - eY * mySize_y * min(1, fuel/100);
+                       barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100);
+               }
                if(fuel)
-                       drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
-       //}
+                       drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL);
        }
 }
 
-// Score (#7)
-//
-void HUD_Score()
+// ___TODO___ !!!
+// Notification area (#4)
+void HUD_Notify (void)
 {
+       float id = 4;
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(7);
-       mySize = HUD_Panel_GetSize(7);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(7, pos, mySize);
+       HUD_Panel_DrawBg(id, 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];
+       string s;
+       entity tm;
+       if(spectatee_status && !intermission)
+       {
+               drawfont = hud_bigfont;
+               if(spectatee_status == -1)
+                       s = "^1Observing";
+               else
+                       s = GetPlayerName(spectatee_status - 1);
+               // spectated player name between HUD and chat area, aligned to the left
+               pos_x = 0;
+               pos_y = - 50 - hud_fontsize_spec_y;
+               s = textShortenToWidth(s, vid_conwidth/2.5, hud_fontsize_spec, stringwidth_colors);
+               drawcolorcodedstring(pos, s, hud_fontsize_spec, hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawfont = hud_font;
 
-       if (!teamplay) { // non-teamgames
-               // me vector := [team/connected frags id]
-               pl = players.sort_next;
-               if(pl == me)
-                       pl = pl.sort_next;
+               // spectator text in the upper right corner
+               if(spectatee_status == -1)
+                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
+               else
+                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
 
-               if(hud_configure)
-                       distribution = 42;
-               else if(pl)
-                       distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
+               if(spectatee_status == -1)
+                       s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
                else
-                       distribution = 0;
+                       s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
 
-               score = me.(scores[ps_primary]);
-               if(hud_configure)
-                       score = 123;
+               s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
 
-               if(distribution >= 5) {
-                       distribution_color = eY;
-                       leader = 1;
-               } else if(distribution >= 0) {
-                       distribution_color = '1 1 1';
-                       leader = 1;
-               } else if(distribution >= -5)
-                       distribution_color = '1 1 0';
+               if(gametype == GAME_ARENA)
+                       s = "^1Wait for your turn to join";
+               else if(gametype == GAME_LMS)
+               {
+                       entity sk;
+                       sk = playerslots[player_localentnum - 1];
+                       if(sk.(scores[ps_primary]) >= 666)
+                               s = "^1Match has already begun";
+                       else if(sk.(scores[ps_primary]) > 0)
+                               s = "^1You have no more lives left";
+                       else
+                               s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+               }
                else
-                       distribution_color = eX;
+                       s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
 
-               score_len = strlen(ftos(score));
-               distr_len = strlen(ftos(distribution));
+               //show restart countdown:
+               if (time < getstatf(STAT_GAMESTARTTIME)) {
+                       float countdown;
+                       //we need to ceil, otherwise the countdown would be off by .5 when using round()
+                       countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
+                       s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+               }
+       }
+       if(warmup_stage && !intermission)
+       {
+               s = "^2Currently in ^1warmup^2 stage!";
+       }
 
-               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_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("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 = -99;
+       // move more important stuff more to the middle so its more visible
 
-               float teamnum;
-               for(tm = teams.sort_next; tm; tm = tm.sort_next) {
-                       if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !hud_configure)) // no players? don't display
-                               continue;
-                       score = tm.(teamscores[ts_primary]);
-                       if(hud_configure)
-                               score = 123;
-                       leader = 0;
-                       
-                       score_len = strlen(ftos(score));
+       string blinkcolor;
+       if(mod(time, 1) >= 0.5)
+               blinkcolor = "^1";
+       else
+               blinkcolor = "^3";
 
-                       if (score > max_fragcount)
-                               max_fragcount = score;
+       if(ready_waiting && !intermission && !spectatee_status)
+       {
+               if(ready_waiting_for_me)
+               {
+                       if(warmup_stage)
+                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
+                       else
+                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+               }
+               else
+               {
+                       if(warmup_stage)
+                               s = strcat("^2Waiting for others to ready up to end warmup...");
+                       else
+                               s = strcat("^2Waiting for others to ready up...");
+               }
+       }
+       else if(warmup_stage && !intermission && !spectatee_status)
+       {
+               s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
+       }
+
+       if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
+       {
+               float ts_min, ts_max;
+               tm = teams.sort_next;
+               if (tm)
+               {
+                       for(; tm.sort_next; tm = tm.sort_next)
+                       {
+                               if(!tm.team_size || tm.team == COLOR_SPECTATOR)
+                                       continue;
+                               if(!ts_min) ts_min = tm.team_size;
+                               else ts_min = min(ts_min, tm.team_size);
+                               if(!ts_max) ts_max = tm.team_size;
+                               else ts_max = max(ts_max, tm.team_size);
+                       }
+                       if ((ts_max - ts_min) > 1)
+                       {
+                               s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
+                               tm = GetTeam(myteam, false);
+                               if (tm)
+                               if (tm.team != COLOR_SPECTATOR)
+                               if (tm.team_size == ts_max)
+                                       s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
 
-                       if(tm.team == myteam) {
-                               if (max_fragcount == score)
-                                       leader = 1;
-                               if (leader)
-                                       drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("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;
-                               if (leader)
-                                       drawpic_skin(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("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;
                        }
                }
        }
 }
 
-// Race timer (#8)
+// Timer (#5)
 //
-void HUD_RaceTimer (void) {
+void HUD_Timer()
+{
+       float id = 5;
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(8);
-       mySize = HUD_Panel_GetSize(8);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(8, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
-       drawfont = hud_bigfont;
-       float a, t;
-       string s, forcetime;
+       float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft;
 
-       if(hud_configure)
-       {
-               s = "0:13:37";
-               drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-               s = "^1Intermediate 1 (+15.42)";
-               drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg, DRAWFLAG_NORMAL);
-       }
-       else if(race_checkpointtime)
-       {
-               a = bound(0, 2 - (time - race_checkpointtime), 1);
+       timelimit = getstatf(STAT_TIMELIMIT);
+
+       timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
+       timeleft = ceil(timeleft);
+       minutesLeft = floor(timeleft / 60);
+       secondsLeft = timeleft - minutesLeft*60;
+
+       vector timer_color;
+       if(minutesLeft >= 5 || warmup_stage || timelimit == 0) //don't use red or yellow in warmup or when there is no timelimit
+               timer_color = '1 1 1'; //white
+       else if(minutesLeft >= 1)
+               timer_color = '1 1 0'; //yellow
+       else
+               timer_color = '1 0 0'; //red
+
+       if (cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
+               if (time < getstatf(STAT_GAMESTARTTIME)) {
+                       //while restart is still active, show 00:00
+                       minutes = seconds = 0;
+               } else {
+                       elapsedTime = floor(time - getstatf(STAT_GAMESTARTTIME)); //127
+                       minutes = floor(elapsedTime / 60);
+                       seconds = elapsedTime - minutes*60;
+               }
+       } else {
+               minutes = minutesLeft;
+               seconds = secondsLeft;
+       }
+
+       if(minutes > 999)
+               seconds = 99;
+       minutes = min(minutes, 999);
+       if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 5.1 * mySize_y, minutes, 3, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawpic_skin(pos + eX * mySize_x - eX * 2.57 * mySize_y, "num_colon", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+       HUD_DrawXNum(pos + eX * mySize_x - eX * 2 * mySize_y, seconds, -2, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+}
+
+// Radar (#6)
+//
+void HUD_Radar(void)
+{
+       float id = 6;
+       vector pos, mySize;
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
+
+       HUD_Panel_DrawBg(id, pos, mySize);
+
+       local float color1, color2; // color already declared as a global in hud.qc
+       local vector rgb;
+       local entity tm;
+       float scale2d, normalsize, bigsize;
+       float f;
+
+       teamradar_origin2d = pos + 0.5 * mySize; // TODO: stupid compat, should be removed
+       teamradar_size2d = mySize;
+
+       if(minimapname == "" && !ons_showmap)
+               return;
+
+       teamradar_loadcvars();
+
+       switch(cl_teamradar_zoommode)
+       {
+               default:
+               case 0:
+                       f = current_zoomfraction;
+                       break;
+               case 1:
+                       f = 1 - current_zoomfraction;
+                       break;
+               case 2:
+                       f = 0;
+                       break;
+               case 3:
+                       f = 1;
+                       break;
+       }
+
+       switch(cl_teamradar_rotation)
+       {
+               case 0:
+                       teamradar_angle = view_angles_y - 90;
+                       break;
+               default:
+                       teamradar_angle = 90 * cl_teamradar_rotation;
+                       break;
+       }
+
+       scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
+       teamradar_size2d = mySize;
+
+       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)
+       {
+               // max-min distance must fit the radar in any rotation
+               bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_max - mi_min));
+       }
+       else
+       {
+               vector c0, c1, c2, c3, span;
+               c0 = rotate(mi_min, teamradar_angle * DEG2RAD);
+               c1 = rotate(mi_max, teamradar_angle * DEG2RAD);
+               c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD);
+               c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD);
+               span = '0 0 0';
+               span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x);
+               span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y);
+
+               // max-min distance must fit the radar in x=x, y=y
+               bigsize = min(
+                       teamradar_size2d_x * scale2d / (1.05 * span_x),
+                       teamradar_size2d_y * scale2d / (1.05 * span_y)
+               );
+       }
+
+       normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale;
+       if(bigsize > normalsize)
+               normalsize = bigsize;
+
+       teamradar_size =
+                 f * bigsize
+               + (1 - f) * normalsize;
+       teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord(
+                 f * (mi_min + mi_max) * 0.5
+               + (1 - f) * view_origin);
+
+       color1 = GetPlayerColor(player_localentnum-1);
+       rgb = GetTeamRGB(color1);
+
+       drawsetcliparea(
+               pos_x,
+               pos_y,
+               mySize_x,
+               mySize_y
+       );
+
+       draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha);
+
+       if(ons_showmap)
+       {
+               drawresetcliparea();
+
+               vector frame_origin, frame_size;
+               frame_origin = frame_size = '0 0 0';
+
+               frame_origin_x = pos_x - teamradar_size2d_x * 0.55859375; // matches the picture
+               frame_origin_y = pos_y - teamradar_size2d_y * 0.55859375; // matches the picture
+               frame_size_x = pos_x * 1.1171875; // matches the picture
+               frame_size_y = pos_y * 1.1171875; // matches the picture
+               drawpic_skin(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0);
+               drawpic_skin(frame_origin, "gfx/ons-frame-team.tga", frame_size, rgb, hud_alpha_fg, 0);
+
+               drawsetcliparea(
+                       pos_x - teamradar_size2d_x * 0.5,
+                       pos_y - teamradar_size2d_y * 0.5,
+                       teamradar_size2d_x,
+                       teamradar_size2d_y
+               );
+       }
+
+       for(tm = world; (tm = find(tm, classname, "radarlink")); )
+               draw_teamradar_link(tm.origin, tm.velocity, tm.team);
+       for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); )
+               draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, hud_alpha_fg);
+       for(tm = world; (tm = find(tm, classname, "entcs_receiver")); )
+       {
+               color2 = GetPlayerColor(tm.sv_entnum);
+               //if(color == COLOR_SPECTATOR || color == color2)
+                       draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2));
+       }
+       draw_teamradar_player(view_origin, view_angles, '1 1 1');
+
+       drawresetcliparea();
+};
+
+// Score (#7)
+//
+void HUD_Score()
+{
+       float id = 7;
+       vector pos, mySize;
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
+
+       HUD_Panel_DrawBg(id, 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];
+
+       if (!teamplay) { // non-teamgames
+               // me vector := [team/connected frags id]
+               pl = players.sort_next;
+               if(pl == me)
+                       pl = pl.sort_next;
+
+               if(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(hud_configure)
+                       score = 123;
+
+               if(distribution >= 5) {
+                       distribution_color = eY;
+                       leader = 1;
+               } else if(distribution >= 0) {
+                       distribution_color = '1 1 1';
+                       leader = 1;
+               } else if(distribution >= -5)
+                       distribution_color = '1 1 0';
+               else
+                       distribution_color = eX;
+
+               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_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("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 = -99;
+
+               float teamnum;
+               for(tm = teams.sort_next; tm; tm = tm.sort_next) {
+                       if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !hud_configure)) // no players? don't display
+                               continue;
+                       score = tm.(teamscores[ts_primary]);
+                       if(hud_configure)
+                               score = 123;
+                       leader = 0;
+                       
+                       score_len = strlen(ftos(score));
+
+                       if (score > max_fragcount)
+                               max_fragcount = score;
+
+                       if(tm.team == myteam) {
+                               if (max_fragcount == score)
+                                       leader = 1;
+                               if (leader)
+                                       drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("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;
+                               if (leader)
+                                       drawpic_skin(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("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;
+                       }
+               }
+       }
+}
+
+// Race timer (#8)
+//
+void HUD_RaceTimer (void) {
+       float id = 8;
+       vector pos, mySize;
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
+
+       HUD_Panel_DrawBg(id, pos, mySize);
+
+       drawfont = hud_bigfont;
+       float a, t;
+       string s, forcetime;
+
+       if(hud_configure)
+       {
+               s = "0:13:37";
+               drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               s = "^1Intermediate 1 (+15.42)";
+               drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+       else if(race_checkpointtime)
+       {
+               a = bound(0, 2 - (time - race_checkpointtime), 1);
                s = "";
                forcetime = "";
                if(a > 0) // just hit a checkpoint?
@@ -1796,6 +2298,7 @@ void HUD_RaceTimer (void) {
                        drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg * a, DRAWFLAG_NORMAL);
                }
 
+               // ___ TODO!!!___
                if(race_penaltytime)
                {
                        a = bound(0, 2 - (time - race_penaltyeventtime), 1);
@@ -1810,184 +2313,57 @@ void HUD_RaceTimer (void) {
 
                if(forcetime != "")
                {
-                       a = bound(0, (time - race_checkpointtime) / 0.5, 1);
-                       //drawstring_expanding(m - '16 0 0' * stringwidth(forcetime, FALSE), forcetime, '32 32 0', '1 1 1', hud_alpha_fg, 0, a);
-                       drawstring_expanding(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(forcetime, FALSE, '1 1 0' * 0.75 * mySize_y), forcetime, '1 1 0' * 0.75 * mySize_y, '1 1 1', hud_alpha_fg, 0, a);
-               }
-               else
-                       a = 1;
-
-               if(race_laptime && race_checkpoint != 255)
-               {
-                       s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime));
-                       //drawstring(m - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-                       drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-               }
-       }
-       else
-       {
-               if(race_mycheckpointtime)
-               {
-                       a = bound(0, 2 - (time - race_mycheckpointtime), 1);
-                       s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy);
-                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
-                       //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-                       drawcolorcodedstring(pos - '0 16 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-               }
-               if(race_othercheckpointtime && race_othercheckpointenemy != "")
-               {
-                       a = bound(0, 2 - (time - race_othercheckpointtime), 1);
-                       s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy);
-                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
-                       //drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-                       drawcolorcodedstring(pos - '0 0 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-               }
-
-               if(race_penaltytime && !race_penaltyaccumulator)
-               {
-                       t = race_penaltytime * 0.1 + race_penaltyeventtime;
-                       a = bound(0, (1 + t - time), 1);
-                       if(a > 0)
-                       {
-                               if(time < t)
-                                       s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")");
-                               else
-                                       s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")");
-                               dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
-                               //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-                               drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
-                       }
-               }
-       }
-
-       drawfont = hud_font;
-}
-
-// ___TODO___ !!!
-// Notification area (#4)
-void HUD_Notify (void)
-{
-       vector pos, mySize;
-       pos = HUD_Panel_GetPos(4);
-       mySize = HUD_Panel_GetSize(4);
-
-       HUD_Panel_DrawBg(4, pos, mySize);
-
-       string s;
-       entity tm;
-       if(spectatee_status && !intermission)
-       {
-               drawfont = hud_bigfont;
-               if(spectatee_status == -1)
-                       s = "^1Observing";
-               else
-                       s = GetPlayerName(spectatee_status - 1);
-               // spectated player name between HUD and chat area, aligned to the left
-               pos_x = 0;
-               pos_y = - 50 - hud_fontsize_spec_y;
-               s = textShortenToWidth(s, vid_conwidth/2.5, hud_fontsize_spec, stringwidth_colors);
-               drawcolorcodedstring(pos, s, hud_fontsize_spec, hud_alpha_fg, DRAWFLAG_NORMAL);
-               drawfont = hud_font;
-
-               // spectator text in the upper right corner
-               if(spectatee_status == -1)
-                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
-               else
-                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
-
-               if(spectatee_status == -1)
-                       s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
-               else
-                       s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
-
-               s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
-
-               if(gametype == GAME_ARENA)
-                       s = "^1Wait for your turn to join";
-               else if(gametype == GAME_LMS)
-               {
-                       entity sk;
-                       sk = playerslots[player_localentnum - 1];
-                       if(sk.(scores[ps_primary]) >= 666)
-                               s = "^1Match has already begun";
-                       else if(sk.(scores[ps_primary]) > 0)
-                               s = "^1You have no more lives left";
-                       else
-                               s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
-               }
-               else
-                       s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
-
-               //show restart countdown:
-               if (time < getstatf(STAT_GAMESTARTTIME)) {
-                       float countdown;
-                       //we need to ceil, otherwise the countdown would be off by .5 when using round()
-                       countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
-                       s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
-               }
-       }
-       if(warmup_stage && !intermission)
-       {
-               s = "^2Currently in ^1warmup^2 stage!";
-       }
-
-       // move more important stuff more to the middle so its more visible
-
-       string blinkcolor;
-       if(mod(time, 1) >= 0.5)
-               blinkcolor = "^1";
-       else
-               blinkcolor = "^3";
-
-       if(ready_waiting && !intermission && !spectatee_status)
-       {
-               if(ready_waiting_for_me)
-               {
-                       if(warmup_stage)
-                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
-                       else
-                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+                       a = bound(0, (time - race_checkpointtime) / 0.5, 1);
+                       //drawstring_expanding(m - '16 0 0' * stringwidth(forcetime, FALSE), forcetime, '32 32 0', '1 1 1', hud_alpha_fg, 0, a);
+                       drawstring_expanding(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(forcetime, FALSE, '1 1 0' * 0.75 * mySize_y), forcetime, '1 1 0' * 0.75 * mySize_y, '1 1 1', hud_alpha_fg, 0, a);
                }
                else
+                       a = 1;
+
+               if(race_laptime && race_checkpoint != 255)
                {
-                       if(warmup_stage)
-                               s = strcat("^2Waiting for others to ready up to end warmup...");
-                       else
-                               s = strcat("^2Waiting for others to ready up...");
+                       s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime));
+                       //drawstring(m - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
                }
        }
-       else if(warmup_stage && !intermission && !spectatee_status)
+       else
        {
-               s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
-       }
+               if(race_mycheckpointtime)
+               {
+                       a = bound(0, 2 - (time - race_mycheckpointtime), 1);
+                       s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy);
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos - '0 16 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
+               if(race_othercheckpointtime && race_othercheckpointenemy != "")
+               {
+                       a = bound(0, 2 - (time - race_othercheckpointtime), 1);
+                       s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy);
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       //drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos - '0 0 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
 
-       if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
-       {
-               float ts_min, ts_max;
-               tm = teams.sort_next;
-               if (tm)
+               if(race_penaltytime && !race_penaltyaccumulator)
                {
-                       for(; tm.sort_next; tm = tm.sort_next)
-                       {
-                               if(!tm.team_size || tm.team == COLOR_SPECTATOR)
-                                       continue;
-                               if(!ts_min) ts_min = tm.team_size;
-                               else ts_min = min(ts_min, tm.team_size);
-                               if(!ts_max) ts_max = tm.team_size;
-                               else ts_max = max(ts_max, tm.team_size);
-                       }
-                       if ((ts_max - ts_min) > 1)
+                       t = race_penaltytime * 0.1 + race_penaltyeventtime;
+                       a = bound(0, (1 + t - time), 1);
+                       if(a > 0)
                        {
-                               s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
-                               tm = GetTeam(myteam, false);
-                               if (tm)
-                               if (tm.team != COLOR_SPECTATOR)
-                               if (tm.team_size == ts_max)
-                                       s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
-
+                               if(time < t)
+                                       s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")");
+                               else
+                                       s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")");
+                               dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                               //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
                        }
                }
        }
+
+       drawfont = hud_font;
 }
 
 // Vote window (#9)
@@ -2003,9 +2379,10 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
+       float id = 9;
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(9);
-       mySize = HUD_Panel_GetSize(9);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
        string s;
        float a;
@@ -2027,7 +2404,7 @@ void HUD_VoteWindow(void)
                vote_needed = 4;
        }
 
-       HUD_Panel_DrawBg(9, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        if(vote_alpha) {
                a = vote_alpha * bound(cvar_or("hud_vote_alreadyvoted_alpha", 0.75), 1 - vote_highlighted, 1);
@@ -2553,218 +2930,6 @@ void CSQC_race_hud(void)
        drawfont = hud_font;
 }
 
-// Timer (#5)
-//
-void HUD_Timer()
-{
-       vector pos, mySize;
-       pos = HUD_Panel_GetPos(5);
-       mySize = HUD_Panel_GetSize(5);
-
-       HUD_Panel_DrawBg(5, pos, mySize);
-
-       float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft;
-
-       timelimit = getstatf(STAT_TIMELIMIT);
-
-       HUD_DrawRaceStatus(pos + '0 30 0');
-
-       timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
-       timeleft = ceil(timeleft);
-       minutesLeft = floor(timeleft / 60);
-       secondsLeft = timeleft - minutesLeft*60;
-
-       vector timer_color;
-       if(minutesLeft >= 5 || warmup_stage || timelimit == 0) //don't use red or yellow in warmup or when there is no timelimit
-               timer_color = '1 1 1'; //white
-       else if(minutesLeft >= 1)
-               timer_color = '1 1 0'; //yellow
-       else
-               timer_color = '1 0 0'; //red
-
-       if (cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
-               if (time < getstatf(STAT_GAMESTARTTIME)) {
-                       //while restart is still active, show 00:00
-                       minutes = seconds = 0;
-               } else {
-                       elapsedTime = floor(time - getstatf(STAT_GAMESTARTTIME)); //127
-                       minutes = floor(elapsedTime / 60);
-                       seconds = elapsedTime - minutes*60;
-               }
-       } else {
-               minutes = minutesLeft;
-               seconds = secondsLeft;
-       }
-
-       if(mySize_x/mySize_y > 5.1)
-       {
-               if(minutes > 999)
-                       seconds = 99;
-               minutes = min(minutes, 999);
-               if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
-                       if(minutes < 100)
-                               drawpic_skin(pos + eX * mySize_x - eX * 5.1 * mySize_y, "timer", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
-                       HUD_DrawXNum(pos + eX * mySize_x - eX * 5.1 * mySize_y, minutes, 3, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * mySize_x - eX * 2.57 * mySize_y, "num_colon", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
-               }
-               HUD_DrawXNum(pos + eX * mySize_x - eX * 2 * mySize_y, seconds, -2, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-       }
-       else
-       {
-               if(minutes > 99)
-                       seconds = 99;
-               minutes = min(minutes, 99);
-               if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
-                       if(minutes < 100)
-                               drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y, "timer", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
-                       HUD_DrawXNum(pos + eX * 0.5 * mySize_x - eX * mySize_y + eY * 0.5 * mySize_y, minutes, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-                       drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y + eY * 0.5 * mySize_y, "num_colon", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
-               }
-               HUD_DrawXNum(pos + eX * 0.51 * mySize_x + eY * 0.5 * mySize_y, seconds, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
-       }
-}
-
-// Radar (#6)
-//
-
-void HUD_Radar(void)
-{
-       vector pos, mySize;
-       pos = HUD_Panel_GetPos(6);
-       mySize = HUD_Panel_GetSize(6);
-
-       HUD_Panel_DrawBg(6, pos, mySize);
-
-       local float color1, color2; // color already declared as a global in hud.qc
-       local vector rgb;
-       local entity tm;
-       float scale2d, normalsize, bigsize;
-       float f;
-
-       teamradar_origin2d = pos + 0.5 * mySize; // TODO: stupid compat, should be removed
-       teamradar_size2d = mySize;
-
-       if(minimapname == "" && !ons_showmap)
-               return;
-
-       teamradar_loadcvars();
-
-       switch(cl_teamradar_zoommode)
-       {
-               default:
-               case 0:
-                       f = current_zoomfraction;
-                       break;
-               case 1:
-                       f = 1 - current_zoomfraction;
-                       break;
-               case 2:
-                       f = 0;
-                       break;
-               case 3:
-                       f = 1;
-                       break;
-       }
-
-       switch(cl_teamradar_rotation)
-       {
-               case 0:
-                       teamradar_angle = view_angles_y - 90;
-                       break;
-               default:
-                       teamradar_angle = 90 * cl_teamradar_rotation;
-                       break;
-       }
-
-       scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
-       teamradar_size2d = mySize;
-
-       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)
-       {
-               // max-min distance must fit the radar in any rotation
-               bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_max - mi_min));
-       }
-       else
-       {
-               vector c0, c1, c2, c3, span;
-               c0 = rotate(mi_min, teamradar_angle * DEG2RAD);
-               c1 = rotate(mi_max, teamradar_angle * DEG2RAD);
-               c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD);
-               c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD);
-               span = '0 0 0';
-               span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x);
-               span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y);
-
-               // max-min distance must fit the radar in x=x, y=y
-               bigsize = min(
-                       teamradar_size2d_x * scale2d / (1.05 * span_x),
-                       teamradar_size2d_y * scale2d / (1.05 * span_y)
-               );
-       }
-
-       normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale;
-       if(bigsize > normalsize)
-               normalsize = bigsize;
-
-       teamradar_size =
-                 f * bigsize
-               + (1 - f) * normalsize;
-       teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord(
-                 f * (mi_min + mi_max) * 0.5
-               + (1 - f) * view_origin);
-
-       color1 = GetPlayerColor(player_localentnum-1);
-       rgb = GetTeamRGB(color1);
-
-       drawsetcliparea(
-               pos_x,
-               pos_y,
-               mySize_x,
-               mySize_y
-       );
-
-       draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha);
-
-       if(ons_showmap)
-       {
-               drawresetcliparea();
-
-               vector frame_origin, frame_size;
-               frame_origin = frame_size = '0 0 0';
-
-               frame_origin_x = pos_x - teamradar_size2d_x * 0.55859375; // matches the picture
-               frame_origin_y = pos_y - teamradar_size2d_y * 0.55859375; // matches the picture
-               frame_size_x = pos_x * 1.1171875; // matches the picture
-               frame_size_y = pos_y * 1.1171875; // matches the picture
-               drawpic_skin(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0);
-               drawpic_skin(frame_origin, "gfx/ons-frame-team.tga", frame_size, rgb, hud_alpha_fg, 0);
-
-               drawsetcliparea(
-                       pos_x - teamradar_size2d_x * 0.5,
-                       pos_y - teamradar_size2d_y * 0.5,
-                       teamradar_size2d_x,
-                       teamradar_size2d_y
-               );
-       }
-
-       for(tm = world; (tm = find(tm, classname, "radarlink")); )
-               draw_teamradar_link(tm.origin, tm.velocity, tm.team);
-       for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); )
-               draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, hud_alpha_fg);
-       for(tm = world; (tm = find(tm, classname, "entcs_receiver")); )
-       {
-               color2 = GetPlayerColor(tm.sv_entnum);
-               //if(color == COLOR_SPECTATOR || color == color2)
-                       draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2));
-       }
-       draw_teamradar_player(view_origin, view_angles, '1 1 1');
-
-       drawresetcliparea();
-};
-
 /*
 ==================
 Main HUD system
@@ -2773,22 +2938,23 @@ Main HUD system
 
 void HUD_DrawPressedKeys(void)
 {
+       float id = 10;
        vector pos, mySize;
-       pos = HUD_Panel_GetPos(10);
-       mySize = HUD_Panel_GetSize(10);
+       pos = HUD_Panel_GetPos(id);
+       mySize = HUD_Panel_GetSize(id);
 
-       HUD_Panel_DrawBg(10, pos, mySize);
+       HUD_Panel_DrawBg(id, pos, mySize);
 
        float pressedkeys;
 
        pressedkeys = getstatf(STAT_PRESSED_KEYS);
-       drawpic_skin(pos, "keys/key_bg.tga",           mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * mySize_x - eX * 0.22 * mySize_x +       eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "keys/key_crouch_inv.tga" : "keys/key_crouch.tga"),        '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "keys/key_forward_inv.tga" : "keys/key_forward.tga"),     '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * 0.023 * mySize_x +                      eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "keys/key_jump_inv.tga" : "keys/key_jump.tga"),              '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * 0.1 * mySize_x +                        eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "keys/key_left_inv.tga" : "keys/key_left.tga"),              '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "keys/key_backward_inv.tga" : "keys/key_backward.tga"),  '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-       drawpic_skin(pos + eX * mySize_x - eX * 0.372 * mySize_x +      eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "keys/key_right_inv.tga" : "keys/key_right.tga"),           '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos, "key_bg.tga",           mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * mySize_x - eX * 0.22 * mySize_x +       eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "key_crouch_inv.tga" : "key_crouch.tga"),        '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"),     '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * 0.023 * mySize_x +                      eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"),              '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * 0.1 * mySize_x +                        eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"),              '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"),  '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eX * mySize_x - eX * 0.372 * mySize_x +      eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"),           '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
 }
 
 void HUD_ShowSpeed(void)