qboolean CL_InternalConsolePrint( const char *text ) { int y; int c, i, l; int color; // for some demos we don't want to ever show anything on the console if ( cl_noprint && cl_noprint->integer ) { return qtrue; } if ( !consoleState.initialized ) { consoleState.textWidthInChars = -1; consoleState.initialized = Con_CheckResize(); } //Video hasn't been initialized if ( ! cls.glconfig.vidWidth ) { return qfalse; } // NERVE - SMF - work around for text that shows up in console but not in notify if ( !Q_strncmp( text, S_SKIPNOTIFY, 12 ) ) { text += 12; } else if ( !consoleState.isOpened && strncmp( text, "EXCL: ", 6 ) ) { // feed the text to cgame Cmd_SaveCmdContext(); Cmd_TokenizeString( Cmd::Escape(text).c_str() ); CL_GameConsoleText(); Cmd_RestoreCmdContext(); } color = ColorIndex( CONSOLE_COLOR ); while ( ( c = *text & 0xFF ) != 0 ) { if ( Q_IsColorString( text ) ) { color = ( text[ 1 ] == COLOR_NULL ) ? ColorIndex( CONSOLE_COLOR ) : ColorIndex( text[ 1 ] ); text += 2; continue; } // count word length for ( i = l = 0; l < consoleState.textWidthInChars; ++l ) { if ( text[ i ] <= ' ' && text[ i ] >= 0 ) { break; } if ( text[ i ] == Q_COLOR_ESCAPE && text[ i + 1 ] == Q_COLOR_ESCAPE ) { ++i; } i += Q_UTF8_Width( text + i ); } // word wrap if ( l != consoleState.textWidthInChars && ( consoleState.horizontalCharOffset + l >= consoleState.textWidthInChars ) ) { Con_Linefeed( ); } switch ( c ) { case '\n': Con_Linefeed( ); break; case '\r': consoleState.horizontalCharOffset = 0; break; case Q_COLOR_ESCAPE: if ( text[ 1 ] == Q_COLOR_ESCAPE ) { ++text; } /* no break */ default: // display character and advance y = consoleState.currentLine % consoleState.maxScrollbackLengthInLines; // rain - sign extension caused the character to carry over // into the color info for high ascii chars; casting c to unsigned consoleState.text[ y * consoleState.textWidthInChars + consoleState.horizontalCharOffset ].ch = Q_UTF8_CodePoint( text ); consoleState.text[ y * consoleState.textWidthInChars + consoleState.horizontalCharOffset ].ink = color; ++consoleState.horizontalCharOffset; if ( consoleState.horizontalCharOffset >= consoleState.textWidthInChars ) { Con_Linefeed( ); consoleState.horizontalCharOffset = 0; } break; } text += Q_UTF8_Width( text ); } return qtrue; }
static void Con_Print2( const char *txt, qboolean notify ) { int c, l; int color; qboolean colorflag = qfalse; if( !con_initialized ) return; if( con_printText && con_printText->integer == 0 ) return; color = ColorIndex( COLOR_WHITE ); while( ( c = *txt ) ) { // count word length for( l = 0; l < con.linewidth; l++ ) if( (unsigned char)txt[l] <= ' ' ) break; // word wrap if( l != con.linewidth && ( con.x + l > con.linewidth ) ) con.x = 0; if( !con.x ) { Con_Linefeed(); // mark time for transparent overlay con.times[0] = cls.realtime; if( !notify ) con.times[0] -= con_notifytime->value*1000 + 1; if( color != ColorIndex( COLOR_WHITE ) ) { addchartostr( &con.text[0], Q_COLOR_ESCAPE ); addchartostr( &con.text[0], '0' + color ); con.x += 2; } } switch( c ) { case '\n': color = ColorIndex( COLOR_WHITE ); con.x = 0; break; case '\r': break; default: // display character and advance addchartostr( &con.text[0], c ); con.x++; if( con.x >= con.linewidth ) // haha welcome to 1995 lol con.x = 0; if( colorflag ) { if( *txt != Q_COLOR_ESCAPE ) color = ColorIndex( *txt ); colorflag = qfalse; } else if( *txt == Q_COLOR_ESCAPE ) colorflag = qtrue; // if( Q_IsColorString( txt ) ) { // color = ColorIndex( *(txt+1) ); // } break; } txt++; } }
/* ================ Con_Print Handles cursor positioning, line wrapping, etc All console printing must go through this in order to be logged to disk If no console is visible, the notify window will pop up. ================ */ void Con_Print (char *txt) { int y; int c, l; static int cr; int mask; return; // GAJA: Avoid console printing for trace bot clients if (txt[0] == 1 || txt[0] == 2) { mask = 128; // go to colored text txt++; } else mask = 0; while ( (c = *txt) ) { // count word length for (l=0 ; l< con_linewidth ; l++) if ( txt[l] <= ' ') break; // word wrap if (l != con_linewidth && (con->x + l > con_linewidth) ) con->x = 0; txt++; if (cr) { con->current--; cr = false; } if (!con->x) { Con_Linefeed (); // mark time for transparent overlay if (con->current >= 0) con_times[con->current % NUM_CON_TIMES] = realtime; } switch (c) { case '\n': con->x = 0; break; case '\r': con->x = 0; cr = 1; break; default: // display character and advance y = con->current % con_totallines; con->text[y*con_linewidth+con->x] = c | mask | con_ormask; con->x++; if (con->x >= con_linewidth) con->x = 0; break; } } }
void CL_ConsolePrint( char *txt ) { int y; int c, i, l; int color; qboolean skipnotify = qfalse; // NERVE - SMF int prev; // NERVE - SMF // NERVE - SMF - work around for text that shows up in console but not in notify if ( !Q_strncmp( txt, "[skipnotify]", 12 ) ) { skipnotify = qtrue; txt += 12; } // for some demos we don't want to ever show anything on the console if ( cl_noprint && cl_noprint->integer ) { return; } if ( !con.initialized ) { con.color[ 0 ] = con.color[ 1 ] = con.color[ 2 ] = con.color[ 3 ] = 1.0f; con.linewidth = -1; Con_CheckResize(); con.initialized = qtrue; } if ( !skipnotify && !( cls.keyCatchers & KEYCATCH_CONSOLE ) && strncmp( txt, "EXCL: ", 6 ) ) { // feed the text to cgame Cmd_SaveCmdContext(); Cmd_TokenizeString( txt ); CL_GameConsoleText(); Cmd_RestoreCmdContext(); } color = ColorIndex( CONSOLE_COLOR ); while ( ( c = *txt & 0xFF ) != 0 ) { if ( Q_IsColorString( txt ) ) { color = ( txt[ 1 ] == COLOR_NULL ) ? ColorIndex( CONSOLE_COLOR ) : ColorIndex( txt[ 1 ] ); txt += 2; continue; } // count word length for ( i = l = 0; l < con.linewidth; ++l ) { if ( txt[ i ] <= ' ' && txt[ i ] >= 0 ) { break; } if ( txt[ i ] == Q_COLOR_ESCAPE && txt[ i + 1 ] == Q_COLOR_ESCAPE ) { ++i; } i += Q_UTF8Width( txt + i ); } // word wrap if ( l != con.linewidth && ( con.x + l >= con.linewidth ) ) { Con_Linefeed( skipnotify ); } switch ( c ) { case '\n': Con_Linefeed( skipnotify ); break; case '\r': con.x = 0; break; case Q_COLOR_ESCAPE: if ( txt[ 1 ] == Q_COLOR_ESCAPE ) { ++txt; } default: // display character and advance y = con.current % con.totallines; // rain - sign extension caused the character to carry over // into the color info for high ascii chars; casting c to unsigned con.text[ y * con.linewidth + con.x ].ch = Q_UTF8CodePoint( txt ); con.text[ y * con.linewidth + con.x ].ink = color; ++con.x; if ( con.x >= con.linewidth ) { Con_Linefeed( skipnotify ); con.x = 0; } break; } txt += Q_UTF8Width( txt ); } // mark time for transparent overlay if ( con.current >= 0 ) { // NERVE - SMF if ( skipnotify ) { prev = con.current % NUM_CON_TIMES - 1; if ( prev < 0 ) { prev = NUM_CON_TIMES - 1; } con.times[ prev ] = 0; } else { // -NERVE - SMF con.times[ con.current % NUM_CON_TIMES ] = cls.realtime; } } }
/* ================ CL_ConsolePrint Handles cursor positioning, line wrapping, etc All console printing must go through this in order to be logged to disk If no console is visible, the text will appear at the top of the game window ================ */ void CL_ConsolePrint( const char *txt) { int y; int c, l; int color; qboolean skipnotify = qfalse; // NERVE - SMF int prev; // NERVE - SMF // TTimo - prefix for text that shows up in console but not in notify // backported from RTCW if ( !Q_strncmp( txt, "[skipnotify]", 12 ) ) { skipnotify = qtrue; txt += 12; } if ( txt[0] == '*' ) { skipnotify = qtrue; txt += 1; } // for some demos we don't want to ever show anything on the console if ( cl_noprint && cl_noprint->integer ) { return; } if (!con.initialized) { con.color[0] = con.color[1] = con.color[2] = con.color[3] = 1.0f; con.linewidth = -1; Con_CheckResize (); con.initialized = qtrue; } //color = ColorIndex(COLOR_WHITE); color = 0xfff00000; while ( (c = (unsigned char) *txt) != 0 ) { vec4_t newColor; int colorLen = Q_parseColorString( txt, newColor ); if ( colorLen ) { color = Q_PackRGB( newColor ); txt += colorLen; continue; } // count word length for (l=0 ; l< con.linewidth ; l++) { if ( txt[l] <= ' ') { break; } } // word wrap if (l != con.linewidth && (con.x + l >= con.linewidth) ) { Con_Linefeed(skipnotify); } txt++; switch (c) { case '\n': Con_Linefeed (skipnotify); break; case '\r': con.x = 0; break; default: // display character and advance y = con.current % con.totallines; con.text[y*con.linewidth+con.x] = color | c; con.x++; if (con.x >= con.linewidth) { Con_Linefeed(skipnotify); } break; } } // mark time for transparent overlay if (con.current >= 0 ) { // NERVE - SMF if ( skipnotify ) { prev = con.current % NUM_CON_TIMES - 1; if ( prev < 0 ) prev = NUM_CON_TIMES - 1; con.times[prev] = 0; } else // -NERVE - SMF con.times[con.current % NUM_CON_TIMES] = cls.realtime; } }