1
0
Fork 0
forked from fte/fteqw

Some obituaries were not getting coloured, others could not be linked. Also underline console links on mouseover to encourage users into realising that they can actually be clicked.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5865 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-05-20 15:35:26 +00:00
parent f73e1b7ffc
commit e6c9a979c7
4 changed files with 107 additions and 44 deletions

View file

@ -6240,76 +6240,94 @@ static char acceptedchars[] = {'.', '?', '!', '\'', ',', ':', ' ', '\0'};
static void CL_PrintStandardMessage(char *msgtext, int printlevel)
{
int i;
player_info_t *p;
player_info_t *p, *foundp = NULL;
extern cvar_t cl_standardmsg, msg;
char *begin = msgtext;
char fullmessage[2048];
char *found;
if (printlevel < msg.ival)
return;
fullmessage[0] = 0;
// search for player names in message
for (i = 0, p = cl.players; i < cl.allocated_client_slots; p++, i++)
while(*msgtext)
{
char *v;
char *name;
int len;
qboolean coloured;
char c;
name = p->name;
if (!(*name))
continue;
len = strlen(name);
v = strstr(msgtext, name);
while (v)
found = NULL;
// search for player names in message
for (i = 0, p = cl.players; i < cl.allocated_client_slots; p++, i++)
{
// name parsing rules
if (v != begin && *(v-1) != ' ') // must be space before name
{
v = strstr(v+len, name);
continue;
}
char *v;
char *name;
int len;
name = p->name;
if (!(*name))
continue;
len = strlen(name);
v = strstr(msgtext, name);
while (v)
{
int i;
char aftername = *(v + len);
// search for accepted chars in char after name in msg
for (i = 0; i < sizeof(acceptedchars); i++)
// name parsing rules
if (v != begin && *(v-1) != ' ') // must be space before name
{
if (acceptedchars[i] == aftername)
break;
v = strstr(v+len, name);
continue;
}
if (sizeof(acceptedchars) == i)
{
v = strstr(v+len, name);
continue; // no accepted char found
}
}
int i;
char aftername = *(v + len);
*v = 0; // cut off message
// search for accepted chars in char after name in msg
for (i = 0; i < sizeof(acceptedchars); i++)
{
if (acceptedchars[i] == aftername)
break;
}
if (sizeof(acceptedchars) == i)
{
v = strstr(v+len, name);
continue; // no accepted char found
}
}
if (!found || v < found)
{
found = v;
foundp = p;
}
break;
}
}
if (found)
{
qboolean coloured;
char c;
int len = strlen(foundp->name);
// print msg chunk
*found = 0; // cut off message
Q_strncatz(fullmessage, msgtext, sizeof(fullmessage));
msgtext = v + len; // update search point
msgtext = found + len; // update search point
// get name color
if (p->spectator || cl_standardmsg.ival)
if (foundp->spectator || cl_standardmsg.ival)
{
coloured = false;
c = '7';
}
else
c = '0' + CL_PlayerColor(p, &coloured);
c = '0' + CL_PlayerColor(foundp, &coloured);
// print name
Q_strncatz(fullmessage, va("^[%s^%c%s^d\\player\\%i^]", coloured?"^m":"", c, name, (int)(p - cl.players)), sizeof(fullmessage));
break;
Q_strncatz(fullmessage, va("^[%s^%c%s^d\\player\\%i^]", coloured?"^m":"", c, foundp->name, (int)(foundp - cl.players)), sizeof(fullmessage));
}
else
break; //nope, can't find anyone in there...
}
// print final chunk

View file

@ -2574,12 +2574,51 @@ static int Con_DrawConsoleLines(console_t *con, conline_t *l, float displayscrol
con->selstartoffset = c - (conchar_t*)(l+1);
else
con->selstartoffset = 0;
if (selactive == 2 && s)
{ //checking for mouseover
//scan earlier to find any link enclosure
for(; c >= (conchar_t*)(l+1); c--)
{
if (*c == CON_LINKSTART)
{
selactive = 3; //we're mouse-overing a link!
con->selstartoffset = c - (conchar_t*)(l+1);
break;
}
if (*c == CON_LINKEND)
break; //some other link ended here. don't use its start.
}
if (selactive == 3 && con->selendline==l)
{
for (; c < (conchar_t*)(l+1)+l->length; c++)
if (*c == CON_LINKEND)
{
con->selendoffset = c - (conchar_t*)(l+1);
break;
}
sstart = picw;
for (c = s; c < (conchar_t*)(l+1)+con->selstartoffset; )
{
c = Font_Decode(c, &codeflags, &codepoint);
sstart = Font_CharEndCoord(font_console, sstart, codeflags, codepoint);
}
send = sstart;
for (; c < (conchar_t*)(l+1)+con->selendoffset; )
{
c = Font_Decode(c, &codeflags, &codepoint);
send = Font_CharEndCoord(font_console, send, codeflags, codepoint);
}
}
}
}
sstart += center;
send += center;
if (selactive == 1)
if (selactive != 2)
{
if (selactive == 1)
R2D_ImageColours(SRGBA(0.1,0.1,0.3, alphaval)); //selected
@ -2587,8 +2626,14 @@ static int Con_DrawConsoleLines(console_t *con, conline_t *l, float displayscrol
R2D_ImageColours(SRGBA(0.3,0.3,0.3, alphaval)); //mouseover.
if (send < sstart)
R2D_FillBlock((send*vid.width)/(float)vid.rotpixelwidth, (y*vid.height)/(float)vid.rotpixelheight, ((sstart - send)*vid.width)/(float)vid.rotpixelwidth, (Font_CharHeight()*vid.height)/(float)vid.rotpixelheight);
else
{
center = sstart;
sstart = send;
send = center;
}
if (selactive == 3) //2 pixels high
R2D_FillBlock((sstart*vid.width)/(float)vid.rotpixelwidth, ((y+Font_CharHeight()-2)*vid.height)/(float)vid.rotpixelheight, ((send - sstart)*vid.width)/(float)vid.rotpixelwidth, (2*vid.height)/(float)vid.rotpixelheight);
else //full height
R2D_FillBlock((sstart*vid.width)/(float)vid.rotpixelwidth, (y*vid.height)/(float)vid.rotpixelheight, ((send - sstart)*vid.width)/(float)vid.rotpixelwidth, (Font_CharHeight()*vid.height)/(float)vid.rotpixelheight);
R2D_Flush();
}

View file

@ -899,7 +899,7 @@ void Key_DefaultLinkClicked(console_t *con, char *text, char *info)
if (*cl.players[player].ip)
Con_Footerf(con, true, "\n%s", cl.players[player].ip);
if (cl.playerview[0].spectator || cls.demoplayback)
if (cl.playerview[0].spectator || cls.demoplayback==DPB_MVD||cls.demoplayback==DPB_EZTV)
{
//we're spectating, or an mvd
Con_Footerf(con, true, " ^[Spectate\\player\\%i\\action\\spec^]", player);

View file

@ -3282,7 +3282,7 @@ char *COM_DeFunString(conchar_t *str, conchar_t *stop, char *out, int outsize, q
}
if (d & CON_2NDCHARSETTEXT)
{ //FIXME: convert to quake glyphs...
if (!com_parseutf8.ival && !forceutf8 && codepoint >= 32 && codepoint <= 127)
if (!com_parseutf8.ival && !forceutf8 && codepoint >= 32 && codepoint <= 127 && (codeflags&CON_2NDCHARSETTEXT))
{ //strip the flag and encode it in private use (so it gets encoded as quake-compatible)
codeflags &= ~CON_2NDCHARSETTEXT;
codepoint |= 0xe080;