Merge remote branch 'origin/master' into fruitiex/gamemode_freezetag
authorFruitieX <fruitiex@gmail.com>
Tue, 30 Nov 2010 13:56:46 +0000 (15:56 +0200)
committerFruitieX <fruitiex@gmail.com>
Tue, 30 Nov 2010 13:56:46 +0000 (15:56 +0200)
1  2 
defaultXonotic.cfg
qcsrc/client/View.qc
qcsrc/client/hud.qc
qcsrc/common/util.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/progs.src
qcsrc/server/w_electro.qc

diff --combined defaultXonotic.cfg
@@@ -89,13 -89,14 +89,14 @@@ _cl_color 10
  _cl_name Player
  _cl_playermodel models/player/umbra.iqm
  _cl_playerskin 0
- seta crosshair 3
+ seta crosshair 16
  seta crosshair_color "0.6 0.8 1"
- seta crosshair_alpha 1
- seta crosshair_size 0.35
+ seta crosshair_alpha 0.3
+ seta crosshair_size 0.5
  seta crosshair_dot 1
  seta crosshair_dot_alpha 1
- seta crosshair_dot_size 1
+ seta crosshair_dot_size 0.6
+ seta crosshair_dot_color "1 0 0" "when != 0, use custom color for the crosshair dot"
  seta crosshair_pickup 0.25
  seta crosshair_pickup_speed 4
  seta crosshair_per_weapon 0   "when 1, each gun will display a different crosshair"
@@@ -181,7 -182,6 +182,7 @@@ seta crosshair_fireball_size 1     "crossha
  
  // ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
  seta crosshair_ring_size 2    "bullet counter ring size for Rifle, velocity ring for Nex"
 +seta crosshair_ring_alpha 0.2 "ring alpha"
  
  seta crosshair_ring_campingrifle_alpha 0.15
  
@@@ -568,14 -568,6 +569,14 @@@ seta g_nexball_goalleadlimit -1 "Nexbal
  seta g_ctf_win_mode 0 "0: captures only, 1: captures, then points, 2: points only"
  seta g_ctf_ignore_frags 0     "1: regular frags give no points"
  
 +set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze teammates by standing next to them"
 +seta g_freezetag_warmup 5 "Time players get to run around before the round starts"
 +seta g_freezetag_point_limit -1       "Freeze Tag point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 +seta g_freezetag_point_leadlimit -1   "Freeze Tag point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 +seta g_freezetag_revive_time 2.5 "Time it takes to revive a frozen teammate"
 +seta g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him"
 +seta g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with"
 +
  // 50% of the spawns shall be far away from any players
  set g_spawn_furthest 0.5
  // respawn delay
@@@ -615,8 -607,6 +616,8 @@@ set g_cts_respawn_waves 
  set g_cts_respawn_delay 0.25
  set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
  set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
 +set g_freezetag_respawn_waves 0
 +set g_freezetag_respawn_delay 0.25
  
  // overtime
  seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
@@@ -1359,6 -1349,11 +1360,11 @@@ seta hud_panel_weapons_ammo_full_fuel 1
  seta hud_panel_weapons_timeout "3" "panel disappears if you don't switch weapon for this amount of seconds"
  seta hud_panel_weapons_timeout_effect "1" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
  
+ seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
+ seta hud_panel_healtharmor_maxhealth "250" "when you have this much health, the health status bar is full"
+ seta hud_panel_healtharmor_maxarmor "150" "when you have this much armor, the armor status bar is full"
  seta hud_panel_notify_time 10 "time that a new entry stays until it fades out"
  seta hud_panel_notify_fadetime 3 "fade out time"
  
@@@ -1378,8 -1373,6 +1384,8 @@@ seta hud_panel_engineinfo_framecounter_
  seta hud_showbinds 1  "the way to show the keys to press in HUD messages: 0 displays commands, 1 bound keys, 2 both"
  seta hud_showbinds_limit 2    "maximum number of bound keys to show for a command. 0 for unlimited"
  
 +seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
 +
  seta hud_damage 1 "an improved version of gl_polyblend, draw an image instead when hurt"
  seta hud_damage_gentle_alpha_multiplier 0.25 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
  seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
@@@ -1712,7 -1705,7 +1718,7 @@@ seta cl_showspeed_position 0.7 "Y-axis 
  seta cl_showacceleration 0 "show the XY acceleration of the player"
  seta cl_showacceleration_z 0 "include the speed on the Z-axis"
  seta cl_showacceleration_size 40 "height of the bar"
