]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
Merge branch 'master' into divVerent/4team_ctf
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index 469fe67fa27d1524e8f541adaf86602b46f3be90..d4de8f9d12b834a4fa20350eb340a4d176e05190 100644 (file)
@@ -264,7 +264,7 @@ HUD panels
 
 // draw the background/borders
 #define HUD_Panel_DrawBg(theAlpha)\
-if(panel_bg != "0")\
+if(panel_bg != "0" && panel_bg != "")\
        draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * theAlpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER))
 
 //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu
@@ -447,8 +447,7 @@ float GetAmmoTypeForWep(float i)
 void HUD_Weapons(void)
 {
        // declarations
-       WEPSET_DECLARE_A(weapons_stat);
-       WEPSET_COPY_AS(weapons_stat);
+       WepSet weapons_stat = WepSet_GetFromStat();
        float i, f, a;
        float screen_ar, center_x = 0, center_y;
        float weapon_count, weapon_id;
@@ -532,9 +531,9 @@ void HUD_Weapons(void)
        {
                if(autocvar__hud_configure)
                {
-                       if (WEPSET_EMPTY_A(weapons_stat))
+                       if (!weapons_stat)
                                for(i = WEP_FIRST; i <= WEP_LAST; i += floor((WEP_LAST-WEP_FIRST)/5))
-                                       WEPSET_OR_AW(weapons_stat, i);
+                                       weapons_stat |= WepSet_FromWeapon(i);
 
                        if(menu_enabled != 2)
                                HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
@@ -543,7 +542,7 @@ void HUD_Weapons(void)
                // do we own this weapon?
                weapon_count = 0;
                for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
-                       if(WEPSET_CONTAINS_AW(weapons_stat, weaponorder[i].weapon))
+                       if(weapons_stat & WepSet_FromWeapon(weaponorder[i].weapon))
                                ++weapon_count;
 
                // add it anyway if weaponcomplain is shown
@@ -735,7 +734,7 @@ void HUD_Weapons(void)
 
                // skip this weapon if we don't own it (and onlyowned is enabled)-- or if weapons_complainbubble is showing for this weapon
                if(autocvar_hud_panel_weapons_onlyowned)
-               if not(WEPSET_CONTAINS_AW(weapons_stat, self.weapon) || (self.weapon == complain_weapon))
+               if not((weapons_stat & WepSet_FromWeapon(self.weapon)) || (self.weapon == complain_weapon))
                        continue;
 
                // figure out the drawing position of weapon
@@ -759,7 +758,7 @@ void HUD_Weapons(void)
                }
 
                // drawing all the weapon items
-               if(WEPSET_CONTAINS_AW(weapons_stat, self.weapon))
+               if(weapons_stat & WepSet_FromWeapon(self.weapon))
                {
                        // draw the weapon image
                        drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
@@ -2731,30 +2730,42 @@ void HUD_Mod_CA(vector myPos, vector mySize)
 }
 
 // CTF HUD modicon section
-float redflag_prevframe, blueflag_prevframe; // status during previous frame
-float redflag_prevstatus, blueflag_prevstatus; // last remembered status
-float redflag_statuschange_time, blueflag_statuschange_time; // time when the status changed
+float redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe; // status during previous frame
+float redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus; // last remembered status
+float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time; // time when the status changed
 
 void HUD_Mod_CTF_Reset(void)
 {
-       redflag_prevstatus = blueflag_prevstatus = redflag_prevframe = blueflag_prevframe = redflag_statuschange_time = blueflag_statuschange_time = 0;
+       redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = 0;
+       redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = 0;
+       redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = 0;
 }
 
 void HUD_Mod_CTF(vector pos, vector mySize)
 {
-       vector redflag_pos, blueflag_pos;
+       vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos;
        vector flag_size;
        float f; // every function should have that
 
-       float redflag, blueflag; // current status
-       float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime; // time since the status changed
+       float redflag, blueflag, yellowflag, pinkflag; // current status
+       float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime, yellowflag_statuschange_elapsedtime, pinkflag_statuschange_elapsedtime; // time since the status changed
        float stat_items;
+       float teams_count = 0;
+       float fs, fs2, fs3, size1, size2;
+       vector e1, e2;
+       entity tm;
+       
+       for(tm = teams.sort_next; tm; tm = tm.sort_next)
+       if(tm.team != NUM_SPECTATOR)
+               ++teams_count;
 
        stat_items = getstati(STAT_ITEMS, 0, 24);
        redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
        blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
+       yellowflag = (stat_items/IT_YELLOW_FLAG_TAKEN) & 3;
+       pinkflag = (stat_items/IT_PINK_FLAG_TAKEN) & 3;
        
-       if(redflag || blueflag)
+       if(redflag || blueflag || yellowflag || pinkflag)
                mod_active = 1;
        else
                mod_active = 0;
@@ -2763,6 +2774,10 @@ void HUD_Mod_CTF(vector pos, vector mySize)
        {
                redflag = 1;
                blueflag = 2;
+               if(teams_count >= 3)
+                       yellowflag = 2;
+               if(teams_count >= 4)
+                       pinkflag = 3;
        }
 
        // when status CHANGES, set old status into prevstatus and current status into status
@@ -2779,9 +2794,25 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                blueflag_prevstatus = blueflag_prevframe;
                blueflag_prevframe = blueflag;
        }
+       
+       if (yellowflag != yellowflag_prevframe)
+       {
+               yellowflag_statuschange_time = time;
+               yellowflag_prevstatus = yellowflag_prevframe;
+               yellowflag_prevframe = yellowflag;
+       }
+
+       if (pinkflag != pinkflag_prevframe)
+       {
+               pinkflag_statuschange_time = time;
+               pinkflag_prevstatus = pinkflag_prevframe;
+               pinkflag_prevframe = pinkflag;
+       }
 
        redflag_statuschange_elapsedtime = time - redflag_statuschange_time;
        blueflag_statuschange_elapsedtime = time - blueflag_statuschange_time;
+       yellowflag_statuschange_elapsedtime = time - yellowflag_statuschange_time;
+       pinkflag_statuschange_elapsedtime = time - pinkflag_statuschange_time;
 
        float BLINK_FACTOR = 0.15;
        float BLINK_BASE = 0.85;
@@ -2800,7 +2831,7 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                case 2: red_icon = "flag_red_lost"; break;
                case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
                default:
-                       if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2))
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_1))
                                red_icon = "flag_red_shielded";
                        else
                                red_icon = string_null;
