console.c

来自「quake1 dos源代码最新版本」· C语言 代码 · 共 799 行 · 第 1/2 页

C
799
字号
		case '\r':
			con_x = 0;
			cr = 1;
			break;

		default:	// display character and advance
// 2000-01-05 Console scrolling fix by Maddes  start
//			y = con_current % con_totallines;
			y = (con_current-1) % con_totallines;
// 2000-01-05 Console scrolling fix by Maddes  end
			con_text[y*con_linewidth+con_x] = c | mask;
			con_x++;
			if (con_x >= con_linewidth)
				con_x = 0;
			break;
		}

	}
}


/*
================
Con_DebugLog
================
*/
void Con_DebugLog(char *file, char *fmt, ...)
{
	va_list	argptr;
	static char	data[1024];
	int	fd;

	va_start(argptr, fmt);
	vsprintf(data, fmt, argptr);
	va_end(argptr);
	fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666);
	write(fd, data, strlen(data));
	close(fd);
}


/*
================
Con_Printf

Handles cursor positioning, line wrapping, etc
================
*/
#define	MAXPRINTMSG	4096
// FIXME: make a buffer size safe vsprintf?
void Con_Printf (char *fmt, ...)
{
	va_list		argptr;
	char		msg[MAXPRINTMSG];
	static qboolean	inupdate;

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);

// also echo to debugging console
	Sys_Printf ("%s", msg);	// also echo to debugging console

// log all messages to file
	if (con_debuglog)
		Con_DebugLog(va("%s/qconsole.log",com_gamedir), "%s", msg);

	if (!con_initialized)
		return;

	if (cls.state == ca_dedicated)
		return;		// no graphics mode

// write it to the scrollable buffer
	Con_Print (msg);

// update the screen if the console is displayed
	if (cls.signon != SIGNONS && !scr_disabled_for_loading )
	{
	// protect against infinite loop if something in SCR_UpdateScreen calls
	// Con_Printd
		if (!inupdate)
		{
			inupdate = true;
			SCR_UpdateScreen ();
			inupdate = false;
		}
	}
}

/*
================
Con_DPrintf

A Con_Printf that only shows up if the "developer" cvar is set
================
*/
void Con_DPrintf (char *fmt, ...)
{
	va_list		argptr;
	char		msg[MAXPRINTMSG];

	if (!developer->value)
		return;			// don't confuse non-developers with techie stuff...

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);

	Con_Printf ("%s", msg);
}


/*
==================
Con_SafePrintf

Okay to call even when the screen can't be updated
==================
*/
void Con_SafePrintf (char *fmt, ...)
{
	va_list		argptr;
	char		msg[1024];
	int			temp;

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);

	temp = scr_disabled_for_loading;
	scr_disabled_for_loading = true;
	Con_Printf ("%s", msg);
	scr_disabled_for_loading = temp;
}


/*
==============================================================================

DRAWING

==============================================================================
*/


/*
================
Con_DrawInput

The input line scrolls horizontally if typing goes beyond the right edge
================
*/
void Con_DrawInput (void)
{
// 2000-01-05 Console typing enhancement by Radix  start
// use strlen of edit_line instead of key_linepos to allow editing
// of early characters w/o erasing
// 2000-01-05 Console typing enhancement by Radix  end

	int		y;
	int		i;
	char	*text;
	char	editlinecopy[256];	// 2000-01-05 Console typing enhancement by Radix

	if (key_dest != key_console && !con_forcedup)
		return;		// don't draw anything

// 2000-01-05 Console typing enhancement by Radix  start
/*
	text = key_lines[edit_line];

// add the cursor frame
	text[key_linepos] = 10+((int)(realtime*con_cursorspeed)&1);

// fill out remainder with spaces
	for (i=key_linepos+1 ; i< con_linewidth ; i++)
		text[i] = ' ';
*/
	text = strcpy(editlinecopy, key_lines[edit_line]);

// fill out remainder with spaces
	y = strlen(text);
	for (i = y; i < 256; i++)
	{
		text[i] = ' ';
	}

// add the cursor frame
	if ((int)(realtime * con_cursorspeed) & 1)	// cursor is visible
	{
		text[key_linepos] = 11 + 130 * key_insert;	// either solid block or triagle facing right
	}
// 2000-01-05 Console typing enhancement by Radix  end

//	prestep if horizontally scrolling
	if (key_linepos >= con_linewidth)
		text += 1 + key_linepos - con_linewidth;

// draw it
	y = con_vislines-16;

	for (i=0 ; i<con_linewidth ; i++)
// 2001-12-10 Reduced compiler warnings by Jeff Ford  start
	{
//		Draw_Character ( (i+1)<<3, con_vislines - 16, text[i]);
		Draw_Character ( (i+1)<<3, y, text[i]);
	}
// 2001-12-10 Reduced compiler warnings by Jeff Ford  end

// remove cursor
//	key_lines[edit_line][key_linepos] = 0;	// 2000-01-05 Console typing enhancement by Radix
}