- seta cl_showacceleration_scale 5 "X-axis scale of the bar"
+ seta cl_showacceleration_scale 1 "X-axis scale of the bar"
  seta cl_showacceleration_alpha 0.5 "alpha of the bar"
  seta cl_showacceleration_color_custom 0 "0 = dynamic color depending on acceleration, 1 = use custom color"
  seta cl_showacceleration_color "1 0 0" "color of the bar, needs cl_showacceleration_color_custom to be 1"
@@@ -2010,6 -2003,9 +2016,9 @@@ set g_forced_team_yellow "" "list of pl
  set g_forced_team_pink "" "list of player IDs for pink team"
  set g_forced_team_otherwise "default" "action if a non listed player joins (can be default for default action, spectate for forcing to spectate, or red, blue, yellow, pink)"
  
+ // player statistics server URI
+ set g_playerstats_uri ""
  // other config files
  exec balanceXonotic.cfg
  exec ctfscoring-ai.cfg
diff --combined qcsrc/client/View.qc
@@@ -764,17 -764,6 +764,17 @@@ void CSQC_UpdateView(float w, float h
          CSQC_RAPTOR_HUD();
        else
        {
 +              if(gametype == GAME_FREEZETAG)
 +              {
 +                      if(getstati(STAT_FROZEN))
 +                              drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', cvar_or("hud_colorflash_alpha", 0.5), DRAWFLAG_ADDITIVE);
 +                      if(getstatf(STAT_REVIVE_PROGRESS))
 +                      {
 +                              DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', cvar("hud_colorflash_alpha"), DRAWFLAG_ADDITIVE);
 +                              drawstring_aspect(eY * 0.64 * vid_conheight, "Revival progress", eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
 +                      }
 +              }
 +
                if(cvar("r_letterbox") == 0)
                        if(cvar("viewsize") < 120)
                                CSQC_common_hud();
                        CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
  
                        if(cvar("crosshair_dot"))
-                               CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", wcross_alpha * f * cvar("crosshair_dot_alpha"));
+             {
+                 vector wcross_color_old;
+                 wcross_color_old = wcross_color;
+                 if(cvar_string("crosshair_dot_color") != "0")
+                     wcross_color = stov(cvar_string("crosshair_dot_color"));
+                               CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", f * cvar("crosshair_dot_alpha"));
+                 wcross_color = wcross_color_old;
+             }
  
                        wcross_name_alpha_goal_prev = f;
                }
diff --combined qcsrc/client/hud.qc
@@@ -14,7 -14,12 +14,12 @@@ Misc HUD function
  //   1/4 height: bottom part
  void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
  {
-       if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border
+     if (theBorderSize_x < 0 && theBorderSize_y < 0) // draw whole image as it is
+     {
+               drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0);
+               return;
+     }
+       if (theBorderSize_x == 0 && theBorderSize_y == 0) // no border
        {
                // draw only the central part
                drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0);
@@@ -491,18 -496,26 +496,26 @@@ void HUD_Panel_ExportCfg(string cfgname
                                case HUD_PANEL_AMMO:
                                        HUD_Write_PanelCvar_q("_onlycurrent");
                                        HUD_Write_PanelCvar_q("_iconalign");
+                                       HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_name");
+                                       HUD_Write_PanelCvar_q("_text");
                                        break;
                                case HUD_PANEL_POWERUPS:
                                        HUD_Write_PanelCvar_q("_flip");
                                        HUD_Write_PanelCvar_q("_iconalign");
                                        HUD_Write_PanelCvar_q("_baralign");
                                        HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_strength");
+                                       HUD_Write_PanelCvar_q("_progressbar_shield");
                                        break;
                                case HUD_PANEL_HEALTHARMOR:
                                        HUD_Write_PanelCvar_q("_flip");
                                        HUD_Write_PanelCvar_q("_iconalign");
                                        HUD_Write_PanelCvar_q("_baralign");
                                        HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_health");
+                                       HUD_Write_PanelCvar_q("_progressbar_armor");
+                                       HUD_Write_PanelCvar_q("_text");
                                        break;
                                case HUD_PANEL_NOTIFY:
                                        HUD_Write_PanelCvar_q("_flip");
@@@ -553,31 -566,37 +566,37 @@@ 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, string pic, float vertical, float barflip, float x, vector color, float alpha, float drawflag)
  {
-       if(!alpha)
+       if(!alpha || x == 0)
                return;
  
-       string pic;
+     x = bound(0, x, 1);
        if(vertical) {
-               pic = strcat(hud_skin_path, "/statusbar_vertical");
+               pic = strcat(hud_skin_path, "/", pic, "_vertical");
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar_vertical";
                }
-               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);
-               drawsubpic(pos + eY * mySize_y - eY * min(mySize_y * 0.5, mySize_x), eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0.75 0', '1 0.25 0', color, alpha, drawflag);
+         if(barflip)
+             drawsetcliparea(pos_x, pos_y + mySize_y * (1 - x), mySize_x, mySize_y * x);
+         else
+             drawsetcliparea(pos_x, pos_y, mySize_x, mySize_y * x);
        } else {
-               pic = strcat(hud_skin_path, "/statusbar");
+               pic = strcat(hud_skin_path, "/", pic);
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar";
                }
-               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);
-               drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
+         if(barflip)
+             drawsetcliparea(pos_x + mySize_x * (1 - x), pos_y, mySize_x * x, mySize_y);
+         else
+             drawsetcliparea(pos_x, pos_y, mySize_x * x, mySize_y);
        }
