]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/newpanelhud
authorterencehill <piuntn@gmail.com>
Sat, 27 Nov 2010 23:06:41 +0000 (00:06 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 27 Nov 2010 23:06:41 +0000 (00:06 +0100)
1  2 
qcsrc/client/Main.qc
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/client/scoreboard.qc

diff --combined qcsrc/client/Main.qc
index 59387904361ee5233609f48705168ce9a94bede5,ef220acefac5e4d960c8e7d7bc69faebedae5c72..9e5b6be54a57650d30ceebf8213e14719d9e15c0
@@@ -848,11 -848,6 +848,6 @@@ void Ent_ClientData(
        if(newspectatee_status != spectatee_status)
        {
                float i;
-               // clear the weapon accuracy stats
-               for(i = WEP_FIRST; i <= WEP_LAST; ++i) {
-                       weapon_hits[i] = 0;
-                       weapon_fired[i] = 0;
-               }
  
                // clear race stuff
                race_laptime = 0;
@@@ -904,6 -899,32 +899,32 @@@ void Ent_RandomSeed(
        psrandom(s);
  }
  
+ void Ent_ReadAccuracy(void)
+ {
+       float sf, f, w, b;
+       sf = ReadInt24_t();
+       if(sf == 0)
+       {
+               for(w = 0; w <= WEP_LAST - WEP_FIRST; ++w)
+                       weapon_accuracy[w] = -1;
+               return;
+       }
+       
+       for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
+       {
+               if(sf & f)
+               {
+                       b = ReadByte();
+                       if(b == 0)
+                               weapon_accuracy[w] = -1;
+                       else if(b == 255)
+                               weapon_accuracy[w] = 1.0; // no better error handling yet, sorry
+                       else
+                               weapon_accuracy[w] = (b - 1.0) / 100.0;
+               }
+       }
+ }
  // CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured.
  // The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS.
  void Ent_RadarLink();
@@@ -967,6 -988,7 +988,7 @@@ void(float bIsNewEntity) CSQC_Ent_Updat
                case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break;
                case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
                case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
+               case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
                default:
                        error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
                        break;
@@@ -998,6 -1020,15 +1020,6 @@@ void CSQC_Ent_Remove(
  
  void Gamemode_Init()
  {
 -      if(gametype == GAME_ONSLAUGHT) {
 -              print(strcat("Using ", minimapname, " as minimap.\n"));
 -              precache_pic("gfx/ons-cp-neutral.tga");
 -              precache_pic("gfx/ons-cp-red.tga");
 -              precache_pic("gfx/ons-cp-blue.tga");
 -              precache_pic("gfx/ons-frame.tga");
 -              precache_pic("gfx/ons-frame-team.tga");
 -      }
 -
        if not(isdemo())
        {
                localcmd("\n_cl_hook_gamestart ", GametypeNameFromType(gametype), "\n");
diff --combined qcsrc/client/hud.qc
index 691c77d0ac7998dd225e1ed8a9ffc32db63c7f4f,01dc0166305f20a7b30ef955958444d1ab71b196..6ab50f5f531607b6a6d6755c992fef8495300542
@@@ -553,7 -553,7 +553,7 @@@ if(highlightedPanel_prev == active_pane
        HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\
  } ENDS_WITH_CURLY_BRACE
  
 -void HUD_Panel_DrawProgressBar(vector pos, float vertical, vector mySize, vector color, float alpha, float drawflag)
 +void HUD_Panel_DrawProgressBar(vector pos, vector mySize, float lenght_ratio, float vertical, float right_align, vector color, float alpha, float drawflag)
  {
        if(!alpha)
                return;
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar_vertical";
                }
 +
 +              if (right_align)
 +                      pos_y += (1 - lenght_ratio) * mySize_y;
 +              mySize_y *= lenght_ratio;
 +
                drawsubpic(pos, eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0 0', '1 0.25 0', color, alpha, drawflag);
                if(mySize_y/mySize_x > 2)
                        drawsubpic(pos + eY * mySize_x, eY * (mySize_y - 2 * mySize_x) + eX * mySize_x, pic, '0 0.25 0', '1 0.5 0', color, alpha, drawflag);
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar";
                }
 +
 +              if (right_align)
 +                      pos_x += (1 - lenght_ratio) * mySize_x;
 +              mySize_x *= lenght_ratio;
 +
                drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag);
                if(mySize_x/mySize_y > 2)
                        drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
@@@ -691,10 -681,10 +691,10 @@@ void HUD_Panel_SetPos(vector pos
        //if(cvar("hud_configure_checkcollisions_debug"))
                //drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
  
 -      if(autocvar_hud_configure_grid)
 +      if(cvar("hud_configure_grid"))
        {
 -              pos_x = floor((pos_x/vid_conwidth)/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth;
 -              pos_y = floor((pos_y/vid_conheight)/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight;
 +              pos_x = floor((pos_x/vid_conwidth)/hud_configure_gridSize_x + 0.5) * hud_configure_realGridSize_x;
 +              pos_y = floor((pos_y/vid_conheight)/hud_configure_gridSize_y + 0.5) * hud_configure_realGridSize_y;
        }
  
        if(hud_configure_checkcollisions)
@@@ -872,10 -862,10 +872,10 @@@ void HUD_Panel_SetPosSize(vector mySize
                //drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
  
        // before checkresize, otherwise panel can be snapped partially inside another panel or panel aspect ratio can be broken
 -      if(autocvar_hud_configure_grid)
 +      if(cvar("hud_configure_grid"))
        {
 -              mySize_x = floor((mySize_x/vid_conwidth)/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth;
 -              mySize_y = floor((mySize_y/vid_conheight)/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight;
 +              mySize_x = floor((mySize_x/vid_conwidth)/hud_configure_gridSize_x + 0.5) * hud_configure_realGridSize_x;
 +              mySize_y = floor((mySize_y/vid_conheight)/hud_configure_gridSize_y + 0.5) * hud_configure_realGridSize_y;
        }
  
        if(hud_configure_checkcollisions)
@@@ -926,21 -916,21 +926,21 @@@ void HUD_Panel_Arrow_Action(float nPrim
        hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
  
        float step;
 -      if(autocvar_hud_configure_grid)
 +      if(cvar("hud_configure_grid"))
        {
                if (nPrimary == K_UPARROW || nPrimary == K_DOWNARROW)
                {
                        if (hudShiftState & S_SHIFT)
 -                              step = bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight;
 +                              step = hud_configure_realGridSize_y;
                        else
 -                              step = 2 * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight;
 +                              step = 2 * hud_configure_realGridSize_y;
                }
                else
                {
                        if (hudShiftState & S_SHIFT)
 -                              step = bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth;
 +                              step = hud_configure_realGridSize_x;
                        else
 -                              step = 2 * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth;
 +                              step = 2 * hud_configure_realGridSize_x;
                }
        }
        else
@@@ -1078,68 -1068,74 +1078,68 @@@ float HUD_Panel_InputEvent(float bInput
                menu_enabled_time = time;
                localcmd("menu_showhudexit\n");
        }
 -      else if(hudShiftState & S_CTRL)
 +      else if(nPrimary == K_SPACE && hudShiftState & S_CTRL) // enable/disable highlighted panel or dock
        {
 -              if (mouseClicked)
 +              if (bInputType == 1 || mouseClicked)
                        return true;
  
 -              if(nPrimary == K_SPACE) // enable/disable highlighted panel or dock
 -              {
 -                      if (bInputType == 1)
 -                              return true;
 +              if (highlightedPanel_prev != -1)
 +                      cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled)));
 +              else
 +                      cvar_set(strcat("hud_dock"), (autocvar_hud_dock == "") ? "dock" : "");
 +      }
 +      else if(nPrimary == 'c' && hudShiftState & S_CTRL) // copy highlighted panel size
 +      {
 +              if (bInputType == 1 || mouseClicked)
 +                      return true;
  
 -                      if (highlightedPanel_prev != -1)
 -                              cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled)));
 -                      else
 -                              cvar_set(strcat("hud_dock"), (autocvar_hud_dock == "") ? "dock" : "");
 -              }
 -              if(nPrimary == 'c') // copy highlighted panel size
 +              if (highlightedPanel_prev != -1)
                {
 -                      if (bInputType == 1)
 -                              return true;
 -
 -                      if (highlightedPanel_prev != -1)
 -                      {
 -                              panel_size_copied = panel_size;
 -                              highlightedPanel_copied = highlightedPanel_prev;
 -                      }
 +                      panel_size_copied = panel_size;
 +                      highlightedPanel_copied = highlightedPanel_prev;
                }
 -              else if(nPrimary == 'v') // past copied size on the highlighted panel
 -              {
 -                      if (bInputType == 1)
 -                              return true;
 +      }
 +      else if(nPrimary == 'v' && hudShiftState & S_CTRL) // past copied size on the highlighted panel
 +      {
 +              if (bInputType == 1 || mouseClicked)
 +                      return true;
  
 -                      if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1)
 -                              return true;
 +              if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1)
 +                      return true;
  
 -                      HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev);
 +              HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev);
  
 -                      // reduce size if it'd go beyond screen boundaries
 -                      vector tmp_size = panel_size_copied;
 -                      if (panel_pos_x + panel_size_copied_x > vid_conwidth)
 -                              tmp_size_x = vid_conwidth - panel_pos_x;
 -                      if (panel_pos_y + panel_size_copied_y > vid_conheight)
 -                              tmp_size_y = vid_conheight - panel_pos_y;
 +              // reduce size if it'd go beyond screen boundaries
 +              vector tmp_size = panel_size_copied;
 +              if (panel_pos_x + panel_size_copied_x > vid_conwidth)
 +                      tmp_size_x = vid_conwidth - panel_pos_x;
 +              if (panel_pos_y + panel_size_copied_y > vid_conheight)
 +                      tmp_size_y = vid_conheight - panel_pos_y;
  
 -                      if (panel_size == tmp_size)
 -                              return true;
 +              if (panel_size == tmp_size)
 +                      return true;
  
 -                      // backup first!
 -                      panel_pos_backup = panel_pos;
 -                      panel_size_backup = panel_size;
 -                      highlightedPanel_backup = highlightedPanel_prev;
 +              // backup first!
 +              panel_pos_backup = panel_pos;
 +              panel_size_backup = panel_size;
 +              highlightedPanel_backup = highlightedPanel_prev;
  
 -                      s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight));
 -                      cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
 -              }
 -              else if(nPrimary == 'z') // undo last action
 +              s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight));
 +              cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
 +      }
 +      else if(nPrimary == 'z' && hudShiftState & S_CTRL) // undo last action
 +      {
 +              if (bInputType == 1 || mouseClicked)
 +                      return true;
 +              //restore previous values
 +              if (highlightedPanel_backup != -1)
                {
 -                      if (bInputType == 1)
 -                              return true;
 -                      //restore previous values
 -                      if (highlightedPanel_backup != -1)
 -                      {
 -                              HUD_Panel_GetName(highlightedPanel_backup);
 -                              s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight));
 -                              cvar_set(strcat("hud_panel_", panel_name, "_pos"), s);
 -                              s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight));
 -                              cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
 -                              highlightedPanel_backup = -1;
 -                      }
 +                      HUD_Panel_GetName(highlightedPanel_backup);
 +                      s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight));
 +                      cvar_set(strcat("hud_panel_", panel_name, "_pos"), s);
 +                      s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight));
 +                      cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
 +                      highlightedPanel_backup = -1;
                }
        }
        else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW)
  float HUD_Panel_HighlightCheck()
  {
        float i, j, border;
 -      vector panelPos;
 -      vector panelSize;
  
 -      while(j <= HUD_PANEL_NUM)
 +      while(j < HUD_PANEL_NUM)
        {
                i = panel_order[j];
                j += 1;
  
                HUD_Panel_UpdatePosSizeForId(i);
  
 -              panelPos = panel_pos;
 -              panelSize = panel_size;
                border = max(8, panel_bg_border); // FORCED border so a small border size doesn't mean you can't resize
  
                // move
 -              if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
 +              if(mousepos_x >= panel_pos_x && mousepos_y >= panel_pos_y && mousepos_x <= panel_pos_x + panel_size_x && mousepos_y <= panel_pos_y + panel_size_y)
                {
                        return 1;
                }
                // resize from topleft border
 -              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + 0.5 * panel_size_y)
                {
                        return 2;
                }
                // resize from topright border
 -              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + 0.5 * panel_size_y)
                {
                        return 3;
                }
                // resize from bottomleft border
 -              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
 +              else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + panel_size_y + border)
                {
                        return 3;
                }
                // resize from bottomright border
 -              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
 +              else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + panel_size_y + border)
                {
                        return 2;
                }
