]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
Merge branch 'master' into terencehill/physics_panel_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index b69163c9582bc437cded89032bc65cac78bd8203..ef45602716d9033af4af4212bf7778b8a4973a72 100644 (file)
@@ -452,7 +452,7 @@ void HUD_Weapons(void)
        float fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
        
        vector weapon_pos, weapon_size;
-       vector old_panel_size;
+       local noref vector old_panel_size; // fteqcc sucks
        vector color, ammo_color;
        
        // check to see if we want to continue
@@ -506,7 +506,7 @@ void HUD_Weapons(void)
                        }
                }
                for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i)
-                       weaponorder[i] = NULL;
+                       weaponorder[i] = world;
                heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
 
                weaponorder_cmp_str = string_null;
@@ -931,7 +931,7 @@ void HUD_Ammo(void)
                ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
        }
 
-       vector offset;
+       local noref vector offset; // fteqcc sucks
        float newSize;
        if(ammo_size_x/ammo_size_y > 3)
        {
@@ -1940,84 +1940,84 @@ void HUD_KillCenterprint(string s1, string s2, float type, float msg)
        gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
        if(msg == MSG_SUICIDE) {
                if (type == DEATH_TEAMCHANGE) {
-                       centerprint(sprintf(_("You are now on: %s"), s1));
+                       centerprint_hud(sprintf(_("You are now on: %s"), s1));
                } else if (type == DEATH_AUTOTEAMCHANGE) {
-                       centerprint(sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1));
+                       centerprint_hud(sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1));
                } else if (type == DEATH_CAMP) {
                        if(gentle)
-                               centerprint(_("^1Reconsider your tactics, camper!"));
+                               centerprint_hud(_("^1Reconsider your tactics, camper!"));
                        else
-                               centerprint(_("^1Die camper!"));
+                               centerprint_hud(_("^1Die camper!"));
                } else if (type == DEATH_NOAMMO) {
                        if(gentle)
-                               centerprint(_("^1You are reinserted into the game for running out of ammo..."));
+                               centerprint_hud(_("^1You are reinserted into the game for running out of ammo..."));
                        else
-                               centerprint(_("^1You were killed for running out of ammo..."));
+                               centerprint_hud(_("^1You were killed for running out of ammo..."));
                } else if (type == DEATH_ROT) {
                        if(gentle)
-                               centerprint(_("^1You need to preserve your health"));
+                               centerprint_hud(_("^1You need to preserve your health"));
                        else
-                               centerprint(_("^1You grew too old without taking your medicine"));
+                               centerprint_hud(_("^1You grew too old without taking your medicine"));
                } else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
                        if(gentle)
-                               centerprint(_("^1Don't go against team mates!"));
+                               centerprint_hud(_("^1Don't go against team mates!"));
                        else
