]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/minigames/cl_minigames.qc
Fix FL_WEAPON flag overlapping FL_JUMPRELEASED. This unintentional change was introdu...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / minigames / cl_minigames.qc
index 2e5b30c61cbfae9f5ef5935e4aa4a100e78dd515..a4241ba97b14d4349170db7229cd5700fcf29d21 100644 (file)
@@ -246,14 +246,54 @@ NET_HANDLE(ENT_CLIENT_MINIGAME, bool isnew)
 #undef FIELD
 #undef MSLE
 
-string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw)
+void minigame_show_allspecs(vector boardpos, vector boardsize)
 {
-       int last_word;
-       string s;
-       int take_until;
-       int skip = 0;
+       string allspecs = "";
+       float allspecs_width = 0;
+       float max_allspecs_width = boardsize.x;
+       float max_current_spec_width = hud_fontsize.x * 5;
+       int allspecs_lines = 2;
+
+       entity e;
+       FOREACH_MINIGAME_ENTITY(e)
+       {
+               if (allspecs_width >= 0 && e.classname == "minigame_player" && e.team == C4_SPECTATOR_TEAM)
+               {
+                       string current_spec = ColorTranslateRGB(entcs_GetName(e.minigame_playerslot - 1));
+                       current_spec = textShortenToWidth(current_spec, max_current_spec_width, hud_fontsize, stringwidth_colors);
+                       if (allspecs != "")
+                               current_spec = strcat(", ", current_spec);
+                       else
+                               current_spec = current_spec;
+
+                       allspecs_width = stringwidth(allspecs, true, hud_fontsize);
+
+                       float max_width = max_allspecs_width * allspecs_lines - max_current_spec_width;
+                       if (allspecs_width + stringwidth(current_spec, true, hud_fontsize) < max_width)
+                               allspecs = strcat(allspecs, current_spec);
+                       else
+                       {
+                               // current_spec doesn't fit in the list
+                               allspecs = strcat(allspecs, ", ...");
+                               allspecs_width = -1; // skip remaining spectators
+                       }
+               }
+       }
+
+       if (allspecs != "")
+       {
+               vector pos = boardpos;
+               pos.y -= panel_bg_border + hud_fontsize.y * (1.25 + allspecs_lines + 0.5);
+               minigame_drawstring_wrapped(max_allspecs_width, pos, _("Spectators:"), hud_fontsize * 1.25, '0.85 0.47 0.42', panel_fg_alpha, DRAWFLAG_NORMAL, 0);
+
+               pos.y += hud_fontsize.y * 1.25;
+               minigame_drawcolorcodedstring_wrapped(max_allspecs_width, pos, allspecs, hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL, 0);
+       }
+}
 
-       s = getWrappedLine_remaining;
+string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw)
+{
+       string s = getWrappedLine_remaining;
 
        if(w <= 0)
        {
@@ -261,12 +301,13 @@ string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_
                return s; // the line has no size ANYWAY, nothing would be displayed.
        }
 
-       take_until = textLengthUpToWidth(s, w, theFontSize, tw);
+       int take_until = textLengthUpToWidth(s, w, theFontSize, tw);
 
        if ( take_until > strlen(s) )
                take_until = strlen(s);
 
-       for ( int i = 0; i < take_until; i++ )
+       int skip = 0;
+       for ( int i = 0; i < take_until; ++i )
                if ( substring(s,i,1) == "\n" )
                {
                        take_until = i;
@@ -278,7 +319,7 @@ string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_
        {
                if ( skip == 0 && take_until < strlen(s) )
                {
-                       last_word = take_until;
+                       int last_word = take_until;
                        while(last_word > 0 && substring(s, last_word, 1) != " ")
                                --last_word;
 
@@ -368,7 +409,7 @@ void minigame_cmd_workaround(float dummy, string...cmdargc)
        string cmd;
        cmd = "cmd minigame ";
        float i;
-       for ( i = 0; i < cmdargc; i++ )
+       for ( i = 0; i < cmdargc; ++i )
                cmd = strcat(cmd,...(i,string));
        localcmd(strcat(cmd,"\n"));
 }
@@ -393,6 +434,8 @@ MUTATOR_HOOKFUNCTION(minigames, HUD_Command)
 
        if(argv(1) == "minigame")
        {
+               if (isdemo())
+                       return true; // minigames can't function properly in demo mode
                if (HUD_MinigameMenu_IsOpened())
                        HUD_MinigameMenu_Close(NULL, NULL, NULL);
                else