+     drawpic(pos, pic, mySize, color, alpha, drawflag);
+     drawresetcliparea();
  }
  
  void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float alpha, float drawflag)
@@@ -1896,10 -1915,16 +1915,16 @@@ void DrawAmmoItem(vector myPos, vector 
        if (currently_selected)
                drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  
-       if(a > 0)
-               drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
-       else // "ghost" ammo count
-               drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+     if(a > 0 && cvar("hud_panel_ammo_progressbar"))
+         HUD_Panel_DrawProgressBar(myPos + eX * cvar("hud_panel_ammo_progressbar_xoffset") * mySize_x, mySize - eX * cvar("hud_panel_ammo_progressbar_xoffset") * mySize_x, cvar_string("hud_panel_ammo_progressbar_name"), 0, 0, min(1, a/cvar("hud_panel_ammo_maxammo")), color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+     if(cvar("hud_panel_ammo_text"))
+     {
+         if(a > 0)
+             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+         else // "ghost" ammo count
+             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+     }
        if(a > 0)
                drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
        else // "ghost" ammo icon
@@@ -2099,129 -2124,147 +2124,147 @@@ void HUD_Powerups(void) 
        vector numpos;
  
        string leftname, rightname;
+     string leftprogressname, rightprogressname;
        float leftcnt, rightcnt;
        float leftexact, rightexact;
        float flip = cvar("hud_panel_powerups_flip");
        if (flip) {
                leftname = "strength";
+         leftprogressname = cvar_string("hud_panel_powerups_progressbar_strength");
                leftcnt = ceil(strength_time);
                leftexact = strength_time;
  
                rightname = "shield";
+         rightprogressname = cvar_string("hud_panel_powerups_progressbar_shield");
                rightcnt = ceil(shield_time);
                rightexact = shield_time;
        } else {
                leftname = "shield";
+         leftprogressname = cvar_string("hud_panel_powerups_progressbar_shield");
                leftcnt = ceil(shield_time);
                leftexact = shield_time;
  
                rightname = "strength";
+         rightprogressname = cvar_string("hud_panel_powerups_progressbar_strength");
                rightcnt = ceil(strength_time);
                rightexact = strength_time;
        }
  
        drawfont = hud_bigfont;
        float baralign = cvar("hud_panel_powerups_baralign");
+     float barflip;
        float iconalign = cvar("hud_panel_powerups_iconalign");
        float progressbar = cvar("hud_panel_powerups_progressbar");
        if (mySize_x/mySize_y > 4)
        {
+         barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                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;
+                 barpos = pos + eX * 0.5 * mySize_x;
+                 barflip = 1;
                        } else { // left align
-                               barpos = pos;
-                               barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
+                 barpos = pos;
+                 barflip = 0;
                        }
  
                        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(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/30), 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);
-                       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));
+             if(cvar("hud_panel_powerups_text"))
+             {
+                 if(leftcnt > 1)
+                     DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '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));
+             }
                }
  
                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;
+                 barpos = pos;
+                 barflip = 0;
                        } 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;
