Index: src/clientgame.mm ================================================================== --- src/clientgame.mm +++ src/clientgame.mm @@ -9,11 +9,11 @@ void mode(int n) { addmsg(1, 2, SV_GAMEMODE, nextmode = n); -}; +} COMMAND(mode, ARG_1INT) bool intermission = false; dynent *player1 = newdynent(); // our client @@ -491,11 +491,11 @@ clientmap = @""; initclientnet(); } void -startmap(char *name) // called just after a map load +startmap(OFString *name) // called just after a map load { if (netmapstart() && m_sp) { gamemode = 0; conoutf(@"coop sp not supported yet"); } @@ -505,13 +505,11 @@ spawncycle = -1; spawnplayer(player1); player1->frags = 0; loopv(players) if (players[i]) players[i]->frags = 0; resetspawns(); - @autoreleasepool { - clientmap = @(name); - } + clientmap = name; if (editmode) toggleedit(); setvar(@"gamespeed", 100); setvar(@"fog", 180); setvar(@"fogcolour", 0x8099B3); Index: src/clients2c.mm ================================================================== --- src/clients2c.mm +++ src/clients2c.mm @@ -16,11 +16,13 @@ void changemapserv(char *name, int mode) // forced map change from the server { gamemode = mode; - load_world(name); + @autoreleasepool { + load_world(@(name)); + } } void changemap(OFString *name) // request map change, server may ignore { @@ -362,11 +364,13 @@ case SV_RECVMAP: { sgetstr(); conoutf(@"received map \"%s\" from server, reloading..", text); int mapsize = getint(p); - writemap(text, mapsize, p); + @autoreleasepool { + writemap(@(text), mapsize, p); + } p += mapsize; changemapserv(text, gamemode); break; } Index: src/protos.h ================================================================== --- src/protos.h +++ src/protos.h @@ -86,11 +86,11 @@ extern void writeclientinfo(OFStream *stream); // clientgame extern void mousemove(int dx, int dy); extern void updateworld(int millis); -extern void startmap(char *name); +extern void startmap(OFString *name); extern void changemap(OFString *name); extern void initclient(); extern void spawnplayer(dynent *d); extern void selfdamage(int damage, int actor, dynent *act); extern dynent *newdynent(); @@ -181,12 +181,12 @@ int type, int fade, OFVector3D &from, OFVector3D &to); extern void render_particles(int time); // worldio extern void save_world(OFString *fname); -extern void load_world(char *mname); -extern void writemap(char *mname, int msize, uchar *mdata); +extern void load_world(OFString *mname); +extern void writemap(OFString *mname, int msize, uchar *mdata); extern OFData *readmap(OFString *mname); extern void loadgamerest(); extern void incomingdemodata(uchar *buf, int len, bool extras = false); extern void demoplaybackstep(); extern void stop(); Index: src/world.mm ================================================================== --- src/world.mm +++ src/world.mm @@ -467,11 +467,11 @@ s->type = SOLID; s->floor = 0; s->ceil = 16; s->vdelta = 0; s->defer = 0; - }; + } strncpy(hdr.head, "CUBE", 4); hdr.version = MAPVERSION; hdr.headersize = sizeof(header); hdr.sfactor = sfactor; @@ -479,46 +479,47 @@ if (copy) { loop(x, ssize / 2) loop(y, ssize / 2) { *S(x + ssize / 4, y + ssize / 4) = *SWS(oldworld, x, y, ssize / 2); - }; + } loopv(ents) { ents[i].x += ssize / 4; ents[i].y += ssize / 4; - }; + } } else { strn0cpy(hdr.maptitle, "Untitled Map by Unknown", 128); hdr.waterlevel = -100000; loopi(15) hdr.reserved[i] = 0; loopk(3) loopi(256) hdr.texlists[k][i] = i; ents.setsize(0); block b = {8, 8, ssize - 16, ssize - 16}; edittypexy(SPACE, b); - }; + } calclight(); - startmap("base/unnamed"); + startmap(@"base/unnamed"); if (oldworld) { free(oldworld); toggleedit(); execute("fullbright 1"); - }; -}; + } +} void mapenlarge() { empty_world(-1, false); -}; +} + void newmap(int i) { empty_world(i, false); -}; +} COMMAND(mapenlarge, ARG_NONE) COMMAND(newmap, ARG_1INT) COMMANDN(recalc, calclight, ARG_NONE) COMMAND(delent, ARG_NONE) COMMAND(entproperty, ARG_2INT) Index: src/worldio.mm ================================================================== --- src/worldio.mm +++ src/worldio.mm @@ -118,22 +118,25 @@ } // these two are used by getmap/sendmap.. transfers compressed maps directly void -writemap(char *mname, int msize, uchar *mdata) +writemap(OFString *mname, int msize, uchar *mdata) { - setnames(mname); + @autoreleasepool { + setnames(mname.UTF8String); + } backup(cgzname, bakname); + FILE *f = fopen(cgzname, "wb"); if (!f) { conoutf(@"could not write map to %s", cgzname); return; } fwrite(mdata, 1, msize, f); fclose(f); - conoutf(@"wrote map %s as file %s", mname, cgzname); + conoutf(@"wrote map %@ as file %s", mname, cgzname); } OFData * readmap(OFString *mname) { @@ -239,17 +242,19 @@ } } COMMANDN(savemap, save_world, ARG_1STR) void -load_world(char *mname) // still supports all map formats that have existed - // since the earliest cube betas! +load_world(OFString *mname) // still supports all map formats that have existed + // since the earliest cube betas! { stopifrecording(); cleardlights(); pruneundos(); - setnames(mname); + @autoreleasepool { + setnames(mname.UTF8String); + } gzFile f = gzopen(cgzname, "rb9"); if (!f) { conoutf(@"could not read map %s", cgzname); return; }