X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmapinfo.qc;h=0b851d53b0c5299c7625055d6f470f7925b90564;hb=2718fac2d710f2c4e63a6de3cfe0ffc66dc7d6a3;hp=2e692d7268f9e7b55eefc8ea9c8c25d7c832825c;hpb=cf4d36d9d295ce940e9e9bdf7a711e4036de0b3c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mapinfo.qc b/qcsrc/common/mapinfo.qc index 2e692d726..0b851d53b 100644 --- a/qcsrc/common/mapinfo.qc +++ b/qcsrc/common/mapinfo.qc @@ -187,6 +187,32 @@ float MapInfo_FilterGametype(int pGametype, int pFeatures, int pFlagsRequired, i return 1; } +void MapInfo_FilterString(string sf) +{ + // this function further filters _MapInfo_filtered, which is prepared by MapInfo_FilterGametype by string + float i, j; + string title; + + for(i = 0, j = -1; i < MapInfo_count; ++i) + { + if (MapInfo_Get_ByID(i)) + { + // prepare for keyword filter + if (MapInfo_Map_title && strstrofs(MapInfo_Map_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); +} void MapInfo_Filter_Free() { @@ -576,19 +602,13 @@ void _MapInfo_Map_ApplyGametype(string s, int pWantedType, int pThisType, int lo 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; } @@ -689,7 +709,6 @@ void _MapInfo_Map_ApplyGametypeEx(string s, int pWantedType, int pThisType) float MapInfo_Type_FromString(string t) { - entity e; if(t == "nexball") { print("MapInfo_Type_FromString (probably ", MapInfo_Map_bspname, "): using deprecated name '", t); @@ -728,38 +747,27 @@ float MapInfo_Type_FromString(string 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"); } @@ -1140,7 +1148,13 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, int p 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"); @@ -1257,14 +1271,9 @@ int MapInfo_CurrentFeatures() 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; } @@ -1289,9 +1298,9 @@ float MapInfo_CheckMap(string s) // returns 0 if the map can't be played with th 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)