-                               centerprint(_("^1Don't shoot your team mates!"));
+                               centerprint_hud(_("^1Don't shoot your team mates!"));
                } else if (type == DEATH_QUIET) {
                        // do nothing
                } else { // generic message
                        if(gentle)
-                               centerprint(_("^1You need to be more careful!"));
+                               centerprint_hud(_("^1You need to be more careful!"));
                        else
-                               centerprint(_("^1You killed your own dumb self!"));
+                               centerprint_hud(_("^1You killed your own dumb self!"));
                }
        } else if(msg == MSG_KILL) {
                if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
                        if(gentle) {
-                               centerprint(sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1));
+                               centerprint_hud(sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1));
                        } else {
-                               centerprint(sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1));
+                               centerprint_hud(sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1));
                        }
                } else if (type == KILL_FIRST_BLOOD) {
                        if(gentle) {
-                               centerprint(_("^1First score"));
+                               centerprint_hud(_("^1First score"));
                        } else {
-                               centerprint(_("^1First blood"));
+                               centerprint_hud(_("^1First blood"));
                        }
                } else if (type == KILL_FIRST_VICTIM) {
                        if(gentle) {
-                               centerprint(_("^1First casualty"));
+                               centerprint_hud(_("^1First casualty"));
                        } else {
-                               centerprint(_("^1First victim"));
+                               centerprint_hud(_("^1First victim"));
                        }
                } else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap...
                        if(gentle) {
-                               centerprint(strcat(sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
                        } else {
-                               centerprint(strcat(sprintf(_("^1You typefragged ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You typefragged ^7%s"), s1), s2));
                        }
                } else if (type == KILL_TYPEFRAGGED) {
                        if(gentle) {
-                               centerprint(strcat(sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
                        } else {
-                               centerprint(strcat(sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
                        }
                } else if (type == KILL_FRAG) {
                        if(gentle) {
-                               centerprint(strcat(sprintf(_("^4You scored against ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^4You scored against ^7%s"), s1), s2));
                        } else {
-                               centerprint(strcat(sprintf(_("^4You fragged ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^4You fragged ^7%s"), s1), s2));
                        }
                } else { // generic message
                        if(gentle) {
-                               centerprint(strcat(sprintf(_("^1You were scored against by ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You were scored against by ^7%s"), s1), s2));
                        } else {
-                               centerprint(strcat(sprintf(_("^1You were fragged by ^7%s"), s1), s2));
+                               centerprint_hud(strcat(sprintf(_("^1You were fragged by ^7%s"), s1), s2));
                        }
                }
        } else if(msg == MSG_KILL_ACTION) {
                // TODO: invent more centerprints here?
-               centerprint(_("^1Watch your step!"));
+               centerprint_hud(_("^1Watch your step!"));
        }
 }
 
@@ -2494,8 +2494,8 @@ void HUD_Radar(void)
                c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD);
                c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD);
                span = '0 0 0';
-               span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x);
-               span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y);
+               span_x = max(c0_x, c1_x, c2_x, c3_x) - min(c0_x, c1_x, c2_x, c3_x);
+               span_y = max(c0_y, c1_y, c2_y, c3_y) - min(c0_y, c1_y, c2_y, c3_y);
 
                // max-min distance must fit the radar in x=x, y=y
                bigsize = min(
@@ -2770,7 +2770,7 @@ void HUD_Score(void)
                drawstring_aspect(pos + eX * 0.75 * mySize_x, distribution_str, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
        } else { // teamgames
                float scores_count, row, column, rows, columns;
-               vector offset;
+               local noref vector offset; // fteqcc sucks
                vector score_pos, score_size; //for scores other than myteam
                if (spectatee_status == -1 || autocvar_hud_panel_score_rankings)
                {
@@ -4268,6 +4268,16 @@ void HUD_Physics(void)
                panel_size -= '2 2 0' * panel_bg_padding;
        }
 
+       float acceleration_progressbar_scale;
+       if(autocvar_hud_panel_physics_progressbar && autocvar_hud_panel_physics_acceleration_progressbar_scale > 1)
+               acceleration_progressbar_scale = autocvar_hud_panel_physics_acceleration_progressbar_scale;
+
+       float text_scale;
+       if (autocvar_hud_panel_physics_text_scale <= 0)
+               text_scale = 1;
+       else
+               text_scale = min(autocvar_hud_panel_physics_text_scale, 1);
+
        //compute speed
        float speed, conversion_factor;
        string unit;
@@ -4327,7 +4337,7 @@ void HUD_Physics(void)
        //compute layout
        float panel_ar = panel_size_x/panel_size_y;
        vector speed_offset, acceleration_offset;
-       if (panel_ar >= 5)
+       if (panel_ar >= 5 && !acceleration_progressbar_scale)
        {
                panel_size_x *= 0.5;
                if (autocvar_hud_panel_physics_flip)
@@ -4372,11 +4382,12 @@ void HUD_Physics(void)
        if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 2)
        {
                tmp_size_x = panel_size_x * 0.75;
-               tmp_size_y = panel_size_y;
+               tmp_size_y = panel_size_y * text_scale;
                if (speed_baralign)
                        tmp_offset_x = panel_size_x - tmp_size_x;
                //else
                        //tmp_offset_x = 0;
+               tmp_offset_y = (panel_size_y - tmp_size_y) / 2;
                drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 
                //draw speed unit
@@ -4388,7 +4399,8 @@ void HUD_Physics(void)
                {
                        //tmp_offset_y = 0;
                        tmp_size_x = panel_size_x * (1 - 0.75);
-                       tmp_size_y = panel_size_y * 0.4;
+                       tmp_size_y = panel_size_y * 0.4 * text_scale;
+                       tmp_offset_y = (panel_size_y * 0.4 - tmp_size_y) / 2;
                        drawstring_aspect(panel_pos + speed_offset + tmp_offset, unit, tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                }
        }
@@ -4449,7 +4461,8 @@ void HUD_Physics(void)
                        //top speed
                        tmp_offset_y = panel_size_y * 0.4;
                        tmp_size_x = panel_size_x * (1 - 0.75);
-                       tmp_size_y = panel_size_y - tmp_offset_y;
+                       tmp_size_y = (panel_size_y - tmp_offset_y) * text_scale;
+                       tmp_offset_y += (panel_size_y - tmp_offset_y - tmp_size_y) / 2;
                        drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(top_speed), tmp_size, '1 0 0', f * panel_fg_alpha, DRAWFLAG_NORMAL);
                }
                else
@@ -4464,10 +4477,37 @@ void HUD_Physics(void)
                        HUD_Panel_GetProgressBarColor(acceleration_neg);
                else
                        HUD_Panel_GetProgressBarColor(acceleration);
-               HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset, panel_size, "accelbar", acceleration/autocvar_hud_panel_physics_acceleration_max, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+
+               f = acceleration/autocvar_hud_panel_physics_acceleration_max;
+               if (autocvar_hud_panel_physics_acceleration_progressbar_nonlinear)
+                       f = sqrt(f);
+
+               if (acceleration_progressbar_scale) // allow progressbar to go out of panel bounds
+               {
+                       tmp_size = acceleration_progressbar_scale * panel_size_x * eX + panel_size_y * eY;
+
+                       if (acceleration_baralign == 1)
+                               tmp_offset_x = panel_size_x - tmp_size_x;
+                       else if (acceleration_baralign == 2 || acceleration_baralign == 3)
+                               tmp_offset_x = (panel_size_x - tmp_size_x) / 2;
+                       else
+                               tmp_offset_x = 0;
+                       tmp_offset_y = 0;
+               }
+               else
+               {
+                       tmp_size = panel_size;
+                       tmp_offset = '0 0 0';
+               }
+
+               HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset + tmp_offset, tmp_size, "accelbar", f, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
+       tmp_size_x = panel_size_x;
+       tmp_size_y = panel_size_y * text_scale;
+       tmp_offset_x = 0;
+       tmp_offset_y = (panel_size_y - tmp_size_y) / 2;
        if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3)