/*
================
Con_DrawNotify

Draws the last few lines of output transparently over the game top
================
*/
void Con_DrawNotify (void)
{
	int		x, v;
	char	*text;
	int		i;
	float	time;
	extern char chat_buffer[];

	v = 0;
// 2000-01-05 Console scrolling fix by Maddes  start
//	for (i= con_current-NUM_CON_TIMES+1 ; i<=con_current ; i++)
	for (i= con_current-NUM_CON_TIMES ; i<con_current ; i++)
// 2000-01-05 Console scrolling fix by Maddes  end
	{
		if (i < 0)
			continue;
		time = con_times[i % NUM_CON_TIMES];
		if (time == 0)
			continue;
		time = realtime - time;
		if (time > con_notifytime->value)
			continue;
		text = con_text + (i % con_totallines)*con_linewidth;

		clearnotify = 0;
		scr_copytop = 1;

		for (x = 0 ; x < con_linewidth ; x++)
			Draw_Character ( (x+1)<<3, v, text[x]);

		v += 8;
	}


	if (key_dest == key_message)
	{
		clearnotify = 0;
		scr_copytop = 1;

		x = 0;

		Draw_String (8, v, "say:");
		while(chat_buffer[x])
		{
			Draw_Character ( (x+5)<<3, v, chat_buffer[x]);
			x++;
		}
		Draw_Character ( (x+5)<<3, v, 10+((int)(realtime*con_cursorspeed)&1));
		v += 8;
	}

	if (v > con_notifylines)
		con_notifylines = v;
}

/*
================
Con_DrawConsole

Draws the console with the solid background
The typing input line at the bottom should only be drawn if typing is allowed
================
*/
void Con_DrawConsole (int lines, qboolean drawinput)
{
	int		i, x, y;
	int		rows;
	char	*text;
	int		j;
	int		sb;	// 2001-12-15 Avoid automatic console scrolling by Fett

	if (lines <= 0)
		return;

// draw the background
	Draw_ConsoleBackground (lines);

// draw the text
	con_vislines = lines;

	rows = (lines-16)>>3;		// rows of text to draw
	y = lines - 16 - (rows<<3);	// may start slightly negative

// 2000-01-05 Console scrolling fix by Maddes  start
	if (con_backscroll >= con_current)
		con_backscroll = con_current - 1;
	if (con_backscroll >= con_totallines)
		con_backscroll = con_totallines - 1;
	if (con_backscroll < 0)
		con_backscroll = 0;
// 2000-01-05 Console scrolling fix by Maddes  end

// 2001-12-15 Avoid automatic console scrolling by Fett  start
	if (con_backscroll)
	{
		sb=1;	// reserve line for scrollback indicator
	}
	else
	{
		sb=0;
	}
// 2001-12-15 Avoid automatic console scrolling by Fett  end

// 2000-01-05 Console scrolling fix by Maddes  start
//	for (i= con_current - rows + 1 ; i<=con_current ; i++, y+=8 )
// 2001-12-15 Avoid automatic console scrolling by Fett  start
//	for (i= con_current - rows; i<con_current ; i++, y+=8 )
	for (i= con_current - rows + sb; i<con_current ; i++, y+=8)
// 2001-12-15 Avoid automatic console scrolling by Fett  end
// 2000-01-05 Console scrolling fix by Maddes  end
	{
		j = i - con_backscroll;
// 2000-01-05 Console scrolling fix by Maddes  start
/*
		if (j<0)
			j = 0;
*/
		if ((j<0) || (j < (con_current - con_totallines)))
		{
			continue;
		}
// 2000-01-05 Console scrolling fix by Maddes  end
		text = con_text + (j % con_totallines)*con_linewidth;

		for (x=0 ; x<con_linewidth ; x++)
			Draw_Character ( (x+1)<<3, y, text[x]);
	}
// 2001-12-15 Avoid automatic console scrolling by Fett  start
	if (sb)	// are we scrolled back?
	{
		// draw arrows to show the buffer is backscrolled
		for (x=0 ; x<con_linewidth ; x+=4)
			Draw_Character ((x+1)<<3, y, '^');
	}
// 2001-12-15 Avoid automatic console scrolling by Fett  end

// draw the input prompt, user text, and cursor if desired
	if (drawinput)
		Con_DrawInput ();
}


/*
==================
Con_NotifyBox
==================
*/
void Con_NotifyBox (char *text)
{
	double		t1, t2;

// during startup for sound / cd warnings
	Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");

	Con_Printf (text);

	Con_Printf ("Press a key.\n");
	Con_Printf("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");

	key_count = -2;		// wait for a key down and up
	key_dest = key_console;

	do
	{
		t1 = Sys_FloatTime ();
		SCR_UpdateScreen ();
		Sys_SendKeyEvents ();
		t2 = Sys_FloatTime ();
		realtime += t2-t1;		// make the cursor blink
	} while (key_count < 0);

	Con_Printf ("\n");
	key_dest = key_game;
	realtime = 0;				// put the cursor back to invisible
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?