]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote branch 'remotes/origin/terencehill/newpanelhud' into terencehill/newpanelhud
authorterencehill <piuntn@gmail.com>
Sat, 18 Dec 2010 01:00:58 +0000 (02:00 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 18 Dec 2010 01:00:58 +0000 (02:00 +0100)
1  2 
_hud_descriptions.cfg
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc

diff --combined _hud_descriptions.cfg
index 756f17fc0a61ac601019f3be6c6391beab8f1e5b,5234a3f2693f7a63535de4d73c9b569754d67f2b..7eb0de2f1525111a5f58959c816105dd4105577a
@@@ -50,6 -50,8 +50,8 @@@ seta hud_panel_weapons_complainbubble_c
  seta hud_panel_weapons_complainbubble_color_unavailable "" "color of the complainbubble when showing weapon unavailable message"
  seta hud_panel_weapons_ammo_color "" "color of status bar"
  seta hud_panel_weapons_ammo_alpha "" "alpha of status bar"
+ seta hud_panel_weapons_timeout "" "panel disappears if you don't switch weapon for this amount of seconds"
+ seta hud_panel_weapons_timeout_effect "" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
  
  seta hud_panel_ammo "" "enable/disable this panel"
  seta hud_panel_ammo_pos "" "position of this panel"
@@@ -196,7 -198,7 +198,7 @@@ seta hud_panel_chat_bg_alpha "" "if se
  seta hud_panel_chat_bg_border "" "if set to something else than \"\" = override default size of border around the background"
  seta hud_panel_chat_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
  
 -seta hud_panel_engineinfo "" "enable/disable this panel
 +seta hud_panel_engineinfo "" "enable/disable this panel"
  seta hud_panel_engineinfo_pos "" "position of this base of the panel"
  seta hud_panel_engineinfo_size "" "size of this panel"
  seta hud_panel_engineinfo_bg "" "if set to something else than \"\" = override default background"
@@@ -206,7 -208,7 +208,7 @@@ seta hud_panel_engineinfo_bg_alpha "" "
  seta hud_panel_engineinfo_bg_border "" "if set to something else than \"\" = override default size of border around the background"
  seta hud_panel_engineinfo_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
  
 -seta hud_panel_infomessages "" "enable/disable this panel
 +seta hud_panel_infomessages "" "enable/disable this panel"
  seta hud_panel_infomessages_pos "" "position of this base of the panel"
  seta hud_panel_infomessages_size "" "size of this panel"
  seta hud_panel_infomessages_bg "" "if set to something else than \"\" = override default background"
@@@ -217,7 -219,7 +219,7 @@@ seta hud_panel_infomessages_bg_border "
  seta hud_panel_infomessages_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
  seta hud_panel_infomessages_flip "" "1 = align the items to the right"
  
 -seta hud_panel_physics "" "enable/disable this panel
 +seta hud_panel_physics "" "enable/disable this panel, 1 = show only when spectating other players, 2 = show always"
  seta hud_panel_physics_pos "" "position of this base of the panel"
  seta hud_panel_physics_size "" "size of this panel"
  seta hud_panel_physics_bg "" "if set to something else than \"\" = override default background"
index 79647cc89a90524ece29a22fcfb09820af7b02f8,2824a3231e56e444a761048d66bc127d4983467f..64b6e33fa0bb91502aba5c7657bb48f4d8911a67
@@@ -60,6 -60,19 +60,6 @@@ float autocvar_cl_readpicture_force
  float autocvar_cl_reticle_item_nex;
  float autocvar_cl_reticle_item_normal;
  float autocvar_cl_reticle_stretch;
 -float autocvar_cl_showacceleration;
 -float autocvar_cl_showacceleration_alpha;
 -string autocvar_cl_showacceleration_color;
 -float autocvar_cl_showacceleration_color_custom;
 -float autocvar_cl_showacceleration_position;
 -float autocvar_cl_showacceleration_scale;
 -float autocvar_cl_showacceleration_size;
 -float autocvar_cl_showacceleration_z;
 -float autocvar_cl_showspeed;
 -float autocvar_cl_showspeed_position;
 -float autocvar_cl_showspeed_size;
 -float autocvar_cl_showspeed_unit;
 -float autocvar_cl_showspeed_z;
  float autocvar_cl_sound_maptime_warning;
  float autocvar_cl_stripcolorcodes;
  var float autocvar_cl_vehicle_spiderbot_cross_alpha = 0.6;
@@@ -181,6 -194,7 +181,7 @@@ float autocvar_hud_panel_healtharmor_te
  float autocvar_hud_panel_infomessages;
  float autocvar_hud_panel_infomessages_flip;
  float autocvar_hud_panel_modicons;
+ float autocvar_hud_panel_modicons_dom_layout;
  float autocvar_hud_panel_notify;
  float autocvar_hud_panel_notify_fadetime;
  float autocvar_hud_panel_notify_flip;
diff --combined qcsrc/client/hud.qc
index ff15da526407d4e98a05f7595691dd6144f41b4e,0551fd284881d141f1931a2c73b40f0d8a248391..1504a0388d65352f831466c06a847b99ccdb907e
@@@ -492,6 -492,8 +492,8 @@@ void HUD_Panel_ExportCfg(string cfgname
                                        HUD_Write_PanelCvar_q("_ammo_color");
                                        HUD_Write_PanelCvar_q("_ammo_alpha");
                                        HUD_Write_PanelCvar_q("_aspect");
+                                       HUD_Write_PanelCvar_q("_timeout");
+                                       HUD_Write_PanelCvar_q("_timeout_effect");
                                        break;
                                case HUD_PANEL_AMMO:
                                        HUD_Write_PanelCvar_q("_onlycurrent");
@@@ -567,18 -569,18 +569,18 @@@ void HUD_Panel_HlBorder(float myBorder
  #define HUD_Panel_DrawBg(alpha)\
  if(panel_bg != "0")\
        draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\
 -if(highlightedPanel_prev == hud_configure_active_panel && autocvar__hud_configure)\
 +if(highlightedPanel == hud_configure_active_panel && autocvar__hud_configure)\
  {\
        HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\
  } ENDS_WITH_CURLY_BRACE
  
  //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu
- void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float lenght_ratio, float vertical, float right_align, vector theColor, float theAlpha, float drawflag)
+ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, float vertical, float baralign, vector theColor, float theAlpha, float drawflag)
  {
-       if(lenght_ratio <= 0 || !theAlpha)
+       if(length_ratio <= 0 || !theAlpha)
                return;
-       if(lenght_ratio > 1)
-               lenght_ratio = 1;
+       if(length_ratio > 1)
+               length_ratio = 1;
  
        vector square;
        vector width, height;
                        pic = "gfx/hud/default/statusbar_vertical";
                }
  
-               if (right_align)
-                       theOrigin_y += (1 - lenght_ratio) * theSize_y;
-               theSize_y *= lenght_ratio;
+         if (baralign == 1) // bottom align
+                       theOrigin_y += (1 - length_ratio) * theSize_y;
+         else if (baralign == 2) // center align
+             theOrigin_y += 0.5 * (1 - length_ratio) * theSize_y;
+               theSize_y *= length_ratio;
  
                vector bH;
                width = eX * theSize_x;
                        pic = "gfx/hud/default/statusbar";
                }
  