+                 barpos = pos + eX * 0.5 * mySize_x;
+                 barflip = 1;
                        }
  
                        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(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/30), 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);
-                       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));
+             if(cvar("hud_panel_powerups_text"))
+             {
+                 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);
+                 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));
+             }
                }
        }
        else if (mySize_x/mySize_y > 1.5)
        {
+         barsize = eX * mySize_x + eY * 0.5 * mySize_y;
                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;
+             barpos = pos;
+                       if(baralign == 1 || baralign == 3) { // right/down align
+                 barflip = 1;
+                       } else { // left/up align
+                 barflip = 0;
                        }
  
                        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(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/30), 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);
-                       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));
+             if(cvar("hud_panel_powerups_text"))
+             {
+                 if(leftcnt > 1)
+                     DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '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));
+             }
                }
  
                if(rightcnt)
                {
+             barpos = pos + eY * 0.5 * mySize_y;
                        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;
+                 barflip = 0;
                        } 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;
+                 barflip = 1;
                        }
  
                        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(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/30), 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);
-                       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));
+             if(cvar("hud_panel_powerups_text"))
+             {
+                 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);
+                 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
        {
+         barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                if(leftcnt)
                {
+             barpos = pos;
                        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);
+                 barflip = 1;
                        } else { // up align
-                               barpos = pos;
-                               barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
+                 barflip = 0;
                        }
  
                        if(iconalign == 1 || iconalign == 3) { // down align
                        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);
+                               HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 1, barflip, min(1, leftcnt/30), 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(cvar("hud_panel_powerups_text"))
+             {
+                 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);
+             barpos = pos + eX * 0.5 * mySize_x;
+                       if(baralign == 0 || baralign == 3) { // down align
+                 barflip = 1;
+                       } else { // up align
+                 barflip = 0;
                        }
  
                        if(iconalign == 0 || iconalign == 3) { // up align
                        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);
+                               HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 1, barflip, min(1, rightcnt/30), 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);
+             if(cvar("hud_panel_powerups_text"))
+             {
+                 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);
+             }
                }
        }
        drawfont = hud_font;
@@@ -2304,9 -2352,9 +2352,9 @@@ void HUD_HealthArmor(void
  
        if(autocvar__hud_configure)
        {
-               armor = 150;
-               health = 100;
-               fuel = 70;
+               armor = 75;
+               health = 150;
+               fuel = 20;
        }
  
        if(health <= 0)
        float baralign = cvar("hud_panel_healtharmor_baralign");
        float iconalign = cvar("hud_panel_healtharmor_iconalign");
        float progressbar = cvar("hud_panel_healtharmor_progressbar");
+     float maxhealth = cvar("hud_panel_healtharmor_maxhealth");
+     float maxarmor = cvar("hud_panel_healtharmor_maxarmor");
        if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display
        {
                vector v;
                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;
-               }
+         float maxtotal = maxhealth + maxarmor;
+         barpos = pos;
+         barsize = mySize;
  
                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(barpos, barsize, cvar_string("hud_panel_healtharmor_progressbar_health"), 0, mod(baralign, 2), x/maxtotal, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(armor)
+             if(cvar("hud_panel_healtharmor_text"))
                                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);
                }
                else
                        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(barpos, barsize, cvar_string("hud_panel_healtharmor_progressbar_armor"), 0, mod(baralign, 2), x/maxtotal, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(health)
+             if(cvar("hud_panel_healtharmor_text"))
                                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);
