QUAKETC with dpmaster fix.
don't archive csprogs when it's getting saved into demos anyway. bound bones when using a model with less bones than the relative skeletal object. mute(dprint) xinput restarts. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5205 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
922b0ca2bb
commit
f3ae58608b
14 changed files with 227 additions and 83 deletions
|
@ -1792,6 +1792,8 @@ void INS_StartupJoystick (void)
|
||||||
}
|
}
|
||||||
if (pXInputGetState)
|
if (pXInputGetState)
|
||||||
{
|
{
|
||||||
|
XINPUT_STATE xistate;
|
||||||
|
numdevs = 0;
|
||||||
for (id = 0; id < 4; id++)
|
for (id = 0; id < 4; id++)
|
||||||
{
|
{
|
||||||
if (joy_count == countof(wjoy))
|
if (joy_count == countof(wjoy))
|
||||||
|
@ -1802,8 +1804,11 @@ void INS_StartupJoystick (void)
|
||||||
wjoy[joy_count].devid = DEVID_UNSET;//id;
|
wjoy[joy_count].devid = DEVID_UNSET;//id;
|
||||||
wjoy[joy_count].numbuttons = 18; //xinput supports 16 buttons, we emulate two more with the two triggers.
|
wjoy[joy_count].numbuttons = 18; //xinput supports 16 buttons, we emulate two more with the two triggers.
|
||||||
joy_count++;
|
joy_count++;
|
||||||
|
|
||||||
|
if (ERROR_DEVICE_NOT_AVAILABLE != pXInputGetState(id, &xistate))
|
||||||
|
numdevs++;
|
||||||
}
|
}
|
||||||
Con_Printf("XInput is enabled (max %i controllers)\n", id);
|
Con_DPrintf("XInput is enabled (%i controllers found)\n", numdevs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Con_Printf("XInput not installed\n");
|
Con_Printf("XInput not installed\n");
|
||||||
|
|
|
@ -140,11 +140,21 @@ net_masterlist_t net_masterlist[] = {
|
||||||
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "kubus.rulez.pl:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "kubus.rulez.pl"},
|
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "kubus.rulez.pl:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "kubus.rulez.pl"},
|
||||||
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "telefrag.me:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "telefrag.me"},
|
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "telefrag.me:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "telefrag.me"},
|
||||||
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "master.teamdamage.com:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "master.teamdamage.com"},
|
// {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "master.teamdamage.com:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "master.teamdamage.com"},
|
||||||
#endif
|
|
||||||
|
|
||||||
|
//Total conversions will need to define their own in defaults.cfg or whatever.
|
||||||
{MP_DPMASTER, CVARFC("net_masterextra1", "ghdigital.com:27950 207.55.114.154:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //207.55.114.154 (was 69.59.212.88 (admin: LordHavoc)
|
{MP_DPMASTER, CVARFC("net_masterextra1", "ghdigital.com:27950 207.55.114.154:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //207.55.114.154 (was 69.59.212.88 (admin: LordHavoc)
|
||||||
{MP_DPMASTER, CVARFC("net_masterextra2", "dpmaster.deathmask.net:27950 107.161.23.68:27950 [2604:180::4ac:98c1]:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //107.161.23.68 (admin: Willis)
|
{MP_DPMASTER, CVARFC("net_masterextra2", "dpmaster.deathmask.net:27950 107.161.23.68:27950 [2604:180::4ac:98c1]:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //107.161.23.68 (admin: Willis)
|
||||||
{MP_DPMASTER, CVARFC("net_masterextra3", "dpmaster.tchr.no:27950 92.62.40.73:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //92.62.40.73 (admin: tChr)
|
{MP_DPMASTER, CVARFC("net_masterextra3", "dpmaster.tchr.no:27950 92.62.40.73:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //92.62.40.73 (admin: tChr)
|
||||||
|
#else
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra1", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra2", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra3", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
#endif
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra4", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra5", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra6", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra7", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
{MP_DPMASTER, CVARFC("net_masterextra8", "", CVAR_NOSAVE, Net_Masterlist_Callback)},
|
||||||
|
|
||||||
#ifdef Q2CLIENT
|
#ifdef Q2CLIENT
|
||||||
// {MP_QUAKE2, CVARFC("net_q2masterextra1", "satan.idsoftware.com:27900", CVAR_NOSAVE, Net_Masterlist_Callback), "Official Quake2 master server"},
|
// {MP_QUAKE2, CVARFC("net_q2masterextra1", "satan.idsoftware.com:27900", CVAR_NOSAVE, Net_Masterlist_Callback), "Official Quake2 master server"},
|
||||||
|
@ -275,7 +285,14 @@ void SV_Master_SingleHeartbeat(net_masterlist_t *master)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case MP_DPMASTER:
|
case MP_DPMASTER:
|
||||||
if (sv_listen_dp.value || sv_listen_nq.value) //set listen to 1 to allow qw connections, 2 to allow nq connections too.
|
//fte normally uses quakeworld masters for clients that support qw protocols, and dpmaster for clients that support nq protocols.
|
||||||
|
//unfortunately qwmasters don't support ipv6, and total conversions don't want to use qwmasters.
|
||||||
|
//we default to FTE-Quake when running quake so at least that part is fair.
|
||||||
|
//however, I made QSS also look for FTE-Quake servers too, so that's messy with listen_nq 0, but that's true if listen_dp is set.
|
||||||
|
//so we want to be quite permissive here, at least with custom builds that will default to these cvars set to 0.
|
||||||
|
#if defined(NQPROT) && !defined(QUAKETC)
|
||||||
|
if (sv_listen_dp.value || sv_listen_nq.value)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (sv_reportheartbeats.value)
|
if (sv_reportheartbeats.value)
|
||||||
{
|
{
|
||||||
|
@ -2471,6 +2488,7 @@ void MasterInfo_Request(master_t *mast)
|
||||||
case MP_NETQUAKE:
|
case MP_NETQUAKE:
|
||||||
//there is no nq udp master protocol
|
//there is no nq udp master protocol
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case MP_DPMASTER:
|
case MP_DPMASTER:
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
@ -2483,14 +2501,13 @@ void MasterInfo_Request(master_t *mast)
|
||||||
//for compat with dp, we use the nq netchan version. which is stupid, but whatever
|
//for compat with dp, we use the nq netchan version. which is stupid, but whatever
|
||||||
//we ask for ipv6 addresses from ipv6 masters (assuming it resolved okay)
|
//we ask for ipv6 addresses from ipv6 masters (assuming it resolved okay)
|
||||||
if (mast->adr.type == NA_IPV6)
|
if (mast->adr.type == NA_IPV6)
|
||||||
str = va("%c%c%c%cgetserversExt %s %u empty full ipv6"/*\x0A\n"*/, 255, 255, 255, 255, game, NQ_NETCHAN_VERSION);
|
str = va("%c%c%c%cgetserversExt %s %u empty full ipv6"/*\x0A\n"*/, 255, 255, 255, 255, game, com_protocolversion.ival);
|
||||||
else
|
else
|
||||||
str = va("%c%c%c%cgetservers %s %u empty full"/*\x0A\n"*/, 255, 255, 255, 255, game, NQ_NETCHAN_VERSION);
|
str = va("%c%c%c%cgetservers %s %u empty full"/*\x0A\n"*/, 255, 255, 255, 255, game, com_protocolversion.ival);
|
||||||
NET_SendPollPacket (strlen(str), str, mast->adr);
|
NET_SendPollPacket (strlen(str), str, mast->adr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MT_BCAST:
|
case MT_BCAST:
|
||||||
|
@ -2523,6 +2540,7 @@ void MasterInfo_Request(master_t *mast)
|
||||||
NET_SendPollPacket(net_message.cursize, net_message.data, mast->adr);
|
NET_SendPollPacket(net_message.cursize, net_message.data, mast->adr);
|
||||||
SZ_Clear(&net_message);
|
SZ_Clear(&net_message);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case MP_DPMASTER: //fixme
|
case MP_DPMASTER: //fixme
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
@ -2530,7 +2548,6 @@ void MasterInfo_Request(master_t *mast)
|
||||||
NET_SendPollPacket (strlen(str), str, mast->adr);
|
NET_SendPollPacket (strlen(str), str, mast->adr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6854,6 +6854,7 @@ void CSQC_Shutdown(void)
|
||||||
//when the qclib needs a file, it calls out to this function.
|
//when the qclib needs a file, it calls out to this function.
|
||||||
void *PDECL CSQC_PRLoadFile (const char *path, unsigned char *(PDECL *buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *sz)
|
void *PDECL CSQC_PRLoadFile (const char *path, unsigned char *(PDECL *buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *sz)
|
||||||
{
|
{
|
||||||
|
extern cvar_t sv_demo_write_csqc;
|
||||||
qbyte *file = NULL;
|
qbyte *file = NULL;
|
||||||
|
|
||||||
if (!strcmp(path, "csprogs.dat"))
|
if (!strcmp(path, "csprogs.dat"))
|
||||||
|
@ -6898,8 +6899,16 @@ void *PDECL CSQC_PRLoadFile (const char *path, unsigned char *(PDECL *buf_get)(v
|
||||||
file = NULL; //not valid
|
file = NULL; //not valid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//we write the csprogs into our archive if it was loaded from outside of there.
|
||||||
|
//this is to ensure that demos will play on the same machine later on...
|
||||||
|
//this is unreliable though, and redundant if we're writing the csqc into the demos themselves.
|
||||||
|
//also kinda irrelevant with sv_pure.
|
||||||
#ifndef FTE_TARGET_WEB
|
#ifndef FTE_TARGET_WEB
|
||||||
if (file)
|
if (file
|
||||||
|
#ifndef CLIENTONLY
|
||||||
|
&& !sv_demo_write_csqc.ival
|
||||||
|
#endif
|
||||||
|
)
|
||||||
//back it up
|
//back it up
|
||||||
COM_WriteFile(newname, FS_GAMEONLY, file, *sz);
|
COM_WriteFile(newname, FS_GAMEONLY, file, *sz);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -297,6 +297,7 @@ extern cvar_t fs_gamename;
|
||||||
extern cvar_t pm_downloads_url;
|
extern cvar_t pm_downloads_url;
|
||||||
extern cvar_t pm_autoupdate;
|
extern cvar_t pm_autoupdate;
|
||||||
extern cvar_t com_protocolname;
|
extern cvar_t com_protocolname;
|
||||||
|
extern cvar_t com_protocolversion;
|
||||||
extern cvar_t com_nogamedirnativecode;
|
extern cvar_t com_nogamedirnativecode;
|
||||||
extern cvar_t com_parseutf8;
|
extern cvar_t com_parseutf8;
|
||||||
extern cvar_t com_parseezquake;
|
extern cvar_t com_parseezquake;
|
||||||
|
|
|
@ -1224,7 +1224,7 @@ const float *Alias_GetBoneInformation(galiasinfo_t *inf, framestate_t *framestat
|
||||||
|
|
||||||
//try to return data in-place.
|
//try to return data in-place.
|
||||||
if (numgroups==1 && lerps[0].lerpcount == 1)
|
if (numgroups==1 && lerps[0].lerpcount == 1)
|
||||||
return Alias_ConvertBoneData(lerps[0].skeltype, lerps[0].pose[0], lerps[0].endbone, inf->ofsbones, targettype, targetbuffer, targetbufferalt, maxbufferbones);
|
return Alias_ConvertBoneData(lerps[0].skeltype, lerps[0].pose[0], min(lerps[0].endbone, inf->numbones), inf->ofsbones, targettype, targetbuffer, targetbufferalt, maxbufferbones);
|
||||||
|
|
||||||
for (lerp = lerps; numgroups--; lerp++)
|
for (lerp = lerps; numgroups--; lerp++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -109,6 +109,7 @@ cvar_t gameversion_min = CVARD("gameversion_min","", "gamecode version for serve
|
||||||
cvar_t gameversion_max = CVARD("gameversion_max","", "gamecode version for server browsers");
|
cvar_t gameversion_max = CVARD("gameversion_max","", "gamecode version for server browsers");
|
||||||
cvar_t fs_gamename = CVARAFD("com_fullgamename", NULL, "fs_gamename", CVAR_NOSET, "The filesystem is trying to run this game");
|
cvar_t fs_gamename = CVARAFD("com_fullgamename", NULL, "fs_gamename", CVAR_NOSET, "The filesystem is trying to run this game");
|
||||||
cvar_t com_protocolname = CVARAD("com_protocolname", NULL, "com_gamename", "The protocol game name used for dpmaster queries. For compatibility with DP, you can set this to 'DarkPlaces-Quake' in order to be listed in DP's master server, and to list DP servers.");
|
cvar_t com_protocolname = CVARAD("com_protocolname", NULL, "com_gamename", "The protocol game name used for dpmaster queries. For compatibility with DP, you can set this to 'DarkPlaces-Quake' in order to be listed in DP's master server, and to list DP servers.");
|
||||||
|
cvar_t com_protocolversion = CVARAD("com_protocolversion", "3", NULL, "The protocol version used for dpmaster queries."); //3 by default, for compat with DP/NQ, even if our QW protocol uses different versions entirely. really it only matters for master servers.
|
||||||
cvar_t com_parseutf8 = CVARD("com_parseutf8", "1", "Interpret console messages/playernames/etc as UTF-8. Requires special fonts. -1=iso 8859-1. 0=quakeascii(chat uses high chars). 1=utf8, revert to ascii on decode errors. 2=utf8 ignoring errors"); //1 parse. 2 parse, but stop parsing that string if a char was malformed.
|
cvar_t com_parseutf8 = CVARD("com_parseutf8", "1", "Interpret console messages/playernames/etc as UTF-8. Requires special fonts. -1=iso 8859-1. 0=quakeascii(chat uses high chars). 1=utf8, revert to ascii on decode errors. 2=utf8 ignoring errors"); //1 parse. 2 parse, but stop parsing that string if a char was malformed.
|
||||||
cvar_t com_parseezquake = CVARD("com_parseezquake", "0", "Treat chevron chars from configs as a per-character flag. You should use this only for compat with nquake's configs.");
|
cvar_t com_parseezquake = CVARD("com_parseezquake", "0", "Treat chevron chars from configs as a per-character flag. You should use this only for compat with nquake's configs.");
|
||||||
cvar_t com_highlightcolor = CVARD("com_highlightcolor", STRINGIFY(COLOR_RED), "ANSI colour to be used for highlighted text, used when com_parseutf8 is active.");
|
cvar_t com_highlightcolor = CVARD("com_highlightcolor", STRINGIFY(COLOR_RED), "ANSI colour to be used for highlighted text, used when com_parseutf8 is active.");
|
||||||
|
|
|
@ -5984,6 +5984,7 @@ void COM_InitFilesystem (void)
|
||||||
Cvar_Register(&pm_downloads_url, "Filesystem");
|
Cvar_Register(&pm_downloads_url, "Filesystem");
|
||||||
Cvar_Register(&pm_autoupdate, "Filesystem");
|
Cvar_Register(&pm_autoupdate, "Filesystem");
|
||||||
Cvar_Register(&com_protocolname, "Server Info");
|
Cvar_Register(&com_protocolname, "Server Info");
|
||||||
|
Cvar_Register(&com_protocolversion, "Server Info");
|
||||||
Cvar_Register(&fs_game, "Filesystem");
|
Cvar_Register(&fs_game, "Filesystem");
|
||||||
#ifdef Q2SERVER
|
#ifdef Q2SERVER
|
||||||
Cvar_Register(&fs_gamedir, "Filesystem");
|
Cvar_Register(&fs_gamedir, "Filesystem");
|
||||||
|
|
|
@ -128,11 +128,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
//=========================================
|
//=========================================
|
||||||
|
|
||||||
#define PORT_NQSERVER 26000
|
#define PORT_NQSERVER 26000
|
||||||
|
#define PORT_DPMASTER PORT_Q3MASTER
|
||||||
#define PORT_QWCLIENT 27001
|
#define PORT_QWCLIENT 27001
|
||||||
#define PORT_QWMASTER 27000
|
#define PORT_QWMASTER 27000
|
||||||
#define PORT_QWSERVER 27500
|
#define PORT_QWSERVER 27500
|
||||||
#define PORT_Q2CLIENT 27901
|
#define PORT_Q2CLIENT 27901
|
||||||
#define PORT_Q2SERVER 27910
|
#define PORT_Q2SERVER 27910
|
||||||
|
#define PORT_Q3MASTER 27950
|
||||||
#define PORT_Q3SERVER 27960
|
#define PORT_Q3SERVER 27960
|
||||||
|
|
||||||
//hexen2: 26900
|
//hexen2: 26900
|
||||||
|
|
|
@ -782,69 +782,114 @@ static struct charcache_s *Font_LoadPlaceholderGlyph(font_t *f, CHARIDXTYPE char
|
||||||
{
|
{
|
||||||
struct charcache_s *c;
|
struct charcache_s *c;
|
||||||
unsigned int out[169*4], i, o, g, b, w, h, d, n;
|
unsigned int out[169*4], i, o, g, b, w, h, d, n;
|
||||||
d = (f->charheight >= 11);
|
if (charidx == 0xe080 || charidx == 0xe081 || charidx == 0xe082 || charidx == 0xe083)
|
||||||
if (d)
|
{ //scrollbar glyps
|
||||||
{ //two rows
|
w = min(16,f->charheight);
|
||||||
h = 11;
|
h = max(1,w/8);
|
||||||
if (charidx > 0xffff)
|
d = 0;
|
||||||
n = 3;
|
|
||||||
else if (charidx > 0xff)
|
if (charidx == 0xe083) //centre
|
||||||
n = 2;
|
{
|
||||||
|
h *= 3;
|
||||||
|
memset(out+w*h*0, 0xff, w*4*h);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
n = 1;
|
{
|
||||||
w = n*4-1;
|
memset(out+w*h*0, 0xff, w*4*h);
|
||||||
n*=2;
|
memset(out+w*h*1, 0x00, w*4*h);
|
||||||
|
memset(out+w*h*2, 0xff, w*4*h);
|
||||||
|
for (i = 0; i < h; i++)
|
||||||
|
{
|
||||||
|
if (charidx == 0xe080) //left
|
||||||
|
memset(out+w*(i+h*1), 0xff, h*4);
|
||||||
|
if (charidx == 0xe082) //right
|
||||||
|
memset(out+w*(i+h*1)+w-h, 0xff, h*4);
|
||||||
|
}
|
||||||
|
h *= 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (charidx == 0xe01d || charidx == 0xe01e || charidx == 0xe01f)
|
||||||
|
{ //horizontal separator
|
||||||
|
w = min(16,f->charheight);
|
||||||
|
h = max(1,w/8);
|
||||||
|
d = 0;
|
||||||
|
memset(out, 0xff, w*4*h);
|
||||||
|
}
|
||||||
|
else if (charidx == 0xe00b)
|
||||||
|
{
|
||||||
|
h = min(16,f->charheight);
|
||||||
|
w = max(1,h/8);
|
||||||
|
d = 1;
|
||||||
|
memset(out, 0xff, w*4*h);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ //single row. bye bye fixed-width.
|
|
||||||
if (charidx > 0xfffff)
|
|
||||||
n = 6;
|
|
||||||
else if (charidx > 0xffff)
|
|
||||||
n = 5;
|
|
||||||
else if (charidx > 0xfff)
|
|
||||||
n = 4;
|
|
||||||
else if (charidx > 0xff)
|
|
||||||
n = 3;
|
|
||||||
else
|
|
||||||
n = 2;
|
|
||||||
w = n*4-1;
|
|
||||||
h = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
//figure out if we can get away with giving it a little more border to boost readability
|
|
||||||
b = (h+2 < f->charheight);
|
|
||||||
w += b*2;
|
|
||||||
h += b*2;
|
|
||||||
|
|
||||||
memset(out, 0xff, sizeof(out));
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
{
|
||||||
g = hex[0xf & (charidx>>(i<<2))];
|
d = (f->charheight >= 11);
|
||||||
o = b + w*b;
|
|
||||||
if (d)
|
if (d)
|
||||||
{ //stradle them over the two rows.
|
{ //two rows
|
||||||
if (i >= (n>>1))
|
h = 11;
|
||||||
o += 4*(n-i-1);
|
if (charidx > 0xffff)
|
||||||
|
n = 3;
|
||||||
|
else if (charidx > 0xff)
|
||||||
|
n = 2;
|
||||||
else
|
else
|
||||||
|
n = 1;
|
||||||
|
w = n*4-1;
|
||||||
|
n*=2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ //single row. bye bye fixed-width.
|
||||||
|
if (charidx > 0xfffff)
|
||||||
|
n = 6;
|
||||||
|
else if (charidx > 0xffff)
|
||||||
|
n = 5;
|
||||||
|
else if (charidx > 0xfff)
|
||||||
|
n = 4;
|
||||||
|
else if (charidx > 0xff)
|
||||||
|
n = 3;
|
||||||
|
else
|
||||||
|
n = 2;
|
||||||
|
w = n*4-1;
|
||||||
|
h = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
//figure out if we can get away with giving it a little more border to boost readability
|
||||||
|
b = (h+2 < f->charheight);
|
||||||
|
w += b*2;
|
||||||
|
h += b*2;
|
||||||
|
|
||||||
|
memset(out, 0xff, sizeof(out));
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
g = hex[0xf & (charidx>>(i<<2))];
|
||||||
|
o = b + w*b;
|
||||||
|
if (d)
|
||||||
|
{ //stradle them over the two rows.
|
||||||
|
if (i >= (n>>1))
|
||||||
|
o += 4*(n-i-1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o += 4*((n>>1)-i-1);
|
||||||
|
o += w * 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
o += 4*(n-i-1); //just arrange them in order
|
||||||
|
for (; g; g>>=3, o+=w)
|
||||||
{
|
{
|
||||||
o += 4*((n>>1)-i-1);
|
if (g & 4) out[o+0] = 0xff0000ff;
|
||||||
o += w * 6;
|
if (g & 2) out[o+1] = 0xff0000ff;
|
||||||
|
if (g & 1) out[o+2] = 0xff0000ff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
o += 4*(n-i-1); //just arrange them in order
|
d = 1;
|
||||||
for (; g; g>>=3, o+=w)
|
|
||||||
{
|
|
||||||
if (g & 4) out[o+0] = 0xff0000ff;
|
|
||||||
if (g & 2) out[o+1] = 0xff0000ff;
|
|
||||||
if (g & 1) out[o+2] = 0xff0000ff;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c = Font_LoadGlyphData(f, charidx, FT_PIXEL_MODE_RGBA, out, w, h, w*4);
|
c = Font_LoadGlyphData(f, charidx, FT_PIXEL_MODE_RGBA, out, w, h, w*4);
|
||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
c->advance = w+1;
|
c->advance = w+d;
|
||||||
c->left = 0;
|
c->left = 0;
|
||||||
c->top = (f->charheight-h-1)/2;
|
c->top = (f->charheight-h-1)/2;
|
||||||
}
|
}
|
||||||
|
@ -895,7 +940,8 @@ static struct charcache_s *Font_TryLoadGlyph(font_t *f, CHARIDXTYPE charidx)
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
charidx &= 0x7f;
|
if ((charidx&0x7f) > 0x20)
|
||||||
|
charidx &= 0x7f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1724,7 +1770,9 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
|
||||||
{
|
{
|
||||||
FMT_AUTO, //freetype, or quake
|
FMT_AUTO, //freetype, or quake
|
||||||
FMT_QUAKE, //first is default
|
FMT_QUAKE, //first is default
|
||||||
FMT_ISO88591, //latin-1 (first 256 chars of unicode too)
|
FMT_ISO88591, //latin-1 (first 256 chars of unicode too, c1 glyphs are usually invisible)
|
||||||
|
FMT_WINDOWS1252,//variation of latin-1 with extra glyphs
|
||||||
|
FMT_KOI8U, //image is 16*16 koi8-u codepage.
|
||||||
FMT_HORIZONTAL, //unicode, charcount=width/(height-2). single strip of chars, like halflife.
|
FMT_HORIZONTAL, //unicode, charcount=width/(height-2). single strip of chars, like halflife.
|
||||||
} fmt = FMT_AUTO;
|
} fmt = FMT_AUTO;
|
||||||
|
|
||||||
|
@ -1777,6 +1825,10 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
|
||||||
fmt = FMT_QUAKE;
|
fmt = FMT_QUAKE;
|
||||||
else if (*t == 'l')
|
else if (*t == 'l')
|
||||||
fmt = FMT_ISO88591;
|
fmt = FMT_ISO88591;
|
||||||
|
else if (*t == 'w')
|
||||||
|
fmt = FMT_WINDOWS1252;
|
||||||
|
else if (*t == 'k')
|
||||||
|
fmt = FMT_KOI8U;
|
||||||
else if (*t == 'h')
|
else if (*t == 'h')
|
||||||
fmt = FMT_HORIZONTAL;
|
fmt = FMT_HORIZONTAL;
|
||||||
}
|
}
|
||||||
|
@ -2036,11 +2088,52 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
|
||||||
if (defaultplane != INVALIDPLANE)
|
if (defaultplane != INVALIDPLANE)
|
||||||
{
|
{
|
||||||
if (!f->faces)
|
if (!f->faces)
|
||||||
{
|
{
|
||||||
|
static const unsigned short iso88591[] = {
|
||||||
|
0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87, 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f,
|
||||||
|
0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97, 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f};
|
||||||
|
static const unsigned short win1252[] = {
|
||||||
|
0x20ac, 0x81,0x201a,0x0192, 0x201e,0x2026,0x2020,0x2021, 0x02c6,0x2030,0x0160,0x2039, 0x0152, 0x8d,0x017d, 0x8f,
|
||||||
|
0x90,0x2018,0x2019,0x101c, 0x201d,0x2022,0x2013,0x2014, 0x02dc,0x2122,0x0161,0x203a, 0x0153, 0x9d,0x017e,0x0178};
|
||||||
|
static const unsigned short koi8u[] = {
|
||||||
|
0x2500,0x2502,0x250C,0x2510, 0x2514,0x2518,0x251C,0x2524, 0x252C,0x2534,0x253C,0x2580, 0x2584,0x2588,0x258C,0x2590,
|
||||||
|
0x2591,0x2592,0x2593,0x2320, 0x25A0,0x2219,0x221A,0x2248, 0x2264,0x2265,0x00A0,0x2321, 0x00B0,0x00B2,0x00B7,0x00F7,
|
||||||
|
0x2550,0x2551,0x2552,0x0451, 0x0454,0x2554,0x0456,0x0457, 0x2557,0x2558,0x2559,0x255A, 0x255B,0x0491,0x255D,0x255E,
|
||||||
|
0x255F,0x2560,0x2561,0x0401, 0x0404,0x2563,0x0406,0x0407, 0x2566,0x2567,0x2568,0x2569, 0x256A,0x0490,0x256C,0x00A9,
|
||||||
|
0x044E,0x0430,0x0431,0x0446, 0x0434,0x0435,0x0444,0x0433, 0x0445,0x0438,0x0439,0x043A, 0x043B,0x043C,0x043D,0x043E,
|
||||||
|
0x043F,0x044F,0x0440,0x0441, 0x0442,0x0443,0x0436,0x0432, 0x044C,0x044B,0x0437,0x0448, 0x044D,0x0449,0x0447,0x044A,
|
||||||
|
0x042E,0x0410,0x0411,0x0426, 0x0414,0x0415,0x0424,0x0413, 0x0425,0x0418,0x0419,0x041A, 0x041B,0x041C,0x041D,0x041E,
|
||||||
|
0x041F,0x042F,0x0420,0x0421, 0x0422,0x0423,0x0416,0x0412, 0x042C,0x042B,0x0417,0x0428, 0x042D,0x0429,0x0427,0x042A};
|
||||||
|
const unsigned short *c1;
|
||||||
|
unsigned int c1size;
|
||||||
|
|
||||||
|
if (fmt==FMT_AUTO)
|
||||||
|
fmt=FMT_QUAKE;
|
||||||
|
|
||||||
|
if (fmt == FMT_WINDOWS1252)
|
||||||
|
{ //some tools use these extra ones (latin-1 has no visible c1 entries)
|
||||||
|
c1 = win1252;
|
||||||
|
c1size = countof(win1252);
|
||||||
|
}
|
||||||
|
else if (fmt == FMT_KOI8U)
|
||||||
|
{ //lots of russians in the quake scene
|
||||||
|
c1 = koi8u;
|
||||||
|
c1size = countof(koi8u);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c1 = iso88591;
|
||||||
|
c1size = countof(iso88591);
|
||||||
|
}
|
||||||
|
c1size += 128;
|
||||||
|
|
||||||
/*force it to load, even if there's nothing there*/
|
/*force it to load, even if there's nothing there*/
|
||||||
for (i = ((fmt==FMT_QUAKE)?32:0); i < ((fmt==FMT_QUAKE)?128:256); i++)
|
for (i = ((fmt==FMT_QUAKE)?32:0); i < ((fmt==FMT_QUAKE)?128:256); i++)
|
||||||
{
|
{
|
||||||
c = Font_GetCharStore(f, i);
|
if (i >= 128 && i < c1size)
|
||||||
|
c = Font_GetCharStore(f, c1[i-128]);
|
||||||
|
else
|
||||||
|
c = Font_GetCharStore(f, i);
|
||||||
|
|
||||||
c->advance = f->charheight;
|
c->advance = f->charheight;
|
||||||
c->bmh = PLANEWIDTH/16;
|
c->bmh = PLANEWIDTH/16;
|
||||||
|
@ -2054,19 +2147,22 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*pack the default chars into it*/
|
if (fmt == FMT_QUAKE)
|
||||||
for (i = 0xe000; i <= 0xe0ff; i++)
|
|
||||||
{
|
{
|
||||||
c = Font_GetCharStore(f, i);
|
/*pack the default chars into it*/
|
||||||
c->advance = f->charheight;
|
for (i = 0xe000; i <= 0xe0ff; i++)
|
||||||
c->bmh = PLANEWIDTH/16;
|
{
|
||||||
c->bmw = PLANEWIDTH/16;
|
c = Font_GetCharStore(f, i);
|
||||||
c->bmx = ((i&15))*(PLANEWIDTH/16);
|
c->advance = f->charheight;
|
||||||
c->bmy = ((i&0xf0)/16)*(PLANEWIDTH/16);
|
c->bmh = PLANEWIDTH/16;
|
||||||
c->left = 0;
|
c->bmw = PLANEWIDTH/16;
|
||||||
c->top = 0;
|
c->bmx = ((i&15))*(PLANEWIDTH/16);
|
||||||
c->nextchar = 0; //these chars are not linked in
|
c->bmy = ((i&0xf0)/16)*(PLANEWIDTH/16);
|
||||||
c->texplane = defaultplane;
|
c->left = 0;
|
||||||
|
c->top = 0;
|
||||||
|
c->nextchar = 0; //these chars are not linked in
|
||||||
|
c->texplane = defaultplane;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
|
|
|
@ -2768,7 +2768,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"!!cvarf gl_specular\n"
|
"!!cvarf gl_specular\n"
|
||||||
"!!cvardf gl_affinemodels=0\n"
|
"!!cvardf gl_affinemodels=0\n"
|
||||||
"!!cvardf r_tessellation_level=5\n"
|
"!!cvardf r_tessellation_level=5\n"
|
||||||
"!!samps diffuse normalmap specular fullbright upper lower paletted\n"
|
"!!samps diffuse normalmap specular fullbright upper lower paletted reflectmask reflectcube\n"
|
||||||
|
|
||||||
"#include \"sys/defs.h\"\n"
|
"#include \"sys/defs.h\"\n"
|
||||||
|
|
||||||
|
@ -10998,7 +10998,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"!!cvarf r_glsl_offsetmapping_scale\n"
|
"!!cvarf r_glsl_offsetmapping_scale\n"
|
||||||
"!!cvardf r_glsl_pcf\n"
|
"!!cvardf r_glsl_pcf\n"
|
||||||
"!!cvardf r_tessellation_level=5\n"
|
"!!cvardf r_tessellation_level=5\n"
|
||||||
"!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask\n"
|
"!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask projectionmap\n"
|
||||||
|
|
||||||
"#include \"sys/defs.h\"\n"
|
"#include \"sys/defs.h\"\n"
|
||||||
|
|
||||||
|
@ -11211,7 +11211,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
|
|
||||||
"void main ()\n"
|
"void main ()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
"#ifdef ORTHO\n"
|
||||||
|
"float colorscale = 1.0;\n"
|
||||||
|
"#else\n"
|
||||||
"float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);\n"
|
"float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);\n"
|
||||||
|
"#endif\n"
|
||||||
"#ifdef PCF\n"
|
"#ifdef PCF\n"
|
||||||
/*filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows*/
|
/*filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows*/
|
||||||
"colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord);\n"
|
"colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord);\n"
|
||||||
|
|
|
@ -1170,3 +1170,5 @@ vfile_t *QCC_FindVFile(const char *name);
|
||||||
vfile_t *QCC_AddVFile(const char *name, void *data, size_t size);
|
vfile_t *QCC_AddVFile(const char *name, void *data, size_t size);
|
||||||
void QCC_CatVFile(vfile_t *, const char *fmt, ...);
|
void QCC_CatVFile(vfile_t *, const char *fmt, ...);
|
||||||
void QCC_InsertVFile(vfile_t *, size_t pos, const char *fmt, ...);
|
void QCC_InsertVFile(vfile_t *, size_t pos, const char *fmt, ...);
|
||||||
|
|
||||||
|
void *QCC_ReadFile(const char *fname, unsigned char *(*buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *out_size);
|
||||||
|
|
|
@ -144,8 +144,10 @@ cvar_t sv_phs = CVARD("sv_phs", "1", "If 1, do not use the phs. It is genera
|
||||||
cvar_t sv_resetparms = CVAR("sv_resetparms", "0");
|
cvar_t sv_resetparms = CVAR("sv_resetparms", "0");
|
||||||
cvar_t sv_pupglow = CVARFD("sv_pupglow", "", CVAR_SERVERINFO, "Instructs clients to enable hexen2-style powerup pulsing.");
|
cvar_t sv_pupglow = CVARFD("sv_pupglow", "", CVAR_SERVERINFO, "Instructs clients to enable hexen2-style powerup pulsing.");
|
||||||
|
|
||||||
|
#ifdef SV_MASTER
|
||||||
cvar_t sv_master = CVAR("sv_master", "0");
|
cvar_t sv_master = CVAR("sv_master", "0");
|
||||||
cvar_t sv_masterport = CVAR("sv_masterport", "0");
|
cvar_t sv_masterport = CVAR("sv_masterport", "0");
|
||||||
|
#endif
|
||||||
|
|
||||||
cvar_t pext_ezquake_nochunks = CVARD("pext_ezquake_nochunks", "0", "Prevents ezquake clients from being able to use the chunked download extension. This sidesteps numerous ezquake issues, and will make downloads slower but more robust.");
|
cvar_t pext_ezquake_nochunks = CVARD("pext_ezquake_nochunks", "0", "Prevents ezquake clients from being able to use the chunked download extension. This sidesteps numerous ezquake issues, and will make downloads slower but more robust.");
|
||||||
|
|
||||||
|
@ -1251,13 +1253,13 @@ static void SVC_GetInfo (char *challenge, int fullstatus)
|
||||||
Q_strncpyz(resp, svs.info, sizeof(response) - (resp-response));
|
Q_strncpyz(resp, svs.info, sizeof(response) - (resp-response));
|
||||||
//this is a DP protocol query, so some QW fields are not needed
|
//this is a DP protocol query, so some QW fields are not needed
|
||||||
Info_RemoveKey(resp, "maxclients"); //replaced with sv_maxclients
|
Info_RemoveKey(resp, "maxclients"); //replaced with sv_maxclients
|
||||||
Info_RemoveKey(resp, "map"); //replaced with mapname
|
Info_RemoveKey(resp, "map"); //replaced with mapname
|
||||||
|
Info_RemoveKey(resp, "*gamedir"); //replaced with modname
|
||||||
|
Info_RemoveKey(resp, "*z_ext"); //uninteresting and spammy.
|
||||||
Info_SetValueForKey(resp, "gamename", protocolname, sizeof(response) - (resp-response));
|
Info_SetValueForKey(resp, "gamename", protocolname, sizeof(response) - (resp-response));
|
||||||
Info_SetValueForKey(resp, "modname", FS_GetGamedir(true), sizeof(response) - (resp-response));
|
Info_SetValueForKey(resp, "modname", FS_GetGamedir(true), sizeof(response) - (resp-response));
|
||||||
// Info_SetValueForKey(resp, "gamedir", FS_GetGamedir(true), sizeof(response) - (resp-response));
|
// Info_SetValueForKey(resp, "gamedir", FS_GetGamedir(true), sizeof(response) - (resp-response));
|
||||||
#ifdef NQPROT
|
Info_SetValueForKey(resp, "protocol", va("%d", com_protocolversion.ival), sizeof(response) - (resp-response));
|
||||||
Info_SetValueForKey(resp, "protocol", va("%d", NQ_NETCHAN_VERSION), sizeof(response) - (resp-response));
|
|
||||||
#endif
|
|
||||||
Info_SetValueForKey(resp, "clients", va("%d", numclients), sizeof(response) - (resp-response));
|
Info_SetValueForKey(resp, "clients", va("%d", numclients), sizeof(response) - (resp-response));
|
||||||
Info_SetValueForKey(resp, "sv_maxclients", maxclients.string, sizeof(response) - (resp-response));
|
Info_SetValueForKey(resp, "sv_maxclients", maxclients.string, sizeof(response) - (resp-response));
|
||||||
Info_SetValueForKey(resp, "mapname", Info_ValueForKey(svs.info, "map"), sizeof(response) - (resp-response));
|
Info_SetValueForKey(resp, "mapname", Info_ValueForKey(svs.info, "map"), sizeof(response) - (resp-response));
|
||||||
|
@ -4832,6 +4834,7 @@ float SV_Frame (void)
|
||||||
IWebRun();
|
IWebRun();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SV_MASTER
|
||||||
if (sv_master.ival)
|
if (sv_master.ival)
|
||||||
{
|
{
|
||||||
if (sv_masterport.ival)
|
if (sv_masterport.ival)
|
||||||
|
@ -4839,6 +4842,7 @@ float SV_Frame (void)
|
||||||
else
|
else
|
||||||
SVM_Think(PORT_QWMASTER);
|
SVM_Think(PORT_QWMASTER);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PLUGINS
|
#ifdef PLUGINS
|
||||||
if (isDedicated)
|
if (isDedicated)
|
||||||
|
@ -5145,8 +5149,10 @@ void SV_InitLocal (void)
|
||||||
|
|
||||||
Cvar_Register (&sv_showconnectionlessmessages, cvargroup_servercontrol);
|
Cvar_Register (&sv_showconnectionlessmessages, cvargroup_servercontrol);
|
||||||
Cvar_Register (&sv_banproxies, cvargroup_serverpermissions);
|
Cvar_Register (&sv_banproxies, cvargroup_serverpermissions);
|
||||||
|
#ifdef SV_MASTER
|
||||||
Cvar_Register (&sv_master, cvargroup_servercontrol);
|
Cvar_Register (&sv_master, cvargroup_servercontrol);
|
||||||
Cvar_Register (&sv_masterport, cvargroup_servercontrol);
|
Cvar_Register (&sv_masterport, cvargroup_servercontrol);
|
||||||
|
#endif
|
||||||
|
|
||||||
Cvar_Register (&filterban, cvargroup_servercontrol);
|
Cvar_Register (&filterban, cvargroup_servercontrol);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
!!cvarf gl_specular
|
!!cvarf gl_specular
|
||||||
!!cvardf gl_affinemodels=0
|
!!cvardf gl_affinemodels=0
|
||||||
!!cvardf r_tessellation_level=5
|
!!cvardf r_tessellation_level=5
|
||||||
!!samps diffuse normalmap specular fullbright upper lower paletted
|
!!samps diffuse normalmap specular fullbright upper lower paletted reflectmask reflectcube
|
||||||
|
|
||||||
#include "sys/defs.h"
|
#include "sys/defs.h"
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
!!cvarf r_glsl_offsetmapping_scale
|
!!cvarf r_glsl_offsetmapping_scale
|
||||||
!!cvardf r_glsl_pcf
|
!!cvardf r_glsl_pcf
|
||||||
!!cvardf r_tessellation_level=5
|
!!cvardf r_tessellation_level=5
|
||||||
!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask
|
!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask projectionmap
|
||||||
|
|
||||||
#include "sys/defs.h"
|
#include "sys/defs.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue