]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud/panel/centerprint.qc
Merge branch 'master' into Lyberta/WaypointIcons
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / centerprint.qc
index 90a496e0d175962f8dae41d4f75beec0346010b9..15f46d29c4d4e3a2413c235380ec73009dcad64e 100644 (file)
@@ -2,31 +2,61 @@
 
 #include "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);
+       //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)
@@ -76,6 +106,7 @@ void centerprint_generic(int new_id, string strMessage, float duration, int coun
                j = cpm_index;
        }
        strcpy(centerprint_messages[j], strMessage);
+       centerprint_bold[j] = is_bold;
        centerprint_msgID[j] = new_id;
        if (duration < 0)
        {
@@ -92,42 +123,44 @@ void centerprint_generic(int new_id, string strMessage, float duration, int coun
        centerprint_countdown_num[j] = countdown_num;
 }
 
-void centerprint_kill(int id)
+void centerprint_Kill(int id)
 {
        TC(int, id);
-       centerprint_generic(id, "", 0, 0);
+       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)
@@ -137,16 +170,16 @@ void HUD_CenterPrint ()
                                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;
                        }
                }
@@ -194,12 +227,6 @@ void HUD_CenterPrint ()
        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;
@@ -213,6 +240,15 @@ void HUD_CenterPrint ()
        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)
@@ -237,7 +273,7 @@ void HUD_CenterPrint ()
 
                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.
@@ -245,7 +281,7 @@ void HUD_CenterPrint ()
                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
@@ -306,7 +342,9 @@ void HUD_CenterPrint ()
                                        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
@@ -342,10 +380,11 @@ void HUD_CenterPrint ()
                        }
                }
        }
+
        drawfontscale = hud_scale;
        if (all_messages_expired)
        {
                centerprint_showing = false;
-               reset_centerprint_messages();
+               centerprint_KillAll();
        }
 }