@@@ -1243,69 -1243,73 +1243,69 @@@ void HUD_Panel_FirstInDrawQ(float id
  void HUD_Panel_Highlight()
  {
        float i, j, border;
 -      vector panelPos;
 -      vector panelSize;
  
 -      while(j <= HUD_PANEL_NUM)
 +      while(j < HUD_PANEL_NUM)
        {
                i = panel_order[j];
                j += 1;
  
                HUD_Panel_UpdatePosSizeForId(i);
  
 -              panelPos = panel_pos;
 -              panelSize = panel_size;
                border = max(8, panel_bg_border); // FORCED border so a small border size doesn't mean you can't resize
  
                // move
 -              if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
 +              if(mousepos_x >= panel_pos_x && mousepos_y >= panel_pos_y && mousepos_x <= panel_pos_x + panel_size_x && mousepos_y <= panel_pos_y + panel_size_y)
                {
                        highlightedPanel = i;
                        HUD_Panel_FirstInDrawQ(i);
                        highlightedAction = 1;
 -                      panel_click_distance = mousepos - panelPos;
 +                      panel_click_distance = mousepos - panel_pos;
                        return;
                }
                // resize from topleft border
 -              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + 0.5 * panel_size_y)
                {
                        highlightedPanel = i;
                        HUD_Panel_FirstInDrawQ(i);
                        highlightedAction = 2;
                        resizeCorner = 1;
 -                      panel_click_distance = mousepos - panelPos;
 -                      panel_click_resizeorigin = panelPos + panelSize;
 +                      panel_click_distance = mousepos - panel_pos;
 +                      panel_click_resizeorigin = panel_pos + panel_size;
                        return;
                }
                // resize from topright border
 -              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + 0.5 * panel_size_y)
                {
                        highlightedPanel = i;
                        HUD_Panel_FirstInDrawQ(i);
                        highlightedAction = 2;
                        resizeCorner = 2;
 -                      panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x;
 -                      panel_click_distance_y = mousepos_y - panelPos_y;
 -                      panel_click_resizeorigin = panelPos + eY * panelSize_y;
 +                      panel_click_distance_x = panel_size_x - mousepos_x + panel_pos_x;
 +                      panel_click_distance_y = mousepos_y - panel_pos_y;
 +                      panel_click_resizeorigin = panel_pos + eY * panel_size_y;
                        return;
                }
                // resize from bottomleft border
 -              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
 +              else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + panel_size_y + border)
                {
                        highlightedPanel = i;
                        HUD_Panel_FirstInDrawQ(i);
                        highlightedAction = 2;
                        resizeCorner = 3;
 -                      panel_click_distance_x = mousepos_x - panelPos_x;
 -                      panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y;
 -                      panel_click_resizeorigin = panelPos + eX * panelSize_x;
 +                      panel_click_distance_x = mousepos_x - panel_pos_x;
 +                      panel_click_distance_y = panel_size_y - mousepos_y + panel_pos_y;
 +                      panel_click_resizeorigin = panel_pos + eX * panel_size_x;
                        return;
                }
                // resize from bottomright border
 -              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
 +              else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + panel_size_y + border)
                {
                        highlightedPanel = i;
                        HUD_Panel_FirstInDrawQ(i);
                        highlightedAction = 2;
                        resizeCorner = 4;
 -                      panel_click_distance = panelSize - mousepos + panelPos;
 -                      panel_click_resizeorigin = panelPos;
 +                      panel_click_distance = panel_size - mousepos + panel_pos;
 +                      panel_click_resizeorigin = panel_pos;
                        return;
                }
                else
