mirror of
https://github.com/yquake2/yquake2
synced 2026-08-20 00:26:04 -04:00
menu: Cleanup PlayerModelList
This commit is contained in:
parent
1621077464
commit
aea72afde6
1 changed files with 45 additions and 113 deletions
|
|
@ -5779,7 +5779,7 @@ PlayerDirectoryList(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
SkinsInDir(strlist_t *sl, const char *dirname, const char *ext)
|
||||
{
|
||||
strlist_t list;
|
||||
|
|
@ -5820,165 +5820,97 @@ SkinsInDir(strlist_t *sl, const char *dirname, const char *ext)
|
|||
static qboolean
|
||||
PlayerModelList(void)
|
||||
{
|
||||
strlist_t list;
|
||||
char** data = NULL;
|
||||
int i;
|
||||
int mdl = 0;
|
||||
qboolean result = true;
|
||||
|
||||
// malloc models
|
||||
data = (char**)calloc(MAX_PLAYERMODELS, sizeof(char*));
|
||||
YQ2_COM_CHECK_OOM(data, "calloc()", MAX_PLAYERMODELS * sizeof(char*))
|
||||
if (!data)
|
||||
{
|
||||
/* unaware about YQ2_ATTR_NORETURN_FUNCPTR? */
|
||||
return false;
|
||||
}
|
||||
|
||||
s_modelname.data = data;
|
||||
s_modelname.num = 0;
|
||||
StrList_Init(&s_modelname, 3);
|
||||
|
||||
/* verify the existence of at least one pcx skin */
|
||||
for (i = 0; i < s_directory.num; ++i)
|
||||
{
|
||||
char* s = NULL;
|
||||
char* t = NULL;
|
||||
int l;
|
||||
strlist_t list, *sl;
|
||||
char *s, *t;
|
||||
int k;
|
||||
|
||||
if (s_directory.data[i] == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* contains triangle .md2 model */
|
||||
s = s_directory.data[i];
|
||||
|
||||
if (!FS_FileExists(s, "tris.md2"))
|
||||
if (!s || !FS_FileExists(s, "tris.md2"))
|
||||
{
|
||||
/* invalid player model */
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
StrList_Init(&list, 0);
|
||||
|
||||
SkinsInDir(&list, s, "pcx");
|
||||
SkinsInDir(&list, s, "png");
|
||||
|
||||
/* get a list of pcx files */
|
||||
if (!list.num)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* count valid skins, which consist of a skin with a matching "_i" icon */
|
||||
s_skinnames[mdl].num = 0;
|
||||
sl = &s_skinnames[s_modelname.num];
|
||||
StrList_Init(sl, 0);
|
||||
|
||||
for (int j = 0; j < list.num; j++)
|
||||
for (k = 0; k < list.num; ++k)
|
||||
{
|
||||
/* last element of FS_FileList maybe null */
|
||||
if (list.data[j] == 0)
|
||||
if (strstr(list.data[k], "_i.png") ||
|
||||
strstr(list.data[k], "_i.pcx"))
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strstr(list.data[j], "_i.png") ||
|
||||
!strstr(list.data[j], "_i.pcx"))
|
||||
if (!IconOfSkinExists(list.data[k], &list, "png") &&
|
||||
!IconOfSkinExists(list.data[k], &list, "pcx"))
|
||||
{
|
||||
if (IconOfSkinExists(list.data[j], &list, "png") ||
|
||||
IconOfSkinExists(list.data[j], &list, "pcx"))
|
||||
{
|
||||
s_skinnames[mdl].num++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (s_skinnames[mdl].num == 0)
|
||||
{
|
||||
StrList_Free(&list);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* malloc skinnames */
|
||||
data = (char**)malloc((s_skinnames[mdl].num + 1) * sizeof(char*));
|
||||
YQ2_COM_CHECK_OOM(data, "malloc()", (s_skinnames[mdl].num + 1) * sizeof(char*))
|
||||
if (!data)
|
||||
{
|
||||
/* unaware about YQ2_ATTR_NORETURN_FUNCPTR? */
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(data, 0, (s_skinnames[mdl].num + 1) * sizeof(char*));
|
||||
|
||||
s_skinnames[mdl].data = data;
|
||||
s_skinnames[mdl].num = 0;
|
||||
|
||||
/* duplicate strings */
|
||||
for (int k = 0; k < list.num; ++k)
|
||||
{
|
||||
/* last element of FS_FileList maybe null */
|
||||
if (list.data[k] == 0)
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strstr(list.data[k], "_i.png") ||
|
||||
!strstr(list.data[k], "_i.pcx"))
|
||||
t = Q_strrchrs(list.data[k], "/\\");
|
||||
if (!t)
|
||||
{
|
||||
if (IconOfSkinExists(list.data[k], &list, "png") ||
|
||||
IconOfSkinExists(list.data[k], &list, "pcx"))
|
||||
{
|
||||
t = Q_strrchrs(list.data[k], "/\\");
|
||||
|
||||
l = strlen(t) + 1;
|
||||
s = (char*)malloc(l);
|
||||
|
||||
YQ2_COM_CHECK_OOM(s, "malloc()", l * sizeof(char))
|
||||
if (!s)
|
||||
{
|
||||
/* unaware about YQ2_ATTR_NORETURN_FUNCPTR? */
|
||||
return false;
|
||||
}
|
||||
|
||||
COM_StripExtension2(t);
|
||||
Q_strlcpy(s, t + 1, l);
|
||||
|
||||
data[s_skinnames[mdl].num++] = s;
|
||||
}
|
||||
t = list.data[k];
|
||||
}
|
||||
else
|
||||
{
|
||||
t++;
|
||||
}
|
||||
|
||||
COM_StripExtension2(t);
|
||||
|
||||
StrList_Append(sl, t);
|
||||
}
|
||||
|
||||
/* sort skin names alphabetically */
|
||||
qsort(s_skinnames[mdl].data, s_skinnames[mdl].num, sizeof(char*), Q_sort_stricmp);
|
||||
|
||||
/* at this point we have a valid player model */
|
||||
t = strrchr(s_directory.data[i], '/');
|
||||
l = strlen(t) + 1;
|
||||
s = (char*)malloc(l);
|
||||
|
||||
YQ2_COM_CHECK_OOM(s, "malloc()", l * sizeof(char))
|
||||
if (!s)
|
||||
if (sl->num > 1)
|
||||
{
|
||||
/* unaware about YQ2_ATTR_NORETURN_FUNCPTR? */
|
||||
return false;
|
||||
qsort(sl->data, sl->num, sizeof(char*), Q_sort_stricmp);
|
||||
}
|
||||
|
||||
Q_strlcpy(s, t + 1, l);
|
||||
StrList_Compress(sl);
|
||||
|
||||
s_modelname.data[s_modelname.num++] = s;
|
||||
mdl = s_modelname.num;
|
||||
t = strrchr(s, '/');
|
||||
if (!t)
|
||||
{
|
||||
t = s;
|
||||
}
|
||||
else
|
||||
{
|
||||
t++;
|
||||
}
|
||||
|
||||
StrList_Append(&s_modelname, t);
|
||||
|
||||
/* free file list */
|
||||
StrList_Free(&list);
|
||||
}
|
||||
|
||||
if (s_modelname.num == 0)
|
||||
if (!s_modelname.num)
|
||||
{
|
||||
PlayerModelFree();
|
||||
result = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
return result;
|
||||
StrList_Compress(&s_modelname);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static qboolean
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue