Properly parse and cache ubersounds, and don't cache resources that must be always loaded to avoid filling up sound indexes

This commit is contained in:
smallmodel 2024-10-29 21:02:16 +01:00 committed by GitHub
parent becf9f5d8c
commit d3212c55a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 196 additions and 91 deletions

View file

@ -4189,15 +4189,16 @@ void ClientGameCommandManager::CacheFont(Event *ev)
//===============
void AliasResource(dtiki_t *pmdl, const char *alias, const char *realname, const char *parameters)
{
if (pmdl) {
if (!pmdl->a->alias_list) {
pmdl->a->alias_list = cgi.AliasList_New(pmdl->a->name);
}
cgi.Alias_ListAdd((AliasList_t *)pmdl->a->alias_list, alias, realname, parameters);
} else {
if (!pmdl) {
cgi.Alias_Add(alias, realname, parameters);
return;
}
if (!pmdl->a->alias_list) {
pmdl->a->alias_list = cgi.AliasList_New(pmdl->a->name);
}
cgi.Alias_ListAdd((AliasList_t*)pmdl->a->alias_list, alias, realname, parameters);
}
qboolean bLoadForMap(const char *psMapsBuffer, const char *name)
@ -4258,19 +4259,32 @@ void ClientGameCommandManager::AliasCache(Event *ev)
psMapsBuffer = NULL;
for (i = 3; i <= ev->NumArgs(); i++) {
if (!strcmp(ev->GetToken(i).c_str(), "maps")) {
str s = ev->GetString(i);
if (!s.icmp("maps")) {
i++;
psMapsBuffer = ev->GetToken(i);
} else if (!strcmp(ev->GetToken(i).c_str(), "always")) {
bAlwaysLoaded = true;
} else {
strcat(parmbuffer, ev->GetToken(i));
strcat(parmbuffer, " ");
psMapsBuffer = (char *)ev->GetToken(i).c_str();
continue;
}
if (!s.icmp("always")) {
bAlwaysLoaded = true;
continue;
}
strcat(parmbuffer, s);
strcat(parmbuffer, " ");
}
if (bAlwaysLoaded || bLoadForMap(psMapsBuffer, ev->GetString(1))) {
if (bAlwaysLoaded) {
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
}
if (bLoadForMap(psMapsBuffer, ev->GetString(1))) {
if (!bAlwaysLoaded) {
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
}
CacheResource(ev->GetString(2));
}
}
@ -4300,28 +4314,33 @@ void ClientGameCommandManager::Alias(Event *ev)
psMapsBuffer = NULL;
for (i = 3; i <= ev->NumArgs(); i++) {
if (!strcmp(ev->GetToken(i).c_str(), "maps")) {
str s = ev->GetString(i);
if (!s.icmp("maps")) {
i++;
psMapsBuffer = ev->GetToken(i);
} else if (!strcmp(ev->GetToken(i).c_str(), "always")) {
psMapsBuffer = (char *)ev->GetToken(i).c_str();
continue;
}
if (!s.icmp("always")) {
bAlwaysLoaded = true;
} else if (subtitle) {
strcat(parmbuffer, "\"");
strcat(parmbuffer, s);
strcat(parmbuffer, "\" ");
subtitle = 0;
} else {
subtitle = s.icmp("subtitle") == 0;
if (!subtitle) {
if (!Q_stricmp(ev->GetToken(i), "subtitle") || !Q_stricmp(ev->GetToken(i), "forcesubtitle")) {
subtitle = qtrue;
strcat(parmbuffer, ev->GetToken(i));
} else {
strcat(parmbuffer, ev->GetToken(i));
}
} else {
strcat(parmbuffer, "\"");
strcat(parmbuffer, ev->GetToken(i));
strcat(parmbuffer, "\"");
subtitle = qfalse;
subtitle = s.icmp("forcesubtitle") == 0;
}
strcat(parmbuffer, " ");
strcat(parmbuffer, s);
}
strcat(parmbuffer, " ");
}
if (bAlwaysLoaded || bLoadForMap(psMapsBuffer, ev->GetString(1))) {

View file

@ -205,48 +205,72 @@ void CG_RegisterCvars(void)
cgs.localServer = temp->integer;
}
/*
================
CG_RegisterSoundsForFile
Register the specified ubersound source file
================
*/
void CG_RegisterSoundsForFile(const char *name)
{
int startTime;
int endTime;
Com_Printf("\n\n-----------PARSING '%s'------------\n", name);
Com_Printf(
"Any SetCurrentTiki errors means that tiki wasn't prefetched and tiki-specific sounds for it won't work. To "
"fix prefetch the tiki. Ignore if you don't use that tiki on this level.\n"
);
startTime = cgi.Milliseconds();
CG_Command_ProcessFile(name, qfalse, NULL);
endTime = cgi.Milliseconds();
Com_Printf("Parse/Load time: %f seconds.\n", (float)(endTime - startTime) / 1000.0);
Com_Printf("-------------PARSING '%s' DONE---------------\n\n", name);
}
/*
=================
qsort_compare_strings
perform case-insensitive sorting
=================
*/
int qsort_compare_strings(const void *s1, const void *s2)
{
return Q_stricmp(*(const char **)s1, *(const char **)s2);
}
/*
=================
CG_RegisterSounds
called during a precache command
Called during a precache command
=================
*/
void CG_RegisterSounds(void)
{
int startTime;
int endTime;
char filename[MAX_QPATH];
char **fileList;
int numFiles;
int i;
Com_Printf("\n\n-----------PARSING UBERSOUND------------\n");
Com_Printf(
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
"tiki-specific sounds for it won't work. To fix prefe"
"tch the tiki. Ignore if you don't use that tiki on this level.\n"
);
Com_sprintf(filename, sizeof(filename), "ubersound/ubersound.scr");
fileList = cgi.FS_ListFilteredFiles("ubersound/", "scr", "*.scr", qfalse, &numFiles, qtrue);
if (cgs.gametype != GT_SINGLE_PLAYER) {
cgi.Alias_Clear();
}
qsort(fileList, numFiles, sizeof(char *), &qsort_compare_strings);
startTime = cgi.Milliseconds();
CG_Command_ProcessFile(filename, 0, 0);
endTime = cgi.Milliseconds();
for (i = 0; i < numFiles; i++) {
// Added in 2.0
// Since 2.0, all files in the ubersound folder
// are parsed
CG_RegisterSoundsForFile(va("ubersound/%s", fileList[i]));
}
Com_Printf("Parse/Load time: %f seconds.\n", (endTime - startTime) / 1000.0f);
Com_Printf("-------------UBERSOUND DONE---------------\n\n");
Com_Printf("\n\n-----------PARSING UBERDIALOG------------\n");
Com_Printf(
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
"tiki-specific sounds for it won't work. To fix prefe"
"tch the tiki. Ignore if you don't use that tiki on this level.\n"
);
Com_sprintf(filename, sizeof(filename), "ubersound/uberdialog.scr");
startTime = cgi.Milliseconds();
CG_Command_ProcessFile(filename, 0, 0);
endTime = cgi.Milliseconds() - startTime;
Com_Printf("Parse/Load time: %f seconds.\n", endTime / 1000.0f);
Com_Printf("-------------UBERDIALOG DONE---------------\n\n");
cgi.FS_FreeFileList(fileList);
}
/*

View file

@ -977,6 +977,7 @@ qboolean G_Command_ProcessFile(const char *filename, qboolean quiet)
const char *bufstart;
const char *token;
int numTokens = 0;
char tempName[65];
if (gi.FS_ReadFile(filename, (void **)&buffer, quiet) == -1) {
return qfalse;
@ -988,6 +989,9 @@ qboolean G_Command_ProcessFile(const char *filename, qboolean quiet)
bufstart = buffer;
Com_sprintf(tempName, sizeof(tempName), "m%s", filename);
gi.LoadResource(tempName);
while (1) {
// grab each line as we go
token = COM_ParseExt(&buffer, qtrue);
@ -1024,6 +1028,9 @@ qboolean G_Command_ProcessFile(const char *filename, qboolean quiet)
gi.FS_FreeFile((void *)bufstart);
Com_sprintf(tempName, sizeof(tempName), "o%s", filename);
gi.LoadResource(tempName);
return qtrue;
}

View file

@ -440,24 +440,27 @@ static int bLoadForMap(char *psMapsBuffer, const char *name)
return false;
}
void ScriptMaster::RegisterAliasInternal(Event *ev, bool bCache)
void ScriptMaster::RegisterAliasAndCache(Event *ev)
{
int i;
char parameters[MAX_STRING_CHARS];
char *psMapsBuffer;
int subtitle;
bool bAlwaysLoaded = false;
int i;
char parameters[MAX_STRING_CHARS];
char *psMapsBuffer;
bool bAlwaysLoaded = false;
if (ev->NumArgs() < 2) {
return;
}
// Get the parameters for this alias command
parameters[0] = 0;
subtitle = 0;
psMapsBuffer = NULL;
for (i = 3; i <= ev->NumArgs(); i++) {
str s;
// MOHAA doesn't check that
// Added in OPM
// MOHAA doesn't check that
if (ev->IsListenerAt(i)) {
Listener *l = ev->GetListener(i);
@ -470,44 +473,97 @@ void ScriptMaster::RegisterAliasInternal(Event *ev, bool bCache)
s = ev->GetString(i);
}
if (subtitle) {
if (!s.icmp("maps")) {
i++;
psMapsBuffer = (char *)ev->GetToken(i).c_str();
continue;
}
if (!s.icmp("always")) {
bAlwaysLoaded = true;
continue;
}
strcat(parameters, s);
strcat(parameters, " ");
}
if (bAlwaysLoaded) {
gi.GlobalAlias_Add(ev->GetString(1), ev->GetString(2), parameters);
}
if (bLoadForMap(psMapsBuffer, ev->GetString(1))) {
if (!bAlwaysLoaded) {
gi.GlobalAlias_Add(ev->GetString(1), ev->GetString(2), parameters);
}
CacheResource(ev->GetString(2));
}
}
void ScriptMaster::RegisterAlias(Event *ev)
{
int i;
char parameters[MAX_STRING_CHARS];
char *psMapsBuffer;
qboolean subtitle;
bool bAlwaysLoaded = false;
if (ev->NumArgs() < 2) {
return;
}
// Get the parameters for this alias command
parameters[0] = 0;
subtitle = 0;
psMapsBuffer = NULL;
for (i = 3; i <= ev->NumArgs(); i++) {
str s;
// Added in OPM
// MOHAA doesn't check that
if (ev->IsListenerAt(i)) {
Listener *l = ev->GetListener(i);
if (l && l == Director.CurrentThread()) {
s = "local";
} else {
s = ev->GetString(i);
}
} else {
s = ev->GetString(i);
}
if (!s.icmp("maps")) {
i++;
psMapsBuffer = (char *)ev->GetToken(i).c_str();
continue;
}
if (!s.icmp("always")) {
bAlwaysLoaded = true;
} else if (subtitle) {
strcat(parameters, "\"");
strcat(parameters, s);
strcat(parameters, "\" ");
subtitle = 0;
} else if (!s.icmp("maps")) {
i++;
psMapsBuffer = (char *)ev->GetToken(i).c_str();
} else if (!s.icmp("always")) {
bAlwaysLoaded = true;
} else {
subtitle = s.icmp("subtitle") == 0;
strcat(parameters, s);
strcat(parameters, " ");
}
strcat(parameters, " ");
}
if (bAlwaysLoaded || bLoadForMap(psMapsBuffer, ev->GetString(1))) {
gi.GlobalAlias_Add(ev->GetString(1), ev->GetString(2), parameters);
if (bCache) {
CacheResource(ev->GetString(2));
}
}
}
void ScriptMaster::RegisterAliasAndCache(Event *ev)
{
RegisterAliasInternal(ev, true);
}
void ScriptMaster::RegisterAlias(Event *ev)
{
RegisterAliasInternal(ev);
}
void ScriptMaster::Cache(Event *ev)
{
#ifdef GAME_DLL

View file

@ -82,7 +82,6 @@ protected:
void Cache(Event *ev);
void RegisterAliasAndCache(Event *ev);
void RegisterAlias(Event *ev);
void RegisterAliasInternal(Event *ev, bool bCache = false);
public:
CLASS_PROTOTYPE(ScriptMaster);