-               drawstring_aspect(panel_pos + acceleration_offset, strcat(ftos_decimals(acceleration, 2), "g"), panel_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawstring_aspect(panel_pos + acceleration_offset + tmp_offset, strcat(ftos_decimals(acceleration, 2), "g"), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 }
 
 // CenterPrint (#16)
@@ -4555,7 +4595,7 @@ void centerprint_generic(float new_id, string strMessage, float duration, float
        centerprint_countdown_num[j] = countdown_num;
 }
 
-void centerprint(string strMessage)
+void centerprint_hud(string strMessage)
 {
        centerprint_generic(0, strMessage, autocvar_hud_panel_centerprint_time, 0);
 }
@@ -4598,7 +4638,7 @@ void HUD_CenterPrint (void)
                        else if (r > 0.8)
                                centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0);
                        else
-                               centerprint(sprintf("Message at time %s", seconds_tostring(time)));
+                               centerprint_hud(sprintf("Message at time %s", seconds_tostring(time)));
                        hud_configure_cp_generation_time = time + 1 + random()*4;
                }
        }
@@ -4615,9 +4655,14 @@ void HUD_CenterPrint (void)
                if (scoreboard_bottom >= 0.96 * vid_conheight)
                        return;
                vector target_pos;
+               
                target_pos = eY * scoreboard_bottom + eX * 0.5 * (vid_conwidth - panel_size_x);
-               panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha);
-               panel_size_y = min(panel_size_y, vid_conheight - scoreboard_bottom);
+               
+               if(target_pos_y > panel_pos_y)
+               {
+                       panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha);
+                       panel_size_y = min(panel_size_y, vid_conheight - scoreboard_bottom);
+               }
        }
 
        HUD_Panel_DrawBg(1);
@@ -4668,12 +4713,15 @@ void HUD_CenterPrint (void)
                                continue;
                }
                
-               // fade the centerprint in/out 
+               // fade the centerprint_hud in/out 
                if (centerprint_time[j] < 0 || centerprint_expire_time[j] - autocvar_hud_panel_centerprint_fade_out > time)
                        a = bound(0, (time - (centerprint_expire_time[j] - centerprint_time[j])) / max(0.0001, autocvar_hud_panel_centerprint_fade_in), 1);
                else if (centerprint_expire_time[j] > time)
                        a = (centerprint_expire_time[j] - time) / max(0.0001, autocvar_hud_panel_centerprint_fade_out);
                