-               if (right_align)
-                       theOrigin_x += (1 - lenght_ratio) * theSize_x;
-               theSize_x *= lenght_ratio;
+               if (baralign == 1) // right align
+                       theOrigin_x += (1 - length_ratio) * theSize_x;
+         else if (baralign == 2) // center align
+             theOrigin_x += 0.5 * (1 - length_ratio) * theSize_x;
+               theSize_x *= length_ratio;
  
                vector bW;
                width = eX * theSize_x;
@@@ -960,11 -966,15 +966,11 @@@ void HUD_Panel_SetPosSize(vector mySize
        cvar_set(strcat("hud_panel_", panel_name, "_pos"), s);
  }
  
 -float mouseClicked;
 -float prevMouseClicked; // previous state
 -float prevMouseClickedTime; // time during previous mouse click, to check for doubleclicks
 -vector prevMouseClickedPos; // pos during previous mouse click, to check for doubleclicks
 -
  float pressed_key_time;
 +vector highlightedPanel_initial_pos, highlightedPanel_initial_size;
  void HUD_Panel_Arrow_Action(float nPrimary)
  {
 -      if (highlightedPanel_prev == -1 || mouseClicked)
 +      if (highlightedPanel == -1)
                return;
  
        hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
                        step = (step / 64) * (1 + 2 * (time - pressed_key_time));
        }
  
 -      highlightedPanel = highlightedPanel_prev;
 -
        HUD_Panel_UpdatePosSizeForId(highlightedPanel);
  
 -      vector prev_pos, prev_size;
 -      prev_pos = panel_pos;
 -      prev_size = panel_size;
 +      highlightedPanel_initial_pos = panel_pos;
 +      highlightedPanel_initial_size = panel_size;
  
        if (hudShiftState & S_ALT) // resize
        {
  
        HUD_Panel_UpdatePosSizeForId(highlightedPanel);
  
 -      if (prev_pos != panel_pos || prev_size != panel_size)
 +      if (highlightedPanel_initial_pos != panel_pos || highlightedPanel_initial_size != panel_size)
        {
                // backup!
 -              panel_pos_backup = prev_pos;
 -              panel_size_backup = prev_size;
 +              panel_pos_backup = highlightedPanel_initial_pos;
 +              panel_size_backup = highlightedPanel_initial_size;
                highlightedPanel_backup = highlightedPanel;
        }
  }
  
 +float mouseClicked;
 +float prevMouseClicked; // previous state
 +float prevMouseClickedTime; // time during previous mouse click, to check for doubleclicks
 +vector prevMouseClickedPos; // pos during previous mouse click, to check for doubleclicks
 +
  void HUD_Panel_EnableMenu();
  float tab_panels[HUD_PANEL_NUM];
  float tab_panel, tab_backward;
