THIS COMMIT MOST LIKELY BREAKS THINGS.

changed conchars from 16-bit to 32-bit
added support for RGBI fg and bg colors
better support for ^8/^9 text codes
fix to echoish menu sounds
added plugin stuff for centerprints/server messages/chat messages, not finalized (?)
GL/SW color character functions improved (although neither handle transparent characters, and SW needs improvement with the palette remapping)


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1750 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2006-01-01 09:01:15 +00:00
parent 8ef3ae1182
commit a8889d8f24
31 changed files with 632 additions and 575 deletions

View file

@ -3084,6 +3084,9 @@ char *CL_ParseChat(char *text, player_info_t **player)
Validation_CheckIfResponse(text);
if (!Plug_ChatMessage(text + offset, *player ? (int)(*player - cl.players) : -1, flags))
return NULL;
if (flags == 2 && !TP_FilterMessage(text + offset))
return NULL;
@ -3096,6 +3099,11 @@ char *CL_ParseChat(char *text, player_info_t **player)
else if (check_flood == NO_IGNORE_ADD)
Ignore_Flood_Add(s);
}
else
{
if (!Plug_ServerMessage(text + offset, PRINT_CHAT))
return NULL;
}
suppress_talksound = false;
@ -3163,35 +3171,35 @@ int CL_PlayerColor(player_info_t *plr, int *name_ormask)
{ //translate q1 skin colours to console colours
case 10:
case 1:
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 4: //red
c = 1;
break;
case 11:
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 3: // green
c = 2;
break;
case 5:
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 12:
c = 3;
break;
case 6:
case 7:
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 8:
case 9:
c = 5;
break;
case 2: // light blue
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 13: //blue
case 14: //blue
c = 6;
break;
default:
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
case 0: // white
c = 7;
break;
@ -3218,7 +3226,7 @@ int CL_PlayerColor(player_info_t *plr, int *name_ormask)
}
if ((c / 7) & 1)
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
c = 1 + (c % 7);
}
@ -3236,7 +3244,7 @@ int CL_PlayerColor(player_info_t *plr, int *name_ormask)
c = plr->userid; // Quake2 can start from 0
if ((c / 7) & 1)
*name_ormask = CON_STANDARDMASK;
*name_ormask = CON_HIGHCHARSMASK;
c = 1 + (c % 7);
}
@ -3244,7 +3252,7 @@ int CL_PlayerColor(player_info_t *plr, int *name_ormask)
return c;
}
// CL_ParseChat: takes chat strings and performs name coloring and cl_parsewhitetext parsing
// CL_PrintChat: takes chat strings and performs name coloring and cl_parsewhitetext parsing
// NOTE: text in rawmsg/msg is assumed destroyable and should not be used afterwards
void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
{
@ -3272,7 +3280,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
if (cl_standardchat.value)
{
name_ormask = CON_STANDARDMASK;
name_ormask = CON_HIGHCHARSMASK;
c = 7;
}
else
@ -3284,7 +3292,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
c = 0; // blacken () on observers
else
{
name_ormask = CON_STANDARDMASK;
name_ormask = CON_HIGHCHARSMASK;
c = 7;
}
}
@ -3293,7 +3301,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
else
{
// defaults for fake clients
name_ormask = CON_STANDARDMASK;
name_ormask = CON_HIGHCHARSMASK;
c = 7;
}
}
@ -3304,7 +3312,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
{
if (memessage)
{
con_ormask = CON_STANDARDMASK;
con_ormask = CON_HIGHCHARSMASK;
if (!cl_standardchat.value && (plrflags & TPM_SPECTATOR))
Con_Printf ("^0*^7 ");
else
@ -3316,7 +3324,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
// color is reset every printf so we're safe here
con_ormask = name_ormask;
Con_Printf("^%c(", c);
con_ormask = CON_STANDARDMASK;
con_ormask = CON_HIGHCHARSMASK;
Con_Printf("%s", name);
con_ormask = name_ormask;
Con_Printf("^%c)", c);
@ -3330,7 +3338,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
if (!memessage)
{
// only print seperator with an actual player name
con_ormask = CON_STANDARDMASK;
con_ormask = CON_HIGHCHARSMASK;
if (!cl_standardchat.value && (plrflags & TPM_SPECTATOR))
Con_Printf ("^0:^7 ");
else
@ -3341,7 +3349,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
}
// print message
con_ormask = CON_STANDARDMASK;
con_ormask = CON_HIGHCHARSMASK;
if (cl_parsewhitetext.value && (cl_parsewhitetext.value == 1 || (plrflags & TPM_TEAM)))
{
char *t, *u;
@ -3356,7 +3364,7 @@ void CL_PrintChat(player_info_t *plr, char *rawmsg, char *msg, int plrflags)
Con_Printf("%s", msg);
con_ormask = 0;
Con_Printf("%s", t+1);
con_ormask = CON_STANDARDMASK;
con_ormask = CON_HIGHCHARSMASK;
msg = u+1;
}
else
@ -3522,7 +3530,6 @@ void CL_ParsePrecache(void)
CL_ParseServerMessage
=====================
*/
char *Translate(char *message);
int received_framecount;
void CL_ParseServerMessage (void)
{
@ -3612,8 +3619,6 @@ void CL_ParseServerMessage (void)
i = MSG_ReadByte ();
s = MSG_ReadString ();
// Plug_Message(0, i, s);
if (i == PRINT_CHAT)
{
char *msg;
@ -3630,13 +3635,19 @@ void CL_ParseServerMessage (void)
}
else
{
CL_ParsePrint(s, i);
CL_PrintStandardMessage(s);
if (Plug_ServerMessage(s, i))
{
CL_ParsePrint(s, i);
CL_PrintStandardMessage(s);
}
}
break;
case svc_centerprint:
SCR_CenterPrint (destsplit, Translate(MSG_ReadString ()));
s = MSG_ReadString ();
if (Plug_CenterPrintMessage(s, destsplit))
SCR_CenterPrint (destsplit, s);
break;
case svc_stufftext:
@ -4072,8 +4083,6 @@ void CLQ2_ParseServerMessage (void)
i = MSG_ReadByte ();
s = MSG_ReadString ();
// Plug_Message(0, i, s);
if (i == PRINT_CHAT)
{
char *msg;
@ -4087,8 +4096,11 @@ void CLQ2_ParseServerMessage (void)
}
else
{
CL_ParsePrint(s, i);
CL_PrintStandardMessage(s);
if (Plug_ServerMessage(s, i))
{
CL_ParsePrint(s, i);
CL_PrintStandardMessage(s);
}
}
con_ormask = 0;
break;
@ -4113,7 +4125,10 @@ void CLQ2_ParseServerMessage (void)
CLQ2_ParseBaseline();
break;
case svcq2_centerprint: //15 // [string] to put in center of the screen
SCR_CenterPrint (0, Translate(MSG_ReadString ()));
s = MSG_ReadString();
if (Plug_CenterPrintMessage(s, 0))
SCR_CenterPrint (0, s);
break;
case svcq2_download: //16 // [short] size [size bytes]
CL_ParseDownload();
@ -4304,9 +4319,6 @@ void CLNQ_ParseServerMessage (void)
char *msg;
player_info_t *plr = NULL;
// Plug_Message(0, PRINT_CHAT, s);
if (msg = CL_ParseChat(s+1, &plr))
{
CL_ParsePrint(s+1, PRINT_CHAT);
@ -4315,10 +4327,11 @@ void CLNQ_ParseServerMessage (void)
}
else
{
// Plug_Message(0, PRINT_HIGH, s);
CL_ParsePrint(s, PRINT_HIGH);
CL_PrintStandardMessage(s);
if (Plug_ServerMessage(s, PRINT_HIGH))
{
CL_ParsePrint(s, PRINT_HIGH);
CL_PrintStandardMessage(s);
}
}
con_ormask = 0;
break;
@ -4328,7 +4341,10 @@ void CLNQ_ParseServerMessage (void)
break;
case svc_centerprint:
SCR_CenterPrint (0, Translate(MSG_ReadString ()));
s = MSG_ReadString ();
if (Plug_CenterPrintMessage(s, 0))
SCR_CenterPrint (0, s);
break;
case svc_stufftext:

View file

@ -167,17 +167,17 @@ CENTER PRINTING
===============================================================================
*/
unsigned short scr_centerstring[MAX_SPLITS][1024];
conchar_t scr_centerstring[MAX_SPLITS][1024];
float scr_centertime_start[MAX_SPLITS]; // for slow victory printing
float scr_centertime_off[MAX_SPLITS];
int scr_center_lines[MAX_SPLITS];
int scr_erase_lines[MAX_SPLITS];
int scr_erase_center[MAX_SPLITS];
void CopyAndMarkup(unsigned short *dest, qbyte *src, int maxlength)
void CopyAndMarkup(conchar_t *dest, qbyte *src, int maxlength)
{
int ext = COLOR_WHITE<<8;
int extstack[20];
conchar_t ext = CON_WHITEMASK;
conchar_t extstack[20];
int extstackdepth = 0;
if (maxlength < 0)
@ -189,33 +189,21 @@ void CopyAndMarkup(unsigned short *dest, qbyte *src, int maxlength)
if (*src == '^')
{
src++;
if (*src >= '0' && *src <= '7')
if (*src >= '0' && *src <= '9')
{
ext = (*src++-'0')*256 | (ext&~CON_COLOURMASK);
ext = q3codemasks[*src - '0'] | (ext&~CON_Q3MASK);
continue;
}
else if (*src == '8') //'half transparent'
else if (*src == 'b') // toggle blink bit
{
src++;
ext = (COLOR_WHITE)*256 | (ext&~CON_COLOURMASK);
ext ^= CON_BLINKTEXT;
continue;
}
else if (*src == '9') //'half brightness'
else if (*src == 'a') // toggle alternate charset
{
src++;
ext = (COLOR_WHITE)*256 | (ext&~CON_COLOURMASK);
continue;
}
else if (*src == 'b')
{
src++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
continue;
}
else if (*src == 'a')
{
src++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
ext ^= CON_2NDCHARSETTEXT;
continue;
}
else if (*src == 's')
@ -314,7 +302,7 @@ void SCR_EraseCenterString (void)
}
}
void SCR_CenterPrintBreaks(unsigned short *start, int *lines, int *maxlength)
void SCR_CenterPrintBreaks(conchar_t *start, int *lines, int *maxlength)
{
int l;
*lines = 0;
@ -350,7 +338,7 @@ void SCR_CenterPrintBreaks(unsigned short *start, int *lines, int *maxlength)
void SCR_DrawCenterString (int pnum)
{
unsigned short *start;
conchar_t *start;
int l;
int j;
int x, y;

View file

@ -21,24 +21,44 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.h"
//this is the same order as q3, except that white and black are swapped...
consolecolours_t consolecolours[] = {
#define CON_WHITEMASK 7*256 //must be constant. things assume this
{0, 0, 0, 0x0000},
{1, 0, 0, 0x001F},
{0, 1, 0, 0x03E0},
{1, 1, 0, 0x03FF},
{0.1, 0.1, 1, 0x7C00}, //brighten dark blue a little
{1, 0, 1, 0x7C1F},
{0, 1, 1, 0x7FE0},
{1, 1, 1, 0x7FFF}
// This is the standard RGBI palette used in CGA text mode
consolecolours_t consolecolours[MAXCONCOLOURS] = {
{ 0, 0, 0, 0, 0, 0 }, // black
{ 0, 0, 170, 0, 0, 0.67}, // blue
{ 0, 170, 0, 0, 0.67, 0 }, // green
{ 0, 170, 170, 0, 0.67, 0.67}, // cyan
{170, 0, 0, 0.67, 0, 0 }, // red
{170, 0, 170, 0.67, 0, 0.67}, // magenta
{170, 85, 0, 0.67, 0.33, 0 }, // brown
{170, 170, 170, 0.67, 0.67, 0.67}, // light gray
{ 85, 85, 85, 0.33, 0.33, 0.33}, // dark gray
{ 85, 85, 255, 0.33, 0.33, 1 }, // light blue
{ 85, 255, 85, 0.33, 1, 0.33}, // light green
{ 85, 255, 255, 0.33, 1, 1 }, // light cyan
{255, 85, 85, 1, 0.33, 0.33}, // light red
{255, 85, 255, 1, 0.33, 1 }, // light magenta
{255, 255, 85, 1, 1, 0.33}, // yellow
{255, 255, 255, 1, 1, 1 } // white
};
int con_ormask;
// This is for remapping the Q3 color codes to character masks, including ^9
conchar_t q3codemasks[MAXQ3COLOURS] = {
0x00000000, // 0, black
0x0c000000, // 1, red
0x0a000000, // 2, green
0x0e000000, // 3, yellow
0x09000000, // 4, blue
0x0b000000, // 5, cyan
0x0d000000, // 6, magenta
0x0f000000, // 7, white
0x0f100000, // 8, half-alpha white (BX_COLOREDTEXT)
0x07000000 // 9, "half-intensity" (BX_COLOREDTEXT)
};
conchar_t con_ormask;
console_t con_main;
console_t *con_current; // point to either con_main
#ifdef QTERM
#include <windows.h>
typedef struct qterm_s {
@ -436,7 +456,7 @@ Con_Resize
void Con_ResizeCon (console_t *con)
{
int i, j, width, oldwidth, oldtotallines, numlines, numchars;
unsigned short tbuf[CON_TEXTSIZE];
conchar_t tbuf[CON_TEXTSIZE];
if (scr_chatmode == 2)
width = (vid.width >> 4) - 2;
@ -472,7 +492,7 @@ void Con_ResizeCon (console_t *con)
numchars = con->linewidth;
Q_memcpy (tbuf, con->text, sizeof(con->text));
for (i = 0; i < sizeof(con->text)/sizeof(unsigned short); i++)
for (i = 0; i < sizeof(con->text)/sizeof(conchar_t); i++)
con->text[i] = ' ';
// Q_memset (con->text, ' ', sizeof(con->text));
@ -598,7 +618,7 @@ void Con_PrintCon (console_t *con, char *txt)
if (txt[0] == 1 || txt[0] == 2)
{
mask = CON_STANDARDMASK|CON_WHITEMASK; // go to colored text
mask = CON_HIGHCHARSMASK|CON_WHITEMASK; // go to colored text
txt++;
}
else
@ -609,21 +629,21 @@ void Con_PrintCon (console_t *con, char *txt)
{
if (c == '^')
{
if (txt[1]>='0' && txt[1]<'8')
if (txt[1]>='0' && txt[1]<='9')
{
mask = (txt[1]-'0')*256 + (mask&~CON_COLOURMASK); //change colour only.
mask = q3codemasks[txt[1]-'0'] + (mask&~CON_Q3MASK); //change colour only.
txt+=2;
continue;
}
if (txt[1] == 'b')
{
mask = (mask & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (mask & CON_BLINKTEXT));
mask ^= CON_BLINKTEXT;
txt+=2;
continue;
}
if (txt[1] == 'a')
{
mask = (mask & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (mask & CON_2NDCHARSETTEXT));
mask ^= CON_2NDCHARSETTEXT;
txt+=2;
continue;
}
@ -873,9 +893,9 @@ void Con_DrawInput (void)
int p;
unsigned char *text, *fname;
extern int con_commandmatch;
unsigned short maskedtext[MAXCMDLINE];
conchar_t maskedtext[MAXCMDLINE];
unsigned short mask=CON_WHITEMASK;
conchar_t mask=CON_WHITEMASK;
int maskstack[4];
int maskstackdepth = 0;
@ -898,12 +918,12 @@ void Con_DrawInput (void)
{
if (text[i] == '^') //is this an escape code?
{
if (text[i+1]>='0' && text[i+1]<'8')
mask = (text[i+1]-'0')*256 + (mask&~CON_COLOURMASK); //change colour only.
if (text[i+1]>='0' && text[i+1]<='9')
mask = q3codemasks[text[i+1]-'0'] | (mask&~CON_Q3MASK); //change colour only.
else if (text[i+1] == 'b')
mask = (mask & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (mask & CON_BLINKTEXT));
mask ^= CON_BLINKTEXT;
else if (text[i+1] == 'a') //alternate
mask = (mask & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (mask & CON_2NDCHARSETTEXT));
mask ^= CON_2NDCHARSETTEXT;
else if (text[i+1] == 's') //store on stack (it's great for names)
{
if (maskstackdepth < sizeof(maskstack)/sizeof(maskstack[0]))
@ -938,7 +958,7 @@ void Con_DrawInput (void)
if (text[1] == '/' || Cmd_IsCommand(text+1))
{ //color the first token yellow, it's a valid command
for (p = 1; (maskedtext[p]&255)>' '; p++)
maskedtext[p] = (maskedtext[p]&255) | (COLOR_YELLOW<<8);
maskedtext[p] = (maskedtext[p]&255) | (COLOR_YELLOW<<CON_FGSHIFT);
}
if (key_linepos == i) //cursor is at end
{
@ -947,7 +967,7 @@ void Con_DrawInput (void)
if (fname) //we can compleate it to:
{
for (p = i-x; fname[p]>' '; p++)
maskedtext[p+x] = (unsigned char)fname[p] | (COLOR_GREEN<<8);
maskedtext[p+x] = (unsigned char)fname[p] | (COLOR_GREEN<<CON_FGSHIFT);
maskedtext[p+x] = '\0';
}
}
@ -988,7 +1008,7 @@ Draws the last few lines of output transparently over the game top
void Con_DrawNotify (void)
{
int x, v;
unsigned short *text;
conchar_t *text;
int i;
float time;
char *s;
@ -1095,12 +1115,12 @@ void Con_DrawNotify (void)
{
if (s[x] == '^')
{
if (s[x+1]>='0' && s[x+1]<'8')
mask = (s[x+1]-'0')*256 + (mask&~CON_COLOURMASK); //change colour only.
if (s[x+1]>='0' && s[x+1]<='9')
mask = q3codemasks[s[x+1]-'0'] | (mask&~CON_Q3MASK); //change colour only.
else if (s[x+1] == 'b')
mask = (mask & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (mask & CON_BLINKTEXT));
mask ^= CON_BLINKTEXT;
else if (s[x+1] == 'a') //alternate
mask = (mask & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (mask & CON_2NDCHARSETTEXT));
mask ^= CON_2NDCHARSETTEXT;
else if (s[x+1] == 's') //store on stack (it's great for names)
{
if (maskstackdepth < sizeof(maskstack)/sizeof(maskstack[0]))
@ -1125,12 +1145,12 @@ void Con_DrawNotify (void)
{
if (s[x] == '^')
{
if (s[x+1]>='0' && s[x+1]<'8')
mask = (s[x+1]-'0')*256 + (mask&~CON_COLOURMASK); //change colour only.
if (s[x+1]>='0' && s[x+1]<='9')
mask = q3codemasks[s[x+1]-'0'] | (mask&~CON_Q3MASK); //change colour only.
else if (s[x+1] == 'b')
mask = (mask & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (mask & CON_BLINKTEXT));
mask ^= CON_BLINKTEXT;
else if (s[x+1] == 'a') //alternate
mask = (mask & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (mask & CON_2NDCHARSETTEXT));
mask ^= CON_2NDCHARSETTEXT;
else if (s[x+1] == 's') //store on stack (it's great for names)
{
if (maskstackdepth < sizeof(maskstack)/sizeof(maskstack[0]))
@ -1152,7 +1172,7 @@ void Con_DrawNotify (void)
Draw_ColouredCharacter ( (x+skip)<<3, v, s[x]|mask);
x++;
}
Draw_ColouredCharacter ( (x+skip)<<3, v, (10+((int)(realtime*con_cursorspeed)&1))|M_COLOR_WHITE);
Draw_ColouredCharacter ( (x+skip)<<3, v, (10+((int)(realtime*con_cursorspeed)&1))|CON_WHITEMASK);
v += 8;
}
@ -1165,7 +1185,7 @@ void Con_DrawNotify (void)
void Con_PrintToSys(void)
{
int line, row, x, spc, content;
short *text;
conchar_t *text;
console_t *curcon = &con_main;
content = 0;
@ -1203,7 +1223,7 @@ void Con_DrawConsole (int lines, qboolean noback)
int i, j, x, y;
float n;
int rows;
unsigned short *text;
conchar_t *text;
char *txt;
int row;
unsigned char dlbar[1024];
@ -1333,9 +1353,9 @@ void Con_DrawConsole (int lines, qboolean noback)
// draw it
y = curcon->vislines-22 + 8;
for (i = 0; i < strlen(dlbar); i++)
Draw_ColouredCharacter ( (i+1)<<3, y, (unsigned char)dlbar[i] | M_COLOR_WHITE);
Draw_ColouredCharacter ( (i+1)<<3, y, (unsigned char)dlbar[i] | CON_WHITEMASK);
Draw_ColouredCharacter ((n+1+x)*8, y, (unsigned char)'\x83' | M_COLOR_WHITE);
Draw_ColouredCharacter ((n+1+x)*8, y, (unsigned char)'\x83' | CON_WHITEMASK);
}
// draw the input prompt, user text, and cursor if desired

View file

@ -480,7 +480,6 @@ void Menu_DownloadStuff_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(dlmenu_t));
info = menu->data;

View file

@ -1316,6 +1316,8 @@ void M_Menu_Main_f (void)
}
*/
S_LocalSound ("misc/menu2.wav");
mgt = M_GameType();
if (mgt == MGT_QUAKE2) //quake2 main menu.
{
@ -1323,7 +1325,6 @@ void M_Menu_Main_f (void)
{
m_state = m_complex;
key_dest = key_menu;
m_entersound = true;
mainm = M_CreateMenu(0);
mainm->key = MC_Main_Key;
@ -1354,7 +1355,6 @@ void M_Menu_Main_f (void)
{
m_state = m_complex;
key_dest = key_menu;
m_entersound = true;
mainm = M_CreateMenu(0);
mainm->key = MC_Main_Key;
@ -1389,7 +1389,6 @@ void M_Menu_Main_f (void)
{
m_state = m_complex;
key_dest = key_menu;
m_entersound = true;
mainm = M_CreateMenu(0);
p = Draw_SafeCachePic("gfx/ttl_main.lmp");

View file

@ -80,7 +80,7 @@ static void NM_Print (int cx, int cy, qbyte *str)
{
while (*str)
{
Draw_ColouredCharacter (cx, cy, (*str)|128|M_COLOR_WHITE);
Draw_ColouredCharacter (cx, cy, (*str)|CON_HIGHCHARSMASK|CON_WHITEMASK);
str++;
cx += 8;
}
@ -90,7 +90,7 @@ static void NM_PrintWhite (int cx, int cy, qbyte *str)
{
while (*str)
{
Draw_ColouredCharacter (cx, cy, (*str)+M_COLOR_WHITE);
Draw_ColouredCharacter (cx, cy, (*str)|CON_WHITEMASK);
str++;
cx += 8;
}
@ -100,16 +100,12 @@ static void NM_PrintColoured (int cx, int cy, int colour, qbyte *str)
{
while (*str)
{
NM_DrawColouredCharacter (cx, cy, (*str) + (colour<<8));
NM_DrawColouredCharacter (cx, cy, (*str) | (colour<<CON_FGSHIFT));
str++;
cx += 8;
}
}
qboolean M_IsFiltered(serverinfo_t *server) //figure out if we should filter a server.
{
if (slist_type == SLISTTYPE_FAVORITES)
@ -260,7 +256,7 @@ int M_AddColumn (int right, int y, char *text, int maxchars, int colour)
right = left;
while (*text && maxchars>0)
{
NM_DrawColouredCharacter (right, y, (*(unsigned char *)text) + (colour<<8));
NM_DrawColouredCharacter (right, y, (*(unsigned char *)text) | (colour<<CON_FGSHIFT));
text++;
right += 8;
maxchars--;
@ -342,20 +338,20 @@ void M_DrawServerList(void)
y = 8*2;
x = vid.width;
if (sb_showtimelimit.value)
x = M_AddColumn(x, y, "tl", 3, 1);
x = M_AddColumn(x, y, "tl", 3, COLOR_RED);
if (sb_showfraglimit.value)
x = M_AddColumn(x, y, "fl", 3, 1);
x = M_AddColumn(x, y, "fl", 3, COLOR_RED);
if (sb_showplayers.value)
x = M_AddColumn(x, y, "plyrs", 6, 1);
x = M_AddColumn(x, y, "plyrs", 6, COLOR_RED);
if (sb_showmap.value)
x = M_AddColumn(x, y, "map", 9, 1);
x = M_AddColumn(x, y, "map", 9, COLOR_RED);
if (sb_showgamedir.value)
x = M_AddColumn(x, y, "gamedir", 9, 1);
x = M_AddColumn(x, y, "gamedir", 9, COLOR_RED);
if (sb_showping.value)
x = M_AddColumn(x, y, "png", 4, 1);
x = M_AddColumn(x, y, "png", 4, COLOR_RED);
if (sb_showaddress.value)
x = M_AddColumn(x, y, "address", 21, 1);
x = M_AddColumn(x, y, "name", x/8-1, 1);
x = M_AddColumn(x, y, "address", 21, COLOR_RED);
x = M_AddColumn(x, y, "name", x/8-1, COLOR_RED);
y = 8*3;
while(server)

View file

@ -289,7 +289,6 @@ void Media_Next_f (void)
void M_Menu_Media_f (void) {
key_dest = key_menu;
m_state = m_media;
m_entersound = true;
}
void Media_LoadTrackNames (char *listname);

View file

@ -18,7 +18,6 @@ void M_Menu_MultiPlayer_f (void)
p = NULL;
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
mgt = M_GameType();
@ -93,8 +92,8 @@ qboolean ApplySetupMenu (union menuoption_s *option,struct menu_s *menu, int key
Cvar_Set(&team, info->teamedit->text);
Cvar_Set(&skin, info->skinedit->text);
Cbuf_AddText(va("color %i %i\n", info->lowercolour, info->topcolour), RESTRICT_LOCAL);
m_entersound=true;
M_RemoveMenu(menu);
S_LocalSound ("misc/menu2.wav");
M_RemoveMenu(menu);
return true;
}
qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int key)
@ -107,7 +106,7 @@ qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int ke
info->topcolour ++;
if (info->topcolour>=14)
info->topcolour=0;
m_entersound=true;
S_LocalSound ("misc/menu2.wav");
return true;
}
if (key == K_LEFTARROW)
@ -115,7 +114,7 @@ qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int ke
info->topcolour --;
if (info->topcolour<=0)
info->topcolour=13;
m_entersound=true;
S_LocalSound ("misc/menu2.wav");
return true;
}
@ -127,7 +126,7 @@ qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int ke
info->lowercolour ++;
if (info->lowercolour>=14)
info->lowercolour=0;
m_entersound=true;
S_LocalSound ("misc/menu2.wav");
return true;
}
if (key == K_LEFTARROW)
@ -135,7 +134,7 @@ qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int ke
info->lowercolour --;
if (info->lowercolour<=0)
info->lowercolour=13;
m_entersound=true;
S_LocalSound ("misc/menu2.wav");
return true;
}
}
@ -179,7 +178,6 @@ void M_Menu_Setup_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(setupmenu_t));
info = menu->data;
@ -217,7 +215,6 @@ void M_Menu_ServerList_f (void)
{
key_dest = key_menu;
m_state = m_slist;
m_entersound = true;
MasterInfo_Begin();
}
@ -304,7 +301,6 @@ qboolean MultiBeginGame (union menuoption_s *option,struct menu_s *menu, int key
Cbuf_AddText("echo You can use the setrenderer command to return to a graphical interface at any time\n", RESTRICT_LOCAL);
}
m_entersound=true;
M_RemoveAllMenus();
return true;
@ -372,7 +368,6 @@ void M_Menu_GameOptions_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(newmultimenu_t));
info = menu->data;

View file

@ -46,7 +46,6 @@ void M_Menu_Options_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(0);
@ -204,7 +203,6 @@ void M_Menu_Audio_Speakers_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(audiomenuinfo_t));
info = menu->data;
@ -262,7 +260,6 @@ void M_Menu_Audio_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(0);
@ -317,7 +314,6 @@ void M_Menu_Particles_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(0);
@ -434,7 +430,6 @@ void M_Menu_FPS_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(0);

View file

@ -44,8 +44,6 @@ void M_MenuS_Script_f (void) //create a menu.
// if (key_dest != key_console)
key_dest = key_menu;
m_state = m_complex;
if (menu_script != currentmenu)
m_entersound = true;
selectitem = 0;
items=0;

View file

@ -98,7 +98,6 @@ void M_Menu_Save_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(loadsavemenuinfo_t));
menu->data = menu+1;
@ -123,7 +122,6 @@ void M_Menu_Load_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(loadsavemenuinfo_t));
menu->data = menu+1;
@ -158,7 +156,6 @@ void M_Menu_SinglePlayer_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
mgt = M_GameType();
if (mgt == MGT_QUAKE2)
@ -408,7 +405,6 @@ void M_Menu_Demos_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(demomenu_t));
menu->remove = M_Demo_Remove;
@ -445,7 +441,6 @@ void M_Menu_ParticleSets_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(demomenu_t));
menu->remove = M_Demo_Remove;
@ -474,7 +469,6 @@ void M_Menu_MediaFiles_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(demomenu_t));
menu->remove = M_Demo_Remove;

View file

@ -27,8 +27,6 @@ m_state_t m_state;
extern menu_t *menu_script;
qboolean m_entersound; // play after drawing a frame, so caching
// won't disrupt the sound
qboolean m_recursiveDraw;
int m_return_state;
@ -69,7 +67,7 @@ void M_Print (int cx, int cy, qbyte *str)
{
while (*str)
{
M_DrawCharacter (cx, cy, (*str)+128);
M_DrawCharacter (cx, cy, (*str)|CON_HIGHCHARSMASK);
str++;
cx += 8;
}
@ -79,7 +77,7 @@ void M_PrintColoured (int cx, int cy, int colour, qbyte *str)
{
while (*str)
{
M_DrawColouredCharacter (cx, cy, (*str) + (colour<<8));
M_DrawColouredCharacter (cx, cy, (*str) + (colour<<CON_FGMASK));
str++;
cx += 8;
}
@ -219,7 +217,6 @@ void M_ToggleMenu_f (void)
if (MP_Toggle())
return;
#endif
m_entersound = true;
if (key_dest == key_menu)
{
@ -346,7 +343,6 @@ void M_Menu_Keys_f (void)
{
key_dest = key_menu;
m_state = m_keys;
m_entersound = true;
#ifdef Q2CLIENT
if (cls.protocol == CP_QUAKE2)
@ -538,7 +534,6 @@ void M_Menu_Help_f (void)
{
key_dest = key_menu;
m_state = m_help;
m_entersound = true;
help_page = 0;
if (COM_FDepthFile("gfx/help1.lmp", true) < COM_FDepthFile("gfx/menu/help1.lmp", true))
@ -578,14 +573,14 @@ void M_Help_Key (int key)
case K_UPARROW:
case K_RIGHTARROW:
m_entersound = true;
S_LocalSound ("misc/menu2.wav");
if (++help_page >= num_help_pages)
help_page = 0;
break;
case K_DOWNARROW:
case K_LEFTARROW:
m_entersound = true;
S_LocalSound ("misc/menu2.wav");
if (--help_page < 0)
help_page = num_help_pages-1;
break;
@ -781,7 +776,6 @@ void M_Menu_Quit_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
M_RemoveMenu(&quitmenu);
memset(&quitmenu, 0, sizeof(quitmenu));
@ -1005,12 +999,6 @@ void M_Draw (int uimenu)
#endif
}
if (m_entersound)
{
S_LocalSound ("misc/menu2.wav");
m_entersound = false;
}
VID_UnlockBuffer ();
S_ExtraUpdate ();
VID_LockBuffer ();

View file

@ -278,8 +278,6 @@ void M_Complex_Draw(void);
void M_Script_Init(void);
void M_Serverlist_Init(void);
extern qboolean m_entersound;
void M_Menu_Main_f (void);
void M_Menu_SinglePlayer_f (void);
void M_Menu_Load_f (void);

View file

@ -1138,7 +1138,6 @@ void M_Menu_Video_f (void)
key_dest = key_menu;
m_state = m_complex;
m_entersound = true;
menu = M_CreateMenu(sizeof(videomenuinfo_t));
info = menu->data;

View file

@ -110,7 +110,7 @@ void Sbar_ChatModeOverlay(void);
void Draw_FunString(int x, int y, unsigned char *str)
{
int ext = COLOR_WHITE<<8;
int ext = CON_WHITEMASK;
int extstack[4];
int extstackdepth = 0;
@ -120,21 +120,21 @@ void Draw_FunString(int x, int y, unsigned char *str)
if (*str == '^')
{
str++;
if (*str >= '0' && *str <= '7')
if (*str >= '0' && *str <= '9')
{
ext = (*str++-'0')*256 + (ext&~CON_COLOURMASK); //change colour only.
ext = q3codemasks[*str++-'0'] | (ext&~CON_Q3MASK); //change colour only.
continue;
}
else if (*str == 'a')
{
str++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
ext ^= CON_2NDCHARSETTEXT;
continue;
}
else if (*str == 'b')
{
str++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
ext ^= CON_BLINKTEXT;
continue;
}
else if (*str == 's') //store on stack (it's great for names)
@ -159,26 +159,26 @@ void Draw_FunString(int x, int y, unsigned char *str)
}
else if (*str == '^')
{
Draw_ColouredCharacter(x, y, '^' + ext);
Draw_ColouredCharacter(x, y, '^' | ext);
str++;
}
else
{
Draw_ColouredCharacter(x, y, '^' + ext);
Draw_ColouredCharacter(x, y, '^' | ext);
x += 8;
Draw_ColouredCharacter (x, y, (*str++) + ext);
Draw_ColouredCharacter (x, y, (*str++) | ext);
}
x += 8;
continue;
}
Draw_ColouredCharacter (x, y, (*str++) + ext);
Draw_ColouredCharacter (x, y, (*str++) | ext);
x += 8;
}
}
void Draw_FunStringLen(int x, int y, unsigned char *str, int len)
{
int ext = COLOR_WHITE<<8;
int ext = CON_WHITEMASK;
int extstack[4];
int extstackdepth = 0;
@ -191,21 +191,21 @@ void Draw_FunStringLen(int x, int y, unsigned char *str, int len)
if (*str == '^')
{
str++;
if (*str >= '0' && *str <= '7')
if (*str >= '0' && *str <= '9')
{
ext = (*str++-'0')*256 + (ext&~CON_COLOURMASK); //change colour only.
ext = q3codemasks[*str++-'0'] | (ext&~CON_Q3MASK); //change colour only.
continue;
}
else if (*str == 'a')
{
str++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
ext ^= CON_2NDCHARSETTEXT;
continue;
}
else if (*str == 'b')
{
str++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
ext ^= CON_BLINKTEXT;
continue;
}
else if (*str == 's') //store on stack (it's great for names)
@ -229,19 +229,19 @@ void Draw_FunStringLen(int x, int y, unsigned char *str, int len)
}
else if (*str == '^')
{
Draw_ColouredCharacter(x, y, '^' + ext);
Draw_ColouredCharacter(x, y, '^' | ext);
str++;
}
else
{
Draw_ColouredCharacter(x, y, '^' + ext);
Draw_ColouredCharacter(x, y, '^' | ext);
x += 8;
Draw_ColouredCharacter (x, y, (*str++) + ext);
Draw_ColouredCharacter (x, y, (*str++) | ext);
}
x += 8;
continue;
}
Draw_ColouredCharacter (x, y, (*str++) + ext);
Draw_ColouredCharacter (x, y, (*str++) | ext);
x += 8;
}
}
@ -2056,7 +2056,7 @@ void Sbar_DeathmatchOverlay (int start)
y += skip;
}
Draw_Character(0,0,COLOR_WHITE<<8);
Draw_Character(0,0,CON_WHITEMASK);
if (y >= vid.height-10) // we ran over the screen size, squish
largegame = true;
@ -2157,7 +2157,7 @@ void Sbar_ChatModeOverlay(void)
y += skip;
}
Draw_Character(0,0,COLOR_WHITE<<8);
Draw_Character(0,0,CON_WHITEMASK);
if (y >= vid.height-10) // we ran over the screen size, squish
largegame = true;
@ -2240,7 +2240,7 @@ void Sbar_MiniDeathmatchOverlay (void)
f = s->frags;
sprintf (num, "%3i",f);
Draw_ColouredCharacter ( x+8 , y, (COLOR_WHITE<<8)|num[0]);
Draw_ColouredCharacter ( x+8 , y, CON_WHITEMASK|num[0]);
Draw_Character ( x+16, y, num[1]);
Draw_Character ( x+24, y, num[2]);
@ -2270,7 +2270,7 @@ void Sbar_MiniDeathmatchOverlay (void)
// draw seperator
x += 208;
for (y = sbar_rect.height - sb_lines; y < sbar_rect.height - 6; y += 2)
Draw_ColouredCharacter(x, y, (COLOR_WHITE<<8)|14);
Draw_ColouredCharacter(x, y, CON_WHITEMASK|14);
x += 16;

View file

@ -760,7 +760,7 @@ void Draw_CursorLine(int ox, int y, fileblock_t *b)
if (*d == '\t')
{
if (a == cx)
Draw_ColouredCharacter (x+ox, y, 11|M_COLOR_WHITE);
Draw_ColouredCharacter (x+ox, y, 11|CON_WHITEMASK);
x+=ts;
x-=x%ts;
d++;
@ -770,9 +770,9 @@ void Draw_CursorLine(int ox, int y, fileblock_t *b)
if (x+ox< vid.width)
{
if (a == cx)
Draw_ColouredCharacter (x+ox, y, 11|M_COLOR_WHITE);
Draw_ColouredCharacter (x+ox, y, 11|CON_WHITEMASK);
else
Draw_ColouredCharacter (x+ox, y, (int)*d | (colour<<8));
Draw_ColouredCharacter (x+ox, y, (int)*d | (colour<<CON_FGSHIFT));
}
d++;
x += 8;
@ -816,7 +816,7 @@ void Draw_NonCursorLine(int x, int y, fileblock_t *b)
continue;
}
if (x+nx < vid.width)
Draw_ColouredCharacter (x+nx, y, (int)*d | (colour<<8));
Draw_ColouredCharacter (x+nx, y, (int)*d | (colour<<CON_FGSHIFT));
d++;
nx += 8;
}
@ -894,9 +894,9 @@ void Editor_Draw(void)
x = 0;
if (madechanges)
Draw_Character (vid.width - 8, 0, '!'|128);
Draw_Character (vid.width - 8, 0, '!'|CON_HIGHCHARSMASK);
if (!insertkeyhit)
Draw_Character (vid.width - 16, 0, 'O'|128);
Draw_Character (vid.width - 16, 0, 'O'|CON_HIGHCHARSMASK);
Draw_String(0, 0, va("%6i:%4i:%s", cursorlinenum, cursorx+1, OpenEditorFile));
if (useeval)

View file

@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifdef FISH
void R_RenderView_fisheye(void);
cvar_t ffov = {"ffov", "160"};
cvar_t ffov = {"ffov", "0"};
cvar_t fviews = {"fviews", "6"};
#endif
@ -43,7 +43,7 @@ when crossing a water boudnary.
*/
#ifdef SIDEVIEWS
cvar_t vsec_enabled[SIDEVIEWS] = {{"v2_enabled", "1"}, {"v3_enabled", "0"}, {"v4_enabled", "0"}, {"v5_enabled", "0"}};
cvar_t vsec_enabled[SIDEVIEWS] = {{"v2_enabled", "0"}, {"v3_enabled", "0"}, {"v4_enabled", "0"}, {"v5_enabled", "0"}};
cvar_t vsec_x[SIDEVIEWS] = {{"v2_x", "0"}, {"v3_x", "0.25"}, {"v4_x", "0.5"}, {"v5_x", "0.75"}};
cvar_t vsec_y[SIDEVIEWS] = {{"v2_y", "0"}, {"v3_y", "0"}, {"v4_y", "0"}, {"v5_y", "0"}};
cvar_t vsec_scalex[SIDEVIEWS] = {{"v2_scalex", "0.25"}, {"v3_scalex", "0.25"}, {"v4_scalex", "0.25"}, {"v5_scalex", "0.25"}};

View file

@ -1393,7 +1393,7 @@ static char *TP_ParseFunChars (char *s, qbool chat)
}
}
if (!chat && *s == '^' && s[1] && s[1] != ' ') {
*out++ = s[1] | 128;
*out++ = s[1] | CON_HIGHCHARSMASK;
s += 2;
continue;
}

View file

@ -2773,7 +2773,7 @@ void Cmd_Condump_f(void)
// print out current contents of console
// stripping out starting blank lines and blank spaces
{
unsigned short *text;
conchar_t *text;
int row, line, x, spc, content;
console_t *curcon = &con_main;

View file

@ -21,31 +21,53 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// console
//
#define MAXCONCOLOURS 8
typedef unsigned int conchar_t;
#define MAXCONCOLOURS 16
typedef struct {
float r, g, b;
int rgbmask;
int ir, ig, ib;
float fr, fg, fb;
} consolecolours_t;
extern consolecolours_t consolecolours[MAXCONCOLOURS];
#define CON_STANDARDMASK 0x0080
#define CON_COLOURMASK 0x0700
#define CON_SPAREMASK3 0x0800 //something cool?
#define CON_SPAREMASK2 0x1000 //underline?
#define CON_SPAREMASK1 0x2000 //italics?
#define CON_BLINKTEXT 0x4000
#define CON_2NDCHARSETTEXT 0x8000
#define MAXQ3COLOURS 10
extern conchar_t q3codemasks[MAXQ3COLOURS];
#define COLOR_BLACK 0
#define COLOR_RED 1
#define COLOR_GREEN 2
#define COLOR_YELLOW 3
#define COLOR_BLUE 4
#define COLOR_MAGENTA 5
#define COLOR_CYAN 6
#define COLOR_WHITE 7
#define CON_NONCLEARBG 0x00800000
#define CON_BLINKTEXT 0x00400000
#define CON_2NDCHARSETTEXT 0x00200000
#define CON_HALFALPHA 0x00100000
#define CON_HIGHCHARSMASK 0x00000080 // Quake's alternative mask
#define M_COLOR_WHITE ((COLOR_WHITE)<<8)
#define CON_FLAGSMASK 0xFFFF0000
#define CON_CHARMASK 0x000000FF
#define CON_FGMASK 0x0F000000
#define CON_BGMASK 0xF0000000
#define CON_FGSHIFT 24
#define CON_BGSHIFT 28
#define CON_Q3MASK 0x0F100000
#define CON_WHITEMASK 0x0F000000 // must be constant. things assume this
// RGBI standard colors
#define COLOR_BLACK 0
#define COLOR_DARKBLUE 1
#define COLOR_DARKGREEN 2
#define COLOR_DARKCYAN 3
#define COLOR_DARKRED 4
#define COLOR_DARKMAGENTA 5
#define COLOR_BROWN 6
#define COLOR_GREY 7
#define COLOR_DARKGREY 8
#define COLOR_BLUE 9
#define COLOR_GREEN 10
#define COLOR_CYAN 11
#define COLOR_RED 12
#define COLOR_MAGENTA 13
#define COLOR_YELLOW 14
#define COLOR_WHITE 15
#define S_COLOR_BLACK "^0"
#define S_COLOR_RED "^1"
@ -57,10 +79,11 @@ extern consolecolours_t consolecolours[MAXCONCOLOURS];
#define S_COLOR_WHITE "^7"
#define CON_TEXTSIZE 16384
typedef struct console_s
{
char name[64];
unsigned short text[CON_TEXTSIZE];
conchar_t text[CON_TEXTSIZE];
int current; // line where next message will be printed
int x; // offset in current line for next print
int display; // bottom of console displays this line
@ -78,7 +101,7 @@ typedef struct console_s
extern console_t con_main;
extern console_t *con_current; // point to either con_main or con_chat
extern int con_ormask;
extern conchar_t con_ormask;
extern int scr_chatmode;

View file

@ -113,7 +113,7 @@ void Con_Log (char *s)
char c;
c = *(s+1);
if ((c >= '0' && c < '8') || c == 'a' || c == 'b' || c == 's' || c == 'r')
if ((c >= '0' && c <= '9') || c == 'a' || c == 'b' || c == 's' || c == 'r')
{
i--;
s++;

View file

@ -125,7 +125,9 @@ typedef struct plugin_s {
//protocol-in-a-plugin
int connectionlessclientpacket;
#endif
int messagefunction;
int svmsgfunction;
int chatmsgfunction;
int centerprintfunction;
struct plugin_s *next;
} plugin_t;
@ -371,8 +373,12 @@ int VARGS Plug_ExportToEngine(void *offset, unsigned int mask, const long *arg)
currentplug->sbarlevel[2] = arg[1];
else if (!strcmp(name, "ConnectionlessClientPacket"))
currentplug->connectionlessclientpacket = arg[1];
else if (!strcmp(name, "MessageEvent"))
currentplug->messagefunction = arg[1];
else if (!strcmp(name, "ServerMessageEvent"))
currentplug->svmsgfunction = arg[1];
else if (!strcmp(name, "ChatMessageEvent"))
currentplug->chatmsgfunction = arg[1];
else if (!strcmp(name, "CenterPrintMessage"))
currentplug->centerprintfunction = arg[1];
#endif
else
return 0;
@ -1549,17 +1555,49 @@ void Plug_SBar(void)
}
#endif
int Plug_Message(int clientnum, int messagelevel, char *buffer)
qboolean Plug_ServerMessage(char *buffer, int messagelevel)
{
qboolean ret = true;
for (currentplug = plugs; currentplug; currentplug = currentplug->next)
{
if (currentplug->messagefunction)
if (currentplug->svmsgfunction)
{
VM_Call(currentplug->vm, currentplug->messagefunction, clientnum, messagelevel, buffer);
ret &= VM_Call(currentplug->vm, currentplug->svmsgfunction, buffer, messagelevel);
}
}
return 1; // don't silence message
return ret; // true to display message, false to supress
}
qboolean Plug_ChatMessage(char *buffer, int talkernum, int tpflags)
{
qboolean ret = true;
for (currentplug = plugs; currentplug; currentplug = currentplug->next)
{
if (currentplug->chatmsgfunction)
{
ret &= VM_Call(currentplug->vm, currentplug->chatmsgfunction, buffer, talkernum, tpflags);
}
}
return ret; // true to display message, false to supress
}
qboolean Plug_CenterPrintMessage(char *buffer, int clientnum)
{
qboolean ret = true;
for (currentplug = plugs; currentplug; currentplug = currentplug->next)
{
if (currentplug->centerprintfunction)
{
ret &= VM_Call(currentplug->vm, currentplug->centerprintfunction, buffer, clientnum);
}
}
return ret; // true to display message, false to supress
}
void Plug_Close(plugin_t *plug)

View file

@ -1279,9 +1279,10 @@ void GLDraw_Character (int x, int y, unsigned int num)
#endif*/
}
void GLDraw_FillRGB (int x, int y, int w, int h, float r, float g, float b);
void GLDraw_ColouredCharacter (int x, int y, unsigned int num)
{
int col;
unsigned int col;
if (num & CON_BLINKTEXT)
{
@ -1290,11 +1291,16 @@ void GLDraw_ColouredCharacter (int x, int y, unsigned int num)
return;
}
// draw background
if (num & CON_NONCLEARBG)
{
col = (num&CON_COLOURMASK)/256;
qglColor3f(consolecolours[col].r, consolecolours[col].g, consolecolours[col].b);
col = (num & CON_BGMASK) >> CON_BGSHIFT;
GLDraw_FillRGB(x, y, 8, 8, consolecolours[col].fr, consolecolours[col].fg, consolecolours[col].fb);
}
// render character with foreground color
col = (num & CON_FGMASK) >> CON_FGSHIFT;
qglColor3f(consolecolours[col].fr, consolecolours[col].fg, consolecolours[col].fb);
Draw_Character(x, y, num);
}
/*
@ -1948,30 +1954,10 @@ void GLDraw_TileClear (int x, int y, int w, int h)
}
}
/*
=============
Draw_Fill
Fills a box of pixels with a single color
=============
*/
void GLDraw_Fill (int x, int y, int w, int h, int c)
void GLDraw_FillRGB (int x, int y, int w, int h, float r, float g, float b)
{
extern qboolean gammaworks;
qglDisable (GL_TEXTURE_2D);
if (gammaworks)
{
qglColor3f (host_basepal[c*3]/255.0,
host_basepal[c*3+1]/255.0,
host_basepal[c*3+2]/255.0);
}
else
{
qglColor3f (gammatable[host_basepal[c*3]]/255.0,
gammatable[host_basepal[c*3+1]]/255.0,
gammatable[host_basepal[c*3+2]]/255.0);
}
qglColor3f (r, g, b);
qglBegin (GL_QUADS);
@ -1984,6 +1970,32 @@ void GLDraw_Fill (int x, int y, int w, int h, int c)
qglColor3f (1,1,1);
qglEnable (GL_TEXTURE_2D);
}
/*
=============
Draw_Fill
Fills a box of pixels with a single color
=============
*/
void GLDraw_Fill (int x, int y, int w, int h, int c)
{
extern qboolean gammaworks;
if (gammaworks)
{
GLDraw_FillRGB (x, y, w, h,
host_basepal[c*3]/255.0,
host_basepal[c*3+1]/255.0,
host_basepal[c*3+2]/255.0);
}
else
{
GLDraw_FillRGB (x, y, w, h,
gammatable[host_basepal[c*3]]/255.0,
gammatable[host_basepal[c*3+1]]/255.0,
gammatable[host_basepal[c*3+2]]/255.0);
}
}
//=============================================================================
/*

View file

@ -38,6 +38,7 @@ void GLDraw_EditorBackground (int lines);
void GLDraw_BeginDisc (void);
void GLDraw_EndDisc (void);
void GLDraw_TileClear (int x, int y, int w, int h);
void GLDraw_FillRGB (int x, int y, int w, int h, float r, float g, float b);
void GLDraw_Fill (int x, int y, int w, int h, int c);
void GLDraw_FadeScreen (void);
void GLDraw_String (int x, int y, const qbyte *str);

View file

@ -30,7 +30,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//okay, so these are a quick but easy hack
void ED_Print (struct progfuncs_s *progfuncs, struct edict_s *ed);
int PR_EnableEBFSBuiltin(char *name, int binum);
void PR_CleanLogText_Init (void);
cvar_t nomonsters = {"nomonsters", "0"};
cvar_t gamecfg = {"gamecfg", "0"};
@ -535,8 +534,6 @@ void PR_LoadGlabalStruct(void)
pr_items2 = !!PR_FindGlobal(svprogfuncs, "items2", 0);
PR_CleanLogText_Init();
SV_ClearQCStats();
if (progstype == PROG_H2)
@ -5362,7 +5359,7 @@ void PF_redstring(progfuncs_t *prinst, struct globalvars_s *pr_globals)
static char buf[1024];
for (s = buf; *string; s++, string++)
*s=*string|128;
*s=*string|CON_HIGHCHARSMASK;
*s = '\0';
RETURN_TSTRING(buf);
@ -6836,66 +6833,46 @@ void PF_strstr (progfuncs_t *prinst, struct globalvars_s *pr_globals)
RETURN_TSTRING(p);
}
/*
====================
SV_CleanName_Init
sets chararcter table to translate quake texts to more friendly texts
====================
*/
char chartbl2[256];
void PR_CleanLogText_Init (void)
char readable2[256] =
{
int i;
for (i = 0; i < 256; i++)
chartbl2[i] = (i&127) < 32 ? ' ' : i&127;
chartbl2[13] = 13;
chartbl2[10] = 10;
// special cases
// numbers
for (i = 18; i < 28; i++)
chartbl2[i] = chartbl2[i + 128] = i + 30;
// brackets
chartbl2[29] = chartbl2[29 + 128] = chartbl2[128] = '(';
chartbl2[31] = chartbl2[31 + 128] = chartbl2[130] = ')';
chartbl2[16] = chartbl2[16 + 128]= '[';
chartbl2[17] = chartbl2[17 + 128] = ']';
// hash
for (i = 1; i < 10; i++) // 5 redefined as '.'
chartbl2[i] = chartbl2[i + 128] = '#';
chartbl2[11] = chartbl2[11 + 128] = '#';
// dot
chartbl2[5] = chartbl2[14] = chartbl2[15] = chartbl2[28] = chartbl2[46] = '.';
chartbl2[5 + 128] = chartbl2[14 + 128] = chartbl2[15 + 128] = chartbl2[28 + 128] = chartbl2[46 + 128] = '.';
// left arrow
chartbl2[127] = '>';
// right arrow
chartbl2[141] = '<';
// '='
chartbl2[30] = chartbl2[129] = chartbl2[30 + 128] = '=';
// whitespaces
chartbl2[12] = chartbl2[12 + 128] = chartbl2[138] = ' ';
chartbl2[33] = chartbl2[33 + 128]= '!';
}
'.', '_', '_', '_', '_', '.', '_', '_',
'_', '_', '\n', '_', '\n', '>', '.', '.',
'[', ']', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '.', '_', '_', '_',
' ', '!', '\"', '#', '$', '%', '&', '\'',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', '_',
'_', '_', '_', '_', '_', '.', '_', '_',
'_', '_', '_', '_', '_', '>', '.', '.',
'[', ']', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '.', '_', '_', '_',
' ', '!', '\"', '#', '$', '%', '&', '\'',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', '_'
};
void PR_CleanText(unsigned char *text)
{
for ( ; *text; text++)
*text = chartbl2[*text];
*text = readable2[*text];
}
/*

View file

@ -899,8 +899,8 @@ void SV_MVDWritePackets (int num)
demo.dbuf->maxsize = MAXSIZE + demo.dbuf->bufsize;
}
static char chartbl[256];
void CleanName_Init ();
extern char readable[256];
#define chartbl readable
void MVD_Init (void)
{
@ -918,15 +918,8 @@ void MVD_Init (void)
Cvar_Register (&sv_demoSuffix, MVDVARGROUP);
Cvar_Register (&sv_demotxt, MVDVARGROUP);
Cvar_Register (&sv_demoExtraNames, MVDVARGROUP);
CleanName_Init();
}
static char *SV_PrintTeams(void)
{
char *teams[MAX_CLIENTS];
@ -1523,85 +1516,6 @@ static qboolean SV_MVD_Record (mvddest_t *dest)
return true;
}
/*
====================
SV_CleanName_Init
sets chararcter table for quake text->filename translation
====================
*/
void CleanName_Init ()
{
int i;
for (i = 0; i < 256; i++)
chartbl[i] = (((i&127) < 'a' || (i&127) > 'z') && ((i&127) < '0' || (i&127) > '9')) ? '_' : (i&127);
// special cases
// numbers
for (i = 18; i < 29; i++)
chartbl[i] = chartbl[i + 128] = i + 30;
// allow lowercase only
for (i = 'A'; i <= 'Z'; i++)
chartbl[i] = chartbl[i+128] = i + 'a' - 'A';
// brackets
chartbl[29] = chartbl[29+128] = chartbl[128] = '(';
chartbl[31] = chartbl[31+128] = chartbl[130] = ')';
chartbl[16] = chartbl[16 + 128]= '[';
chartbl[17] = chartbl[17 + 128] = ']';
// dot
chartbl[5] = chartbl[14] = chartbl[15] = chartbl[28] = chartbl[46] = '.';
chartbl[5 + 128] = chartbl[14 + 128] = chartbl[15 + 128] = chartbl[28 + 128] = chartbl[46 + 128] = '.';
// !
chartbl[33] = chartbl[33 + 128] = '!';
// #
chartbl[35] = chartbl[35 + 128] = '#';
// %
chartbl[37] = chartbl[37 + 128] = '%';
// &
chartbl[38] = chartbl[38 + 128] = '&';
// '
chartbl[39] = chartbl[39 + 128] = '\'';
// (
chartbl[40] = chartbl[40 + 128] = '(';
// )
chartbl[41] = chartbl[41 + 128] = ')';
// +
chartbl[43] = chartbl[43 + 128] = '+';
// -
chartbl[45] = chartbl[45 + 128] = '-';
// @
chartbl[64] = chartbl[64 + 128] = '@';
// ^
// chartbl[94] = chartbl[94 + 128] = '^';
chartbl[91] = chartbl[91 + 128] = '[';
chartbl[93] = chartbl[93 + 128] = ']';
chartbl[16] = chartbl[16 + 128] = '[';
chartbl[17] = chartbl[17 + 128] = ']';
chartbl[123] = chartbl[123 + 128] = '{';
chartbl[125] = chartbl[125 + 128] = '}';
}
/*
====================
SV_CleanName

View file

@ -41,8 +41,19 @@ cvar_t sys_linebuffer = {"sys_linebuffer", "1"};
qboolean stdin_ready;
// This is for remapping the Q3 color codes to character masks, including ^9
conchar_t q3codemasks[MAXQ3COLOURS] = {
0x00000000, // 0, black
0x0c000000, // 1, red
0x0a000000, // 2, green
0x0e000000, // 3, yellow
0x09000000, // 4, blue
0x0b000000, // 5, cyan
0x0d000000, // 6, magenta
0x0f000000, // 7, white
0x0f100000, // 8, half-alpha white (BX_COLOREDTEXT)
0x07000000 // 9, "half-intensity" (BX_COLOREDTEXT)
};
struct termios orig, changes;
@ -186,39 +197,64 @@ void Sys_Error (const char *error, ...)
exit (1);
}
int ansiremap[8] = {0, 4, 2, 6, 1, 5, 3, 7};
void ApplyColour(unsigned int chr)
{
static int oldchar = 7*256;
chr = chr&~255;
static int oldchar = CON_WHITEMASK;
int bg, fg;
chr &= CON_FLAGSMASK;
if (oldchar == chr)
return;
oldchar = chr;
switch(chr&CON_COLOURMASK)
printf("\e[0;"); // reset
if (chr & CON_BLINKTEXT)
printf("5;"); // set blink
bg = chr & CON_BGMASK >> CON_BGSHIFT;
fg = chr & CON_FGMASK >> CON_FGSHIFT;
// don't handle intensive bit for background
// as terminals differ too much in displaying \e[1;7;3?m
bg &= 0x7;
if (chr & CON_NONCLEARBG)
{
//to get around wierd defaults (like a white background) we have these special hacks for colours 0 and 7
case 0*256:
printf("\e[0;7%sm", (chr&CON_BLINKTEXT)?";5":"");
break;
case 7*256:
printf("\e[0%sm", (chr&CON_BLINKTEXT)?";5":"");
break;
default:
printf("\e[0;%i%sm", 30+((chr&CON_COLOURMASK)>>8), (chr&CON_BLINKTEXT)?";5":"");
break;
if (fg & 0x8) // intensive bit set for foreground
{
printf("1;"); // set bold/intensity ansi flag
fg &= 0x7; // strip intensive bit
}
// set foreground and background colors
printf("3%i;4%im", ansiremap[fg], ansiremap[bg]);
}
else
{
switch(fg)
{
//to get around wierd defaults (like a white background) we have these special hacks for colours 0 and 7
case COLOR_BLACK:
printf("7m"); // set inverse
break;
case COLOR_GREY:
printf("1;30m"); // treat as dark grey
break;
case COLOR_WHITE:
print("m"); // set nothing else
break;
default:
if (fg & 0x8) // intensive bit set for foreground
{
printf("1;"); // set bold/intensity ansi flag
fg &= 0x7; // strip intensive bit
}
printf("3%im", fg); // set foreground
break;
}
}
}
@ -227,7 +263,7 @@ void Sys_PrintColouredChar(unsigned int chr)
{
ApplyColour(chr);
putch(chr&255);
putch(chr & CON_CHARMASK);
}
/*
@ -292,7 +328,7 @@ void Sys_Printf (char *fmt, ...)
if (sys_colorconsole.value)
{
int ext = COLOR_WHITE<<8;
int ext = CON_WHITEMASK;
int extstack[4];
int extstackdepth = 0;
unsigned char *str = (unsigned char*)msg;
@ -303,21 +339,21 @@ void Sys_Printf (char *fmt, ...)
if (*str == '^')
{
str++;
if (*str >= '0' && *str <= '7')
if (*str >= '0' && *str <= '9')
{
ext = (*str++-'0')*256 + (ext&~CON_COLOURMASK); //change colour only.
ext = q3codemasks[*str++-'0'] | (ext&~CON_Q3MASK); //change colour only.
continue;
}
else if (*str == 'a')
{
str++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
ext ^= CON_2NDCHARSETTEXT;
continue;
}
else if (*str == 'b')
{
str++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
ext ^= CON_BLINKTEXT;
continue;
}
else if (*str == 's') //store on stack (it's great for names)
@ -342,20 +378,20 @@ void Sys_Printf (char *fmt, ...)
}
else if (*str == '^')
{
Sys_PrintColouredChar('^' + ext);
Sys_PrintColouredChar('^' | ext);
str++;
}
else
{
Sys_PrintColouredChar('^' + ext);
Sys_PrintColouredChar ((*str++) + ext);
Sys_PrintColouredChar('^' | ext);
Sys_PrintColouredChar ((*str++) | ext);
}
continue;
}
Sys_PrintColouredChar ((*str++) + ext);
Sys_PrintColouredChar ((*str++) | ext);
}
ApplyColour(7*256);
ApplyColour(CON_WHITEMASK);
}
else
{

View file

@ -31,7 +31,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#endif
#define SERVICENAME DISTRIBUTION"SV"
// This is for remapping the Q3 color codes to character masks, including ^9
conchar_t q3codemasks[MAXQ3COLOURS] = {
0x00000000, // 0, black
0x0c000000, // 1, red
0x0a000000, // 2, green
0x0e000000, // 3, yellow
0x09000000, // 4, blue
0x0b000000, // 5, cyan
0x0d000000, // 6, magenta
0x0f000000, // 7, white
0x0f100000, // 8, half-alpha white (BX_COLOREDTEXT)
0x07000000 // 9, "half-intensity" (BX_COLOREDTEXT)
};
static HANDLE hconsoleout;
static HINSTANCE game_library;
@ -421,75 +433,54 @@ char *Sys_ConsoleInput (void)
void ApplyColour(unsigned int chr)
{
static int oldchar = 7*256;
chr = chr&~255;
static int oldchar = CON_WHITEMASK;
chr &= CON_FLAGSMASK;
if (oldchar == chr)
return;
oldchar = chr;
#if 1
if (hconsoleout)
{
int val;
val = FOREGROUND_INTENSITY;
switch(chr&CON_COLOURMASK)
unsigned short val = 0;
// bits 28-31 of the console chars match up to the attributes for
// the CHAR_INFO struct exactly
if (chr & CON_NONCLEARBG)
val = (chr & (CON_FGMASK|CON_BGMASK) >> CON_FGSHIFT);
else
{
case 0*256:
val = FOREGROUND_INTENSITY|FOREGROUND_INTENSITY; //don't allow secret messages (just hard to read)
break;
case 1*256:
val = FOREGROUND_RED|FOREGROUND_INTENSITY;
break;
case 2*256:
val = FOREGROUND_GREEN|FOREGROUND_INTENSITY;
break;
case 3*256:
val = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;
break;
case 4*256:
val = FOREGROUND_BLUE|FOREGROUND_INTENSITY;
break;
case 5*256:
val = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY;
break;
case 6*256:
val = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY;
break;
case 7*256:
val = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;
break;
int fg = (chr & CON_FGMASK) >> CON_FGSHIFT;
switch (fg)
{
case COLOR_BLACK: // reverse ^0 like the Linux version
val = BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE;
break;
case COLOR_WHITE: // reset to defaults?
val = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE; // use grey
break;
case COLOR_GREY:
val = FOREGROUND_INTENSITY; // color light grey as dark grey
break;
default:
val = fg; // send RGBI value as is
break;
}
}
if ((chr & CON_HALFALPHA) && (val & ~FOREGROUND_INTENSITY))
val &= ~FOREGROUND_INTENSITY; // strip intensity to fake alpha
SetConsoleTextAttribute(hconsoleout, val);
}
#else
//does ansi work?
//no?
//windows sucks.
switch(chr&CON_COLOURMASK)
{
case 0*256:
printf("%c[%s;3%u;4%um", (char)27,
(chr & CON_BLINKTEXT)? "01" : "00",
(unsigned int)(0),
(unsigned int)(0));
break;
default:
printf("%c[%s;3%u;4%um", (char)27,
(chr & CON_BLINKTEXT)? "01" : "00",
(unsigned int)(7),
(unsigned int)(0));
break;
}
#endif
}
void Sys_PrintColouredChar(unsigned int chr)
{
ApplyColour(chr);
printf("%c", chr&255);
printf("%c", chr & CON_CHARMASK);
}
/*
@ -551,7 +542,7 @@ void Sys_Printf (char *fmt, ...)
if (sys_colorconsole.value && hconsoleout)
{
int ext = COLOR_WHITE<<8;
int ext = CON_WHITEMASK;
int extstack[4];
int extstackdepth = 0;
unsigned char *str = (unsigned char*)msg;
@ -562,21 +553,21 @@ void Sys_Printf (char *fmt, ...)
if (*str == '^')
{
str++;
if (*str >= '0' && *str <= '7')
if (*str >= '0' && *str <= '9')
{
ext = (*str++-'0')*256 + (ext&~CON_COLOURMASK); //change colour only.
ext = q3codemasks[*str++-'0'] | (ext&~CON_Q3MASK); //change colour only.
continue;
}
else if (*str == 'a')
{
str++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
ext ^= CON_2NDCHARSETTEXT;
continue;
}
else if (*str == 'b')
{
str++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
ext ^= CON_BLINKTEXT;
continue;
}
else if (*str == 's') //store on stack (it's great for names)
@ -601,20 +592,20 @@ void Sys_Printf (char *fmt, ...)
}
else if (*str == '^')
{
Sys_PrintColouredChar('^' + ext);
Sys_PrintColouredChar('^' | ext);
str++;
}
else
{
Sys_PrintColouredChar('^' + ext);
Sys_PrintColouredChar ((*str++) + ext);
Sys_PrintColouredChar('^' | ext);
Sys_PrintColouredChar ((*str++) | ext);
}
continue;
}
Sys_PrintColouredChar ((*str++) + ext);
Sys_PrintColouredChar ((*str++) | ext);
}
ApplyColour(7*256);
ApplyColour(CON_WHITEMASK);
}
else
printf("%s", msg);

View file

@ -153,8 +153,8 @@ int palremapsize;
palremap_t *D_GetPaletteRemap(int red, int green, int blue, qboolean desaturate, qboolean fullbrights, int topcolor, int bottomcolor);
qbyte *D_GetMenuTintPal(void);
extern palremap_t *D_IdentityRemap(void);
extern void D_DereferenceRemap(palremap_t *palremap);
palremap_t *D_IdentityRemap(void);
void D_DereferenceRemap(palremap_t *palremap);
void D_InitTrans(void);
// void Set_TransLevelI(int level);

View file

@ -256,7 +256,7 @@ void MakePaletteRemaps(void)
for (i = 2; i < palremapsize; i++)
{
palremaps[i].key = 0;
palremaps[i].references = 0;
palremaps[i].references = -2147483648;
}
}
@ -360,7 +360,7 @@ void BuildModulatedPalette(qbyte *indexes, int red, int green, int blue, qboolea
palremap_t *D_GetPaletteRemap(int red, int green, int blue, qboolean desaturate, qboolean fullbrights, int topcolor, int bottomcolor)
{
int i, key, deref = -1;
int i, key, deref = -1, dereflast = 1;
topcolor = topcolor & 0xf;
bottomcolor = bottomcolor & 0xf;
@ -374,11 +374,17 @@ palremap_t *D_GetPaletteRemap(int red, int green, int blue, qboolean desaturate,
palremaps[i].b == blue &&
palremaps[i].key == key)
{
palremaps[i].references++;
if (palremaps[i].references < 1)
palremaps[i].references = 1;
else
palremaps[i].references++;
return palremaps + i;
}
else if (palremaps[i].references <= 0)
else if (palremaps[i].references < dereflast)
{
deref = i;
dereflast = palremaps[i].references;
}
}
if (deref < 2) // no remaps found and all maps are referenced
@ -420,8 +426,20 @@ palremap_t *RebuildMenuTint(void)
void D_DereferenceRemap(palremap_t *palremap)
{
static int dereftime;
if (palremap && palremap >= palremaps+2)
palremap->references--;
{
if (palremap->references < 2)
{
if (dereftime >= 0)
dereftime = -2147483648; // lowest negative 32-bit number
palremap->references = dereftime;
dereftime++;
}
else
palremap->references--;
}
}
qbyte *D_GetMenuTintPal(void)
@ -441,7 +459,6 @@ qbyte *D_GetMenuTintPal(void)
return NULL;
}
palremap_t *D_IdentityRemap(void) // TODO: explicitly inline this
{
return palremaps;

View file

@ -666,22 +666,19 @@ void SWDraw_Character (int x, int y, unsigned int num)
}
/*
#define FindPalette(r,g,b) pal555to8[((r&0xF8)>>3)|((g&0xF8)<<2)|((b&0xF8)<<7)]
#define colourmask(p,r,g,b) FindPalette(host_basepal[p*3]*r, host_basepal[p*3+1]*g, host_basepal[p*3+2]*b)
#define draw(p) colourmask(p, (int)consolecolours[colour].r, (int)consolecolours[colour].g, (int)consolecolours[colour].b)
*/
#define drawpal(r,g,b) pal555to8[(r|(g<<5)|(b<<10)) & consolecolours[colour].rgbmask]
#define draw(p) drawpal(host_basepal[p*3]>>3,host_basepal[p*3+1]>>3,host_basepal[p*3+2]>>3)
*/
#define draw(x) pr->pal[x]
void SWDraw_ColouredCharacter (int x, int y, unsigned int num)
{
qbyte *source;
int drawline;
int row, col;
extern cvar_t cl_noblink;
int colour;
unsigned int colour, bgcolour;
qboolean drawbg = false;
if (y <= -8)
return; // totally off screen
@ -689,7 +686,11 @@ int colour;
if (y > vid.height - 8 || x < 0 || x > vid.width - 8)
return;
colour = (num&CON_COLOURMASK)/256;
colour = (num & CON_FGMASK) >> CON_FGSHIFT;
bgcolour = (num & CON_BGMASK) >> CON_BGSHIFT;
if (num & CON_NONCLEARBG)
drawbg = true;
if (num & CON_BLINKTEXT)
{
@ -698,7 +699,7 @@ int colour;
return;
}
if (colour == COLOR_WHITE)
if (colour == COLOR_WHITE && !drawbg)
{
Draw_Character(x, y, num);
return;
@ -720,30 +721,61 @@ int colour;
if (r_pixbytes == 1)
{
palremap_t *pr;
qbyte *dest;
dest = vid.conbuffer + y*vid.conrowbytes + x;
while (drawline--)
pr = D_GetPaletteRemap(consolecolours[colour].ir,
consolecolours[colour].ig,
consolecolours[colour].ib,
false, true, TOP_DEFAULT, BOTTOM_DEFAULT);
if (drawbg)
{
if (source[0])
dest[0] = draw(source[0]);
if (source[1])
dest[1] = draw(source[1]);
if (source[2])
dest[2] = draw(source[2]);
if (source[3])
dest[3] = draw(source[3]);
if (source[4])
dest[4] = draw(source[4]);
if (source[5])
dest[5] = draw(source[5]);
if (source[6])
dest[6] = draw(source[6]);
if (source[7])
dest[7] = draw(source[7]);
source += 128;
dest += vid.conrowbytes;
int bgidx = GetPalette(consolecolours[bgcolour].ir,
consolecolours[bgcolour].ig,
consolecolours[bgcolour].ib);
while (drawline--)
{
dest[0] = source[0] ? draw(source[0]) : bgidx;
dest[1] = source[1] ? draw(source[1]) : bgidx;
dest[2] = source[2] ? draw(source[2]) : bgidx;
dest[3] = source[3] ? draw(source[3]) : bgidx;
dest[4] = source[4] ? draw(source[4]) : bgidx;
dest[5] = source[5] ? draw(source[5]) : bgidx;
dest[6] = source[6] ? draw(source[6]) : bgidx;
dest[7] = source[7] ? draw(source[7]) : bgidx;
source += 128;
dest += vid.conrowbytes;
}
}
else
{
while (drawline--)
{
if (source[0])
dest[0] = draw(source[0]);
if (source[1])
dest[1] = draw(source[1]);
if (source[2])
dest[2] = draw(source[2]);
if (source[3])
dest[3] = draw(source[3]);
if (source[4])
dest[4] = draw(source[4]);
if (source[5])
dest[5] = draw(source[5]);
if (source[6])
dest[6] = draw(source[6]);
if (source[7])
dest[7] = draw(source[7]);
source += 128;
dest += vid.conrowbytes;
}
}
D_DereferenceRemap(pr);
}
else if (r_pixbytes == 2)
{
@ -754,39 +786,45 @@ int colour;
dest16 = (unsigned short *)vid.conbuffer + y*vid.conrowbytes + x;
rm = consolecolours[colour].r*32;
gm = consolecolours[colour].g*32;
bm = consolecolours[colour].b*32;
while (drawline--)
rm = consolecolours[colour].ir>>3;
gm = consolecolours[colour].ig>>3;
bm = consolecolours[colour].ib>>3;
if (drawbg)
{
for (i = 0; i < 8; i++)
int bgidx16 = (consolecolours[bgcolour].ir>>3) |
(consolecolours[bgcolour].ig>>3)<<5 |
(consolecolours[bgcolour].ib>>3)<<10;
while (drawline--)
{
if (source[i])
dest16[i] = ((pal[source[i]*4+0]*bm/256)<<10)+
((pal[source[i]*4+1]*gm/256)<<5)+
pal[source[i]*4+2]*rm/256;
for (i = 0; i < 8; i++)
{
if (source[i])
dest16[i] = (((16+pal[source[i]*4+0]*bm)>>8)<<10)+
(((16+pal[source[i]*4+1]*gm)>>8)<<5)+
((16+pal[source[i]*4+2]*rm)>>8);
else
dest16[i] = bgidx16;
}
source += 128;
dest16 += vid.conrowbytes;
}
}
else
{
while (drawline--)
{
for (i = 0; i < 8; i++)
{
if (source[i])
dest16[i] = (((16+pal[source[i]*4+0]*bm)>>8)<<10)+
(((16+pal[source[i]*4+1]*gm)>>8)<<5)+
((16+pal[source[i]*4+2]*rm)>>8);
}
source += 128;
dest16 += vid.conrowbytes;
}
/*
if (source[0])
dest16[0] = pal[draw(source[0])];
if (source[1])
dest16[1] = pal[draw(source[1])];
if (source[2])
dest16[2] = pal[draw(source[2])];
if (source[3])
dest16[3] = pal[draw(source[3])];
if (source[4])
dest16[4] = pal[draw(source[4])];
if (source[5])
dest16[5] = pal[draw(source[5])];
if (source[6])
dest16[6] = pal[draw(source[6])];
if (source[7])
dest16[7] = pal[draw(source[7])];
*/
source += 128;
dest16 += vid.conrowbytes;
}
}
else if (r_pixbytes == 4)
@ -796,19 +834,45 @@ int colour;
unsigned char *pal = (unsigned char *)d_8to32table;
dest = vid.conbuffer + (y*vid.conrowbytes + x)*r_pixbytes;
while (drawline--)
if (drawbg)
{
for (i = 0; i < 8; i++)
while (drawline--)
{
if (source[i])
for (i = 0; i < 8; i++)
{
dest[0+i*4] = pal[source[i]*4+0]*consolecolours[colour].b;
dest[1+i*4] = pal[source[i]*4+1]*consolecolours[colour].g;
dest[2+i*4] = pal[source[i]*4+2]*consolecolours[colour].r;
}
if (source[i])
{
dest[0+i*4] = (128+pal[source[i]*4+0]*consolecolours[colour].ib)>>8;
dest[1+i*4] = (128+pal[source[i]*4+1]*consolecolours[colour].ig)>>8;
dest[2+i*4] = (128+pal[source[i]*4+2]*consolecolours[colour].ir)>>8;
}
else
{
dest[0+i*4] = consolecolours[bgcolour].ib;
dest[1+i*4] = consolecolours[bgcolour].ig;
dest[2+i*4] = consolecolours[bgcolour].ir;
}
}
source += 128;
dest += vid.conrowbytes*r_pixbytes;
}
}
else
{
while (drawline--)
{
for (i = 0; i < 8; i++)
{
if (source[i])
{
dest[0+i*4] = (128+pal[source[i]*4+0]*consolecolours[colour].ib)>>8;
dest[1+i*4] = (128+pal[source[i]*4+1]*consolecolours[colour].ig)>>8;
dest[2+i*4] = (128+pal[source[i]*4+2]*consolecolours[colour].ir)>>8;
}
}
source += 128;
dest += vid.conrowbytes*r_pixbytes;
}
source += 128;
dest += vid.conrowbytes*r_pixbytes;
}
}
}