fix: convert xmap path names for windows

* make sure, unsaved edits only count in editmode (otherwise "watercolour"
  in map configs would already be "edits")

* nicer filenames for backup-xmaps

* catch failed xmap file write access

* unsavededits is now flag (!= 0) and counter - to enable scripts to
  detect "new edits".

new commands:

xmap_delete_backup    deletes the backup xmap

xmap_keep_backup    moves the backup xmap to a regular named spot

xmap_rename    changes the nickname of an xmap
This commit is contained in:
ac-stef
2014-05-19 12:31:26 +02:00
parent b728a33bb3
commit 493aefd34b
6 changed files with 56 additions and 26 deletions
+1 -1
View File
@@ -347,7 +347,7 @@ void mapmsg(char *s)
filterrichtext(text, s);
filterservdesc(text, text);
copystring(hdr.maptitle, text, 128);
unsavededits = 1;
if(editmode) unsavededits++;
}
void getmapmsg(void)
+8 -8
View File
@@ -324,7 +324,7 @@ void makeundo(block &sel)
storeposition(sel.p);
undos.add(blockcopy(sel));
pruneundos(undomegs<<20);
unsavededits = 1;
unsavededits++;
}
void restoreposition(short p[])
@@ -352,7 +352,7 @@ void editundo()
if(editmetakeydown) restoreposition(*p);
blockpaste(*p);
freeblock(p);
unsavededits = 1;
unsavededits++;
}
void editredo()
@@ -364,7 +364,7 @@ void editredo()
if(editmetakeydown) restoreposition(*p);
blockpaste(*p);
freeblock(p);
unsavededits = 1;
unsavededits++;
}
extern int worldiodebug;
@@ -611,7 +611,7 @@ void edittex(int type, int dir)
edittexxy(type, t, sels[i]);
addmsg(SV_EDITT, "ri6", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, type, t);
}
unsavededits = 1;
unsavededits++;
}
void settex(int texture, int type)
@@ -635,7 +635,7 @@ void settex(int texture, int type)
edittexxy(type, t, sels[i]);
addmsg(SV_EDITT, "ri6", sels[i].x, sels[i].y, sels[i].xs, sels[i].ys, type, t);
}
unsavededits = 1;
unsavededits++;
}
void replace()
@@ -654,7 +654,7 @@ void replace()
}
block b = { 0, 0, ssize, ssize };
remip(b);
unsavededits = 1;
unsavededits++;
}
void edittypexy(int type, block &sel)
@@ -856,7 +856,7 @@ void movemap(int xo, int yo, int zo) // move whole map
entinmap(player1);
calclight();
resetmap(false);
unsavededits = 1;
unsavededits++;
}
void selfliprotate(block &sel, int dir)
@@ -972,7 +972,7 @@ void transformclipentities() // transforms all clip entities to tag clips, if t
while(thisrun);
loopi(ssize) loopj(ssize) { sqr *s = S(i,j); if(s->tag & TAGCLIP) s->tag &= ~TAGPLCLIP; }
conoutf("changed %d clip entities to tagged clip areas", total);
unsavededits = 1;
if(total) unsavededits++;
}
COMMAND(transformclipentities, "");
+2 -2
View File
@@ -4,7 +4,7 @@ int wx1, wy1, wx2, wy2;
float wsx1, wsy1, wsx2, wsy2;
VARP(watersubdiv, 1, 4, 64);
VARF(waterlevel, -128, -128, 127, if(!noteditmode("waterlevel")) { hdr.waterlevel = waterlevel; unsavededits = 1; });
VARF(waterlevel, -128, -128, 127, if(!noteditmode("waterlevel")) { hdr.waterlevel = waterlevel; unsavededits++; });
void setwatercolor(const char *r, const char *g, const char *b, const char *a)
{
@@ -22,7 +22,7 @@ void setwatercolor(const char *r, const char *g, const char *b, const char *a)
hdr.watercolor[2] = 20;
hdr.watercolor[3] = 178;
}
unsavededits = 1;
if(editmode) unsavededits++;
}
COMMANDN(watercolour, setwatercolor, "ssss");
+8 -7
View File
@@ -191,7 +191,7 @@ void entproperty(int prop, int amount)
loc->drop();
}
if(changedents.find(n) == -1) changedents.add(n); // apply ent changes later (reduces network traffic)
unsavededits = 1;
unsavededits++;
}
hashtable<char *, enet_uint32> mapinfo, &resdata = mapinfo;
@@ -247,7 +247,7 @@ void delent()
{
case LIGHT: calclight(); break;
}
unsavededits = 1;
unsavededits++;
}
int findtype(char *what)
@@ -312,7 +312,7 @@ entity *newentity(int index, int x, int y, int z, char *what, int v1, int v2, in
case LIGHT: calclight(); break;
case SOUND: audiomgr.preloadmapsound(e); break;
}
unsavededits = 1;
unsavededits++;
return index<0 ? &ents.last() : &ents[index];
}
@@ -332,16 +332,17 @@ void clearents(char *name)
{
int type = findtype(name);
if(noteditmode("clearents") || multiplayer()) return;
bool found = false;
loopv(ents)
{
entity &e = ents[i];
if(e.type==type) e.type = NOTUSED;
unsavededits = 1;
if(e.type==type) { e.type = NOTUSED; found = true; }
}
switch(type)
{
case LIGHT: calclight(); break;
}
if(found) unsavededits++;
}
COMMAND(clearents, "s");
@@ -369,7 +370,7 @@ void scalelights(int f, int intens)
scalecomp(e.attr3, intens);
scalecomp(e.attr4, intens);
}
unsavededits = 1;
unsavededits++;
}
calclight();
}
@@ -752,7 +753,7 @@ void mapmrproper(bool manual)
conoutf("before: %d / %d / %d / %d / %d / %d / %d", sta[0], sta[1], sta[2], sta[3], sta[4], sta[5], sta[6]);
conoutf("idealized: %d / %d / %d / %d / %d / %d / %d", stb[0], stb[1], stb[2], stb[3], stb[4], stb[5], stb[6]);
conoutf("final count: %d / %d / %d / %d / %d / %d / %d", stc[0], stc[1], stc[2], stc[3], stc[4], stc[5], stc[6]);
unsavededits = 1;
unsavededits++;
}
}
COMMANDF(mapmrproper, "", () { mapmrproper(true); });
+36 -7
View File
@@ -858,7 +858,7 @@ struct xmap
persistent_entity &e = ents[i];
f->printf("restorexmap ent %d %d %d %d %d %d %d %d // %s\n", e.type, e.x, e.y, e.z, e.attr1, e.attr2, e.attr3, e.attr4, e.type >= 0 && e.type < MAXENTTYPES ? entnames[e.type] : "unknown");
}
f->printf("restorexmap position %d %d %d %d %d // EOF, don't touch this\n\n", position[0], position[1], position[2], position[3], position[4]);
f->printf("restorexmap position %d %d %d %d %d // EOF, don't touch this\n\n", int(position[0]), int(position[1]), int(position[2]), int(position[3]), int(position[4]));
}
};
@@ -868,6 +868,8 @@ static xmap *bak, *xmjigsaw; // only bak needs to
#define SPEDIT if(noteditmode("xmap") || multiplayer()) return // only allowed in non-coop editmode
#define SPEDITDIFF if(noteditmode("xmap") || multiplayer() || nodiff()) return // only allowed in non-coop editmode after xmap_diff
bool validxmapname(const char *nick) { if(validmapname(nick)) return true; conoutf("sry, %s is not a valid xmap nickname", nick); return false; }
void xmapdelete(xmap *&xm) // make sure, we don't point to deleted xmaps
{
DELETEP(xm);
@@ -915,8 +917,7 @@ COMMANDF(xmap_list, "", () // list xmaps (and status)
COMMANDF(xmap_store, "s", (const char *nick) // store current map in an xmap buffer
{
if(noteditmode("xmap_store")) return; // (may also be used in coopedit)
if(!*nick) return;
if(!validmapname(nick)) { conoutf("sry, %s is not a valid xmap nickname", nick); return; }
if(!*nick || !validxmapname(nick)) return;
int i;
if(getxmapbynick(nick, &i, false)) { xmap *xm = xmaps.remove(i); xmapdelete(xm); } // overwrite existing same nick
xmaps.add(new xmap(nick));
@@ -936,6 +937,31 @@ COMMANDF(xmap_delete, "s", (const char *nick) // delete xmap buffer
}
} );
COMMANDF(xmap_delete_backup, "", () { if(bak) { xmapdelete(bak); conoutf("deleted backup xmap"); }} );
COMMANDF(xmap_keep_backup, "s", (const char *nick) // move backup xmap to more permanent position
{
if(!bak) { conoutf("no backup xmap available"); return ; }
defformatstring(bakdesc)("%s", bak->nick);
if(*nick)
{
if(validxmapname(nick)) copystring(bak->nick, nick);
else return;
}
loopi(42) if(getxmapbynick(bak->nick, NULL, false)) concatstring(bak->nick, "_"); // evade existing nicknames
xmaps.add(bak);
bak = NULL;
conoutf("stored backup xmap \"%s\" as xmap %s", bakdesc, xmapdescstring(xmaps.last()));
} );
COMMANDF(xmap_rename, "ss", (const char *oldnick, const char *newnick) // rename xmap buffer
{
if(!*oldnick || !*newnick) return;
xmap *xm = getxmapbynick(oldnick);
if(!xm || !validxmapname(newnick) || getxmapbynick(newnick, NULL, false)) return;
copystring(xm->nick, newnick);
} );
COMMANDF(xmap_restore, "s", (const char *nick) // use xmap as current map
{
SPEDIT;
@@ -1025,14 +1051,17 @@ void restorexmap(char **args, int numargs) // read an xmap from a cubescript f
}
COMMAND(restorexmap, "v");
static const char *bakprefix = "__.backup.__", *xmapspath = "mapediting/xmaps";
char *xmapfilename(const char *nick, const char *prefix = "") { static defformatstring(fn)("%s/%s%s.xmap", xmapspath, prefix, nick); return fn; }
static const char *bakprefix = "(backup)", *xmapspath = "mapediting/xmaps";
char *xmapfilename(const char *nick, const char *prefix = "") { static defformatstring(fn)("%s/%s%s.xmap", xmapspath, prefix, nick); return path(fn); }
void writexmap(xmap *xm, const char *prefix = "")
{
stream *f = openfile(xmapfilename(xm->nick, prefix), "w");
xm->write(f);
delete f;
if(f)
{
xm->write(f);
delete f;
}
}
void writeallxmaps() // at game exit, write all xmaps to cubescript files in mapediting/xmaps
+1 -1
View File
@@ -174,7 +174,7 @@ void fullbrightlight(int level)
lastcalclight = totalmillis;
}
VARF(ambient, 0, 0, 0xFFFFFF, if(!noteditmode("ambient")) { hdr.ambient = ambient; calclight(); unsavededits = 1;});
VARF(ambient, 0, 0, 0xFFFFFF, if(!noteditmode("ambient")) { hdr.ambient = ambient; calclight(); unsavededits++;});
void calclight()
{