+         if(cvar("hud_panel_healtharmor_text"))
+             DrawNumIcon(iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, maxtotal), 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;
-                       }
+             barpos = pos;
+             barsize = eX * mySize_x + 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(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                }
        }
        else
        {
                string leftname, rightname;
+         string leftprogressname, rightprogressname;
                float leftcnt, rightcnt;
+               float leftmax, rightmax;
                float leftactive, rightactive;
                float leftalpha, rightalpha;
                float flip = cvar("hud_panel_healtharmor_flip");
+         float barflip;
                if (flip) { // old style layout with armor left/top of health
                        leftname = "armor";
+             leftprogressname = cvar_string("hud_panel_healtharmor_progressbar_armor");
                        leftcnt = armor;
                        if(leftcnt)
                                leftactive = 1;
                        leftalpha = min((armor+10)/55, 1);
+             leftmax = maxarmor;
  
                        rightname = "health";
+             rightprogressname = cvar_string("hud_panel_healtharmor_progressbar_health");
                        rightcnt = health;
                        rightactive = 1;
                        rightalpha = 1;
+             rightmax = maxhealth;
                } else {
                        leftname = "health";
+             leftprogressname = cvar_string("hud_panel_healtharmor_progressbar_health");
                        leftcnt = health;
                        leftactive = 1;
                        leftalpha = 1;
+             leftmax = maxhealth;
  
                        rightname = "armor";
+             rightprogressname = cvar_string("hud_panel_healtharmor_progressbar_armor");
                        rightcnt = armor;
                        if(rightcnt)
                                rightactive = 1;
                        rightalpha = min((armor+10)/55, 1);
+             rightmax = maxarmor;
                }
  
                if (mySize_x/mySize_y > 4)
                {
+             barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                        if(leftactive)
                        {
+                 barpos = pos;
                                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;
+                     barflip = 1;
                                } else { // left align
-                                       barpos = pos;
-                                       barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
+                     barflip = 0;
                                }
  
                                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(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/leftmax), 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);
+                 if(cvar("hud_panel_healtharmor_text"))
+                     DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, leftmax), 1);
                        }
  
                        if(rightactive)
                        {
+                 barpos = pos + eX * 0.5 * mySize_x;
                                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;
+                     barflip = 0;
                                } 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;
+                     barflip = 1;
                                }
  
                                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(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/rightmax), 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);
+                 if(cvar("hud_panel_healtharmor_text"))
+                     DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, rightmax), 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);
+                 barpos = pos;
+                 barsize = eX * mySize_x + eY * 0.2 * mySize_y;
+                 HUD_Panel_GetProgressBarColor(fuel);
+                 HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
                else if (mySize_x/mySize_y > 1.5)
                {
+             barsize = eX * mySize_x + eY * 0.5 * mySize_y;
                        if(leftactive)
                        {
+                 barpos = pos;
                                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;
+                     barflip = 1;
                                } else { // left align
-                                       barpos = pos;
-                                       barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
+                     barflip = 0;
                                }
  
                                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(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/leftmax), 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(cvar("hud_panel_healtharmor_text"))
+                     DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, leftmax), 1);
                        }
  
                        if(rightactive)
                        {
+                 barpos = pos + eY * 0.5 * mySize_y;
                                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;
+                     barflip = 0;
                                } 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;
+                     barflip = 1;
                                }
  
                                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(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/rightmax), 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(cvar("hud_panel_healtharmor_text"))
+                     DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, rightmax), 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);
+                 barpos = pos;
+                 barsize = eX * mySize_x + eY * 0.2 * mySize_y;
+                 HUD_Panel_GetProgressBarColor(fuel);
+                 HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
                else
                {
+             barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                        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);
+                 barpos = pos;
+                               if(baralign == 1 || baralign == 3) { // right align
+                     barflip = 1;
+                               } else { // left align
+                     barflip = 0;
                                }
  
                                if(iconalign == 1 || iconalign == 3) { // down align
                                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(barpos, barsize, leftprogressname, 1, barflip, min(1, leftcnt/leftmax), 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);
+                 if(cvar("hud_panel_healtharmor_text"))
+                 {
+                     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, leftmax), panel_fg_alpha, DRAWFLAG_NORMAL);
+                 }
                        }
  
                        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);
+                 barpos = pos + eX * 0.5 * mySize_x;
+                               if(baralign == 0 || baralign == 3) { // left align
+                     barflip = 0;
+                               } else { // right align
+                     barflip = 1;
                                }
  
                                if(iconalign == 0 || iconalign == 3) { // up align
                                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(barpos, barsize, rightprogressname, 1, barflip, min(1, rightcnt/rightmax), 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);
+                 if(cvar("hud_panel_healtharmor_text"))
+                 {
+                     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, rightmax), panel_fg_alpha, DRAWFLAG_NORMAL);
+                 }
                        }
  
                        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);
+                 barpos = pos;
+                 barsize = eX * 0.05 * mySize_x + eY * mySize_y;
+                 HUD_Panel_GetProgressBarColor(fuel);
+                 HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 1, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
        }
