]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
Merge branch 'fruitiex/fruitbalance' of ssh://git.xonotic.org/xonotic-data.pk3dir...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index cb55a4e1c38b68e48624780f8ad544e5dcd3ea04..00f687d8fd9edf487e2d9c77ac03bb63de4ec0b8 100644 (file)
@@ -467,6 +467,9 @@ void HUD_Panel_ExportCfg(string cfgname)
                                case HUD_PANEL_WEAPONICONS:
                                        fputs(fh, strcat("seta hud_", panel_name, "_complainbubble \"", cvar_string(strcat("hud_", panel_name, "_complainbubble")), "\"", "\n"));
                                        fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_padding \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_padding")), "\"", "\n"));
+                                       fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_outofammo \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_outofammo")), "\"", "\n"));
+                                       fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_donthave \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_donthave")), "\"", "\n"));
+                                       fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_unavailable \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_unavailable")), "\"", "\n"));
                                        fputs(fh, strcat("seta hud_", panel_name, "_ammo_color \"", cvar_string(strcat("hud_", panel_name, "_ammo_color")), "\"", "\n"));
                                        fputs(fh, strcat("seta hud_", panel_name, "_ammo_alpha \"", cvar_string(strcat("hud_", panel_name, "_ammo_alpha")), "\"", "\n"));
                                        fputs(fh, strcat("seta hud_", panel_name, "_aspect \"", cvar_string(strcat("hud_", panel_name, "_ammo_alpha")), "\"", "\n"));
@@ -1236,7 +1239,7 @@ void HUD_Panel_Mouse()
        if(highlightedPanel != -1)
                highlightedPanel_prev = highlightedPanel;
 
-       mousepos = mousepos + getmousepos();
+       mousepos = mousepos + getmousepos() * cvar("menu_mouse_speed");
 
        mousepos_x = bound(0, mousepos_x, vid_conwidth);
        mousepos_y = bound(0, mousepos_y, vid_conheight);
@@ -1369,21 +1372,23 @@ float GetAmmoTypeForWep(float i)
        }
 }
 