@@ -2813,7 +2844,7 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                default:
                        if(redflag == 3)
                                red_icon_prevstatus = "flag_red_carrying"; // make it more visible
-                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2))
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_1))
                                red_icon_prevstatus = "flag_red_shielded";
                        else
                                red_icon_prevstatus = string_null;
@@ -2828,7 +2859,7 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                case 2: blue_icon = "flag_blue_lost"; break;
                case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
                default:
-                       if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1))
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_2))
                                blue_icon = "flag_blue_shielded";
                        else
                                blue_icon = string_null;
@@ -2841,32 +2872,129 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                default:
                        if(blueflag == 3)
                                blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible
-                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1))
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_2))
                                blue_icon_prevstatus = "flag_blue_shielded";
                        else
                                blue_icon_prevstatus = string_null;
                        break;
        }
-
-       if(mySize_x > mySize_y) {
-               if (myteam == NUM_TEAM_1) { // always draw own flag on left
+       
+       string yellow_icon, yellow_icon_prevstatus;
+       float yellow_alpha, yellow_alpha_prevstatus;
+       yellow_alpha = yellow_alpha_prevstatus = 1;
+       switch(yellowflag) {
+               case 1: yellow_icon = "flag_yellow_taken"; break;
+               case 2: yellow_icon = "flag_yellow_lost"; break;
+               case 3: yellow_icon = "flag_yellow_carrying"; yellow_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_3))
+                               yellow_icon = "flag_yellow_shielded";
+                       else
+                               yellow_icon = string_null;
+                       break;
+       }
+       switch(yellowflag_prevstatus) {
+               case 1: yellow_icon_prevstatus = "flag_yellow_taken"; break;
+               case 2: yellow_icon_prevstatus = "flag_yellow_lost"; break;
+               case 3: yellow_icon_prevstatus = "flag_yellow_carrying"; yellow_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if(yellowflag == 3)
+                               yellow_icon_prevstatus = "flag_yellow_carrying"; // make it more visible
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_3))
+                               yellow_icon_prevstatus = "flag_yellow_shielded";
+                       else
+                               yellow_icon_prevstatus = string_null;
+                       break;
+       }
+       
+       string pink_icon, pink_icon_prevstatus;
+       float pink_alpha, pink_alpha_prevstatus;
+       pink_alpha = pink_alpha_prevstatus = 1;
+       switch(pinkflag) {
+               case 1: pink_icon = "flag_pink_taken"; break;
+               case 2: pink_icon = "flag_pink_lost"; break;
+               case 3: pink_icon = "flag_pink_carrying"; pink_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_4))
+                               pink_icon = "flag_pink_shielded";
+                       else
+                               pink_icon = string_null;
+                       break;
+       }
+       switch(pinkflag_prevstatus) {
+               case 1: pink_icon_prevstatus = "flag_pink_taken"; break;
+               case 2: pink_icon_prevstatus = "flag_pink_lost"; break;
+               case 3: pink_icon_prevstatus = "flag_pink_carrying"; pink_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if(pinkflag == 3)
+                               pink_icon_prevstatus = "flag_pink_carrying"; // make it more visible
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam != NUM_TEAM_4))
+                               pink_icon_prevstatus = "flag_pink_shielded";
+                       else
+                               pink_icon_prevstatus = string_null;
+                       break;
+       }
+       
+       switch(teams_count)
+       {
+               default:
+               case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break;
+               case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break;
+               case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break;
+       }
+       
+       if(mySize_x > mySize_y)
+       {
+               size1 = mySize_x;
+               size2 = mySize_y;
+               e1 = eX;
+               e2 = eY;
+       }
+       else
+       {
+               size1 = mySize_y;
+               size2 = mySize_x;
+               e1 = eY;
+               e2 = eX;
+       }
+       
+       switch(myteam)
+       {
+               default:
+               case NUM_TEAM_1:
+               {
                        redflag_pos = pos;
-                       blueflag_pos = pos + eX * 0.5 * mySize_x;
-               } else {
-                       blueflag_pos = pos;
-                       redflag_pos = pos + eX * 0.5 * mySize_x;
+                       blueflag_pos = pos + eX * fs2 * size1;
+                       yellowflag_pos = pos - eX * fs2 * size1;
+                       pinkflag_pos = pos + eX * fs3 * size1;
+                       break;
                }
-               flag_size = eX * 0.5 * mySize_x + eY * mySize_y;
-       } else {
-               if (myteam == NUM_TEAM_1) { // always draw own flag on left
-                       redflag_pos = pos;
-                       blueflag_pos = pos + eY * 0.5 * mySize_y;
-               } else {
+               case NUM_TEAM_2:
+               {
+                       redflag_pos = pos + eX * fs2 * size1;
                        blueflag_pos = pos;
-                       redflag_pos = pos + eY * 0.5 * mySize_y;
+                       yellowflag_pos = pos - eX * fs2 * size1;
+                       pinkflag_pos = pos + eX * fs3 * size1;
+                       break;
+               }
+               case NUM_TEAM_3:
+               {
+                       redflag_pos = pos + eX * fs3 * size1;
+                       blueflag_pos = pos - eX * fs2 * size1;
+                       yellowflag_pos = pos;
+                       pinkflag_pos = pos + eX * fs2 * size1;
+                       break;
+               }
+               case NUM_TEAM_4:
+               {
+                       redflag_pos = pos - eX * fs2 * size1;
+                       blueflag_pos = pos + eX * fs3 * size1;
+                       yellowflag_pos = pos + eX * fs2 * size1;
+                       pinkflag_pos = pos;
+                       break;
                }
-               flag_size = eY * 0.5 * mySize_y + eX * mySize_x;
        }
+       flag_size = e1 * fs * size1 + e2 * size2;
 
        f = bound(0, redflag_statuschange_elapsedtime*2, 1);
        if(red_icon_prevstatus && f < 1)
@@ -2879,6 +3007,18 @@ void HUD_Mod_CTF(vector pos, vector mySize)
                drawpic_aspect_skin_expanding(blueflag_pos, blue_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * blue_alpha_prevstatus, DRAWFLAG_NORMAL, f);
        if(blue_icon)
                drawpic_aspect_skin(blueflag_pos, blue_icon, flag_size, '1 1 1', panel_fg_alpha * blue_alpha * f, DRAWFLAG_NORMAL);
+               
+       f = bound(0, yellowflag_statuschange_elapsedtime*2, 1);
+       if(yellow_icon_prevstatus && f < 1)
+               drawpic_aspect_skin_expanding(yellowflag_pos, yellow_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * yellow_alpha_prevstatus, DRAWFLAG_NORMAL, f);
+       if(yellow_icon)
+               drawpic_aspect_skin(yellowflag_pos, yellow_icon, flag_size, '1 1 1', panel_fg_alpha * yellow_alpha * f, DRAWFLAG_NORMAL);
+               
+       f = bound(0, pinkflag_statuschange_elapsedtime*2, 1);
+       if(pink_icon_prevstatus && f < 1)
+               drawpic_aspect_skin_expanding(pinkflag_pos, pink_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * pink_alpha_prevstatus, DRAWFLAG_NORMAL, f);
+       if(pink_icon)
+               drawpic_aspect_skin(pinkflag_pos, pink_icon, flag_size, '1 1 1', panel_fg_alpha * pink_alpha * f, DRAWFLAG_NORMAL);
 }
 
 // Keyhunt HUD modicon section
@@ -3140,7 +3280,7 @@ void HUD_Mod_Race(vector pos, vector mySize)
                if(autocvar_cl_autodemo_delete_keeprecords)
                {
                        f = autocvar_cl_autodemo_delete;
-                       f &~= 1;
+                       f &= ~1;
                        cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
                }
        }
@@ -4209,7 +4349,7 @@ void HUD_CenterPrint (void)
                        float r;
                        r = random();
                        if (r > 0.9)
-                               centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: %d"), 1, 10);
+                               centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 1, 10);
                        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
@@ -4593,7 +4733,7 @@ void HUD_Main (void)
                                hud_panel[panel_order[i]].update_time = time;
                }
        }
-       else if (hud_configure_prev && autocvar_hud_cursormode)
+       else if(hud_configure_prev && hud_configure_prev != -1 && autocvar_hud_cursormode)
                setcursormode(0);
 
        hud_configure_prev = autocvar__hud_configure;