diff --git a/src/engine/worldio.cpp b/src/engine/worldio.cpp index fdc71d5..a754ba5 100644 --- a/src/engine/worldio.cpp +++ b/src/engine/worldio.cpp @@ -874,13 +874,16 @@ void loadvslots(stream *f, int numvslots) delete[] prev; } +VARP(allowsavebasemap, 0, 0, 1); + bool save_world(const char *mname, bool nolms) { if(!*mname) mname = game::getclientmap(); setmapfilenames(mname); if(savebak) backup(ogzname, bakname); stream *f = opengzfile(ogzname, "wb"); - if(!f) { conoutf(CON_WARN, "could not write map to %s", ogzname); return false; } + ident *id = readident("allmaps"); + if(!f || (!allowsavebasemap && listincludes(id->getstr(), mname, strlen(mname)) != -1)) { conoutf(CON_WARN, "could not write map to %s", ogzname); return false; } int numvslots = vslots.length(); if(!nolms && !multiplayer(false)) diff --git a/src/shared/iengine.h b/src/shared/iengine.h index 167caad..19b310e 100644 --- a/src/shared/iengine.h +++ b/src/shared/iengine.h @@ -162,6 +162,7 @@ extern bool validateblock(const char *s); extern void explodelist(const char *s, vector &elems, int limit = -1); extern char *indexlist(const char *s, int pos); extern int listlen(const char *s); +extern int listincludes(const char *list, const char *needle, int needlelen); extern void printvar(ident *id); extern void printvar(ident *id, int i); extern void printfvar(ident *id, float f); @@ -226,7 +227,7 @@ static inline bool insideworld(const ivec &o) } // world -extern char* mapid; +extern char *mapid; extern bool emptymap(int factor, bool force, const char *mname = "", bool usecfg = true); extern bool enlargemap(bool force); extern int findentity(int type, int index = 0, int attr1 = -1, int attr2 = -1);