+#define acc_color(i) stov(cvar_string(strcat("hud_weaponicons_accuracy_color", ftos(i))))
+#define MAX_ACCURACY_LEVELS 10
+float acc_lev[MAX_ACCURACY_LEVELS];
+
 void HUD_WeaponIcons(void)
 {
        if(!autocvar_hud_weaponicons && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_WEAPONICONS;
-       HUD_Panel_UpdateCvarsForId(id);
-       float alpha, stat_weapons; // "constants"
+       active_panel = HUD_PANEL_WEAPONICONS;
+       HUD_Panel_UpdateCvars(weaponicons);
        vector pos, mySize;
-       float i, weapid, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
+       float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt;
 
        pos = panel_pos;
        mySize = panel_size;
 
-       stat_weapons = getstati(STAT_WEAPONS);
        weapon_cnt = 0;
        for(i = WEP_FIRST; i <= WEP_LAST; ++i)
        {
@@ -1455,6 +1460,18 @@ void HUD_WeaponIcons(void)
        vector color;
        vector wpnpos;
        vector wpnsize;
+
+       float acc_levels;
+       if(autocvar_hud_weaponicons_accuracy && !(gametype == GAME_RACE || gametype == GAME_CTS))
+       {
+               acc_levels = tokenize(cvar_string("hud_weaponicons_accuracy_color_levels"));
+               if (acc_levels > MAX_ACCURACY_LEVELS)
+                       acc_levels = MAX_ACCURACY_LEVELS;
+
+               for (i = 0; i < acc_levels; ++i)
+                       acc_lev[i] = stof(argv(i));
+       }
+
        for(i = 0; i < weapon_cnt; ++i)
        {
                wpnpos = pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
@@ -1463,41 +1480,39 @@ void HUD_WeaponIcons(void)
                self = weaponorder[i];
                weapid = self.impulse;
 
-               alpha = (self.weapon == activeweapon) ? 1 : 0.6;
-
-               weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
-               weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
-
                // draw background behind currently selected weapon
                if(self.weapon == activeweapon)
                        drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
 
                // draw the weapon accuracy
-               if(autocvar_hud_weaponicons_accuracy && !(gametype == GAME_RACE || gametype == GAME_CTS))
+               if(acc_levels)
                {
+                       float weapon_hit, weapon_damage;
+                       weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
                        if(weapon_damage)
+                       {
+                               weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
                                weapon_stats = floor(100 * weapon_hit / weapon_damage);
-
-                       // yellow_accuracy = value at which accuracy becomes yellow
-                       if(weapon_stats >= 100) {
-                               color_x = 0;
-                               color_y = 1;
-                       }
-                       else if(weapon_stats > autocvar_hud_weaponicons_accuracy_yellow) {
-                               color_x = 1 - (weapon_stats-autocvar_hud_weaponicons_accuracy_yellow)/(100-autocvar_hud_weaponicons_accuracy_yellow); // red value between 1 -> 0
-                               color_y = 1;
-                       } else {
-                               color_x = 1;
-                               color_y = weapon_stats/autocvar_hud_weaponicons_accuracy_yellow; // green value between 0 -> 1
                        }
-                       color_z = 0;
+
+                       // find the max level lower than weapon_stats
+                       float j;
+                       j = acc_levels-1;
+                       while ( j && weapon_stats < acc_lev[j] )
+                               --j;
+
+                       // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
+                       float factor;
+                       factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
+                       color = acc_color(j);
+                       color = color + factor * (acc_color(j+1) - color);
 
                        if(weapon_damage)
                                drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
                }
 
                // draw the weapon icon
-               if((self.impulse >= 0) && (stat_weapons & self.weapons))
+               if((self.impulse >= 0) && (getstati(STAT_WEAPONS) & self.weapons))
                {
                        drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
 
@@ -1582,18 +1597,18 @@ void HUD_WeaponIcons(void)
                        string s;
                        if(complain_weapon_type == 0) {
                                s = "Out of ammo";
-                               color = '1 0 0';
+                               color = autocvar_hud_weaponicons_complainbubble_color_outofammo;
                        }
                        else if(complain_weapon_type == 1) {
                                s = "Don't have";
-                               color = '1 1 0';
+                               color = autocvar_hud_weaponicons_complainbubble_color_donthave;
                        }
                        else {
                                s = "Unavailable";
-                               color = '1 1 1';
+                               color = autocvar_hud_weaponicons_complainbubble_color_unavailable;
                        }
-                       drawpic_aspect_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, "weapon_complainbubble", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
-                       drawstring_aspect(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, s, eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       drawpic_aspect_skin(wpnpos + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, "weapon_complainbubble", wpnsize - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+                       drawstring_aspect(wpnpos + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, s, wpnsize - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
                }
 
                ++row;
@@ -1698,8 +1713,8 @@ void HUD_Inventory(void)
        if(!autocvar_hud_inventory && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_INVENTORY;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_INVENTORY;
+       HUD_Panel_UpdateCvars(inventory);
        float i, currently_selected;
 
        vector pos, mySize;
@@ -1812,8 +1827,8 @@ void HUD_Powerups(void) {
        if(!autocvar_hud_powerups && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_POWERUPS;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_POWERUPS;
+       HUD_Panel_UpdateCvars(powerups);
        float stat_items;
        stat_items = getstati(STAT_ITEMS);
 
@@ -2017,8 +2032,8 @@ void HUD_HealthArmor(void)
        if(!autocvar_hud_healtharmor && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_HEALTHARMOR;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_HEALTHARMOR;
+       HUD_Panel_UpdateCvars(healtharmor);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2182,10 +2197,10 @@ void HUD_HealthArmor(void)
                        {
                                if(autocvar_hud_healtharmor_baralign == 1 || autocvar_hud_healtharmor_baralign == 3) { // right align
                                        barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200);
-                                       barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+                                       barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
                                } else { // left align
                                        barpos = pos;
-                                       barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+                                       barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
                                }
 
                                HUD_Panel_GetProgressBarColor(leftname)
@@ -2757,8 +2772,8 @@ void HUD_Notify (void)
        if(!autocvar_hud_notify && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_NOTIFY;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_NOTIFY;
+       HUD_Panel_UpdateCvars(notify);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2871,7 +2886,6 @@ void HUD_Notify (void)
                        {
                                s = "notify_death";
                        }
-                       // TODO: ctf icons...
                        else if(killnotify_deathtype[j] == INFO_GOTFLAG)
                        {
                                if(killnotify_victims[j] == "^1RED^7 flag")
@@ -3013,8 +3027,8 @@ void HUD_Timer(void)
        if(!autocvar_hud_timer && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_TIMER;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_TIMER;
+       HUD_Panel_UpdateCvars(timer);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3068,8 +3082,8 @@ void HUD_Radar(void)
        if ((autocvar_hud_radar == 0 || (autocvar_hud_radar != 2 && !teamplay)) && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_RADAR;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_RADAR;
+       HUD_Panel_UpdateCvars(radar);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3196,8 +3210,8 @@ void HUD_Score(void)
        if(!autocvar_hud_score && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_SCORE;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_SCORE;
+       HUD_Panel_UpdateCvars(score);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3225,15 +3239,13 @@ void HUD_Score(void)
                                pl = world;
 
                score = me.(scores[ps_primary]);
-               timer = seconds_tostring(score/TIME_FACTOR);
-               timer = strcat(timer, ":", ftos_decimals(mod(score, TIME_FACTOR), log(TIME_FACTOR)));
+               timer = TIME_ENCODED_TOSTRING(score);
 
                if (pl && ((!(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)) || score)) {
                        // distribution display
                        distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
 
-                       distrtimer = seconds_tostring(distribution/TIME_FACTOR);
-                       distrtimer = strcat(timer, ":", ftos_decimals(mod(distribution, TIME_FACTOR), log(TIME_FACTOR)));
+                       distrtimer = ftos(distribution/pow(10, TIME_DECIMALS));
 
                        if (distribution <= 0) {
                                distribution_color = '0 1 0';
@@ -3325,8 +3337,8 @@ void HUD_RaceTimer (void) {
        if(!autocvar_hud_racetimer && !(gametype == GAME_RACE || gametype == GAME_CTS) && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_RACETIMER;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_RACETIMER;
+       HUD_Panel_UpdateCvars(racetimer);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3477,8 +3489,8 @@ void HUD_VoteWindow(void)
        if(!autocvar_hud_vote && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_VOTE;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_VOTE;
+       HUD_Panel_UpdateCvars(vote);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4062,8 +4074,8 @@ void HUD_ModIcons(void)
        if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_MODICONS;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_MODICONS;
+       HUD_Panel_UpdateCvars(modicons);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4108,8 +4120,8 @@ void HUD_DrawPressedKeys(void)
        if(!(spectatee_status > 0 || autocvar_hud_pressedkeys >= 2 || autocvar__hud_configure))
                return;
 
-       float id = HUD_PANEL_PRESSEDKEYS;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_PRESSEDKEYS;
+       HUD_Panel_UpdateCvars(pressedkeys);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4165,8 +4177,8 @@ void HUD_Chat(void)
                return;
        }
 
-       float id = HUD_PANEL_CHAT;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_CHAT;
+       HUD_Panel_UpdateCvars(chat);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4217,8 +4229,8 @@ void HUD_EngineInfo(void)
        if(!autocvar_hud_engineinfo && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_ENGINEINFO;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_ENGINEINFO;
+       HUD_Panel_UpdateCvars(engineinfo);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4270,8 +4282,8 @@ void HUD_InfoMessages(void)
        if(!autocvar_hud_infomessages && !autocvar__hud_configure)
                return;
 
-       float id = HUD_PANEL_INFOMESSAGES;
-       HUD_Panel_UpdateCvarsForId(id);
+       active_panel = HUD_PANEL_INFOMESSAGES;
+       HUD_Panel_UpdateCvars(infomessages);
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4662,10 +4674,13 @@ void HUD_Main (void)
 
        float f;
        vector color;
-       if(teamplay && autocvar_hud_dock_color_team) {
+       if((teamplay) && autocvar_hud_dock_color_team) {
                f = stof(getplayerkey(player_localentnum - 1, "colors"));
                color = colormapPaletteColor(mod(f, 16), 1) * autocvar_hud_dock_color_team;
        }
+       else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && autocvar_hud_dock_color_team) {
+               color = '1 0 0' * autocvar_hud_dock_color_team;
+       }
        else if(autocvar_hud_dock_color == "shirt") {
                f = stof(getplayerkey(player_localentnum - 1, "colors"));
                color = colormapPaletteColor(floor(f / 16), 0);