#include "../client/defs.qh"
#include "util.qh"
#include "buffs.qh"
- #include "weapons/weapons.qh"
+ #include "weapons/all.qh"
#include "mapinfo.qh"
#elif defined(MENUQC)
#elif defined(SVQC)
#include "../dpdefs/dpextensions.qh"
#include "util.qh"
#include "buffs.qh"
- #include "monsters/monsters.qh"
+ #include "monsters/all.qh"
#include "mapinfo.qh"
#endif
return 1;
}
-float MapInfo_FilterGametypeAndString(int pGametype, int pFeatures, int pFlagsRequired, int pFlagsForbidden, bool pAbortOnGenerate, string sf)
+void MapInfo_FilterString(string sf)
{
+ // this function further filters _MapInfo_filtered, which is prepared by MapInfo_FilterGametype by string
float i, j;
string title;
- if (!_MapInfo_filtered_allocated)
- {
- _MapInfo_filtered_allocated = 1;
- _MapInfo_filtered = buf_create();
- }
- MapInfo_count = 0;
- for(i = 0, j = -1; i < _MapInfo_globcount; ++i)
+
+ for(i = 0, j = -1; i < MapInfo_count; ++i)
{
- if(MapInfo_Get_ByName(_MapInfo_GlobItem(i), 1, 0) == 2) // if we generated one... BAIL OUT and let the caller continue in the next frame.
- if(pAbortOnGenerate)
- {
- dprint("Autogenerated a .mapinfo, doing the rest later.\n");
- MapInfo_progress = i / _MapInfo_globcount;
- return 0;
- }
- // prepare for keyword filter
- if (MapInfo_Map_title && strstrofs(MapInfo_Map_title, "<TITLE>", 0) == -1)
- title = MapInfo_Map_title;
- else
- title = MapInfo_Map_bspname;
- // keyword filter
- if((strstrofs(strtolower(title), strtolower(sf), 0)) >= 0)
- if((MapInfo_Map_supportedGametypes & pGametype) != 0)
- if((MapInfo_Map_supportedFeatures & pFeatures) == pFeatures)
- if((MapInfo_Map_flags & pFlagsForbidden) == 0)
- if((MapInfo_Map_flags & pFlagsRequired) == pFlagsRequired)
- bufstr_set(_MapInfo_filtered, ++j, ftos(i));
+ if (MapInfo_Get_ByID(i))
+ {
+ // prepare for keyword filter
+ if (MapInfo_Map_title && strstrofs(MapInfo_Map_title, "<TITLE>", 0) == -1)
+ title = MapInfo_Map_title;
+ else
+ title = MapInfo_Map_bspname;
+ // keyword filter
+ if((strstrofs(strtolower(title), strtolower(sf), 0)) >= 0)
+ bufstr_set(_MapInfo_filtered, ++j, bufstr_get(_MapInfo_filtered, i));
+ }
}
MapInfo_count = j + 1;
MapInfo_ClearTemps();
// sometimes the glob isn't sorted nicely, so fix it here...
heapsort(MapInfo_count, _MapInfo_FilterList_swap, _MapInfo_FilterList_cmp, world);
- return 1;
}
void MapInfo_Filter_Free()
string _MapInfo_GetDefaultEx(float t)
{
- entity e;
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.items)
- return e.model2;
+ FOREACH(MAPINFO_TYPES, it.items == t, LAMBDA(return it.model2));
return "";
}
float _MapInfo_GetTeamPlayBool(float t)
{
- entity e;
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.items)
- return e.team;
+ FOREACH(MAPINFO_TYPES, it.items == t, LAMBDA(return it.team));
return false;
}
float MapInfo_Type_FromString(string t)
{
- entity e;
if(t == "nexball")
{
print("MapInfo_Type_FromString (probably ", MapInfo_Map_bspname, "): using deprecated name '", t);
}
if(t == "all")
return MAPINFO_TYPE_ALL;
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.mdl)
- return e.items;
+ FOREACH(MAPINFO_TYPES, it.mdl == t, LAMBDA(return it.items));
return 0;
}
string MapInfo_Type_Description(float t)
{
- entity e;
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.items)
- return e.gametype_description;
+ FOREACH(MAPINFO_TYPES, it.items == t, LAMBDA(return it.gametype_description));
return "";
}
string MapInfo_Type_ToString(float t)
{
- entity e;
if(t == MAPINFO_TYPE_ALL)
return "all";
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.items)
- return e.mdl;
+ FOREACH(MAPINFO_TYPES, it.items == t, LAMBDA(return it.mdl));
return "";
}
string MapInfo_Type_ToText(float t)
{
- entity e;
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(t == e.items)
- return e.message;
+ FOREACH(MAPINFO_TYPES, it.items == t, LAMBDA(return it.message));
/* xgettext:no-c-format */
return _("@!#%'n Tuba Throwing");
}
else if(t == "cdtrack")
{
t = car(s); s = cdr(s);
- if(pGametypeToSet) // FIXME is this check right here?
+ // We do this only if pGametypeToSet even though this
+ // content is theoretically game type independent,
+ // because MapInfo_Map_clientstuff contains otherwise
+ // game type dependent stuff. That way this value stays
+ // empty when not setting a game type to not set any
+ // false expectations.
+ if(pGametypeToSet)
{
if (!cvar_value_issafe(t))
print("Map ", pFilename, " contains a potentially harmful cdtrack, ignored\n");
int MapInfo_CurrentGametype()
{
- entity e;
int prev = cvar("gamecfg");
- for(e = MapInfo_Type_first; e; e = e.enemy)
- if(cvar(e.netname))
- if(prev != e.items)
- return e.items;
- if(prev)
- return prev;
+ FOREACH(MAPINFO_TYPES, cvar(it.netname) && it.items != prev, LAMBDA(return it.items));
+ if (prev) return prev;
return MAPINFO_TYPE_DEATHMATCH;
}
void MapInfo_SwitchGameType(int t)
{
- for (entity e = MapInfo_Type_first; e; e = e.enemy) {
- cvar_set(e.netname, (t == e.items) ? "1" : "0");
- }
+ FOREACH(MAPINFO_TYPES, true, LAMBDA(
+ cvar_set(it.netname, (it.items == t) ? "1" : "0")
+ ));
}
void MapInfo_LoadMap(string s, float reinit)