@@@ -1419,13 -1423,13 +1419,13 @@@ void HUD_Panel_Mouse(
        cursorsize = '32 32 0';
  
        if(highlightcheck == 0)
 -              drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 +              drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else if(highlightcheck == 1)
 -              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 +              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else if(highlightcheck == 2)
 -              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 +              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else
 -              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 +              drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
  
        prevMouseClicked = mouseClicked;
  }
@@@ -1497,11 -1501,8 +1497,11 @@@ void HUD_Weapons(void
        float f, screen_ar;
        float center_x, center_y;
  
 -      if(!autocvar_hud_panel_weapons && !autocvar__hud_configure)
 -              return;
 +      if(!autocvar__hud_configure)
 +      {
 +              if(!autocvar_hud_panel_weapons) return;
 +              if(spectatee_status == -1) return;
 +      }
  
        float timeout = cvar("hud_panel_weapons_timeout");
        float timeout_effect_length, timein_effect_length;
        }
  
        float show_accuracy;
-       float weapon_stats, weapon_number;
+       float weapon_stats;
        if(cvar("hud_panel_weapons_accuracy") && acc_levels)
        {
                show_accuracy = true;
-               // hits
-               weapon_stats = getstati(STAT_DAMAGE_HITS);
-               weapon_number = weapon_stats & 63;
-               weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
-               // fired
-               weapon_stats = getstati(STAT_DAMAGE_FIRED);
-               weapon_number = weapon_stats & 63;
-               weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
                if (acc_col_x[0] == -1)
                        for (i = 0; i < acc_levels; ++i)
                                acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i))));
                // draw the weapon accuracy
                if(show_accuracy)
                {
-                       float weapon_hit, weapon_damage;
-                       weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
-                       if(weapon_damage)
+                       weapon_stats = weapon_accuracy[self.weapon-WEP_FIRST];
+                       if(weapon_stats >= 0)
                        {
-                               weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
-                               weapon_stats = floor(100 * weapon_hit / weapon_damage);
                                // find the max level lower than weapon_stats
                                float j;
                                j = acc_levels-1;
@@@ -1875,7 -1864,7 +1863,7 @@@ void DrawAmmoItem(vector myPos, vector 
        if(autocvar__hud_configure)
        {
                currently_selected = (itemcode == 2); //rockets always selected
 -              a = 100;
 +              a = 31 + mod(itemcode*93, 128);
        }
        else
                a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode?
  
  void HUD_Ammo(void)
  {
 -      if(!autocvar_hud_panel_ammo && !autocvar__hud_configure)
 -              return;
 +      if(!autocvar__hud_configure)
 +      {
 +              if(!autocvar_hud_panel_ammo) return;
 +              if(spectatee_status == -1) return;
 +      }
  
        active_panel = HUD_PANEL_AMMO;
        HUD_Panel_UpdateCvars(ammo);
        drawfont = hud_font;
  }
  
 -void DrawNumIcon(float iconalign, vector myPos, vector mySize, float x, string icon, float left, vector color, float alpha)
 +void DrawNumIcon(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float alpha)
  {
 -      vector newPos;
 -      float newSize_x, newSize_y;
 +      vector newPos, newSize;
 +      vector picpos, numpos;
 +
 +      if (vertical)
 +      {
 +              if(mySize_y/mySize_x > 2)
 +              {
 +                      newSize_y = 2 * mySize_x;
 +                      newSize_x = mySize_x;
 +
 +                      newPos_y = myPos_y + (mySize_y - newSize_y) / 2;
 +                      newPos_x = myPos_x;
 +              }
 +              else
 +              {
 +                      newSize_x = 1/2 * mySize_y;
 +                      newSize_y = mySize_y;
 +
 +                      newPos_x = myPos_x + (mySize_x - newSize_x) / 2;
 +                      newPos_y = myPos_y;
 +              }
 +
 +              if(icon_right_align)
 +              {
 +                      numpos = newPos;
 +                      picpos = newPos + eY * newSize_x;
 +              }
 +              else
 +              {
 +                      picpos = newPos;
 +                      numpos = newPos + eY * newSize_x;
 +              }
 +
 +              newSize_y /= 2;
 +              drawpic_aspect_skin(picpos, icon, newSize, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
 +              // make number smaller than icon, it looks better
 +              // reduce only y to draw numbers with different number of digits with the same y size
 +              numpos_y += newSize_y * ((1 - 0.7) / 2);
 +              newSize_y *= 0.7;
 +              drawstring_aspect(numpos, ftos(x), newSize, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
 +              return;
 +      }
 +
        if(mySize_x/mySize_y > 3)
        {
                newSize_x = 3 * mySize_y;
                newPos_x = myPos_x;
        }
  
 -      vector picpos, numpos;
 -      if(left)
 +      if(icon_right_align) // right align
        {
 -              if(iconalign == 1 || iconalign == 3) // right align
 -              {
 -                      numpos = newPos;
 -                      picpos = newPos + eX * 2 * newSize_y;
 -              }
 -              else // left align
 -              {
 -                      numpos = newPos + eX * newSize_y;
 -                      picpos = newPos;
 -              }
 +              numpos = newPos;
 +              picpos = newPos + eX * 2 * newSize_y;
        }
 -      else
 +      else // left align
        {
 -              if(iconalign == 0 || iconalign == 3) // left align
 -              {
 -                      numpos = newPos + eX * newSize_y;
 -                      picpos = newPos;
 -              } 
 -              else // right align
 -              {
 -                      numpos = newPos;
 -                      picpos = newPos + eX * 2 * newSize_y;
 -              }
 +              numpos = newPos + eX * newSize_y;
 +              picpos = newPos;
        }
  
 -      drawfont = hud_bigfont;
 -      drawstring_aspect(numpos, ftos(x), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
 -      drawfont = hud_font;
 +      drawstring_aspect(numpos, ftos(x), '2 1 0' * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
        drawpic_aspect_skin(picpos, icon, '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
  }
  
 -void DrawNumIcon_expanding(float iconalign, vector myPos, vector mySize, float x, string icon, float left, vector color, float fadelerp)
 +void DrawNumIcon_expanding(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float fadelerp)
  {
        float sz;
        sz = expandingbox_sizefactor_from_fadelerp(fadelerp);
  
 -      DrawNumIcon(iconalign, myPos + expandingbox_resize_centered_box_offset(sz, mySize, 1), mySize * sz, x, icon, left, color, (1 - fadelerp));
 +      DrawNumIcon(myPos + expandingbox_resize_centered_box_offset(sz, mySize, 1), mySize * sz, x, icon, vertical, icon_right_align, color, (1 - fadelerp));
  }
  
  // Powerups (#2)
  //
  void HUD_Powerups(void) {
 -      if(!autocvar_hud_panel_powerups && !autocvar__hud_configure)
 -              return;
 -
        if(!autocvar__hud_configure)
        {
 -              if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE))
 -                      return;
 -
 -              if (getstati(STAT_HEALTH) <= 0)
 -                      return;
 +              if(!autocvar_hud_panel_powerups) return;
 +              if(spectatee_status == -1) return;
 +              if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE)) return;
 +              if (getstati(STAT_HEALTH) <= 0) return;
        }
  
        active_panel = HUD_PANEL_POWERUPS;
        string leftname, rightname;
        float leftcnt, rightcnt;
        float leftexact, rightexact;
 -      float flip = cvar("hud_panel_powerups_flip");
 -      if (flip) {
 +      if (cvar("hud_panel_powerups_flip")) {
                leftname = "strength";
                leftcnt = ceil(strength_time);
                leftexact = strength_time;
        float baralign = cvar("hud_panel_powerups_baralign");
        float iconalign = cvar("hud_panel_powerups_iconalign");
        float progressbar = cvar("hud_panel_powerups_progressbar");
 -      if (mySize_x/mySize_y > 4)
 +      float panel_ar = mySize_x/mySize_y;
 +      float is_vertical = (panel_ar < 1);
 +      if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
        {
                if(leftcnt)
                {
 -                      if(baralign == 1 || baralign == 3) { // right align
 -                              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;
 -                      } else { // left align
 -                              barpos = pos;
 -                              barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
 -                      }
 -
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(leftname);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos, eX * 0.5 * mySize_x + eY * mySize_y, min(1, leftcnt/30), is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
                        }
                        if(leftcnt > 1)
 -                              DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
 +                              DrawNumIcon(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
                        if(leftcnt <= 5)
 -                              DrawNumIcon_expanding(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
 +                              DrawNumIcon_expanding(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                }
  
                if(rightcnt)
                {
 -                      if(baralign == 0 || baralign == 3) { // left align
 -                              barpos = pos + eX * 0.5 * mySize_x;
 -                              barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y;
 -                      } else { // right align
 -                              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;
 -                      }
 -
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(rightname);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, min(1, rightcnt/30), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
                        }
                        if(rightcnt > 1)
 -                              DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
 +                              DrawNumIcon(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
                        if(rightcnt <= 5)
 -                              DrawNumIcon_expanding(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
 +                              DrawNumIcon_expanding(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                }
        }
 -      else if (mySize_x/mySize_y > 1.5)
 +      else
        {
                if(leftcnt)
                {
 -                      if(baralign == 1 || baralign == 3) { // right align
 -                              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;
 -                      } else { // left align
 -                              barpos = pos;
 -                              barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y;
 -                      }
 -
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(leftname);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.5 * mySize_y, min(1, leftcnt/30), is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
                        }
                        if(leftcnt > 1)
 -                              DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
 +                              DrawNumIcon(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
                        if(leftcnt <= 5)
 -                              DrawNumIcon_expanding(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
 +                              DrawNumIcon_expanding(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                }
  
                if(rightcnt)
                {
 -                      if(baralign == 0 || baralign == 3) { // left align
 -                              barpos = pos + eY * 0.5 * mySize_y;
 -                              barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
 -                      } else { // right align
 -                              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;
 -                      }
 -
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(rightname);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, min(1, rightcnt/30), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
                        }
                        if(rightcnt > 1)
 -                              DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
 +                              DrawNumIcon(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
                        if(rightcnt <= 5)
 -                              DrawNumIcon_expanding(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
 -              }
 -      }
 -      else
 -      {
 -              if(leftcnt)
 -              {
 -                      if(baralign == 1 || baralign == 3) { // down align
 -                              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);
 -                      } else { // up align
 -                              barpos = pos;
 -                              barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
 -                      }
 -
 -                      if(iconalign == 1 || iconalign == 3) { // down align
 -                              picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x);
 -                              numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x;
 -                      } else { // up align
 -                              picpos = pos + eX * 0.05 * mySize_x;
 -                              numpos = pos + eY * 0.4 * mySize_x;
 -                      }
 -
 -                      if(progressbar)
 -                      {
 -                              HUD_Panel_GetProgressBarColorForString(leftname);
 -                              HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 -                      }
 -                      if(leftcnt <= 5)
 -                              drawpic_aspect_skin_expanding(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (leftcnt - leftexact) / 0.5, 1));
 -                      if(leftcnt > 1)
 -                              drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                      drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -              }
 -
 -              if(rightcnt)
 -              {
 -                      if(baralign == 0 || baralign == 3) { // up align
 -                              barpos = pos + eX * 0.5 * mySize_x;
 -                              barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30);
 -                      } else { // down align
 -                              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);
 -                      }
 -
 -                      if(iconalign == 0 || iconalign == 3) { // up align
 -                              picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
 -                              numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
 -                      } else { // down align
 -                              picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x) + eX * 0.5 * mySize_x;
 -                              numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x;
 -                      }
 -
 -                      if(progressbar)
 -                      {
 -                              HUD_Panel_GetProgressBarColorForString(rightname);
 -                              HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
 -                      }
 -                      if(rightcnt <= 5)
 -                              drawpic_aspect_skin_expanding(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (rightcnt - rightexact) / 0.5, 1));
 -                      if(rightcnt > 1)
 -                              drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                      drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              DrawNumIcon_expanding(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                }
        }
        drawfont = hud_font;
  //
  void HUD_HealthArmor(void)
  {
 -      if(!autocvar_hud_panel_healtharmor && !autocvar__hud_configure)
 -              return;
 +      if(!autocvar__hud_configure)
 +      {
 +              if(!autocvar_hud_panel_healtharmor) return;
 +              if(spectatee_status == -1) return;
 +      }
  
        active_panel = HUD_PANEL_HEALTHARMOR;
        HUD_Panel_UpdateCvars(healtharmor);
                return;
  
        vector barpos, barsize;
 -      vector picpos;
 -      vector numpos;
 +      vector picpos, numpos;
  
        drawfont = hud_bigfont;
        float baralign = cvar("hud_panel_healtharmor_baralign");
                float x;
                x = floor(v_x + 1);
  
 -              if(baralign == 1 || baralign == 3) { // right align
 -                      barpos = pos + eX * mySize_x - eX * mySize_x * min(1, x/400);
 -                      barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y;
 -              } else { // left align
 -                      barpos = pos;
 -                      barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y;
 -              }
 -
                string biggercount;
                if(v_z) // NOT fully armored
                {
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColor(health);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos, mySize, min(1, x/400), 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(armor)
                                drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "armor", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL);
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColor(armor);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              HUD_Panel_DrawProgressBar(pos, mySize, min(1, x/400), 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(health)
                                drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "health", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                }
 -              DrawNumIcon(iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, 2 * 200), 1);
 +              DrawNumIcon(pos, mySize, x, biggercount, 0, iconalign, HUD_Get_Num_Color(x, 2 * 200), 1);
  
 -              // fuel
                if(fuel)
                {
 -                      if(baralign == 0 || baralign == 3) { // left align
 -                              barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
 -                              barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
 -                      } else {
 -                              barpos = pos;
 -                              barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
 -                      }
                        HUD_Panel_GetProgressBarColor(fuel);
 -                      HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
 +                      HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.2 * mySize_y, min(1, fuel/100), 0, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                }
        }
        else
                float leftcnt, rightcnt;
                float leftactive, rightactive;
                float leftalpha, rightalpha;
 -              float flip = cvar("hud_panel_healtharmor_flip");
 -              if (flip) { // old style layout with armor left/top of health
 +              if (cvar("hud_panel_healtharmor_flip")) { // layout with armor left/top of health
                        leftname = "armor";
                        leftcnt = armor;
                        if(leftcnt)
                        rightalpha = min((armor+10)/55, 1);
                }
  
 -              if (mySize_x/mySize_y > 4)
 +              float panel_ar = mySize_x/mySize_y;
 +              float is_vertical = (panel_ar < 1);
 +              if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
                {
                        if(leftactive)
                        {
 -                              if(baralign == 1 || baralign == 3) { // right align
 -                                      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;
 -                              } else { // left align
 -                                      barpos = pos;
 -                                      barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
 -                              }
 -
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(leftname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      HUD_Panel_DrawProgressBar(pos, eX * 0.5 * mySize_x + eY * mySize_y, min(1, leftcnt/200), is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
 -                              DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1);
 +                              DrawNumIcon(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
                        }
  
                        if(rightactive)
                        {
 -                              if(baralign == 0 || baralign == 3) { // left align
 -                                      barpos = pos + eX * 0.5 * mySize_x;
 -                                      barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y;
 -                              } else { // right align
 -                                      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;
 -                              }
 -
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(rightname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, min(1, rightcnt/200), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
 -                              DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1);
 +                              DrawNumIcon(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
                        }
  
                        if(fuel)
                        {
 -                              if(baralign == 0 || baralign == 3) { // left align
 -                                      barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
 -                                      barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
 -                              } else {
 -                                      barpos = pos;
 -                                      barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
 -                              }
                                HUD_Panel_GetProgressBarColor(fuel);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
 -                      }
 -              }
 -              else if (mySize_x/mySize_y > 1.5)
 -              {
 -                      if(leftactive)
 -                      {
 -                              if(baralign == 1 || baralign == 3) { // right align
 -                                      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;
 -                              } else { // left align
 -                                      barpos = pos;
 -                                      barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
 -                              }
 -
 -                              if(progressbar)
 -                              {
 -                                      HUD_Panel_GetProgressBarColorForString(leftname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              }
 -                              DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1);
 -                      }
 -
 -                      if(rightactive)
 -                      {
 -                              if(baralign == 0 || baralign == 3) { // left align
 -                                      barpos = pos + eY * 0.5 * mySize_y;
 -                                      barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
 -                              } else { // right align
 -                                      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;
 -                              }
 -
 -                              if(progressbar)
 -                              {
 -                                      HUD_Panel_GetProgressBarColorForString(rightname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              }
 -                              DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1);
 -                      }
 -
 -                      if(fuel)
 -                      {
 -                              if(baralign == 0 || baralign == 3) { // left align
 -                                      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;
 -                              }
 -                              HUD_Panel_GetProgressBarColor(fuel);
 -                              HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
 +                              if (is_vertical) //if vertical always halve x to not cover too much numbers with 3 digits
 +                                      mySize_x *= 0.2 * 0.5 / 2;
 +                              else
 +                                      mySize_y *= 0.2;
 +                              HUD_Panel_DrawProgressBar(pos, mySize, min(1, fuel/100), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
                else
                {
                        if(leftactive)
                        {
 -                              if(baralign == 1 || baralign == 3) { // down align
 -                                      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);
 -                              } else { // up align
 -                                      barpos = pos;
 -                                      barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200);
 -                              }
 -
 -                              if(iconalign == 1 || iconalign == 3) { // down align
 -                                      picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x);
 -                                      numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x;
 -                              } else { // up align
 -                                      picpos = pos + eX * 0.05 * mySize_x;
 -                                      numpos = pos + eY * 0.4 * mySize_x;
 -                              }
 -
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(leftname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.5 * mySize_y, min(1, leftcnt/200), is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
 -                              drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(leftcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              DrawNumIcon(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
                        }
  
                        if(rightactive)
                        {
 -                              if(baralign == 0 || baralign == 3) { // up align
 -                                      barpos = pos + eX * 0.5 * mySize_x;
 -                                      barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200);
 -                              } else { // down align
 -                                      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);
 -                              }
 -
 -                              if(iconalign == 0 || iconalign == 3) { // up align
 -                                      picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
 -                                      numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
 -                              } else { // down align
 -                                      picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x) + eX * 0.5 * mySize_x;
 -                                      numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x;
 -                              }
 -
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(rightname);
 -                                      HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, min(1, rightcnt/200), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
 -                              drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(rightcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              DrawNumIcon(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
                        }
  
                        if(fuel)
                        {
 -                              if(baralign == 0 || baralign == 3) { // left align
 -                                      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);
 -                              }
                                HUD_Panel_GetProgressBarColor(fuel);
 -                              HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
 +                              if (is_vertical) //if vertical always halve x to not cover numbers with 3 digits
 +                                      mySize_x *= 0.2 / 2;
 +                              else
 +                                      mySize_y *= 0.2 * 0.5;
 +                              HUD_Panel_DrawProgressBar(pos, mySize, min(1, fuel/100), is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
        }
@@@ -3262,7 -3443,8 +3250,7 @@@ void HUD_Radar(void
                mySize -= '2 2 0' * panel_bg_padding;
        }
  
 -      local float color1, color2; // color already declared as a global in hud.qc
 -      local vector rgb;
 +      local float color2;
        local entity tm;
        float scale2d, normalsize, bigsize;
        float f;
                  f * (mi_min + mi_max) * 0.5
                + (1 - f) * view_origin);
  
 -      color1 = GetPlayerColor(player_localentnum-1);
 -      rgb = GetTeamRGB(color1);
 -
        drawsetcliparea(
                pos_x,
                pos_y,
  
  // Score (#7)
  //
 +void HUD_UpdatePlayerTeams();
  void HUD_Score(void)
  {
 -      if(!autocvar_hud_panel_score && !autocvar__hud_configure)
 +      if(!autocvar__hud_configure && !autocvar_hud_panel_score)
                return;
  
        active_panel = HUD_PANEL_SCORE;
                mySize -= '2 2 0' * panel_bg_padding;
        }
  
 -      float score, distribution, leader;
 +      float score, distribution;
        string sign;
        vector distribution_color;
        entity tm, pl, me;
                drawstring_aspect(pos, timer, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                drawfont = hud_font;
        } else if (!teamplay) { // non-teamgames
 +              if ((spectatee_status == -1 && !autocvar__hud_configure) || cvar("hud_panel_score_rankings"))
 +              {
 +#define SCOREPANEL_MAX_ENTRIES 6
 +#define SCOREPANEL_ASPECTRATIO 2
 +                      float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
 +                      float height = mySize_y/entries;
 +                      vector fontsize = '0.9 0.9 0' * height;
 +                      pos_y += height * (1 - 0.9) / 2;
 +
 +                      vector rgb;
 +                      rgb = '1 1 1';
 +
 +                      float name_size = mySize_x*0.75;
 +                      float i, me_printed;
 +                      string s;
 +                      if (autocvar__hud_configure)
 +                      {
 +                              score = 10 + SCOREPANEL_MAX_ENTRIES * 3;
 +                              for (i=0; i<entries; ++i)
 +                              {
 +                                      //simulate my score is lower than all displayed players,
 +                                      //so that I don't appear at all showing pure rankings.
 +                                      //This is to better show the difference between the 2 ranking views
 +                                      if (i == entries-1 && cvar("hud_panel_score_rankings") == 1)
 +                                      {
 +                                              rgb = '1 1 0';
 +                                              drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, 0.3 * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                              s = GetPlayerName(pl.sv_entnum);
 +                                              score = 7;
 +                                      }
 +                                      else
 +                                      {
 +                                              s = strcat("Player", ftos(i+1));
 +                                              score -= 3;
 +                                      }
 +
 +                                      s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
 +                                      drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      drawstring(pos + eX * mySize_x*0.79, ftos(score), fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      pos_y += height;
 +                              }
 +                              return;
 +                      }
 +
 +                      if (!scoreboard_fade_alpha) // the scoreboard too calls HUD_UpdatePlayerTeams
 +                              HUD_UpdatePlayerTeams();
 +
 +                      for (pl = players.sort_next, i=0; pl && i<entries; pl = pl.sort_next, ++i)
 +                      {
 +                              if (pl.team == COLOR_SPECTATOR)
 +                                      continue;
 +
 +                              if (i == entries-1 && !me_printed && pl != me)
 +                              if (cvar("hud_panel_score_rankings") == 1 && spectatee_status != -1)
 +                              {
 +                                      for (pl = me.sort_next; pl; pl = pl.sort_next)
 +                                              if (pl.team != COLOR_SPECTATOR)
 +                                                      break;
 +
 +                                      if (pl)
 +                                              rgb = '1 1 0'; //not last but not among the leading players: yellow
 +                                      else
 +                                              rgb = '1 0 0'; //last: red
 +                                      pl = me;
 +                              }
 +
 +                              if (pl == me)
 +                              {
 +                                      if (i == 0)
 +                                              rgb = '0 1 0'; //first: green
 +                                      me_printed = 1;
 +                                      drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, 0.3 * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              }
 +                              s = textShortenToWidth(GetPlayerName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
 +                              drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring(pos + eX * mySize_x*0.79, ftos(pl.(scores[ps_primary])), fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              pos_y += height;
 +                      }
 +                      return;
 +              }
                // me vector := [team/connected frags id]
                pl = players.sort_next;
                if(pl == me)
                if(autocvar__hud_configure)
                        score = 123;
  
 -              if(distribution >= 5) {
 +              if(distribution >= 5)
                        distribution_color = eY;
 -                      leader = 1;
 -              } else if(distribution >= 0) {
 +              else if(distribution >= 0)
                        distribution_color = '1 1 1';
 -                      leader = 1;
 -              } else if(distribution >= -5)
 +              else if(distribution >= -5)
                        distribution_color = '1 1 0';
                else
                        distribution_color = eX;
  
 -              drawstring_aspect(pos + eX * 0.75 * mySize_x, ftos(distribution), eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
 -              if (leader)
 +              string distribution_str;
 +              distribution_str = ftos(distribution);
 +              if (distribution >= 0)
 +              {
 +                      if (distribution > 0)
 +                              distribution_str = strcat("+", distribution_str);
                        HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +              }
                drawfont = hud_bigfont;
                drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
                drawfont = hud_font;
 +              drawstring_aspect(pos + eX * 0.75 * mySize_x, distribution_str, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
        } else { // teamgames
                float max_fragcount;
                max_fragcount = -99;
  
 -              float teamnum;
 +              float scores_count, row, column, rows, columns;
 +              vector offset;
 +              vector score_pos, score_size; //for scores other than myteam
 +              if (spectatee_status == -1)
 +              {
 +                      if (autocvar__hud_configure)
 +                              scores_count = 4;
 +                      else for(tm = teams.sort_next; tm; tm = tm.sort_next) {
 +                              if(tm.team == COLOR_SPECTATOR)
 +                                      continue;
 +                              ++scores_count;
 +                      }
 +                      rows = mySize_y/mySize_x;
 +                      rows = bound(1, floor((sqrt(4 * (3/1) * rows * scores_count + rows * rows) + rows + 0.5) / 2), scores_count);
 +                      //                               ^^^ ammo item aspect goes here
 +
 +                      columns = ceil(scores_count/rows);
 +
 +                      score_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
 +
 +                      float newSize;
 +                      if(score_size_x/score_size_y > 3)
 +                      {
 +                              newSize = 3 * score_size_y;
 +                              offset_x = score_size_x - newSize;
 +                              pos_x += offset_x/2;
 +                              score_size_x = newSize;
 +                      }
 +                      else
 +                      {
 +                              newSize = 1/3 * score_size_x;
 +                              offset_y = score_size_y - newSize;
 +                              pos_y += offset_y/2;
 +                              score_size_y = newSize;
 +                      }
 +              }
 +              else
 +                      score_size = eX * mySize_x*(1/4) + eY * mySize_y*(1/3);
                for(tm = teams.sort_next; tm; tm = tm.sort_next) {
 -                      if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !autocvar__hud_configure)) // no players? don't display
 +                      if(tm.team == COLOR_SPECTATOR)
                                continue;
                        score = tm.(teamscores[ts_primary]);
                        if(autocvar__hud_configure)
                                score = 123;
 -                      leader = 0;
                        
                        if (score > max_fragcount)
                                max_fragcount = score;
  
 -                      if(tm.team == myteam) {
 +                      if (spectatee_status == -1)
 +                      {
 +                              score_pos = pos + eX * column * (score_size_x + offset_x) + eY * row * (score_size_y + offset_y);
 +                              if (max_fragcount == score)
 +                                      HUD_Panel_DrawHighlight(score_pos, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawfont = hud_bigfont;
 +                              drawstring_aspect(score_pos, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawfont = hud_font;
 +                              ++row;
 +                              if(row >= rows)
 +                              {
 +                                      row = 0;
 +                                      ++column;
 +                              }
 +                      }
 +                      else if(tm.team == myteam) {
                                if (max_fragcount == score)
 -                                      leader = 1;
 -                              if (leader)
                                        HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                                drawfont = hud_bigfont;
                                drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                                drawfont = hud_font;
                        } else {
                                if (max_fragcount == score)
 -                                      leader = 1;
 -                              if (leader)
 -                                      HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize_x + eY * (1/3) * teamnum * mySize_y, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * teamnum * mySize_y, ftos(score), eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              teamnum += 1;
 +                                      HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              ++rows;
                        }
                }
        }
  // Race timer (#8)
  //
  void HUD_RaceTimer (void) {
 -      if(!autocvar_hud_panel_racetimer && !(gametype == GAME_RACE || gametype == GAME_CTS) && !autocvar__hud_configure)
 -              return;
 +      if(!autocvar__hud_configure)
 +      {
 +              if(!autocvar_hud_panel_racetimer) return;
 +              if(!(gametype == GAME_RACE || gametype == GAME_CTS)) return;
 +              if(spectatee_status == -1) return;
 +      }
  
        active_panel = HUD_PANEL_RACETIMER;
        HUD_Panel_UpdateCvars(racetimer);
@@@ -4279,11 -4328,18 +4267,11 @@@ void HUD_Mod_NexBall(vector pos, vecto
                //Draw the filling
                vector barsize;
                float vertical;
 +              HUD_Panel_GetProgressBarColor(nexball);
                if(mySize_x > mySize_y)
 -              {
 -                      barsize = eX * p * mySize_x + eY * mySize_y;
 -                      vertical = 0;
 -              }
 +                      HUD_Panel_DrawProgressBar(pos, mySize, p, 0, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                else
 -              {
 -                      barsize = eX * mySize_x + eY * p * mySize_y;
 -                      vertical = 1;
 -              }
 -              HUD_Panel_GetProgressBarColor(nexball);
 -              HUD_Panel_DrawProgressBar(pos, vertical, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                      HUD_Panel_DrawProgressBar(pos, mySize, p, 1, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
  
        if (stat_items & IT_KEY1)
@@@ -4536,15 -4592,14 +4524,15 @@@ void HUD_DrawPressedKeys(void
        vector keysize;
        keysize = eX * mySize_x * (1/3) + eY * mySize_y * 0.5;
        float pressedkeys;
 -
        pressedkeys = getstatf(STAT_PRESSED_KEYS);
 +
        drawpic_aspect_skin(pos, ((pressedkeys & KEY_CROUCH) ? "key_crouch_inv.tga" : "key_crouch.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -      drawpic_aspect_skin(pos + eX * mySize_x * (1/3), ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -      drawpic_aspect_skin(pos + eX * mySize_x * (2/3), ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -      drawpic_aspect_skin(pos + eY * 0.5 * mySize_y, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -      drawpic_aspect_skin(pos + eY * 0.5 * mySize_y + eX * mySize_x * (1/3), ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -      drawpic_aspect_skin(pos + eY * 0.5 * mySize_y + eX * mySize_x * (2/3), ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      drawpic_aspect_skin(pos + eX * keysize_x, ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      drawpic_aspect_skin(pos + eX * keysize_x * 2, ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      pos_y += keysize_y;
 +      drawpic_aspect_skin(pos, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      drawpic_aspect_skin(pos + eX * keysize_x, ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      drawpic_aspect_skin(pos + eX * keysize_x * 2, ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  }
  
  // Handle chat as a panel (#12)
@@@ -4926,7 -4981,9 +4914,7 @@@ float acc_avg
  void HUD_ShowAcceleration(void)
  {
        float acceleration, sz, scale, alpha, f;
 -      vector pos, top, rgb;
 -      top_x = vid_conwidth/2;
 -      top_y = 0;
 +      vector pos, mySize, rgb;
  
        f = time - acc_prevtime;
        if(cvar("cl_showacceleration_z"))
        if (acceleration == 0)
                return;
  
 -      pos = top - sz/2 * eY + (cvar("cl_showacceleration_position") * vid_conheight) * eY;
 -
        sz = cvar("cl_showacceleration_size");
        scale = cvar("cl_showacceleration_scale");
        alpha = cvar("cl_showacceleration_alpha");
                        rgb = '.5 1 .5' - '.5 0 .5' * bound(0, +acceleration * 0.2, 1);
        }
  
 +      mySize_x = vid_conwidth/2;
 +      mySize_y = sz;
 +      pos_y = cvar("cl_showacceleration_position") * vid_conheight - sz/2;
        if (acceleration > 0)
 -              HUD_Panel_DrawProgressBar(pos, 0, acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
 +      {
 +              pos_x = mySize_x;
 +              HUD_Panel_DrawProgressBar(pos, mySize, min(acceleration * scale, 1), 0, 0, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
 +      }
        else
 -              HUD_Panel_DrawProgressBar(pos + acceleration * scale * '40 0 0', 0, -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
 +      {
 +              //pos_x = 0;
 +              HUD_Panel_DrawProgressBar(pos, mySize, min(-acceleration * scale, 1), 0, 1, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
 +      }
  }
  
  void HUD_Reset (void)
@@@ -5029,6 -5079,8 +5017,6 @@@ void HUD_Main (void
        else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
                hud_fade_alpha = 1;
  
 -      hud_fontsize = HUD_GetFontsize("hud_fontsize");
 -
        if(!autocvar__hud_configure && !hud_fade_alpha)
                return;
  
        }
  
        // HUD configure visible grid
 -      if(autocvar__hud_configure && autocvar_hud_configure_grid && autocvar_hud_configure_grid_alpha)
 +      float hud_configure_grid_alpha;
 +      if(autocvar__hud_configure && cvar("hud_configure_grid") && (hud_configure_grid_alpha = cvar("hud_configure_grid_alpha")))
        {
 +              hud_configure_gridSize_x = bound(0.005, cvar("hud_configure_grid_xsize"), 0.2);
 +              hud_configure_gridSize_y = bound(0.005, cvar("hud_configure_grid_ysize"), 0.2);
 +              hud_configure_realGridSize_x = hud_configure_gridSize_x * vid_conwidth;
 +              hud_configure_realGridSize_y = hud_configure_gridSize_y * vid_conheight;
                // x-axis
 -              for(i = 0; i < 1/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2); ++i)
 -              {
 -                      drawfill(eX * i * vid_conwidth * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2), eX + eY * vid_conheight, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL);
 -              }
 +              for(i = 0; i < 1/hud_configure_gridSize_x; ++i)
 +                      drawfill(eX * i * hud_configure_realGridSize_x, eX + eY * vid_conheight, '0.5 0.5 0.5', hud_configure_grid_alpha, DRAWFLAG_NORMAL);
                // y-axis
 -              for(i = 0; i < 1/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2); ++i)
 -              {
 -                      drawfill(eY * i * vid_conheight * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2), eY + eX * vid_conwidth, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL);
 -              }
 +              for(i = 0; i < 1/hud_configure_gridSize_y; ++i)
 +                      drawfill(eY * i * hud_configure_realGridSize_y, eY + eX * vid_conwidth, '0.5 0.5 0.5', hud_configure_grid_alpha, DRAWFLAG_NORMAL);
        }
  
        // draw the dock
diff --combined qcsrc/client/hud.qh
index aaa26067c79b5b29d7108c228ee937ec72c459c9,bbb57d91ff01686dbe7aabcbeb448f0a745d9111..95fefe9f7c847b7c93f781c3cb4057354e126500
@@@ -15,8 -15,7 +15,7 @@@ float highlightedAction; // 0 = nothing
  
  const float BORDER_MULTIPLIER = 0.25;
  float scoreboard_bottom;
- float weapon_hits[WEP_MAXCOUNT];
- float weapon_fired[WEP_MAXCOUNT];
+ float weapon_accuracy[WEP_MAXCOUNT];
  
  #define MAX_ACCURACY_LEVELS 10
  float acc_lev[MAX_ACCURACY_LEVELS];
@@@ -40,8 -39,6 +39,8 @@@ float teamnagger
  
  float hud_configure_checkcollisions;
  float hud_configure_prev;
 +vector hud_configure_gridSize;
 +vector hud_configure_realGridSize;
  
  float hudShiftState;
  const float S_SHIFT = 1;
@@@ -93,10 -90,10 +92,10 @@@ var string panel_bg_padding_str
                progressbar_color = stov(cvar_string("hud_progressbar_" #item "_color"))
  #define HUD_Panel_GetProgressBarColorForString(item) \
  switch(item) {\
 -      case "strength": HUD_Panel_GetProgressBarColor(strength); break;\
 -      case "shield": HUD_Panel_GetProgressBarColor(shield); break;\
        case "health": HUD_Panel_GetProgressBarColor(health); break;\
        case "armor": HUD_Panel_GetProgressBarColor(armor); break;\
 +      case "strength": HUD_Panel_GetProgressBarColor(strength); break;\
 +      case "shield": HUD_Panel_GetProgressBarColor(shield); break;\
        case "fuel": HUD_Panel_GetProgressBarColor(fuel); break;\
        case "nexball": HUD_Panel_GetProgressBarColor(nexball); break;\
  } ENDS_WITH_CURLY_BRACE
@@@ -160,13 -157,12 +159,13 @@@ if(panel_bg_alpha_str == "") {
        panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha);\
  }\
  panel_bg_alpha = stof(panel_bg_alpha_str);\
 -if(autocvar__hud_configure && menu_enabled == 2 && highlightedPanel == active_panel) {\
 -      panel_bg_alpha = (1 - autocvar__menu_alpha) * max(autocvar_hud_configure_bg_minalpha, panel_bg_alpha) + autocvar__menu_alpha * panel_bg_alpha;\
 -} else if(autocvar__hud_configure) {\
 -      panel_bg_alpha = max(autocvar_hud_configure_bg_minalpha, panel_bg_alpha);\
 -} if(autocvar__hud_configure && !panel_enabled) {\
 -      panel_bg_alpha = 0.25;\
 +if(autocvar__hud_configure) {\
 +      if(!panel_enabled)\
 +              panel_bg_alpha = 0.25;\
 +      else if(menu_enabled == 2 && highlightedPanel == active_panel)\
 +              panel_bg_alpha = (1 - autocvar__menu_alpha) * max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha) + autocvar__menu_alpha * panel_bg_alpha;\
 +      else\
 +              panel_bg_alpha = max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha);\
  } if(!(menu_enabled == 2 && highlightedPanel == active_panel)) {\
        panel_bg_alpha *= hud_fade_alpha;\
  }
@@@ -207,15 -203,13 +206,15 @@@ if(panel_bg_padding_str == "") {
  panel_bg_padding = min(min(panel_size_x, panel_size_y)/2 - 5, panel_bg_padding);
  
  // Point to the macros above (stupid max macro length)
 -#define HUD_Panel_StringVars()\
 +#define HUD_Panel_GetStringVars()\
  HUD_Panel_GetBg()\
 -HUD_Panel_GetColorTeam()\
 -HUD_Panel_GetColor()\
 -HUD_Panel_GetBgAlpha()\
 +if (panel_bg != "0") {\
 +      HUD_Panel_GetColorTeam()\
 +      HUD_Panel_GetColor()\
 +      HUD_Panel_GetBgAlpha()\
 +      HUD_Panel_GetBorder()\
 +}\
  HUD_Panel_GetFgAlpha()\
 -HUD_Panel_GetBorder()\
  HUD_Panel_GetScaledVectors()\
  HUD_Panel_GetPadding()
  
@@@ -264,7 -258,7 +263,7 @@@ panel_bg_color_team_str = cvar_string("
  panel_bg_alpha_str = cvar_string("hud_panel_" #name "_bg_alpha"); \
  panel_bg_border_str = cvar_string("hud_panel_" #name "_bg_border"); \
  panel_bg_padding_str = cvar_string("hud_panel_" #name "_bg_padding"); \
 -HUD_Panel_StringVars()\
 +HUD_Panel_GetStringVars()\
  if(menu_enabled == 2 && active_panel == highlightedPanel) {\
        HUD_Panel_GetMenuSize()\
        HUD_Panel_GetMenuPos()\
index d76838fd21979ecec4763814f20759ff6fb2225f,5f4c64eee924ebdd8ace1bb7329c84199cd63ec5..1a99f87ddd2a0e87e042a9c2a3dcd5329d57c63a
@@@ -883,7 -883,7 +883,7 @@@ float HUD_WouldDrawScoreboard() 
                return 1;
        else if (intermission == 1)
                return 1;
 -      else if (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard"))
 +      else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard"))
                return 1;
        else if (scoreboard_showscores_force)
                return 1;
@@@ -941,15 -941,7 +941,7 @@@ vector HUD_DrawScoreboardAccuracyStats(
        if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX)
                g_minstagib = 1; // TODO: real detection for minstagib?
  
-       float weapon_hit, weapon_damage, weapon_stats, weapon_number;
-       // hits
-       weapon_stats = getstati(STAT_DAMAGE_HITS);
-       weapon_number = weapon_stats & 63;
-       weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
-       // fired
-       weapon_stats = getstati(STAT_DAMAGE_FIRED);
-       weapon_number = weapon_stats & 63;
-       weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
+       float weapon_stats, weapon_number;
  
        if (!acc_levels)
                rgb = '1 1 1';
                        continue;
                if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA) // skip port-o-launch, nex || minstanex and tuba
                        continue;
-               weapon_hit = weapon_hits[i-WEP_FIRST];
-               weapon_damage = weapon_fired[i-WEP_FIRST];
+               weapon_stats = weapon_accuracy[i-WEP_FIRST];
  
                float weapon_alpha;
-               if(weapon_damage)
-               {
-                       weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
+               if(weapon_stats >= 0)
                        weapon_alpha = scoreboard_alpha_fg;
-               }
                else
                        weapon_alpha = 0.2 * scoreboard_alpha_fg;
  
                // weapon icon
                drawpic_aspect_skin(pos, strcat("weapon", self.netname), '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
                // the accuracy
-               if(weapon_damage) {
+               if(weapon_stats >= 0) {
                        weapons_with_stats += 1;
                        average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy
  
                        string s;
-                       s = strcat(ftos(weapon_stats),"%");
+                       s = sprintf("%d%%", weapon_stats*100);
  
                        float padding;
                        padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value
  
-                       weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
-                       if(weapon_damage)
-                       {
-                               weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
-                               weapon_stats = floor(100 * weapon_hit / weapon_damage);
-                       }
                        if (acc_levels)
                        {
                                // find the max level lower than weapon_stats
@@@ -1298,183 -1279,3 +1279,3 @@@ void HUD_DrawScoreboard(
  
        scoreboard_bottom = pos_y + 2 * hud_fontsize_y;
  }
- void HUD_DrawAccuracyStats_Description_Hitscan(vector position)
- {
-       drawstring(position + '0 3 0' * hud_fontsize_y, "Shots fired:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 5 0' * hud_fontsize_y, "Shots hit:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 9 0' * hud_fontsize_y, "Shots missed:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- }
- void HUD_DrawAccuracyStats_Description_Splash(vector position)
- {
-       drawstring(position + '0 3 0' * hud_fontsize_y, "Maximum damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 5 0' * hud_fontsize_y, "Actual damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       drawstring(position + '0 9 0' * hud_fontsize_y, "Damage wasted:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- }
- void HUD_DrawAccuracyStats()
- {
-       float i, count_hitscan, count_splash, row;  // count is the number of 'colums'
-       float weapon_hit, weapon_damage, weapon_stats;
-       float left_border;  // position where the weapons start, the description is in the border
-       vector fill_colour, fill_size;
-       vector pos;
-       vector border_colour;
-       float col_margin = 20;  // pixels between the columns
-       float row_margin = 20;  // pixels between the rows
-       fill_size_x = 5 * hud_fontsize_x;  // width of the background
-       fill_size_y = 10 * hud_fontsize_y;  // height of the background
-       drawfont = hud_bigfont;
-       pos_x = 0;
-       pos_y = SCOREBOARD_OFFSET;
-       pos_z = 0;
-       drawstringcenter(pos, "Weapon Accuracy", 2 * hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       left_border = col_margin + 11 * hud_fontsize_x;
-       drawfont = hud_font;
-       if(warmup_stage)
-       {
-               pos_y += 40;
-               if(mod(time, 1) >= 0.4)
-                       drawstringcenter(pos, "Stats are not tracked during warmup stage", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-               return;
-       }
-       if(gametype == GAME_RACE || gametype == GAME_CTS)
-       {
-               pos_y += 40;
-               if(mod(time, 1) >= 0.4)
-                       drawstringcenter(pos, "Stats are not tracked in Race/CTS", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-               return;
-       }
-       float top_border_hitscan = SCOREBOARD_OFFSET + 55;  // position where the hitscan row starts: pixels down the screen
-       HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * top_border_hitscan);
-       float top_border_splash = SCOREBOARD_OFFSET + 175;  // position where the splash row starts: pixels down the screen
-       HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * top_border_splash);
-       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-       {
-               self = get_weaponinfo(i);
-               if not(self.weapons)
-                       continue;
-               weapon_hit = weapon_hits[i-WEP_FIRST];
-               weapon_damage = weapon_fired[i-WEP_FIRST];
-               border_colour = (i == activeweapon) ? '1 1 1' : '0 0 0';  // white or black border
-               if (weapon_damage) {
-                       if (self.spawnflags & WEP_TYPE_SPLASH) {
-                               weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
-                               fill_colour_x = 1 - 0.015 * weapon_stats;
-                               fill_colour_y = 1 - 0.015 * (100 - weapon_stats);
-                               // how the background colour is calculated
-                               // %    red             green   red_2                   green_2
-                               // 0    1               0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 10   0.85    0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 20   0.70    0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 30   0.55    0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 40   0.40    0.10    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 50   0.25    0.25    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 60   0.10    0.40    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 70   0               0.55    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 80   0               0.70    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 90   0               0.85    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 100  0               1               1 - % * 0.015   1 - (100 - %) * 0.015
-                               if ((left_border + count_splash * (fill_size_x + col_margin) + fill_size_x) >= vid_conwidth)
-                               {
-                                       count_splash = 0;
-                                       ++row;
-                                       HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * (top_border_splash + row * (fill_size_y + row_margin)));
-                               }
-                               pos_x = left_border + count_splash * (fill_size_x + col_margin);
-                               pos_y = top_border_splash + row * (fill_size_y + row_margin);
-                               // background
-                               drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-                               drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-                               // the weapon
-                               drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of shots fired or max damage
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of hits or actual damage
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the accuracy
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of shots missed or damage wasted
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               ++count_splash;
-                       } else if (self.spawnflags & WEP_TYPE_HITSCAN) {
-                               weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
-                               fill_colour_x = 1 - 0.015 * weapon_stats;
-                               fill_colour_y = 1 - 0.015 * (100 - weapon_stats);
-                               // how the background colour is calculated
-                               // %    red             green   red_2                   green_2
-                               // 0    1               0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 10   0.850   0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 20   0.70    0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 30   0.55    0               1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 40   0.40    0.10    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 50   0.25    0.25    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 60   0.10    0.40    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 70   0               0.55    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 80   0               0.70    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 90   0               0.85    1 - % * 0.015   1 - (100 - %) * 0.015
-                               // 100  0               1               1 - % * 0.015   1 - (100 - %) * 0.015
-                               if ((left_border + count_hitscan * (fill_size_x + col_margin) + fill_size_x + cvar("stats_right_margin")) >= vid_conwidth)
-                               {
-                                       count_hitscan = 0;
-                                       ++row;
-                                       HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * (top_border_hitscan + row * (fill_size_y + row_margin)));
-                               }
-                               pos_x = left_border + count_hitscan * (fill_size_x + col_margin);
-                               pos_y = top_border_hitscan + row * (fill_size_y + row_margin);
-                               // background
-                               drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-                               drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-                               // the weapon
-                               drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of shots fired or max damage
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of hits or actual damage
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the accuracy
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               // the amount of shots missed or damage wasted
-                               drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-                               ++count_hitscan;
-                       }
-               }
-       }
- }