]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
Merge branch 'master' into terencehill/itemstime
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index fcdd73601793a940136dd9c117c1fc9bad023a30..2fcab695adbd44d90e0975a44e6fa20d4b7890d3 100644 (file)
@@ -1519,7 +1519,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
        alsoprint = (autocvar_hud_panel_notify_print || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled
        gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
        
-       if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == GAME_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel
+       if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == MAPINFO_TYPE_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel
                return;
 
        if(msg == MSG_SUICIDE) {
@@ -2672,7 +2672,7 @@ void HUD_Score(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_score) return;
-               if(spectatee_status == -1 && (gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(spectatee_status == -1 && (gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_SCORE;
@@ -2860,7 +2860,7 @@ void HUD_RaceTimer (void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_racetimer) return;
-               if(!(gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
                if(spectatee_status == -1) return;
        }
        else
@@ -3012,7 +3012,7 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
+       if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
        {
                vote_active = 1;
                if (autocvar__hud_configure)
@@ -3583,7 +3583,7 @@ void HUD_Mod_Race(vector pos, vector mySize)
 
        // clientside personal record
        string rr;
-       if(gametype == GAME_CTS)
+       if(gametype == MAPINFO_TYPE_CTS)
                rr = CTS_RECORD;
        else
                rr = RACE_RECORD;
@@ -3811,7 +3811,7 @@ void HUD_ModIcons(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_modicons) return;
-               if (gametype != GAME_CTF && gametype != GAME_KEYHUNT && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && gametype != GAME_DOMINATION) return;
+               if (gametype != MAPINFO_TYPE_CTF && gametype != MAPINFO_TYPE_KEYHUNT && gametype != MAPINFO_TYPE_NEXBALL && gametype != MAPINFO_TYPE_CTS && gametype != MAPINFO_TYPE_RACE && gametype != MAPINFO_TYPE_CA && gametype != MAPINFO_TYPE_FREEZETAG && gametype != MAPINFO_TYPE_KEEPAWAY && gametype != MAPINFO_TYPE_DOMINATION) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_MODICONS;
@@ -3842,19 +3842,19 @@ void HUD_ModIcons(void)
        }
 
        // these MUST be ran in order to update mod_active
-       if(gametype == GAME_KEYHUNT)
+       if(gametype == MAPINFO_TYPE_KEYHUNT)
                HUD_Mod_KH(pos, mySize);
-       else if(gametype == GAME_CTF || autocvar__hud_configure)
+       else if(gametype == MAPINFO_TYPE_CTF || autocvar__hud_configure)
                HUD_Mod_CTF(pos, mySize); // forcealpha only needed for ctf icons, as only they are shown in config mode
-       else if(gametype == GAME_NEXBALL)
+       else if(gametype == MAPINFO_TYPE_NEXBALL)
                HUD_Mod_NexBall(pos, mySize);
-       else if(gametype == GAME_CTS || gametype == GAME_RACE)
+       else if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE)
                HUD_Mod_Race(pos, mySize);
-       else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
+       else if(gametype == MAPINFO_TYPE_CA || gametype == MAPINFO_TYPE_FREEZETAG)
                HUD_Mod_CA(pos, mySize);
-       else if(gametype == GAME_DOMINATION)
+       else if(gametype == MAPINFO_TYPE_DOMINATION)
                HUD_Mod_Dom(pos, mySize);
-       else if(gametype == GAME_KEEPAWAY)
+       else if(gametype == MAPINFO_TYPE_KEEPAWAY)
                HUD_Mod_Keepaway(pos, mySize);
 }
 
@@ -4149,9 +4149,9 @@ void HUD_InfoMessages(void)
                        s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey("server info", "+show_info"));
                        drawInfoMessage(s)
 
-                       if(gametype == GAME_ARENA)
+                       if(gametype == MAPINFO_TYPE_ARENA)
                                s = _("^1Wait for your turn to join");
-                       else if(gametype == GAME_LMS)
+                       else if(gametype == MAPINFO_TYPE_LMS)
                        {
                                entity sk;
                                sk = playerslots[player_localnum];
@@ -4212,7 +4212,7 @@ void HUD_InfoMessages(void)
                        drawInfoMessage(s)
                }
 
-               if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
+               if(teamplay && !intermission && !spectatee_status && gametype != MAPINFO_TYPE_CA && teamnagger)
                {
                        float ts_min, ts_max;
                        tm = teams.sort_next;
@@ -4263,7 +4263,7 @@ void HUD_Physics(void)
        {
                if(!autocvar_hud_panel_physics) return;
                if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
-               if(autocvar_hud_panel_physics == 3 && !(gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_PHYSICS;
@@ -4778,6 +4778,185 @@ void HUD_CenterPrint (void)
        }
 }
 
+
+// ItemsTime (#17)
+//
+const float ITEMSTIME_MAXITEMS = 9;
+float ItemsTime_time[ITEMSTIME_MAXITEMS];
+string GetItemsTimePicture(float i)
+{
+       switch(i)
+       {
+               case 0: return "armor";
+               case 1: return "health";
+               case 2: return "strength";
+               case 3: return "shield";
+               case 4: return "health";
+               case 5: return "strength";
+               case 6: return "shield";
+               case 7: return "fuelregen";
+               case 8: return "jetpack";
+               default: return "";
+       }
+}
+
+void DrawItemsTimeItem(vector myPos, vector mySize, float ar, float itemcode)
+{
+       float t;
+       vector color;
+       float picalpha;
+       if(ItemsTime_time[itemcode] <= time)
+       {
+               float BLINK_FACTOR = 0.15;
+               float BLINK_BASE = 0.85;
+               float BLINK_FREQ = 5;
+               picalpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
+       }
+       else
+       {
+               picalpha = 1;
+               t = floor(ItemsTime_time[itemcode] - time + 0.999);
+               if(t < 5)
+                       color = '0.7 0 0';
+               else if(t < 10)
+                       color = '0.7 0.7 0';
+               else
+                       color = '1 1 1';
+       }
+
+       vector picpos, numpos;
+       if(autocvar_hud_panel_itemstime_iconalign)
+       {
+               numpos = myPos;
+               picpos = myPos + eX * (ar - 1) * mySize_y;
+       }
+       else
+       {
+               numpos = myPos + eX * mySize_y;
+               picpos = myPos;
+       }
+
+       if(t > 0 && autocvar_hud_panel_itemstime_progressbar)
+       {
+               vector p_pos, p_size;
+               if(autocvar_hud_panel_itemstime_progressbar_reduced)
+               {
+                       p_pos = numpos;
+                       p_size = eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y;
+               }
+               else
+               {
+                       p_pos = myPos;
+                       p_size = mySize;
+               }
+               HUD_Panel_DrawProgressBar(p_pos, p_size, autocvar_hud_panel_itemstime_progressbar_name, t/autocvar_hud_panel_itemstime_progressbar_maxtime, 0, autocvar_hud_panel_itemstime_iconalign, color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+
+       if(t > 0 && autocvar_hud_panel_itemstime_text)
+               drawstring_aspect(numpos, ftos(t), eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawpic_aspect_skin(picpos, GetItemsTimePicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL);
+}
+
+void HUD_ItemsTime(void)
+{
+       if(!autocvar__hud_configure)
+       {
+               if(!autocvar_hud_panel_itemstime) return;
+               if(spectatee_status == 0) return;
+
+               ItemsTime_time[0] = getstatf(STAT_ARMOR_LARGE_TIME);
+               ItemsTime_time[1] = getstatf(STAT_HEALTH_MEGA_TIME);
+               ItemsTime_time[2] = getstatf(STAT_INVISIBLE_TIME);
+               ItemsTime_time[3] = getstatf(STAT_SPEED_TIME);
+               ItemsTime_time[4] = getstatf(STAT_EXTRALIFE_TIME);
+               ItemsTime_time[5] = getstatf(STAT_STRENGTH_TIME);
+               ItemsTime_time[6] = getstatf(STAT_SHIELD_TIME);
+               ItemsTime_time[7] = getstatf(STAT_FUELREGEN_TIME);
+               ItemsTime_time[8] = getstatf(STAT_JETPACK_TIME);
+       }
+       else
+       {
+               hud_configure_active_panel = HUD_PANEL_ITEMSTIME;
+
+               // do not show here mutators-dependent items
+               ItemsTime_time[0] = time + 25;
+               ItemsTime_time[1] = time + 8;
+               ItemsTime_time[2] = -1;
+               ItemsTime_time[3] = -1;
+               ItemsTime_time[4] = -1;
+               ItemsTime_time[5] = time + 0;
+               ItemsTime_time[6] = time + 4;
+               ItemsTime_time[7] = time + 19;
+               ItemsTime_time[8] = time + 46;
+       }
+
+       float i;
+       float count;
+       if (autocvar_hud_panel_itemstime_showspawned)
+               for (i = 0; i < ITEMSTIME_MAXITEMS; ++i)
+                       count += (ItemsTime_time[i] > time || (ItemsTime_time[i] != -1 && ItemsTime_time[i] <= time));
+       else
+               for (i = 0; i < ITEMSTIME_MAXITEMS; ++i)
+                       count += (ItemsTime_time[i] > time);
+       if (count == 0)
+               return;
+
+       HUD_Panel_UpdateCvars(itemstime);
+       HUD_Panel_ApplyFadeAlpha();
+       vector pos, mySize;
+       pos = panel_pos;
+       mySize = panel_size;
+
+       HUD_Panel_DrawBg(1);
+       if(panel_bg_padding)
+       {
+               pos += '1 1 0' * panel_bg_padding;
+               mySize -= '2 2 0' * panel_bg_padding;
+       }
+
+       float rows, columns, row, column;
+       float ar = max(2, autocvar_hud_panel_itemstime_ratio) + 1;
+       rows = mySize_y/mySize_x;
+       rows = bound(1, floor((sqrt(4 * ar * rows * count + rows * rows) + rows + 0.5) / 2), count);
+
+       columns = ceil(count/rows);
+
+       vector itemstime_size;
+       itemstime_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+
+       local noref vector offset; // fteqcc sucks
+       float newSize;
+       if(itemstime_size_x/itemstime_size_y > ar)
+       {
+               newSize = ar * itemstime_size_y;
+               offset_x = itemstime_size_x - newSize;
+               pos_x += offset_x/2;
+               itemstime_size_x = newSize;
+       }
+       else
+       {
+               newSize = 1/ar * itemstime_size_x;
+               offset_y = itemstime_size_y - newSize;
+               pos_y += offset_y/2;
+               itemstime_size_y = newSize;
+       }
+
+       for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) {
+               if (ItemsTime_time[i] == -1)
+                       continue;
+               if (!autocvar_hud_panel_itemstime_showspawned)
+                       if (ItemsTime_time[i] <= time)
+                               continue;
+               DrawItemsTimeItem(pos + eX * column * (itemstime_size_x + offset_x) + eY * row * (itemstime_size_y + offset_y), itemstime_size, ar, i);
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       column = column + 1;
+               }
+       }
+}
+
 /*
 ==================
 Main HUD system
@@ -4787,9 +4966,9 @@ Main HUD system
 void HUD_Reset (void)
 {
        // reset gametype specific icons
-       if(gametype == GAME_KEYHUNT)
+       if(gametype == MAPINFO_TYPE_KEYHUNT)
                HUD_Mod_KH_Reset();
-       else if(gametype == GAME_CTF)
+       else if(gametype == MAPINFO_TYPE_CTF)
                HUD_Mod_CTF_Reset();
 }
 
@@ -4829,6 +5008,8 @@ switch (id) {\
                 HUD_Physics(); break;\
        case (HUD_PANEL_CENTERPRINT):\
                 HUD_CenterPrint(); break;\
+       case (HUD_PANEL_ITEMSTIME):\
+                HUD_ItemsTime(); break;\
 } ENDS_WITH_CURLY_BRACE
 
 void HUD_Main (void)