menu: Cleanup PlayerModelList

This commit is contained in:
BjossiAlfreds 2026-07-24 14:16:19 +00:00
parent 1621077464
commit aea72afde6

View file

@ -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