1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t		baseskin = CVAR2("baseskin", "base");
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t		noskins = CVAR2("noskins", "0");
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar		allskins[128];
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	MAX_CACHED_SKINS		128
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamskin_t		skins[MAX_CACHED_SKINS];
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			numskins;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSkin_Find
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  Determines the best skin for the given scoreboard
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  slot, and sets scoreboard->skin
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Skin_Find (player_info_t *sc)
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	skin_t		*skin;
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		name[128], *s;
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (allskins[0])
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (name, allskins);
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s = Info_ValueForKey (sc->userinfo, "skin");
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (s && s[0])
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			strcpy (name, s);
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			strcpy (name, baseskin.string);
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strstr (name, "..") || *name == '.')
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (name, "base");
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_StripExtension (name, name);
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<numskins ; i++)
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!strcmp (name, skins[i].name))
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sc->skin = &skins[i];
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Skin_Cache (sc->skin);
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (numskins == MAX_CACHED_SKINS)
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// ran out of spots, so flush everything
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Skin_Skins_f ();
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	skin = &skins[numskins];
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sc->skin = skin;
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	numskins++;
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	memset (skin, 0, sizeof(*skin));
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	strncpy(skin->name, name, sizeof(skin->name) - 1);
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSkin_Cache
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamReturns a pointer to the skin bitmap, or NULL to use the default
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte	*Skin_Cache (skin_t *skin)
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	name[1024];
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*raw;
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*out, *pix;
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pcx_t	*pcx;
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		x, y;
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		dataByte;
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		runLength;
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.downloadtype == dl_skin)
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;		// use base until downloaded
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (noskins.value==1) // JACK: So NOSKINS > 1 will show skins, but
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;	  // not download new ones.
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (skin->failedload)
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	out = Cache_Check (&skin->cache);
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (out)
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return out;
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// load the pic from disk
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (name, "skins/%s.pcx", skin->name);
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	raw = COM_LoadTempFile (name);
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!raw)
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Couldn't load skin %s\n", name);
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (name, "skins/%s.pcx", baseskin.string);
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		raw = COM_LoadTempFile (name);
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!raw)
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			skin->failedload = true;
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return NULL;
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse the PCX file
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pcx = (pcx_t *)raw;
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	raw = &pcx->data;
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (pcx->manufacturer != 0x0a
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| pcx->version != 5
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| pcx->encoding != 1
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| pcx->bits_per_pixel != 8
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| pcx->xmax >= 320
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| pcx->ymax >= 200)
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		skin->failedload = true;
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Bad skin %s\n", name);
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	out = Cache_Alloc (&skin->cache, 320*200, skin->name);
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!out)
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Skin_Cache: couldn't allocate");
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pix = out;
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (out, 0, 320*200);
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (y=0 ; y<pcx->ymax ; y++, pix += 320)
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (x=0 ; x<=pcx->xmax ; )
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (raw - (byte*)pcx > com_filesize)
164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			{
165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				Cache_Free (&skin->cache);
166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				skin->failedload = true;
167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				Con_Printf ("Skin %s was malformed.  You should delete it.\n", name);
168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				return NULL;
169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			}
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			dataByte = *raw++;
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if((dataByte & 0xC0) == 0xC0)
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				runLength = dataByte & 0x3F;
175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				if (raw - (byte*)pcx > com_filesize)
176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				{
177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					Cache_Free (&skin->cache);
178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					skin->failedload = true;
179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					Con_Printf ("Skin %s was malformed.  You should delete it.\n", name);
180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					return NULL;
181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				}
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dataByte = *raw++;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				runLength = 1;
186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// skin sanity check
188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (runLength + x > pcx->xmax + 2) {
189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				Cache_Free (&skin->cache);
190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				skin->failedload = true;
191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				Con_Printf ("Skin %s was malformed.  You should delete it.\n", name);
192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				return NULL;
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			while(runLength-- > 0)
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pix[x++] = dataByte;
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ( raw - (byte *)pcx > com_filesize)
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cache_Free (&skin->cache);
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		skin->failedload = true;
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Skin %s was malformed.  You should delete it.\n", name);
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	skin->failedload = false;
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return out;
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSkin_NextDownload
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Skin_NextDownload (void)
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	player_info_t	*sc;
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.downloadnumber == 0)
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Checking skins...\n");
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.downloadtype = dl_skin;
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		; cls.downloadnumber != MAX_CLIENTS
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		; cls.downloadnumber++)
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sc = &cl.players[cls.downloadnumber];
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!sc->name[0])
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Skin_Find (sc);
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (noskins.value)
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!CL_CheckOrDownloadFile(va("skins/%s.pcx", sc->skin->name)))
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;		// started a download
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.downloadtype = dl_none;
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// now load them in for real
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<MAX_CLIENTS ; i++)
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sc = &cl.players[i];
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!sc->name[0])
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Skin_Cache (sc->skin);
251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef GLQUAKE
252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		sc->skin = NULL;
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state != ca_active)
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// get next signon phase
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteString (&cls.netchan.message,
260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			va("begin %i", cl.servercount));
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cache_Report ();		// print remaining memory
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSkin_Skins_f
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamRefind all skins, downloading if needed.
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	Skin_Skins_f (void)
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<numskins ; i++)
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (skins[i].cache.data)
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cache_Free (&skins[i].cache);
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	numskins = 0;
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.downloadnumber = 0;
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.downloadtype = dl_skin;
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Skin_NextDownload ();
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSkin_AllSkins_f
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSets all skins to one specific one
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==========
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	Skin_AllSkins_f (void)
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (allskins, Cmd_Argv(1));
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Skin_Skins_f ();
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
302