@@@ -4326,20 -4375,17 +4375,17 @@@ void HUD_Mod_NexBall(vector pos, vecto
                        p = 2 - p;
  
                //Draw the filling
-               vector barsize;
                float vertical;
                if(mySize_x > mySize_y)
                {
-                       barsize = eX * p * mySize_x + eY * mySize_y;
                        vertical = 0;
                }
                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, "statusbar", vertical, 0, p, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
  
        if (stat_items & IT_KEY1)
@@@ -4503,7 -4549,7 +4549,7 @@@ void HUD_ModIcons(void
        if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
                return;
  
 -      if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && !autocvar__hud_configure)
 +      if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && !autocvar__hud_configure)
                return;
  
        active_panel = HUD_PANEL_MODICONS;
                HUD_Mod_NexBall(pos, mySize);
        else if(gametype == GAME_CTS || gametype == GAME_RACE)
                HUD_Mod_Race(pos, mySize);
 -      else if(gametype == GAME_CA)
 +      else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
                HUD_Mod_CA(pos, mySize);
  }
  
@@@ -5014,9 -5060,9 +5060,9 @@@ void HUD_ShowAcceleration(void
        }
  
        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);
+         HUD_Panel_DrawProgressBar(pos, eX * (vid_conwidth - pos_x) + eY * sz, "statusbar", 0, 0, acceleration * scale, rgb, alpha * autocvar_hud_progressbar_alpha * panel_fg_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);
+         HUD_Panel_DrawProgressBar(eY * pos_y, eX * pos_x + eY * sz, "statusbar", 0, 1, -acceleration * scale, rgb, alpha * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
  }
  
  void HUD_Reset (void)
diff --combined qcsrc/common/util.qc
@@@ -1,43 -1,3 +1,3 @@@
- // checkextension wrapper for log
- float sqrt(float f); // declared later
- float exp(float f); // declared later
- float pow(float f, float e); // declared later
- float checkextension(string s); // declared later
- float log_synth(float f)
- {
-       float p, l;
-       if(f < 0)
-               return sqrt(-1); // nan? -inf?
-       if(f == 0)
-               return sqrt(-1); // ACTUALLY this should rather be -inf, but we cannot create a +inf in QC
-       if(f + f == f)
-               return l; // +inf
-       if(f < 1)
-       {
-               f = 1 / f;
-               p = -1;
-       }
-       else
-               p = 1;
-       while(f > 2)
-       {
-               f = sqrt(f);
-               p *= 2;
-       }
-       // two steps are good enough
-       l = ((6-f) * f - 5) / 4.32808512266689022212;
-       l += exp(-l) * f - 1;
-       l += exp(-l) * f - 1;
-       return l * p;
- }
- float log(float f)
- {
-       if(checkextension("DP_QC_LOG"))
-               return log_builtin(f);
-       else
-               return log_synth(f);
- }
  string wordwrap_buffer;
  
  void wordwrap_buffer_put(string s)
@@@ -439,7 -399,6 +399,7 @@@ string GametypeNameFromType(float g
        else if (g == GAME_RACE) return "rc";
        else if (g == GAME_NEXBALL) return "nexball";
        else if (g == GAME_CTS) return "cts";
 +      else if (g == GAME_FREEZETAG) return "freezetag";
        return "dm";
  }
  
@@@ -603,6 -603,12 +603,12 @@@ void PutObserverInServer (void
  
        Portal_ClearAll(self);
  
+       if(self.alivetime)
+       {
+               PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+               self.alivetime = 0;
+       }
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
  
@@@ -1074,6 -1080,9 +1080,9 @@@ void PutClientInServer (void
                self.switchweapon = w_getbestweapon(self);
                self.cnt = self.switchweapon;
                self.weapon = 0;
+               if(!self.alivetime)
+                       self.alivetime = time;
        } else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) {
                PutObserverInServer ();
        }
@@@ -1338,10 -1347,6 +1347,10 @@@ void ClientKill (void
        {
                // do nothing
        }
 +    else if(g_freezetag && self.freezetag_frozen == 1)
 +    {
 +        // do nothing
 +    }
        else
                ClientKill_TeamChange(0);
  }
