From d28cca0c0ed2f6dd6c98cbd02488d3c02a27038e Mon Sep 17 00:00:00 2001 From: terencehill Date: Sun, 27 Aug 2023 00:21:39 +0200 Subject: [PATCH] Show spectator list on all minigames --- qcsrc/common/minigames/cl_minigames.qc | 45 +++++++++++++++++++++++++ qcsrc/common/minigames/cl_minigames.qh | 3 ++ qcsrc/common/minigames/minigame/bd.qc | 2 ++ qcsrc/common/minigames/minigame/c4.qc | 38 +-------------------- qcsrc/common/minigames/minigame/nmm.qc | 2 ++ qcsrc/common/minigames/minigame/pong.qc | 2 ++ qcsrc/common/minigames/minigame/pp.qc | 2 ++ qcsrc/common/minigames/minigame/ps.qc | 2 ++ qcsrc/common/minigames/minigame/ttt.qc | 30 ++--------------- 9 files changed, 61 insertions(+), 65 deletions(-) diff --git a/qcsrc/common/minigames/cl_minigames.qc b/qcsrc/common/minigames/cl_minigames.qc index eaf8e0d65..68fa2ac37 100644 --- a/qcsrc/common/minigames/cl_minigames.qc +++ b/qcsrc/common/minigames/cl_minigames.qc @@ -246,6 +246,51 @@ NET_HANDLE(ENT_CLIENT_MINIGAME, bool isnew) #undef FIELD #undef MSLE +void minigame_show_allspecs(vector boardpos, vector boardsize) +{ + 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); + } +} + string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw) { string s = getWrappedLine_remaining; diff --git a/qcsrc/common/minigames/cl_minigames.qh b/qcsrc/common/minigames/cl_minigames.qh index 5b4b8a3bd..66c3793d8 100644 --- a/qcsrc/common/minigames/cl_minigames.qh +++ b/qcsrc/common/minigames/cl_minigames.qh @@ -44,6 +44,9 @@ vector minigame_hud_denormalize_size(vector v, vector pos, vector mySize); // Check if the mouse is inside the given area bool minigame_hud_mouse_in(vector pos, vector sz); +// show spectator list above the board +void minigame_show_allspecs(vector boardpos, vector boardsize); + // Like drawstring, but wrapping words to fit maxwidth // returns the size of the drawn area // align selects the string alignment (0 = left, 0.5 = center, 1 = right) diff --git a/qcsrc/common/minigames/minigame/bd.qc b/qcsrc/common/minigames/minigame/bd.qc index 635d1b8d5..c918ac9da 100644 --- a/qcsrc/common/minigames/minigame/bd.qc +++ b/qcsrc/common/minigames/minigame/bd.qc @@ -1119,6 +1119,8 @@ void bd_hud_board(vector pos, vector mySize) minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos, victory_text, winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } + + minigame_show_allspecs(bd_boardpos, bd_boardsize); } diff --git a/qcsrc/common/minigames/minigame/c4.qc b/qcsrc/common/minigames/minigame/c4.qc index 3f9454f04..ccf94c8d8 100644 --- a/qcsrc/common/minigames/minigame/c4.qc +++ b/qcsrc/common/minigames/minigame/c4.qc @@ -256,12 +256,6 @@ void c4_hud_board(vector pos, vector mySize) c4_boardpos = pos; c4_boardsize = mySize; - string allspecs = ""; - float allspecs_width = 0; - float max_allspecs_width = c4_boardsize.x; - float max_current_spec_width = hud_fontsize.x * 5; - float allspecs_lines = 2; - minigame_hud_simpleboard(pos,mySize,minigame_texture("c4/board_under")); drawpic(pos, minigame_texture("c4/board_over"), mySize, '1 1 1', 1, 0); @@ -305,28 +299,6 @@ void c4_hud_board(vector pos, vector mySize) minigame_texture(strcat("c4/piece",ftos(e.team))), tile_size, '1 1 1'*icon_color, panel_fg_alpha, DRAWFLAG_NORMAL ); } - - 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 ( active_minigame.minigame_flags & C4_TURN_WIN ) @@ -351,15 +323,7 @@ void c4_hud_board(vector pos, vector mySize) winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } - if (allspecs != "") - { - pos = c4_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); - } + minigame_show_allspecs(c4_boardpos, c4_boardsize); } diff --git a/qcsrc/common/minigames/minigame/nmm.qc b/qcsrc/common/minigames/minigame/nmm.qc index ea7f3b42c..fbc6df231 100644 --- a/qcsrc/common/minigames/minigame/nmm.qc +++ b/qcsrc/common/minigames/minigame/nmm.qc @@ -495,6 +495,8 @@ void nmm_hud_board(vector pos, vector mySize) sprintf(_("%s^7 won the game!"), pname), winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } + + minigame_show_allspecs(nmm_boardpos, nmm_boardsize); } // Required function, draw the game status panel diff --git a/qcsrc/common/minigames/minigame/pong.qc b/qcsrc/common/minigames/minigame/pong.qc index 698ccfb55..baf7cf285 100644 --- a/qcsrc/common/minigames/minigame/pong.qc +++ b/qcsrc/common/minigames/minigame/pong.qc @@ -575,6 +575,8 @@ void pong_hud_board(vector pos, vector mySize) } } + + minigame_show_allspecs(pos, mySize); } // Required function, draw the game status panel diff --git a/qcsrc/common/minigames/minigame/pp.qc b/qcsrc/common/minigames/minigame/pp.qc index 9a7e54234..6cdca1add 100644 --- a/qcsrc/common/minigames/minigame/pp.qc +++ b/qcsrc/common/minigames/minigame/pp.qc @@ -374,6 +374,8 @@ void pp_hud_board(vector pos, vector mySize) sprintf(_("%s^7 won the game!"), pname), winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } + + minigame_show_allspecs(pp_boardpos, pp_boardsize); } diff --git a/qcsrc/common/minigames/minigame/ps.qc b/qcsrc/common/minigames/minigame/ps.qc index 97bdfa612..b86628beb 100644 --- a/qcsrc/common/minigames/minigame/ps.qc +++ b/qcsrc/common/minigames/minigame/ps.qc @@ -431,6 +431,8 @@ void ps_hud_board(vector pos, vector mySize) strcat(_("Game over!"), " ", remaining_text), winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } + + minigame_show_allspecs(ps_boardpos, ps_boardsize); } diff --git a/qcsrc/common/minigames/minigame/ttt.qc b/qcsrc/common/minigames/minigame/ttt.qc index a78a6468a..d67aa15ea 100644 --- a/qcsrc/common/minigames/minigame/ttt.qc +++ b/qcsrc/common/minigames/minigame/ttt.qc @@ -277,6 +277,8 @@ void ttt_hud_board(vector pos, vector mySize) tile_size, '1 1 1'*icon_color, panel_fg_alpha, DRAWFLAG_NORMAL ); } } + + minigame_show_allspecs(ttt_boardpos, ttt_boardsize); } @@ -298,7 +300,6 @@ void ttt_hud_status(vector pos, vector mySize) vector tile_size = '48 48 0'; entity e; - string allspecs = ""; FOREACH_MINIGAME_ENTITY(e) { if ( e.classname == "minigame_player" && e.team != TTT_SPECTATOR_TEAM ) @@ -320,33 +321,6 @@ void ttt_hud_status(vector pos, vector mySize) drawstring(mypos,ftos(e.minigame_flags),tile_size, '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL); } - - if (e.classname == "minigame_player" && e.team == TTT_SPECTATOR_TEAM) - { - string current_spec = ""; - - string cmpctString = entcs_GetName(e.minigame_playerslot - 1); - if (strlennocol(cmpctString) > 8) - { - int new_length = textLengthUpToLength(cmpctString, 8, strlennocol); - cmpctString = strcat(substring(cmpctString, 0, new_length), ".."); - } - if (strlen(allspecs) > 0) - current_spec = strcat(",", cmpctString); - else - current_spec = cmpctString; - if (strlen(allspecs) < 90) - allspecs = strcat(allspecs, current_spec); - } - } - if (strlen(allspecs) > 0) - { - pos_y = pos_y * 0.3; - pos_x = pos_x * 0.41; - - ts = minigame_drawstring_wrapped(mySize_x * 1.7, pos, "Spectators: ", '14 14 0', '0.85 0.47 0.42', panel_fg_alpha, DRAWFLAG_NORMAL, 0); - pos_y += 14; - ts = minigame_drawcolorcodedstring_wrapped(mySize_x * 1.7, pos, allspecs, hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL, 0); } } -- 2.39.2