+               // set the size from fading in/out before subsequent fading
+               sz = autocvar_hud_panel_centerprint_fade_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_minfontsize); 
+               
                // also fade it based on positioning
                if(autocvar_hud_panel_centerprint_fade_subsequent)
                {
@@ -4681,14 +4729,15 @@ void HUD_CenterPrint (void)
                        a = a * bound(autocvar_hud_panel_centerprint_fade_subsequent_passtwo_minalpha, (1 - (i / max(1, autocvar_hud_panel_centerprint_fade_subsequent_passtwo))), 1); // pass two: after that, gradually lower alpha even more for each message
                }
                
-               // finally set the size based on the new alpha
-               sz = autocvar_hud_panel_centerprint_fade_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_minfontsize); 
+               // finally set the size based on the new alpha from subsequent fading
+               sz = sz * (autocvar_hud_panel_centerprint_fade_subsequent_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_subsequent_minfontsize)); 
                drawfontscale = sz * '1 1 0';
                
                if (centerprint_countdown_num[j])
                        n = tokenizebyseparator(sprintf(centerprint_messages[j], centerprint_countdown_num[j]), "\n");
                else
                        n = tokenizebyseparator(centerprint_messages[j], "\n");
+
                if (autocvar_hud_panel_centerprint_flip)
                {
                        // check if the message can be entirely shown
@@ -4702,12 +4751,6 @@ void HUD_CenterPrint (void)
                                                pos_y -= fontsize_y;
                                        else
                                                pos_y -= fontsize_y * CENTERPRINT_SPACING/2;
-                                       // NOTE: uncommented so as to not reject messages whenever they are "too large" -- This just continues drawing it anyway.
-                                       //if (pos_y < panel_pos_y) // check if the next line can be shown
-                                       //{
-                                       //      drawfontscale = '1 1 0';
-                                       //      return;
-                                       //}
                                }
                        }
                        current_msg_pos_y = pos_y; // save starting pos (first line) of the current message
@@ -4729,12 +4772,6 @@ void HUD_CenterPrint (void)
                                }
                                else
                                        pos_y += fontsize_y * CENTERPRINT_SPACING/2;
-                               // NOTE: uncommented so as to not reject messages whenever they are "too large" -- This just continues drawing it anyway.
-                               //if (!autocvar_hud_panel_centerprint_flip && pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next line can be shown
-                               //{
-                               //      drawfontscale = '1 1 0';
-                               //      return;
-                               //}
                        }
                }
                msg_size = pos_y - msg_size;
@@ -4743,12 +4780,24 @@ void HUD_CenterPrint (void)
                        pos_y = current_msg_pos_y - CENTERPRINT_SPACING * fontsize_y;
                        if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
                                pos_y += (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(sz));
+                               
+                       if (pos_y < panel_pos_y) // check if the next message can be shown
+                       {
+                               drawfontscale = '1 1 0';
+                               return;
+                       }
                }
                else
                {
                        pos_y += CENTERPRINT_SPACING * fontsize_y;
                        if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
                                pos_y -= (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(sz));
+                               
+                       if(pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next message can be shown
+                       {
+                               drawfontscale = '1 1 0';
+                               return;
+                       }
                }
        }
        drawfontscale = '1 1 0';
@@ -4883,7 +4932,7 @@ void HUD_Main (void)
                vector color;
                float hud_dock_color_team = autocvar_hud_dock_color_team;
                if((teamplay) && hud_dock_color_team) {
-                       f = stof(getplayerkey(current_player - 1, "colors"));
+                       f = stof(getplayerkeyvalue(current_player - 1, "colors"));
                        color = colormapPaletteColor(mod(f, 16), 1) * hud_dock_color_team;
                }
                else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && hud_dock_color_team) {
@@ -4893,11 +4942,11 @@ void HUD_Main (void)
                {
                        string hud_dock_color = autocvar_hud_dock_color;
                        if(hud_dock_color == "shirt") {
-                               f = stof(getplayerkey(current_player - 1, "colors"));
+                               f = stof(getplayerkeyvalue(current_player - 1, "colors"));
                                color = colormapPaletteColor(floor(f / 16), 0);
                        }
                        else if(hud_dock_color == "pants") {
-                               f = stof(getplayerkey(current_player - 1, "colors"));
+                               f = stof(getplayerkeyvalue(current_player - 1, "colors"));
                                color = colormapPaletteColor(mod(f, 16), 1);
                        }
                        else