Add support for custom keywords

For now, 32 characters separated by spaces.

Also fixed a SIGSEGV from an empty level title.
This commit is contained in:
James R 2019-02-22 22:25:05 -08:00
parent 6358d839ee
commit bb65e8d72f
5 changed files with 33 additions and 15 deletions

View File

@ -1719,6 +1719,25 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pultmode, boolean rese
}
}
/*
Return the number of times a series of keywords, delimited by spaces, matched.
*/
static int measurekeywords(const char *s, const char *q)
{
int r = 0;
char *qp;
for (qp = strtok(va("%s", q), " ");
qp;
qp = strtok(0, " "))
{
if (strcasestr(s, qp))
{
r++;
}
}
return r;
}
/*
Easy macro; declare parm_*id* and define acceptableargc; put in the parameter
to match as a string as *name*. Set *argn* to the number of extra arguments
@ -1757,8 +1776,6 @@ static void Command_Map_f(void)
char *apromapname = NULL;
/* Keyword matching */
char *query;
char *key;
UINT8 *freq;
UINT8 freqc;
@ -1860,13 +1877,13 @@ static void Command_Map_f(void)
}
else
{
query = ZZ_Alloc(strlen(mapname)+1);
freq = ZZ_Calloc(NUMMAPS * sizeof (UINT8));
for (i = 0, newmapnum = 1; i < NUMMAPS; ++i, ++newmapnum)
if (mapheaderinfo[i])
{
realmapname = G_BuildMapTitle(newmapnum);
if (!( realmapname = G_BuildMapTitle(newmapnum) ))
continue;
/* Now that we found a perfect match no need to fucking guess. */
if (strnicmp(realmapname, mapname, mapnamelen) == 0)
@ -1886,16 +1903,9 @@ static void Command_Map_f(void)
}
else/* ...match individual keywords */
{
strcpy(query, mapname);
for (key = strtok(query, " ");
key;
key = strtok(0, " "))
{
if (strcasestr(realmapname, key))
{
freq[i]++;
}
}
freq[i] += measurekeywords(realmapname, mapname);
freq[i] += measurekeywords(mapheaderinfo[i]->keyword,
mapname);
}
}
@ -1926,7 +1936,6 @@ static void Command_Map_f(void)
}
Z_Free(freq);
Z_Free(query);
}
}

View File

@ -1205,6 +1205,11 @@ static void readlevelheader(MYFILE *f, INT32 num)
mapheaderinfo[num-1]->typeoflevel = tol;
}
}
else if (fastcmp(word, "KEYWORD"))
{
deh_strlcpy(mapheaderinfo[num-1]->keyword, word2,
sizeof(mapheaderinfo[num-1]->keyword), va("Level header %d: keyword", num));
}
else if (fastcmp(word, "MUSIC"))
{
if (fastcmp(word2, "NONE"))

View File

@ -286,6 +286,7 @@ typedef struct
UINT8 actnum; ///< Act number or 0 for none.
UINT16 typeoflevel; ///< Combination of typeoflevel flags.
INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end.
char keyword[33]; ///< Keywords separated by space to search for. 32 characters.
char musname[7]; ///< Music track to play. "" for no music.
UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
UINT32 muspos; ///< Music position to jump to.

View File

@ -2014,6 +2014,8 @@ static int mapheaderinfo_get(lua_State *L)
lua_pushinteger(L, header->typeoflevel);
else if (fastcmp(field,"nextlevel"))
lua_pushinteger(L, header->nextlevel);
else if (fastcmp(field,"keyword"))
lua_pushstring(L, header->keyword);
else if (fastcmp(field,"musname"))
lua_pushstring(L, header->musname);
else if (fastcmp(field,"mustrack"))

View File

@ -211,6 +211,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
mapheaderinfo[num]->typeoflevel = 0;
mapheaderinfo[num]->nextlevel = (INT16)(i + 1);
mapheaderinfo[num]->startrings = 0;
mapheaderinfo[num]->keyword[0] = '\0';
snprintf(mapheaderinfo[num]->musname, 7, "%sM", G_BuildMapName(i));
mapheaderinfo[num]->musname[6] = 0;
mapheaderinfo[num]->mustrack = 0;