]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mapinfo.qc
Allow maps and player models to require beating a campaign or reaching a given level...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mapinfo.qc
index 307eb2773bff0db88146af8b3372b47ba11abc97..b372339f2d3d3a4b9cb87544aa0c5a11a69915e3 100644 (file)
@@ -9,10 +9,10 @@
     #include <common/monsters/_mod.qh>
 #endif
 
-bool autocvar_g_mapinfo_ignore_warnings;
 #ifdef MENUQC
-#define WARN_COND (!autocvar_g_mapinfo_ignore_warnings)
+#define WARN_COND false
 #else
+bool autocvar_g_mapinfo_ignore_warnings;
 #define WARN_COND (!autocvar_g_mapinfo_ignore_warnings && MapInfo_Map_bspname == mi_shortname)
 #endif
 
@@ -589,10 +589,10 @@ void _MapInfo_Map_ApplyGametypeEx(string s, Gametype pWantedType, Gametype pThis
        }
 }
 
-Gametype MapInfo_Type_FromString(string str)
+Gametype MapInfo_Type_FromString(string gtype)
 {
        string replacement = "";
-       switch (str)
+       switch (gtype)
        {
                case "nexball":   replacement = "nb"; break;
                case "freezetag": replacement = "ft"; break;
@@ -603,10 +603,10 @@ Gametype MapInfo_Type_FromString(string str)
        }
        if (replacement != "" && WARN_COND)
        {
-               LOG_WARNF("MapInfo_Type_FromString (probably %s): using deprecated name '%s'. Should use '%s'.", MapInfo_Map_bspname, str, replacement);
-               str = replacement;
+               LOG_WARNF("MapInfo_Type_FromString (probably %s): using deprecated name '%s'. Should use '%s'.", MapInfo_Map_bspname, gtype, replacement);
+               gtype = replacement;
        }
-       FOREACH(Gametypes, it.mdl == str, return it);
+       FOREACH(Gametypes, it.mdl == gtype, return it);
        return NULL;
 }
 
@@ -717,9 +717,11 @@ void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s,
                if(type == 0) // server set
                {
                        LOG_TRACE("Applying temporary setting ", t, " := ", s);
+               #if 0
                        if(cvar("g_campaign"))
                                cvar_set(t, s); // this is a wrapper and is always temporary anyway; no need to backup old values then
                        else
+               #endif
                                cvar_settemp(t, s);
                }
                else
@@ -903,6 +905,23 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        else if(WARN_COND)
                                LOG_WARN("Map ", pFilename, " supports unknown feature ", t, ", ignored");
                }
+               else if(t == "locked")
+               {
+                       t = car(s); s = cdr(s); f = stof(s);
+                       // hide the map based on campaign status
+                       if(f > 0)
+                       {
+                               // we need to have reached this level
+                               if(cvar(strcat("g_campaign_", t, "_index")) < f);
+                                       f |= MAPINFO_FLAG_LOCKED;
+                       }
+                       else
+                       {
+                               // we need to have won the campaign
+                               if(!cvar(strcat("g_campaign_", t, "_won")));
+                                       f |= MAPINFO_FLAG_LOCKED;
+                       }
+               }
                else if(t == "hidden")
                {
                        MapInfo_Map_flags |= MAPINFO_FLAG_HIDDEN;
@@ -1311,6 +1330,11 @@ int MapInfo_ForbiddenFlags()
 {
        int f = MAPINFO_FLAG_FORBIDDEN;
 
+#ifdef GAMEQC
+       if (!cvar("g_maplist_allow_locked"))
+#endif
+               f |= MAPINFO_FLAG_LOCKED;
+
 #ifdef GAMEQC
        if (!cvar("g_maplist_allow_hidden"))
 #endif