@@@ -1705,6 -1710,8 +1714,8 @@@ void ClientConnect (void
        send_CSQC_cr_maxbullets(self);
  
        CheatInitClient();
+       PlayerStats_AddPlayer(self);
  }
  
  /*
@@@ -1725,6 -1732,8 +1736,8 @@@ void ClientDisconnect (void
                return;
        }
  
+       PlayerStats_AddGlobalInfo(self);
        CheatShutdownClient();
  
        if(self.hitplotfh >= 0)
@@@ -386,8 -386,6 +386,8 @@@ void PlayerCorpseDamage (entity inflict
  }
  
  void ClientKill_Now_TeamChange();
 +void freezetag_CheckWinner();
 +void freezetag_Unfreeze();
  
  void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
  {
                float defer_ClientKill_Now_TeamChange;
                defer_ClientKill_Now_TeamChange = FALSE;
  
+               if(self.alivetime)
+               {
+                       PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+                       self.alivetime = 0;
+               }
                if(valid_damage_for_weaponstats)
                        WeaponStats_LogKill(DEATH_WEAPONOF(deathtype), self.weapon);
  
                        }
                }
  
 -              // become fully visible
 -              self.alpha = 1;
 -              // clear selected player display
 -              ClearSelectedPlayer();
 -              // throw a weapon
 -              SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
 +              if(!g_freezetag)
 +              {
 +                      // become fully visible
 +                      self.alpha = 1;
 +                      // clear selected player display
 +                      ClearSelectedPlayer();
 +                      // throw a weapon
 +                      SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
 +              }
 +
                // print an obituary message
                Obituary (attacker, inflictor, self, deathtype);
                race_PreDie();
                DropAllRunes(self);
  
 +              if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
 +              {
 +                      PutClientInServer();
 +                      count_alive_players(); // re-count players
 +                      freezetag_CheckWinner();
 +                      return;
 +              }
 +
                frag_attacker = attacker;
                frag_inflictor = inflictor;
                frag_target = self;
                MUTATOR_CALLHOOK(PlayerDies);
  
 +              if(g_freezetag)
 +            return;
 +
                if(self.flagcarried)
                {
                        if(attacker.classname != "player" && attacker.classname != "gib")
diff --combined qcsrc/server/defs.qh
@@@ -17,7 -17,7 +17,7 @@@ float require_spawnfunc_prefix; // if t
  
  float ctf_score_value(string parameter);
  
 -float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts;
 +float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts, g_freezetag;
  float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_minstagib_invis_alpha, g_bloodloss;
  float g_warmup_limit;
  float g_warmup_allguns;
@@@ -263,7 -263,8 +263,8 @@@ float blockSpectators; //if set, new o
  void checkSpectatorBlock();
  
  .float winning;
- .float jointime;
+ .float jointime; // time of joining
+ .float alivetime; // time of being alive
  
  float isJoinAllowed();
  #define PREVENT_JOIN_TEXT "^1You may not join the game at this time.\n\nThe player limit reached maximum capacity."
@@@ -653,7 -654,3 +654,7 @@@ float allowed_to_spawn; // boolean vari
  float serverflags;
  
  .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
 +
 +.float freezetag_frozen;
 +.float freezetag_beginrevive_time;
 +.float freezetag_revive_progress;
diff --combined qcsrc/server/g_damage.qc
@@@ -120,12 -120,14 +120,14 @@@ void GiveFrags (entity attacker, entit
                {
                        // teamkill
                        PlayerScore_Add(attacker, SP_KILLS, -1); // or maybe add a teamkills field?
+                       PlayerStats_Event(attacker, PLAYERSTATS_KILLS, -1);
                }
        }
        else
        {
                // regular frag
                PlayerScore_Add(attacker, SP_KILLS, 1);
+               PlayerStats_Event(attacker, PLAYERSTATS_KILLS, 1);
        }
  
        PlayerScore_Add(targ, SP_DEATHS, 1);
@@@ -526,15 -528,6 +528,15 @@@ void Damage (entity targ, entity inflic
                if (attacker.isbot)
                        damage = damage * bound(0.1, (skill + 5) * 0.1, 1);
  
 +              if(g_freezetag)
 +              {
 +                      if(targ.freezetag_frozen == 1)
 +                      {
 +                              damage = 0;
 +                              force = force * cvar("g_freezetag_frozen_force");
 +                      }
 +              }
 +
                // nullify damage if teamplay is on
                if(deathtype != DEATH_TELEFRAG)
                if(attacker.classname == "player")
diff --combined qcsrc/server/g_world.qc
@@@ -809,19 -809,11 +809,19 @@@ void spawnfunc_worldspawn (void
        addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
        addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_charge_pool_ammo);
  
 -      if(g_ca)
 +      if(g_ca || g_freezetag)
        {
                addstat(STAT_REDALIVE, AS_INT, redalive_stat);
                addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
 +              addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat);
 +              addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat);
        }
 +      if(g_freezetag)
 +      {
 +              addstat(STAT_FROZEN, AS_INT, freezetag_frozen);
 +              addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress);
 +      }
 +
        // g_movementspeed hack
        addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
        addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed);
                cvar_set("sv_curl_serverpackages", substring(s, 1, -1));
        }
  
+       PlayerStats_Init();
        world_initialized = 1;
  }
  
@@@ -1405,12 -1399,13 +1407,13 @@@ RULE
  
  void DumpStats(float final)
  {
-       local float file;
-       local string s;
-       local float to_console;
-       local float to_eventlog;
-       local float to_file;
-       local float i;
+       float file;
+       string s;
+       float to_console;
+       float to_eventlog;
+       float to_file;
+       float i;
+       entity e;
  
        to_console = cvar("sv_logscores_console");
        to_eventlog = cvar("sv_eventlog");
                fputs(file, ":end\n");
                fclose(file);
        }
+       // send statistics
+       FOR_EACH_CLIENT(e)
+               PlayerStats_AddGlobalInfo(e);
+       PlayerStats_Shutdown();
  }
  
  void FixIntermissionClient(entity e)
@@@ -2726,6 -2726,10 +2734,10 @@@ void MapVote_Start(
        if(mapvote_run)
                return;
  
+       // wait for stats to be sent first
+       if(!playerstats_sent)
+               return;
        MapInfo_Enumerate();
        if(MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1))
                mapvote_run = TRUE;
@@@ -2900,6 -2904,8 +2912,8 @@@ void RestoreGame(
  
  void SV_Shutdown()
  {
+       entity e;
        if(gameover > 1) // shutting down already?
                return;
  
                world_initialized = 0;
                print("Saving persistent data...\n");
                Ban_SaveBans();
+               FOR_EACH_CLIENT(e)
+                       PlayerStats_AddGlobalInfo(e);
+               PlayerStats_Shutdown();
                if(!cheatcount_total)
                {
                        if(cvar("sv_db_saveasdump"))
diff --combined qcsrc/server/progs.src
@@@ -41,6 -41,7 +41,7 @@@ csqceffects.q
  
  anticheat.qh
  cheats.qh
+ playerstats.qh
  
  portals.qh
  
@@@ -176,10 -177,10 +177,11 @@@ playerdemo.q
  
  anticheat.qc
  cheats.qc
+ playerstats.qc
  
  mutators/base.qc
  mutators/gamemode_keyhunt.qc
 +mutators/gamemode_freezetag.qc
  mutators/mutator_nix.qc
  mutators/mutator_dodging.qc
  mutators/mutator_rocketflying.qc
@@@ -110,7 -110,7 +110,7 @@@ void W_Electro_Attack(
  {
        local entity proj;
  
-       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", cvar("g_balance_electro_primary_damage"));
+       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CHAN_WEAPON, cvar("g_balance_electro_primary_damage"));
  
        pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
  
@@@ -147,7 -147,8 +147,8 @@@ void W_Electro_Attack2(
  {
        local entity proj;
  
-       W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", cvar("g_balance_electro_secondary_damage"));
+       W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CHAN_WEAPON, cvar("g_balance_electro_secondary_damage"));
        w_shotdir = v_forward; // no TrueAim for grenades please
  
        pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
@@@ -231,7 -232,7 +232,7 @@@ void lgbeam_think(
                remove(self);
                return;
        }
 -      if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
 +      if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || (g_freezetag && self.owner.freezetag_frozen))
        {
                if(self == self.owner.lgbeam)
                        self.owner.lgbeam = world;
                }
        }
  
-       W_SetupShot_Range(self.owner, TRUE, 0, "", cvar("g_balance_electro_primary_damage") * dt, cvar("g_balance_electro_primary_range"));
+       W_SetupShot_Range(self.owner, TRUE, 0, "", 0, cvar("g_balance_electro_primary_damage") * dt, cvar("g_balance_electro_primary_range"));
        WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
  
        // apply the damage
@@@ -289,9 -290,7 +290,7 @@@ void W_Electro_Attack3 (void
  {
        // only play fire sound if 0.5 sec has passed since player let go the fire button
        if(time - self.prevlgfire > 0.5)
-       {
                sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
-       }
  
        entity beam, oldself;