cvar_t con_notifytime = {CVAR_SAVE, "con_notifytime","3", "how long notify lines last, in seconds"};
cvar_t con_notify = {CVAR_SAVE, "con_notify","4", "how many notify lines to show (0-32)"};
-cvar_t con_textsize = {CVAR_SAVE, "con_textsize","8", "console text size in virtual 2D pixels"}; //[515]: console text size in pixels
+cvar_t con_textsize = {CVAR_SAVE, "con_textsize","8", "console text size in virtual 2D pixels"};
+
+
+cvar_t sys_specialcharactertranslation = {0, "sys_specialcharactertranslation", "1", "terminal console conchars to ASCII translation (set to 0 if your conchars.tga is for an 8bit character set or if you want raw output)"};
+#ifdef WIN32
+cvar_t sys_colortranslation = {0, "sys_colortranslation", "0", "terminal console color translation (supported values: 0 = strip color codes, 1 = translate to ANSI codes, 2 = no translation)"};
+#else
+cvar_t sys_colortranslation = {0, "sys_colortranslation", "1", "terminal console color translation (supported values: 0 = strip color codes, 1 = translate to ANSI codes, 2 = no translation)"};
+#endif
#define MAX_NOTIFYLINES 32
// cl.time time the line was generated for transparent notify lines
GetMapList("", NULL, 0);
}
+void Con_ConDump_f (void)
+{
+ int i, l;
+ qboolean allblankssofar;
+ const char *text;
+ qfile_t *file;
+ char temp[MAX_INPUTLINE+2];
+ if (Cmd_Argc() != 2)
+ {
+ Con_Printf("usage: condump <filename>\n");
+ return;
+ }
+ file = FS_Open(Cmd_Argv(1), "wb", false, false);
+ if (!file)
+ {
+ Con_Printf("condump: unable to write file \"%s\"\n", Cmd_Argv(1));
+ return;
+ }
+ // iterate over the entire console history buffer line by line
+ allblankssofar = true;
+ for (i = 0;i < con_totallines;i++)
+ {
+ text = con_text + ((con_current + 1 + i) % con_totallines)*con_linewidth;
+ // count the used characters on this line
+ for (l = min(con_linewidth, (int)sizeof(temp));l > 0 && text[l-1] == ' ';l--);
+ // if not a blank line, begin output
+ if (l)
+ allblankssofar = false;
+ // output the current line to the file
+ if (!allblankssofar)
+ {
+ if (l)
+ memcpy(temp, text, l);
+ temp[l] = '\n';
+ temp[l+1] = 0;
+ FS_Print(file, temp);
+ }
+ }
+ FS_Close(file);
+}
+
/*
================
Con_Init
logqueue = (unsigned char *)Mem_Alloc (tempmempool, logq_size);
logq_ind = 0;
+ Cvar_RegisterVariable (&sys_colortranslation);
+ Cvar_RegisterVariable (&sys_specialcharactertranslation);
+
Cvar_RegisterVariable (&log_file);
// support for the classic Quake option
// COMMANDLINEOPTION: Console: -condebug logs console messages to qconsole.log, see also log_file
if (COM_CheckParm ("-condebug") != 0)
Cvar_SetQuick (&log_file, "qconsole.log");
-}
-void Con_Init_Commands (void)
-{
// register our cvars
Cvar_RegisterVariable (&con_notifytime);
Cvar_RegisterVariable (&con_notify);
Cmd_AddCommand ("messagemode", Con_MessageMode_f, "input a chat message to say to everyone");
Cmd_AddCommand ("messagemode2", Con_MessageMode2_f, "input a chat message to say to only your team");
Cmd_AddCommand ("clear", Con_Clear_f, "clear console history");
- Cmd_AddCommand ("maps", Con_Maps_f, "list information about available maps"); // By [515]
+ Cmd_AddCommand ("maps", Con_Maps_f, "list information about available maps");
+ Cmd_AddCommand ("condump", Con_ConDump_f, "output console history to a file (see also log_file)");
con_initialized = true;
Con_Print("Console initialized.\n");
{
// play talk wav
if (*msg == 1)
- S_LocalSound ("sound/misc/talk.wav");
+ {
+ if (msg[1] == '(' && cl.foundtalk2wav)
+ S_LocalSound ("sound/misc/talk2.wav");
+ else
+ S_LocalSound ("sound/misc/talk.wav");
+ }
line[index++] = STRING_COLOR_TAG;
line[index++] = '3';
msg++;
if (!sys_nostdout)
{
unsigned char *p;
- for (p = (unsigned char *) line;*p; p++)
- *p = qfont_table[*p];
- Sys_PrintToTerminal(line);
+ if(sys_specialcharactertranslation.integer)
+ {
+ for (p = (unsigned char *) line;*p; p++)
+ *p = qfont_table[*p];
+ }
+
+ if(sys_colortranslation.integer == 1) // ANSI
+ {
+ static char printline[MAX_INPUTLINE * 4 + 3];
+ // 2 can become 7 bytes, rounding that up to 8, and 3 bytes are added at the end
+ // a newline can transform into four bytes, but then prevents the three extra bytes from appearing
+ int lastcolor = 0;
+ const char *in;
+ char *out;
+ for(in = line, out = printline; *in; ++in)
+ {
+ switch(*in)
+ {
+ case STRING_COLOR_TAG:
+ switch(in[1])
+ {
+ case STRING_COLOR_TAG:
+ ++in;
+ *out++ = STRING_COLOR_TAG;
+ break;
+ case '0':
+ case '7':
+ // normal color
+ ++in;
+ if(lastcolor == 0) break; else lastcolor = 0;
+ *out++ = 0x1B; *out++ = '['; *out++ = 'm';
+ break;
+ case '1':
+ // light red
+ ++in;
+ if(lastcolor == 1) break; else lastcolor = 1;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '1'; *out++ = 'm';
+ break;
+ case '2':
+ // light green
+ ++in;
+ if(lastcolor == 2) break; else lastcolor = 2;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '2'; *out++ = 'm';
+ break;
+ case '3':
+ // yellow
+ ++in;
+ if(lastcolor == 3) break; else lastcolor = 3;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '3'; *out++ = 'm';
+ break;
+ case '4':
+ // light blue
+ ++in;
+ if(lastcolor == 4) break; else lastcolor = 4;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '4'; *out++ = 'm';
+ break;
+ case '5':
+ // light cyan
+ ++in;
+ if(lastcolor == 5) break; else lastcolor = 5;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '6'; *out++ = 'm';
+ break;
+ case '6':
+ // light magenta
+ ++in;
+ if(lastcolor == 6) break; else lastcolor = 6;
+ *out++ = 0x1B; *out++ = '['; *out++ = '1'; *out++ = ';'; *out++ = '3'; *out++ = '5'; *out++ = 'm';
+ break;
+ // 7 handled above
+ case '8':
+ case '9':
+ // bold normal color
+ ++in;
+ if(lastcolor == 8) break; else lastcolor = 8;
+ *out++ = 0x1B; *out++ = '['; *out++ = '0'; *out++ = ';'; *out++ = '1'; *out++ = 'm';
+ break;
+ default:
+ *out++ = STRING_COLOR_TAG;
+ break;
+ }
+ break;
+ case '\n':
+ if(lastcolor != 0)
+ {
+ *out++ = 0x1B; *out++ = '['; *out++ = 'm';
+ lastcolor = 0;
+ }
+ *out++ = *in;
+ break;
+ default:
+ *out++ = *in;
+ break;
+ }
+ }
+ if(lastcolor != 0)
+ {
+ *out++ = 0x1B;
+ *out++ = '[';
+ *out++ = 'm';
+ }
+ *out++ = 0;
+ Sys_PrintToTerminal(printline);
+ }
+ else if(sys_colortranslation.integer == 2) // Quake
+ {
+ Sys_PrintToTerminal(line);
+ }
+ else // strip
+ {
+ static char printline[MAX_INPUTLINE]; // it can only get shorter here
+ const char *in;
+ char *out;
+ for(in = line, out = printline; *in; ++in)
+ {
+ switch(*in)
+ {
+ case STRING_COLOR_TAG:
+ switch(in[1])
+ {
+ case STRING_COLOR_TAG:
+ ++in;
+ *out++ = STRING_COLOR_TAG;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ ++in;
+ break;
+ default:
+ *out++ = STRING_COLOR_TAG;
+ break;
+ }
+ break;
+ default:
+ *out++ = *in;
+ break;
+ }
+ }
+ *out++ = 0;
+ Sys_PrintToTerminal(printline);
+ }
}
// empty the line buffer
index = 0;
text += 1 + key_linepos - con_linewidth;
// draw it
- DrawQ_ColoredString(0, con_vislines - con_textsize.value*2, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL );
+ DrawQ_String(0, con_vislines - con_textsize.value*2, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false );
// remove cursor
// key_lines[edit_line][key_linepos] = 0;
// count up to the last non-whitespace, and ignore color codes
for (j = 0;j < con_linewidth && text[j];j++)
{
- if (text[j] == '^' && (text[j+1] >= '0' && text[j+1] <= '9'))
+ if (text[j] == STRING_COLOR_TAG && (text[j+1] >= '0' && text[j+1] <= '9'))
{
j++;
continue;
} else
x = 0;
- DrawQ_ColoredString( x, v, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+ DrawQ_String( x, v, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
v += con_textsize.value;
}
sprintf(temptext, "say:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
while ((int)strlen(temptext) >= con_linewidth)
{
- DrawQ_ColoredString( 0, v, temptext, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+ DrawQ_String( 0, v, temptext, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
strlcpy(temptext, &temptext[con_linewidth], sizeof(temptext));
v += con_textsize.value;
}
if (strlen(temptext) > 0)
{
- DrawQ_ColoredString( 0, v, temptext, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+ DrawQ_String( 0, v, temptext, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
v += con_textsize.value;
}
}
// draw the background
DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback", true) : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0);
- DrawQ_String(vid_conwidth.integer - strlen(engineversion) * con_textsize.value - con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0);
+ DrawQ_String(vid_conwidth.integer - strlen(engineversion) * con_textsize.value - con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true);
// draw the text
con_vislines = lines;
j = max(i - con_backscroll, 0);
text = con_text + (j % con_totallines)*con_linewidth;
- DrawQ_ColoredString( 0, y, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+ DrawQ_String( 0, y, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
}
// draw the input prompt, user text, and cursor if desired
for (;;)
{
int l;
- if (!COM_ParseTokenConsole(&data))
+ if (!COM_ParseToken_Simple(&data, false))
break;
if (com_token[0] == '{')
continue;
for (l = 0;l < (int)sizeof(keyname) - 1 && com_token[k+l] && com_token[k+l] > ' ';l++)
keyname[l] = com_token[k+l];
keyname[l] = 0;
- if (!COM_ParseTokenConsole(&data))
+ if (!COM_ParseToken_Simple(&data, false))
break;
if (developer.integer >= 100)
Con_Printf("key: %s %s\n", keyname, com_token);
goto endcomplete;
}
endcomplete:
- if(p > o)
+ if(p > o && completedname && completednamebufferlength > 0)
{
memset(completedname, 0, completednamebufferlength);
memcpy(completedname, (t->filenames[0]+5), min(p, completednamebufferlength - 1));