#include "centerprint.qh"
-#include "scoreboard.qh"
+#include <client/draw.qh>
+#include <client/hud/panel/scoreboard.qh>
#include <common/notifications/all.qh>
-#include <client/defs.qh>
-#include <client/miscfunctions.qh>
// CenterPrint (#16)
+void HUD_CenterPrint_Export(int fh)
+{
+ // allow saving cvars that aesthetically change the panel into hud skin files
+ HUD_Write_Cvar("hud_panel_centerprint_align");
+ HUD_Write_Cvar("hud_panel_centerprint_flip");
+ HUD_Write_Cvar("hud_panel_centerprint_fontscale");
+ HUD_Write_Cvar("hud_panel_centerprint_fontscale_bold");
+ HUD_Write_Cvar("hud_panel_centerprint_time");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_in");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_out");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent_passone");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent_passone_minalpha");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent_passtwo");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent_passtwo_minalpha");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_subsequent_minfontsize");
+ HUD_Write_Cvar("hud_panel_centerprint_fade_minfontsize");
+}
+
+// These are the functions that draw the text at the center of the screen (e.g. frag messages and server MOTD).
+// centerprint_Add parses a message and puts it in the circular buffer centerprint_messages
+// centerprint_Add is usually called by Local_Notification_centerprint_Add, which is called
+// by Local_Notification.
+// HUD_CenterPrint draws all the messages on screen
+
const int CENTERPRINT_MAX_MSGS = 10;
const int CENTERPRINT_MAX_ENTRIES = 50;
const float CENTERPRINT_SPACING = 0.7;
int cpm_index;
string centerprint_messages[CENTERPRINT_MAX_MSGS];
int centerprint_msgID[CENTERPRINT_MAX_MSGS];
+bool centerprint_bold[CENTERPRINT_MAX_MSGS];
float centerprint_time[CENTERPRINT_MAX_MSGS];
float centerprint_expire_time[CENTERPRINT_MAX_MSGS];
int centerprint_countdown_num[CENTERPRINT_MAX_MSGS];
bool centerprint_showing;
-void centerprint_generic(int new_id, string strMessage, float duration, int countdown_num)
+void centerprint_Add(int new_id, string strMessage, float duration, int countdown_num)
{
- TC(int, new_id); TC(int, countdown_num);
- //printf("centerprint_generic(%d, '%s^7', %d, %d);\n", new_id, strMessage, duration, countdown_num);
+ TC(int, new_id); TC(int, countdown_num);
+ //LOG_INFOF("centerprint_Add: ^2id: %d ^3dur: %d ^5countdown: %d\n'%s'", new_id, duration, countdown_num, strreplace("\n", "^7\\n^7", strMessage));
int i, j;
if(strMessage == "" && new_id == 0)
return;
+ // strip BOLD_OPERATOR
+ bool is_bold = (substring(strMessage, 0, 5) == BOLD_OPERATOR);
+ if (is_bold)
+ strMessage = substring(strMessage, 5, -1);
+
// strip trailing newlines
j = strlen(strMessage) - 1;
while(substring(strMessage, j, 1) == "\n" && j >= 0)
j = cpm_index;
}
strcpy(centerprint_messages[j], strMessage);
+ centerprint_bold[j] = is_bold;
centerprint_msgID[j] = new_id;
if (duration < 0)
{
centerprint_countdown_num[j] = countdown_num;
}
-void centerprint_kill(int id)
+void centerprint_Kill(int id)
{
- TC(int, id);
- centerprint_generic(id, "", 0, 0);
+ TC(int, id);
+ centerprint_Add(id, "", 0, 0);
}
-void centerprint_hud(string strMessage)
+void centerprint_AddStandard(string strMessage)
{
- centerprint_generic(0, strMessage, autocvar_hud_panel_centerprint_time, 0);
+ centerprint_Add(0, strMessage, autocvar_hud_panel_centerprint_time, 0);
}
-void reset_centerprint_messages()
+void centerprint_KillAll()
{
for (int i=0; i<CENTERPRINT_MAX_MSGS; ++i)
{
centerprint_expire_time[i] = 0;
centerprint_time[i] = 1;
centerprint_msgID[i] = 0;
+ centerprint_bold[i] = false;
strfree(centerprint_messages[i]);
}
}
+
float hud_configure_cp_generation_time;
-void HUD_CenterPrint ()
+void HUD_CenterPrint()
{
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_centerprint) return;
if(hud_configure_prev)
- reset_centerprint_messages();
+ centerprint_KillAll();
}
else
{
if(!hud_configure_prev)
{
- reset_centerprint_messages();
+ centerprint_KillAll();
hud_configure_cp_generation_time = time; // show a message immediately
}
if (time > hud_configure_cp_generation_time)
float r;
r = random();
if (r > 0.8)
- centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 1, 10);
+ centerprint_Add(floor(r*1000), sprintf(_("^3Countdown message at time %s, seconds left: ^COUNT"), seconds_tostring(time)), 1, 10);
else if (r > 0.55)
- centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0);
+ centerprint_Add(0, sprintf(_("^1Multiline message at time %s that\n^1lasts longer than normal"), seconds_tostring(time)), 20, 0);
else
- centerprint_hud(sprintf("Message at time %s", seconds_tostring(time)));
+ centerprint_AddStandard(sprintf(_("Message at time %s"), seconds_tostring(time)));
hud_configure_cp_generation_time = time + 1 + random()*4;
}
else
{
- centerprint_generic(0, sprintf("Centerprint message", seconds_tostring(time)), 10, 0);
+ centerprint_Add(0, _("Generic message"), 10, 0);
hud_configure_cp_generation_time = time + 10 - random()*3;
}
}
int entries;
float height;
vector fontsize;
- // entries = bound(1, floor(CENTERPRINT_MAX_ENTRIES * 4 * panel_size_y/panel_size_x), CENTERPRINT_MAX_ENTRIES);
- // height = panel_size_y/entries;
- // fontsize = '1 1 0' * height;
- height = vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale;
- fontsize = '1 1 0' * height;
- entries = bound(1, floor(panel_size.y/height), CENTERPRINT_MAX_ENTRIES);
int i, j, k, n, g;
float a, sz, align, current_msg_posY = 0, msg_size;
align = bound(0, autocvar_hud_panel_centerprint_align, 1);
for (g=0, i=0, j=cpm_index; i<CENTERPRINT_MAX_MSGS; ++i, ++j)
{
+ bool is_bold = centerprint_bold[j];
+
+ // entries = bound(1, floor(CENTERPRINT_MAX_ENTRIES * 4 * panel_size_y/panel_size_x), CENTERPRINT_MAX_ENTRIES);
+ // height = panel_size_y/entries;
+ // fontsize = '1 1 0' * height;
+ height = (is_bold) ? vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale_bold : vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale;
+ fontsize = '1 1 0' * height;
+ entries = bound(1, floor(panel_size.y/height), CENTERPRINT_MAX_ENTRIES);
+
if (j == CENTERPRINT_MAX_MSGS)
j = 0;
if (centerprint_expire_time[j] == -1)
all_messages_expired = false;
- // fade the centerprint_hud in/out
+ // fade
if(centerprint_time[j] < 0) // Expired but forced. Expire time is the fade-in time.
a = (time - centerprint_expire_time[j]) / max(0.0001, autocvar_hud_panel_centerprint_fade_in);
else if(centerprint_expire_time[j] - autocvar_hud_panel_centerprint_fade_out > time) // Regularily printed. Not fading out yet.
else // Expiring soon, so fade it out.
a = (centerprint_expire_time[j] - time) / max(0.0001, autocvar_hud_panel_centerprint_fade_out);
- if(centerprint_msgID[j] == CPID_TIMEIN)
+ if(centerprint_msgID[j] == ORDINAL(CPID_TIMEIN))
a = 1;
// while counting down show it anyway in order to hold the current message position
if (align)
pos.x = panel_pos.x + (panel_size.x - stringwidth(ts, true, fontsize) * sz) * align;
if (a > 0.5/255.0) // Otherwise guaranteed invisible - don't show. This is checked a second time after some multiplications with other factors were done so temporary changes of these cannot cause flicker.
+ if (is_bold) draw_beginBoldFont();
drawcolorcodedstring(pos + eY * 0.5 * (1 - sz * hud_scale.x) * fontsize.y, ts, fontsize, a, DRAWFLAG_NORMAL);
+ if (is_bold) draw_endBoldFont();
pos.y += fontsize.y;
}
else
}
}
}
+
drawfontscale = hud_scale;
if (all_messages_expired)
{
centerprint_showing = false;
- reset_centerprint_messages();
+ centerprint_KillAll();
}
}