conbuffer_t con;
-#define CON_LINES_IDX(i) CONBUF_LINES_IDX(&con, i)
-#define CON_LINES_UNIDX(i) CONBUF_LINES_UNIDX(&con, i)
-#define CON_LINES_LAST CONBUF_LINES_LAST(&con)
-#define CON_LINES(i) CONBUF_LINES(&con, i)
-#define CON_LINES_PRED(i) CONBUF_LINES_PRED(&con, i)
-#define CON_LINES_SUCC(i) CONBUF_LINES_SUCC(&con, i)
+#define CON_LINES(i) CONBUFFER_LINES(&con, i)
+#define CON_LINES_LAST CONBUFFER_LINES_LAST(&con)
+#define CON_LINES_COUNT CONBUFFER_LINES_COUNT(&con)
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"};
cvar_t con_textsize = {CVAR_SAVE, "con_textsize","8", "console text size in virtual 2D pixels"};
cvar_t con_notifysize = {CVAR_SAVE, "con_notifysize","8", "notify text size in virtual 2D pixels"};
cvar_t con_chatsize = {CVAR_SAVE, "con_chatsize","8", "chat text size in virtual 2D pixels (if con_chat is enabled)"};
+cvar_t con_chatsound = {CVAR_SAVE, "con_chatsound","1", "enables chat sound to play on message"};
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)"};
#define NICKS_ALPHANUMERICS_ONLY 8
#define NICKS_NO_SPACES 16
-cvar_t con_completion_playdemo = {CVAR_SAVE, "con_completion_playdemo", "*.dem"};
-cvar_t con_completion_timedemo = {CVAR_SAVE, "con_completion_timedemo", "*.dem"};
-cvar_t con_completion_exec = {CVAR_SAVE, "con_completion_exec", "*.cfg"};
+cvar_t con_completion_playdemo = {CVAR_SAVE, "con_completion_playdemo", "*.dem", "completion pattern for the playdemo command"};
+cvar_t con_completion_timedemo = {CVAR_SAVE, "con_completion_timedemo", "*.dem", "completion pattern for the timedemo command"};
+cvar_t con_completion_exec = {CVAR_SAVE, "con_completion_exec", "*.cfg", "completion pattern for the exec command"};
int con_linewidth;
int con_vislines;
void ConBuffer_Init(conbuffer_t *buf, int textsize, int maxlines, mempool_t *mempool)
{
buf->textsize = textsize;
- buf->text = Mem_Alloc(mempool, textsize);
+ buf->text = (char *) Mem_Alloc(mempool, textsize);
buf->maxlines = maxlines;
- buf->lines = Mem_Alloc(mempool, maxlines * sizeof(*buf->lines));
+ buf->lines = (con_lineinfo_t *) Mem_Alloc(mempool, maxlines * sizeof(*buf->lines));
buf->lines_first = 0;
buf->lines_count = 0;
}
{
Mem_Free(buf->text);
Mem_Free(buf->lines);
+ buf->text = NULL;
+ buf->lines = NULL;
}
/*
int i;
if(buf->lines_count >= 1)
{
- double diff = cl.time - (buf->lines + CONBUF_LINES_LAST(buf))->addtime;
+ double diff = cl.time - CONBUFFER_LINES_LAST(buf).addtime;
if(diff < 0)
{
for(i = 0; i < buf->lines_count; ++i)
- CONBUF_LINES(buf, i).addtime += diff;
+ CONBUFFER_LINES(buf, i).addtime += diff;
}
}
}
if(buf->lines_count == 0)
return;
--buf->lines_count;
- buf->lines_first = CONBUF_LINES_IDX(buf, 1);
+ buf->lines_first = (buf->lines_first + 1) % buf->maxlines;
}
/*
else
{
char *firstline_start = buf->lines[buf->lines_first].start;
- char *lastline_onepastend = buf->lines[CONBUF_LINES_LAST(buf)].start + buf->lines[CONBUF_LINES_LAST(buf)].len;
+ char *lastline_onepastend = CONBUFFER_LINES_LAST(buf).start + CONBUFFER_LINES_LAST(buf).len;
// the buffer is cyclic, so we first have two cases...
if(firstline_start < lastline_onepastend) // buffer is contiguous
{
//fprintf(stderr, "Now have %d lines (%d -> %d).\n", buf->lines_count, buf->lines_first, CON_LINES_LAST);
- p = buf->lines + CONBUF_LINES_LAST(buf);
+ p = &CONBUFFER_LINES_LAST(buf);
p->start = putpos;
p->len = len;
p->addtime = cl.time;
start = buf->lines_count;
for(i = start - 1; i >= 0; --i)
{
- con_lineinfo_t *l = &CONBUF_LINES(buf, i);
+ con_lineinfo_t *l = &CONBUFFER_LINES(buf, i);
if((l->mask & mask_must) != mask_must)
continue;
int i;
for(i = start + 1; i < buf->lines_count; ++i)
{
- con_lineinfo_t *l = &CONBUF_LINES(buf, i);
+ con_lineinfo_t *l = &CONBUFFER_LINES(buf, i);
if((l->mask & mask_must) != mask_must)
continue;
const char *ConBuffer_GetLine(conbuffer_t *buf, int i)
{
static char copybuf[MAX_INPUTLINE];
- con_lineinfo_t *l = &CONBUF_LINES(buf, i);
+ con_lineinfo_t *l = &CONBUFFER_LINES(buf, i);
size_t sz = l->len+1 > sizeof(copybuf) ? sizeof(copybuf) : l->len+1;
strlcpy(copybuf, l->start, sz);
return copybuf;
==============================================================================
*/
+/// \name Logging
+//@{
cvar_t log_file = {0, "log_file","", "filename to log messages to"};
cvar_t log_dest_udp = {0, "log_dest_udp","", "UDP address to log messages to (in QW rcon compatible format); multiple destinations can be separated by spaces; DO NOT SPECIFY DNS NAMES HERE"};
char log_dest_buffer[1400]; // UDP packet
size_t logq_size = 0;
void Log_ConPrint (const char *msg);
-
+//@}
/*
====================
Log_DestBuffer_Init
====================
*/
-static void Log_DestBuffer_Init()
+static void Log_DestBuffer_Init(void)
{
memcpy(log_dest_buffer, "\377\377\377\377n", 5); // QW rcon print
log_dest_buffer_pos = 5;
Log_DestBuffer_Flush
====================
*/
-void Log_DestBuffer_Flush()
+void Log_DestBuffer_Flush(void)
{
lhnetaddress_t log_dest_addr;
lhnetsocket_t *log_dest_socket;
/*
================
Con_ClearNotify
-
-Clear all notify lines.
================
*/
void Con_ClearNotify (void)
{
int i;
- for(i = 0; i < con.lines_count; ++i)
+ for(i = 0; i < CON_LINES_COUNT; ++i)
CON_LINES(i).mask |= CON_MASK_HIDENOTIFY;
}
{
key_dest = key_message;
chat_mode = 0; // "say"
+ chat_bufferlen = 0;
+ chat_buffer[0] = 0;
}
{
key_dest = key_message;
chat_mode = 1; // "say_team"
+ chat_bufferlen = 0;
+ chat_buffer[0] = 0;
}
/*
/*
================
Con_CheckResize
-
-If the line width has changed, reformat the buffer.
================
*/
void Con_CheckResize (void)
Cvar_SetValueQuick(&con_textsize, f);
width = (int)floor(vid_conwidth.value / con_textsize.value);
width = bound(1, width, con.textsize/4);
+ // FIXME uses con in a non abstracted way
if (width == con_linewidth)
return;
con_linewidth = width;
- for(i = 0; i < con.lines_count; ++i)
+ for(i = 0; i < CON_LINES_COUNT; ++i)
CON_LINES(i).height = -1; // recalculate when next needed
Con_ClearNotify();
Con_Printf("condump: unable to write file \"%s\"\n", Cmd_Argv(1));
return;
}
- for(i = 0; i < con.lines_count; ++i)
+ for(i = 0; i < CON_LINES_COUNT; ++i)
{
FS_Write(file, CON_LINES(i).start, CON_LINES(i).len);
FS_Write(file, "\n", 1);
FS_Close(file);
}
-void Con_Clear_f ()
+void Con_Clear_f (void)
{
ConBuffer_Clear(&con);
}
Cvar_RegisterVariable (&con_notifysize);
Cvar_RegisterVariable (&con_notifytime);
Cvar_RegisterVariable (&con_textsize);
+ Cvar_RegisterVariable (&con_chatsound);
// --blub
Cvar_RegisterVariable (&con_nickcompletion);
Con_DPrint("Console initialized.\n");
}
+void Con_Shutdown (void)
+{
+ ConBuffer_Shutdown(&con);
+}
/*
================
static char buf[CON_TEXTSIZE];
static int bufpos = 0;
+ if(!con.text) // FIXME uses a non-abstracted property of con
+ return;
+
for(; *txt; ++txt)
{
if(cr_pending)
break;
default:
buf[bufpos++] = *txt;
- if(bufpos >= con.textsize - 1)
+ if(bufpos >= con.textsize - 1) // FIXME uses a non-abstracted property of con
{
ConBuffer_AddLine(&con, buf, bufpos, mask);
bufpos = 0;
}
}
-/* The translation table between the graphical font and plain ASCII --KB */
+/*! The translation table between the graphical font and plain ASCII --KB */
static char qfont_table[256] = {
'\0', '#', '#', '#', '#', '.', '#', '#',
'#', 9, 10, '#', ' ', 13, '.', '.',
rcon_redirect_bufferpos = 5;
}
-void Con_Rcon_Redirect_Flush()
+void Con_Rcon_Redirect_Flush(void)
{
rcon_redirect_buffer[rcon_redirect_bufferpos] = 0;
NetConn_WriteString(rcon_redirect_sock, rcon_redirect_buffer, rcon_redirect_dest);
rcon_redirect_bufferpos = 5;
}
-void Con_Rcon_Redirect_End()
+void Con_Rcon_Redirect_End(void)
{
Con_Rcon_Redirect_Flush();
rcon_redirect_dest = NULL;
rcon_redirect_sock = NULL;
}
-void Con_Rcon_Redirect_Abort()
+void Con_Rcon_Redirect_Abort(void)
{
rcon_redirect_dest = NULL;
rcon_redirect_sock = NULL;
/*
================
Con_Rcon_AddChar
-
-Adds a character to the rcon buffer
================
*/
+/// Adds a character to the rcon buffer.
void Con_Rcon_AddChar(int c)
{
if(log_dest_buffer_appending)
/*
================
Con_Print
-
-Prints to all appropriate console targets, and adds timestamps
================
*/
extern cvar_t timestamps;
// play talk wav
if (*msg == 1)
{
- if(gamemode == GAME_NEXUIZ)
+ if (con_chatsound.value)
{
- if(msg[1] == '\r' && cl.foundtalk2wav)
- S_LocalSound ("sound/misc/talk2.wav");
- else
- S_LocalSound ("sound/misc/talk.wav");
- }
- else
- {
- if (msg[1] == '(' && cl.foundtalk2wav)
- S_LocalSound ("sound/misc/talk2.wav");
+ if(gamemode == GAME_NEXUIZ)
+ {
+ if(msg[1] == '\r' && cl.foundtalk2wav)
+ S_LocalSound ("sound/misc/talk2.wav");
+ else
+ S_LocalSound ("sound/misc/talk.wav");
+ }
else
- S_LocalSound ("sound/misc/talk.wav");
+ {
+ if (msg[1] == '(' && cl.foundtalk2wav)
+ S_LocalSound ("sound/misc/talk2.wav");
+ else
+ S_LocalSound ("sound/misc/talk.wav");
+ }
}
mask = CON_MASK_CHAT;
}
/*
================
Con_Printf
-
-Prints to all appropriate console targets
================
*/
void Con_Printf(const char *fmt, ...)
/*
================
Con_DPrint
-
-A Con_Print that only shows up if the "developer" cvar is set
================
*/
void Con_DPrint(const char *msg)
/*
================
Con_DPrintf
-
-A Con_Printf that only shows up if the "developer" cvar is set
================
*/
void Con_DPrintf(const char *fmt, ...)
continuationWidth = (int) Con_WordWidthFunc(&ti, continuationString, &l, -1);
// first find the first line to draw by backwards iterating and word wrapping to find their length...
- startidx = con.lines_count;
- for(i = con.lines_count - 1; i >= 0; --i)
+ startidx = CON_LINES_COUNT;
+ for(i = CON_LINES_COUNT - 1; i >= 0; --i)
{
con_lineinfo_t *l = &CON_LINES(i);
int mylines;
ti.y = y + alignment_y * (height - lines * fontsize) - nskip * fontsize;
// then actually draw
- for(i = startidx; i < con.lines_count; ++i)
+ for(i = startidx; i < CON_LINES_COUNT; ++i)
{
con_lineinfo_t *l = &CON_LINES(i);
{
float width = vid_conwidth.value;
con_text_info_t ti;
+ con_lineinfo_t *li = &CON_LINES(lineno);
//if(con.lines[lineno].mask & CON_MASK_LOADEDHISTORY)
// return 0;
ti.fontsize = con_textsize.value;
ti.font = FONT_CONSOLE;
- return COM_Wordwrap(con.lines[lineno].start, con.lines[lineno].len, 0, width, Con_WordWidthFunc, &ti, Con_CountLineFunc, NULL);
+ return COM_Wordwrap(li->start, li->len, 0, width, Con_WordWidthFunc, &ti, Con_CountLineFunc, NULL);
}
/*
*/
int Con_LineHeight(int i)
{
- int h = con.lines[i].height;
+ con_lineinfo_t *li = &CON_LINES(i);
+ int h = li->height;
if(h != -1)
return h;
- return con.lines[i].height = Con_MeasureConsoleLine(i);
+ return li->height = Con_MeasureConsoleLine(i);
}
/*
{
float width = vid_conwidth.value;
con_text_info_t ti;
+ con_lineinfo_t *li = &CON_LINES(lineno);
//if(con.lines[lineno].mask & CON_MASK_LOADEDHISTORY)
// return 0;
ti.ymax = ymax;
ti.width = width;
- return COM_Wordwrap(con.lines[lineno].start, con.lines[lineno].len, 0, width, Con_WordWidthFunc, &ti, Con_DisplayLineFunc, &ti);
+ return COM_Wordwrap(li->start, li->len, 0, width, Con_WordWidthFunc, &ti, Con_DisplayLineFunc, &ti);
}
/*
void Con_LastVisibleLine(int *last, int *limitlast)
{
int lines_seen = 0;
- int ic;
+ int i;
if(con_backscroll < 0)
con_backscroll = 0;
// now count until we saw con_backscroll actual lines
- for(ic = 0; ic < con.lines_count; ++ic)
+ for(i = CON_LINES_COUNT - 1; i >= 0; --i)
{
- int i = CON_LINES_IDX(con.lines_count - 1 - ic);
int h = Con_LineHeight(i);
// line is the last visible line?
// visible then.
con_backscroll = lines_seen - 1;
*last = con.lines_first;
+ // FIXME uses con in a non abstracted way
*limitlast = 1;
}
DrawQ_String_Font(vid_conwidth.integer - DrawQ_TextWidth_Font(engineversion, 0, false, FONT_CONSOLE) * con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true, FONT_CONSOLE);
// draw the text
- if(con.lines_count > 0)
+ if(CON_LINES_COUNT > 0)
{
float ymax = con_vislines - 2 * con_textsize.value;
Con_LastVisibleLine(&last, &limitlast);
y = ymax - con_textsize.value;
if(limitlast)
- y += (con.lines[last].height - limitlast) * con_textsize.value;
+ y += (CON_LINES(last).height - limitlast) * con_textsize.value;
+ // FIXME uses con in a non abstracted way
i = last;
for(;;)
{
y -= Con_DrawConsoleLine(y, i, 0, ymax) * con_textsize.value;
- if(i == con.lines_first)
+ if(i == 0)
break; // top of console buffer
if(y < 0)
break; // top of console window
limitlast = 0;
- i = CON_LINES_PRED(i);
+ --i;
}
}