@@@ -1124,8 -1132,8 +1130,8 @@@ float HUD_Panel_InputEvent(float bInput
                        {
                                //switch to selected panel
                                highlightedPanel = tab_panel;
 -                              highlightedPanel_prev = tab_panel;
 -                              HUD_Panel_FirstInDrawQ(highlightedPanel_prev);
 +                              highlightedAction = 0;
 +                              HUD_Panel_FirstInDrawQ(highlightedPanel);
                        }
                        tab_panel = -1;
                        reset_tab_panels();
                float old_tab_panel = tab_panel;
                if (tab_panel == -1) //first press of TAB
                {
 -                      if (highlightedPanel_prev != -1)
 -                              HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev)
 +                      if (highlightedPanel != -1)
 +                              HUD_Panel_UpdatePosSizeForId(highlightedPanel)
                        else
                                panel_pos = '0 0 0';
 -                      starting_panel = highlightedPanel_prev; //can be -1, it means no starting panel
 +                      starting_panel = highlightedPanel; //can be -1, it means no starting panel
                        tab_panel_pos = panel_pos; //to compute level
                }
                else
                if (bInputType == 1 || mouseClicked)
                        return true;
  
 -              if (highlightedPanel_prev != -1)
 +              if (highlightedPanel != -1)
                {
 -                      HUD_Panel_GetName(highlightedPanel_prev);
 +                      HUD_Panel_GetName(highlightedPanel);
                        cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled)));
                }
                else
                if (bInputType == 1 || mouseClicked)
                        return true;
  
 -              if (highlightedPanel_prev != -1)
 +              if (highlightedPanel != -1)
                {
 -                      HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev);
 +                      HUD_Panel_UpdatePosSizeForId(highlightedPanel);
                        panel_size_copied = panel_size;
 -                      highlightedPanel_copied = highlightedPanel_prev;
 +                      highlightedPanel_copied = highlightedPanel;
                }
        }
        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)
 +              if (highlightedPanel_copied == -1 || highlightedPanel == -1)
                        return true;
  
 -              HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev);
 +              HUD_Panel_UpdatePosSizeForId(highlightedPanel);
  
                // reduce size if it'd go beyond screen boundaries
                vector tmp_size = panel_size_copied;
                // backup first!
                panel_pos_backup = panel_pos;
                panel_size_backup = panel_size;
 -              highlightedPanel_backup = highlightedPanel_prev;
 +              highlightedPanel_backup = highlightedPanel;
  
                s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight));
 -              HUD_Panel_GetName(highlightedPanel_prev);
 +              HUD_Panel_GetName(highlightedPanel);
                cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
        }
        else if(nPrimary == 'z' && hudShiftState & S_CTRL) // undo last action
                else if (pressed_key_time == 0)
                        pressed_key_time = time;
  
 -              HUD_Panel_Arrow_Action(nPrimary); //move or resize panel
 +              if (!mouseClicked)
 +                      HUD_Panel_Arrow_Action(nPrimary); //move or resize panel
        }
        else if(nPrimary == K_ENTER || nPrimary == K_SPACE || nPrimary == K_KP_ENTER)
        {
                if (bInputType == 1)
                        return true;
 -              if (highlightedPanel_prev != -1)
 -              {
 -                      highlightedPanel = highlightedPanel_prev;
 +              if (highlightedPanel != -1)
                        HUD_Panel_EnableMenu();
 -              }
        }
        else if(hit_con_bind)
                return false;
        return true;
  }
  
 -float HUD_Panel_HighlightCheck()
 +float HUD_Panel_Check_Mouse_Pos()
  {
        float i, j, border;
  
@@@ -1478,9 -1488,11 +1484,9 @@@ void HUD_Panel_Highlight(
                        panel_click_resizeorigin = panel_pos;
                        return;
                }
 -              else
 -              {
 -                      highlightedPanel_prev = -1;
 -              }
        }
 +      highlightedPanel = -1;
 +      highlightedAction = 0;
  }
  
  void HUD_Panel_EnableMenu()
        HUD_Panel_GetName(highlightedPanel);
        localcmd("menu_showhudoptions ", panel_name, "\n");
  }
 -float highlightcheck;
 -vector prev_pos, prev_size;
 +float mouse_over_panel;
  void HUD_Panel_Mouse()
  {
        // TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled
        if(menu_enabled == 1 || (menu_enabled == 2 && !hud_fade_alpha))
                return;
  
 -      if(mouseClicked == 0 && menu_enabled != 2 && highlightedPanel >= 0) { // don't reset these variables in menu_enabled mode 2!
 -              highlightedPanel = -1;
 -              highlightedAction = 0;
 -      }
 -      if(highlightedPanel != -1)
 -              highlightedPanel_prev = highlightedPanel;
 -
        mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed;
  
        mousepos_x = bound(0, mousepos_x, vid_conwidth);
  
        if(mouseClicked)
        {
 -              if (tab_panel != -1)
 -              {
 -                      //stop ctrl-tab selection
 -                      tab_panel = -1;
 -                      reset_tab_panels();
 -              }
                if(prevMouseClicked == 0)
                {
 +                      if (tab_panel != -1)
 +                      {
 +                              //stop ctrl-tab selection
 +                              tab_panel = -1;
 +                              reset_tab_panels();
 +                      }
                        HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin
                                                                        // and calls HUD_Panel_UpdatePosSizeForId() for the highlighted panel
 -                      prev_pos = panel_pos;
 -                      prev_size = panel_size;
 +                      if (highlightedPanel != -1)
 +                      {
 +                              highlightedPanel_initial_pos = panel_pos;
 +                              highlightedPanel_initial_size = panel_size;
 +                      }
 +                      // doubleclick check
 +                      if (time - prevMouseClickedTime < 0.4 && highlightedPanel != -1 && prevMouseClickedPos == mousepos)
 +                      {
 +                              mouseClicked = 0; // to prevent spam, I guess.
 +                              HUD_Panel_EnableMenu();
 +                      }
 +                      else
 +                      {
 +                              prevMouseClickedTime = time;
 +                              prevMouseClickedPos = mousepos;
 +                      }
                }
                else
                        HUD_Panel_UpdatePosSizeForId(highlightedPanel);
  
 -              if (prev_pos != panel_pos || prev_size != panel_size)
 +              if (highlightedPanel != -1)
                {
 -                      hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
 -                      // backup!
 -                      panel_pos_backup = prev_pos;
 -                      panel_size_backup = prev_size;
 -                      highlightedPanel_backup = highlightedPanel;
 +                      drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .1, DRAWFLAG_NORMAL);
 +                      if (highlightedPanel_initial_pos != panel_pos || highlightedPanel_initial_size != panel_size)
 +                      {
 +                              hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
 +                              // backup!
 +                              panel_pos_backup = highlightedPanel_initial_pos;
 +                              panel_size_backup = highlightedPanel_initial_size;
 +                              highlightedPanel_backup = highlightedPanel;
 +                      }
 +                      else
 +                              // in case the clicked panel is inside another panel and we aren't
 +                              // moving it, avoid the immediate "fix" of its position/size
 +                              // (often unwanted and hateful) by disabling collisions check
 +                              hud_configure_checkcollisions = false;
                }
 -              else
 -                      // in case the clicked panel is inside another panel and we aren't
 -                      // moving it, avoid the immediate "fix" of its position/size
 -                      // (often unwanted and hateful) by disabling collisions check
 -                      hud_configure_checkcollisions = false;
  
                if(highlightedAction == 1)
                        HUD_Panel_SetPos(mousepos - panel_click_distance);
                        }
                        HUD_Panel_SetPosSize(mySize);
                }
 -
 -              // doubleclick check
 -              if(time - prevMouseClickedTime < 0.4 && prevMouseClicked == 0 && prevMouseClickedPos == mousepos && highlightedPanel >= 0)
 -              {
 -                      mouseClicked = 0; // to prevent spam, I guess.
 -                      HUD_Panel_EnableMenu();
 -                      return;
 -              }
 -              if(prevMouseClicked == 0)
 -              {
 -                      prevMouseClickedTime = time;
 -                      prevMouseClickedPos = mousepos;
 -              }
        }
        else
        {
 -              highlightcheck = HUD_Panel_HighlightCheck();
 +              mouse_over_panel = HUD_Panel_Check_Mouse_Pos();
 +              if (mouse_over_panel && tab_panel == -1)
 +                      drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .1, DRAWFLAG_NORMAL);
        }
 -      // draw cursor after performing move/resize to have the panel pos/size updated before highlightcheck
 -      vector cursorsize;
 -      cursorsize = '32 32 0';
 +      // draw cursor after performing move/resize to have the panel pos/size updated before mouse_over_panel
 +      const vector cursorsize = '32 32 0';
  
 -      if(highlightcheck == 0)
 +      if(!mouse_over_panel)
                drawpic(mousepos, strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 -      else if(highlightcheck == 1)
 +      else if(mouse_over_panel == 1)
                drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_move.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
 -      else if(highlightcheck == 2)
 +      else if(mouse_over_panel == 2)
                drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else
                drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize2.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
@@@ -1678,8 -1692,8 +1684,8 @@@ void HUD_Weapons(void
                if(!autocvar_hud_panel_weapons) return;
                if(spectatee_status == -1) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_WEAPONS;
+     hud_configure_active_panel = HUD_PANEL_WEAPONS;
  
        float timeout = autocvar_hud_panel_weapons_timeout;
        float timeout_effect_length, timein_effect_length;
@@@ -2088,8 -2102,8 +2094,8 @@@ void HUD_Ammo(void
                if(!autocvar_hud_panel_ammo) return;
                if(spectatee_status == -1) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_AMMO;
+     hud_configure_active_panel = HUD_PANEL_AMMO;
  
        HUD_Panel_UpdateCvars(ammo);
        vector pos, mySize;
@@@ -2272,12 -2286,12 +2278,12 @@@ void HUD_Powerups(void
        }
        else
        {
-               hud_configure_active_panel = HUD_PANEL_POWERUPS;
                strength_time = 15;
                shield_time = 27;
        }
  
+     hud_configure_active_panel = HUD_PANEL_POWERUPS;
        HUD_Panel_UpdateCvars(powerups);
        vector pos, mySize;
        pos = panel_pos;
@@@ -2419,13 -2433,13 +2425,13 @@@ void HUD_HealthArmor(void
        }
        else
        {
-               hud_configure_active_panel = HUD_PANEL_HEALTHARMOR;
                health = 150;
                armor = 75;
                fuel = 20;
        }
  
+     hud_configure_active_panel = HUD_PANEL_HEALTHARMOR;
        HUD_Panel_UpdateCvars(healtharmor);
        vector pos, mySize;
        pos = panel_pos;
@@@ -3108,8 -3122,8 +3114,8 @@@ void HUD_Notify (void
        {
                if(!autocvar_hud_panel_notify) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_NOTIFY;
+     hud_configure_active_panel = HUD_PANEL_NOTIFY;
  
        HUD_Panel_UpdateCvars(notify);
        vector pos, mySize;
@@@ -3424,8 -3438,8 +3430,8 @@@ void HUD_Timer(void
        {
                if(!autocvar_hud_panel_timer) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_TIMER;
+     hud_configure_active_panel = HUD_PANEL_TIMER;
  
        HUD_Panel_UpdateCvars(timer);
        vector pos, mySize;
@@@ -3483,8 -3497,8 +3489,8 @@@ void HUD_Radar(void
                if (autocvar_hud_panel_radar == 0) return;
                if (autocvar_hud_panel_radar != 2 && !teamplay) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_RADAR;
+     hud_configure_active_panel = HUD_PANEL_RADAR;
  
        HUD_Panel_UpdateCvars(radar);
        vector pos, mySize;
@@@ -3610,10 -3624,9 +3616,10 @@@ void HUD_Score(void
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_score) return;
 +              if(spectatee_status == -1 && (gametype == GAME_RACE || gametype == GAME_CTS)) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_SCORE;
+     hud_configure_active_panel = HUD_PANEL_SCORE;
  
        HUD_Panel_UpdateCvars(score);
        vector pos, mySize;
                {
  #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;
 +                      const float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
 +                      const float height = mySize_y/entries;
 +                      const 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;
 +                      const float name_size = mySize_x*0.75;
 +                      const float highlight_alpha = 0.2;
                        float i, me_printed;
                        string s;
                        if (autocvar__hud_configure)
                                        if (i == entries-1 && autocvar_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);
 +                                              drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                                s = GetPlayerName(pl.sv_entnum);
                                                score = 7;
                                        }
                                        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);
 +                                      drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * 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);
@@@ -3880,8 -3892,8 +3886,8 @@@ void HUD_RaceTimer (void
                if(!(gametype == GAME_RACE || gametype == GAME_CTS)) return;
                if(spectatee_status == -1) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_RACETIMER;
+     hud_configure_active_panel = HUD_PANEL_RACETIMER;
  
        HUD_Panel_UpdateCvars(racetimer);
        vector pos, mySize;
@@@ -4059,13 -4071,13 +4065,13 @@@ void HUD_VoteWindow(void
        }
        else
        {
-               hud_configure_active_panel = HUD_PANEL_VOTE;
                vote_yescount = 3;
                vote_nocount = 2;
                vote_needed = 4;
        }
  
+     hud_configure_active_panel = HUD_PANEL_VOTE;
        string s;
        float a;
        if(vote_active != vote_prev) {
@@@ -4722,6 -4734,105 +4728,105 @@@ void HUD_Mod_Race(vector pos, vector my
        drawfont = hud_font;
  }
  
+ void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float layout, float i)
+ {
+       float stat, pps_ratio;
+       string pic;
+       vector color;
+       switch(i)
+       {
+               case 0:
+                       stat = getstatf(STAT_DOM_PPS_RED);
+                       pic = "dom_icon_red";
+                       color = '1 0 0';
+                       break;
+               case 1:
+                       stat = getstatf(STAT_DOM_PPS_BLUE);
+                       pic = "dom_icon_blue";
+                       color = '0 0 1';
+                       break;
+               case 2:
+                       stat = getstatf(STAT_DOM_PPS_YELLOW);
+                       pic = "dom_icon_yellow";
+                       color = '1 1 0';
+                       break;
+               case 3:
+                       stat = getstatf(STAT_DOM_PPS_PINK);
+                       pic = "dom_icon_pink";
+                       color = '1 0 1';
+       }
+       pps_ratio = stat / getstatf(STAT_DOM_TOTAL_PPS);
+       if(mySize_x/mySize_y > aspect_ratio)
+       {
+               i = aspect_ratio * mySize_y;
+               myPos_x = myPos_x + (mySize_x - i) / 2;
+               mySize_x = i;
+       }
+       else
+       {
+               i = 1/aspect_ratio * mySize_x;
+               myPos_y = myPos_y + (mySize_y - i) / 2;
+               mySize_y = i;
+       }
+       if (layout) // show text too
+       {
+               //draw the text
+               color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
+               if (layout == 2) // average pps
+                       drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(stat, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+               else // percentage of average pps
+                       drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+       //draw the icon
+       drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+       if (stat > 0)
+       {
+               drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - pps_ratio), mySize_y, mySize_y * pps_ratio);
+               drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawresetcliparea();
+       }
+ }
+ void HUD_Mod_Dom(vector myPos, vector mySize)
+ {
+       mod_active = 1; // required in each mod function that always shows something
+       entity tm;
+       float teams_count;
+       for(tm = teams.sort_next; tm; tm = tm.sort_next)
+               if(tm.team != COLOR_SPECTATOR)
+                       ++teams_count;
+       float layout = autocvar_hud_panel_modicons_dom_layout;
+       float rows, columns, aspect_ratio;
+       rows = mySize_y/mySize_x;
+       aspect_ratio = (layout) ? 3 : 1;
+       rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count);
+       columns = ceil(teams_count/rows);
+       drawfont = hud_bigfont;
+       int i;
+       float row, column;
+       for(i=0; i<teams_count; ++i)
+       {
+               vector pos, itemSize;
+               pos = myPos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
+               itemSize = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+               DrawDomItem(pos, itemSize, aspect_ratio, layout, i);
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       ++column;
+               }
+       }
+       drawfont = hud_font;
+ }
  float mod_prev; // previous state of mod_active to check for a change
  float mod_alpha;
  float mod_change; // "time" when mod_active changed
@@@ -4731,10 -4842,10 +4836,10 @@@ void HUD_ModIcons(void
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_modicons) return;
-               if (gametype != GAME_CTF && gametype != GAME_KEYHUNT && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY) return;
+               if (gametype != GAME_CTF && gametype != GAME_KEYHUNT && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && gametype != GAME_DOMINATION) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_MODICONS;
+     hud_configure_active_panel = HUD_PANEL_MODICONS;
  
        HUD_Panel_UpdateCvars(modicons);
        vector pos, mySize;
                HUD_Mod_Race(pos, mySize);
        else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
                HUD_Mod_CA(pos, mySize);
+       else if(gametype == GAME_DOMINATION)
+               HUD_Mod_Dom(pos, mySize);
        else if(gametype == GAME_KEEPAWAY)
                HUD_Mod_Keepaway(pos, mySize);
  }
@@@ -4784,9 -4897,8 +4891,8 @@@ void HUD_DrawPressedKeys(void
                if(!autocvar_hud_panel_pressedkeys) return;
                if(spectatee_status <= 0 && autocvar_hud_panel_pressedkeys < 2) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_PRESSEDKEYS;
  
+     hud_configure_active_panel = HUD_PANEL_PRESSEDKEYS;
  
        HUD_Panel_UpdateCvars(pressedkeys);
        vector pos, mySize;
@@@ -4849,8 -4961,8 +4955,8 @@@ void HUD_Chat(void
                        return;
                }
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_CHAT;
+     hud_configure_active_panel = HUD_PANEL_CHAT;
  
        HUD_Panel_UpdateCvars(chat);
  
@@@ -4924,8 -5036,8 +5030,8 @@@ void HUD_EngineInfo(void
        {
                if(!autocvar_hud_panel_engineinfo) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_ENGINEINFO;
+     hud_configure_active_panel = HUD_PANEL_ENGINEINFO;
  
        HUD_Panel_UpdateCvars(engineinfo);
        vector pos, mySize;
@@@ -4988,8 -5100,8 +5094,8 @@@ void HUD_InfoMessages(void
        {
                if(!autocvar_hud_panel_infomessages) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_INFOMESSAGES;
+     hud_configure_active_panel = HUD_PANEL_INFOMESSAGES;
  
        HUD_Panel_UpdateCvars(infomessages);
        vector pos, mySize;
@@@ -5174,10 -5286,9 +5280,10 @@@ void HUD_Physics(void
        if(!autocvar_hud_panel_physics)
        {
                if(!autocvar__hud_configure) return;
 +              if(spectatee_status <= 0 && autocvar_hud_panel_physics < 2) return;
        }
-       else
-               hud_configure_active_panel = HUD_PANEL_PHYSICS;
+     hud_configure_active_panel = HUD_PANEL_PHYSICS;
  
        HUD_Panel_UpdateCvars(physics);
  
        float speed, conversion_factor;
        string unit;
  
 -      switch(autocvar_cl_showspeed_unit)
 +      switch(autocvar_hud_panel_physics_speed_unit)
        {
                default:
                case 1:
        float speed_baralign, acceleration_baralign;
        if (autocvar_hud_panel_physics_baralign == 1)
                acceleration_baralign = speed_baralign = 1;
+     else if(autocvar_hud_panel_physics_baralign == 4)
+               acceleration_baralign = speed_baralign = 2;
        else if (autocvar_hud_panel_physics_flip)
        {
                acceleration_baralign = (autocvar_hud_panel_physics_baralign == 2);
                        {
                                top_speed = speed;
                                top_speed_time = time;
+                 f = 1;
                        }
-                       if (top_speed == 0) //hide top speed 0, it would be stupid
-                               f = 0;
-                       else
+             else if (top_speed != 0)
                        {
                                f = max(1, autocvar_hud_panel_physics_topspeed_time);
                                // divide by f to make it start from 1
                                f = cos( ((time - top_speed_time) / f) * PI/2 );
                        }
+             else //hide top speed 0, it would be stupid
+                               f = 0;
                }
                if (f > 0)
                {
-                       //top speed progressbar peek
+                       //top speed progressbar peak
                        if(autocvar_hud_panel_physics_progressbar && speed < top_speed)
                        {
-                               float peek_offset_x, peek_size_x;
-                               if (speed_baralign)
-                                       peek_offset_x = (1 - min(top_speed, max_speed)/max_speed) * panel_size_x;
-                               else
-                                       peek_offset_x = min(top_speed, max_speed)/max_speed * panel_size_x;
+                               float peak_offset_x;
+                 vector peak_size
+                               if (speed_baralign == 0)
+                                       peak_offset_x = min(top_speed, max_speed)/max_speed * panel_size_x;
+                 else if (speed_baralign == 1)
+                                       peak_offset_x = (1 - min(top_speed, max_speed)/max_speed) * panel_size_x;
+                 else if (speed_baralign == 2)
+                     peak_offset_x = min(top_speed, max_speed)/max_speed * panel_size_x * 0.5;
                                //if speed is not 0 the speed progressbar already fetched the color
                                if (speed == 0)
                                        HUD_Panel_GetProgressBarColor(speed);
-                               peek_size_x = panel_size_x * 0.01;
-                               drawfill(panel_pos + speed_offset + eX * (peek_offset_x - peek_size_x), eX * peek_size_x + eY * panel_size_y, progressbar_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                               peak_size_x = floor(panel_size_x * 0.01 + 1.5);
+                 peak_size_y = panel_size_y;
+                 if (speed_baralign == 2) // draw two peaks, on both sides
+                 {
+                     drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size_x + peak_offset_x - peak_size_x), peak_size, progressbar_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                     drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size_x - peak_offset_x + peak_size_x), peak_size, progressbar_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                 }
+                 else
+                     drawfill(panel_pos + speed_offset + eX * (peak_offset_x - peak_size_x), peak_size, progressbar_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
  
                        //top speed