engine: generalize maps command and map command autocompletion

This commit is contained in:
Alibek Omarov 2021-06-18 00:05:01 +03:00
parent 0260a6c234
commit 37c5dfa49f
3 changed files with 45 additions and 27 deletions

View File

@ -494,6 +494,7 @@ int Cmd_AddRefCommand( const char *cmd_name, xcommand_t function, const char *de
void Cmd_RemoveCommand( const char *cmd_name ); void Cmd_RemoveCommand( const char *cmd_name );
qboolean Cmd_Exists( const char *cmd_name ); qboolean Cmd_Exists( const char *cmd_name );
void Cmd_LookupCmds( void *buffer, void *ptr, setpair_t callback ); void Cmd_LookupCmds( void *buffer, void *ptr, setpair_t callback );
int Cmd_ListMaps( search_t *t , char *lastmapname, size_t len );
qboolean Cmd_GetMapList( const char *s, char *completedname, int length ); qboolean Cmd_GetMapList( const char *s, char *completedname, int length );
qboolean Cmd_GetDemoList( const char *s, char *completedname, int length ); qboolean Cmd_GetDemoList( const char *s, char *completedname, int length );
qboolean Cmd_GetMovieList( const char *s, char *completedname, int length ); qboolean Cmd_GetMovieList( const char *s, char *completedname, int length );

View File

@ -51,26 +51,16 @@ static con_autocomplete_t con;
*/ */
/* /*
===================================== =====================================
Cmd_GetMapList Cmd_ListMaps
Prints or complete map filename
===================================== =====================================
*/ */
qboolean Cmd_GetMapList( const char *s, char *completedname, int length ) int Cmd_ListMaps( search_t *t, char *lastmapname, size_t len )
{ {
search_t *t; byte buf[MAX_SYSPATH]; // 1 kb
file_t *f; file_t *f;
string message, compiler, generator, matchbuf; int i, nummaps;
byte buf[MAX_SYSPATH]; // 1 kb string mapname, message, compiler, generator;
int i, nummaps;
t = FS_Search( va( "maps/%s*.bsp", s ), true, con_gamemaps->value );
if( !t ) return false;
COM_FileBase( t->filenames[0], matchbuf );
if( completedname && length )
Q_strncpy( completedname, matchbuf, length );
if( t->numfilenames == 1 ) return true;
for( i = 0, nummaps = 0; i < t->numfilenames; i++ ) for( i = 0, nummaps = 0; i < t->numfilenames; i++ )
{ {
@ -78,9 +68,7 @@ qboolean Cmd_GetMapList( const char *s, char *completedname, int length )
const char *ext = COM_FileExtension( t->filenames[i] ); const char *ext = COM_FileExtension( t->filenames[i] );
int ver = -1, lumpofs = 0, lumplen = 0; int ver = -1, lumpofs = 0, lumplen = 0;
char *ents = NULL, *pfile; char *ents = NULL, *pfile;
qboolean validmap = false;
int version = 0; int version = 0;
char *szBuf;
string version_description; string version_description;
if( Q_stricmp( ext, "bsp" )) continue; if( Q_stricmp( ext, "bsp" )) continue;
@ -157,7 +145,7 @@ qboolean Cmd_GetMapList( const char *s, char *completedname, int length )
} }
if( f ) FS_Close(f); if( f ) FS_Close(f);
COM_FileBase( t->filenames[i], matchbuf ); COM_FileBase( t->filenames[i], mapname );
switch( ver ) switch( ver )
{ {
@ -179,11 +167,41 @@ qboolean Cmd_GetMapList( const char *s, char *completedname, int length )
default: Q_strncpy( version_description, "??", sizeof( version_description )); break; default: Q_strncpy( version_description, "??", sizeof( version_description )); break;
} }
Con_Printf( "%16s (%s) ^3%s^7 ^2%s %s^7\n", matchbuf, version_description, message, compiler, generator ); Con_Printf( "%16s (%s) ^3%s^7 ^2%s %s^7\n", mapname, version_description, message, compiler, generator );
nummaps++; nummaps++;
} }
Con_Printf( "\n^3 %i maps found.\n", nummaps ); if( lastmapname && len )
Q_strncpy( lastmapname, mapname, len );
return nummaps;
}
/*
=====================================
Cmd_GetMapList
Prints or complete map filename
=====================================
*/
qboolean Cmd_GetMapList( const char *s, char *completedname, int length )
{
search_t *t;
string matchbuf;
int i, nummaps;
t = FS_Search( va( "maps/%s*.bsp", s ), true, con_gamemaps->value );
if( !t ) return false;
COM_FileBase( t->filenames[0], matchbuf );
if( completedname && length )
Q_strncpy( completedname, matchbuf, length );
if( t->numfilenames == 1 ) return true;
nummaps = Cmd_ListMaps( t, matchbuf, sizeof( matchbuf ));
Con_Printf( "\n^3 %d maps found.\n", nummaps );
Mem_Free( t ); Mem_Free( t );
// cut shortestMatch to the amount common with s // cut shortestMatch to the amount common with s

View File

@ -244,7 +244,7 @@ void SV_Maps_f( void )
{ {
const char *separator = "-------------------"; const char *separator = "-------------------";
const char *argStr = Cmd_Argv( 1 ); // Substr const char *argStr = Cmd_Argv( 1 ); // Substr
int listIndex; int nummaps;
search_t *mapList; search_t *mapList;
if( Cmd_Argc() != 2 ) if( Cmd_Argc() != 2 )
@ -261,12 +261,11 @@ void SV_Maps_f( void )
return; return;
} }
for( listIndex = 0; listIndex != mapList->numfilenames; ++listIndex ) nummaps = Cmd_ListMaps( mapList, NULL, 0 );
{
Msg( "%s\n", mapList->filenames[listIndex] + 5 ); // Do not show "maps/"
}
Msg( "%s\nDirectory: \"%s/maps\" - Maps listed: %d\n", separator, GI->basedir, mapList->numfilenames ); Mem_Free( mapList );
Msg( "%s\nDirectory: \"%s/maps\" - Maps listed: %d\n", separator, GI->basedir, nummaps );
} }
/* /*