From 2860953c0b835999b1ea2fa28881d5e2a73640f9 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Mon, 3 Mar 2025 23:52:52 +0000 Subject: [PATCH] Migrate more strings FossilOrigin-Name: e7b5d33cada1ff8db653655ab2c77ead76ab7625a5d2f793b9aee3ec21e3778b --- src/Cube.mm | 20 +-- src/client.mm | 70 ++++++----- src/clientextras.mm | 37 +++--- src/clientgame.mm | 26 ++-- src/command.mm | 287 ++++++++++++++++++++++++------------------- src/console.mm | 46 ++++--- src/cube.h | 17 ++- src/editing.mm | 30 +++-- src/entities.mm | 44 ++++--- src/menus.mm | 60 +++++---- src/monster.mm | 30 ++--- src/protos.h | 28 ++--- src/renderextras.mm | 97 ++++++++------- src/rendergl.mm | 24 ++-- src/rendermd2.mm | 43 ++++--- src/savegamedemo.mm | 82 +++++++------ src/serverbrowser.mm | 40 +++--- src/sound.mm | 70 +++++------ src/tools.h | 15 +-- src/weapon.mm | 9 +- src/world.mm | 44 ++++--- src/worldio.mm | 107 ++++++++-------- src/worldlight.mm | 18 +-- src/worldocull.mm | 4 +- 24 files changed, 692 insertions(+), 556 deletions(-) diff --git a/src/Cube.mm b/src/Cube.mm index d1cf5c8..9079c04 100644 --- a/src/Cube.mm +++ b/src/Cube.mm @@ -202,16 +202,16 @@ int framesinmap = 0; initsound(); log("cfg"); - newmenu("frags\tpj\tping\tteam\tname"); - newmenu("ping\tplr\tserver"); - exec("data/keymap.cfg"); - exec("data/menus.cfg"); - exec("data/prefabs.cfg"); - exec("data/sounds.cfg"); - exec("servers.cfg"); - if (!execfile("config.cfg")) - execfile("data/defaults.cfg"); - exec("autoexec.cfg"); + newmenu(@"frags\tpj\tping\tteam\tname"); + newmenu(@"ping\tplr\tserver"); + exec(@"data/keymap.cfg"); + exec(@"data/menus.cfg"); + exec(@"data/prefabs.cfg"); + exec(@"data/sounds.cfg"); + exec(@"servers.cfg"); + if (!execfile(@"config.cfg")) + execfile(@"data/defaults.cfg"); + exec(@"autoexec.cfg"); log("localconnect"); localconnect(); diff --git a/src/client.mm b/src/client.mm index 8c402bb..d8f15e0 100644 --- a/src/client.mm +++ b/src/client.mm @@ -57,21 +57,24 @@ throttle() } void -newname(char *name) +newname(OFString *name) { c2sinit = false; - strn0cpy(player1->name, name, 16); + @autoreleasepool { + strn0cpy(player1->name, name.UTF8String, 16); + } } +COMMANDN(name, newname, ARG_1STR) void -newteam(char *name) +newteam(OFString *name) { c2sinit = false; - strn0cpy(player1->team, name, 5); + @autoreleasepool { + strn0cpy(player1->team, name.UTF8String, 5); + } } - -COMMANDN(team, newteam, ARG_1CSTR) -COMMANDN(name, newname, ARG_1CSTR) +COMMANDN(team, newteam, ARG_1STR) void writeclientinfo(FILE *f) @@ -80,28 +83,31 @@ writeclientinfo(FILE *f) } void -connects(char *servername) +connects(OFString *servername) { - disconnect(1); // reset state - addserver(servername); + @autoreleasepool { + disconnect(1); // reset state + addserver(servername); - conoutf(@"attempting to connect to %s", servername); - ENetAddress address = {ENET_HOST_ANY, CUBE_SERVER_PORT}; - if (enet_address_set_host(&address, servername) < 0) { - conoutf(@"could not resolve server %s", servername); - return; - }; + conoutf(@"attempting to connect to %s", servername.UTF8String); + ENetAddress address = {ENET_HOST_ANY, CUBE_SERVER_PORT}; + if (enet_address_set_host(&address, servername.UTF8String) < + 0) { + conoutf(@"could not resolve server %s", servername); + return; + } - clienthost = enet_host_create(NULL, 1, rate, rate); + clienthost = enet_host_create(NULL, 1, rate, rate); - if (clienthost) { - enet_host_connect(clienthost, &address, 1); - enet_host_flush(clienthost); - connecting = lastmillis; - connattempts = 0; - } else { - conoutf(@"could not connect to server"); - disconnect(); + if (clienthost) { + enet_host_connect(clienthost, &address, 1); + enet_host_flush(clienthost); + connecting = lastmillis; + connattempts = 0; + } else { + conoutf(@"could not connect to server"); + disconnect(); + } } } @@ -173,7 +179,7 @@ echo(char *text) COMMAND(echo, ARG_VARI) COMMANDN(say, toserver, ARG_VARI) -COMMANDN(connect, connects, ARG_1CSTR) +COMMANDN(connect, connects, ARG_1STR) COMMANDN(disconnect, trydisconnect, ARG_NONE) // collect c2s messages conveniently @@ -218,11 +224,13 @@ bool senditemstoserver = string clientpassword; void -password(char *p) +password(OFString *p) { - strcpy_s(clientpassword, p); + @autoreleasepool { + strcpy_s(clientpassword, p.UTF8String); + } } -COMMAND(password, ARG_1CSTR) +COMMAND(password, ARG_1STR) bool netmapstart() @@ -237,8 +245,8 @@ initclientnet() ctext[0] = 0; toservermap = @""; clientpassword[0] = 0; - newname("unnamed"); - newteam("red"); + newname(@"unnamed"); + newteam(@"red"); } void diff --git a/src/clientextras.mm b/src/clientextras.mm index 3a51e23..095187e 100644 --- a/src/clientextras.mm +++ b/src/clientextras.mm @@ -13,7 +13,7 @@ int frame[] = {178, 184, 190, 137, 183, 189, 197, 164, 46, 51, 54, 32, 0, 0, 40, int range[] = {6, 6, 8, 28, 1, 1, 1, 1, 8, 19, 4, 18, 40, 1, 6, 15, 1, 1, 1, 1}; void -renderclient(dynent *d, bool team, char *mdlname, bool hellpig, float scale) +renderclient(dynent *d, bool team, OFString *mdlname, bool hellpig, float scale) { int n = 3; float speed = 100.0f; @@ -27,7 +27,7 @@ renderclient(dynent *d, bool team, char *mdlname, bool hellpig, float scale) } else { n = (intptr_t)d % 3; r = range[n]; - }; + } basetime = d->lastaction; int t = lastmillis - d->lastaction; if (t < 0 || t > 20000) @@ -61,15 +61,15 @@ renderclient(dynent *d, bool team, char *mdlname, bool hellpig, float scale) speed = 1200 / d->maxspeed * scale; if (hellpig) speed = 300 / d->maxspeed; - }; + } if (hellpig) { n++; scale *= 32; mz -= 1.9f; - }; + } rendermodel(mdlname, frame[n], range[n], 0, 1.5f, d->o.x, mz, d->o.y, d->yaw + 90, d->pitch / 2, team, scale, speed, 0, basetime); -}; +} extern int democlientnum; @@ -79,9 +79,9 @@ renderclients() dynent *d; loopv(players) if ((d = players[i]) && (!demoplayback || i != democlientnum)) - renderclient( - d, isteam(player1->team, d->team), "monster/ogro", false, 1.0f); -}; + renderclient(d, isteam(player1->team, d->team), @"monster/ogro", + false, 1.0f); +} // creation of scoreboard pseudo-menu @@ -161,15 +161,15 @@ renderscores() // sendmap/getmap commands, should be replaced by more intuitive map downloading void -sendmap(const char *mapname) +sendmap(OFString *mapname) { @autoreleasepool { - if (*mapname) + if (mapname.length > 0) save_world(mapname); - changemap(@(mapname)); - mapname = getclientmap().UTF8String; + changemap(mapname); + mapname = getclientmap(); int mapsize; - uchar *mapdata = readmap(mapname, &mapsize); + uchar *mapdata = readmap(mapname.UTF8String, &mapsize); if (!mapdata) return; ENetPacket *packet = enet_packet_create( @@ -177,10 +177,11 @@ sendmap(const char *mapname) uchar *start = packet->data; uchar *p = start + 2; putint(p, SV_SENDMAP); - sendstring(mapname, p); + sendstring(mapname.UTF8String, p); putint(p, mapsize); if (65535 - (p - start) < mapsize) { - conoutf(@"map %s is too large to send", mapname); + conoutf( + @"map %s is too large to send", mapname.UTF8String); free(mapdata); enet_packet_destroy(packet); return; @@ -191,10 +192,10 @@ sendmap(const char *mapname) *(ushort *)start = ENET_HOST_TO_NET_16(p - start); enet_packet_resize(packet, p - start); sendpackettoserv(packet); - conoutf(@"sending map %s to server...", mapname); + conoutf(@"sending map %s to server...", mapname.UTF8String); sprintf_sd(msg)( "[map %s uploaded to server, \"getmap\" to receive it]", - mapname); + mapname.UTF8String); toserver(msg); } } @@ -213,5 +214,5 @@ getmap() conoutf(@"requesting map from server..."); } -COMMAND(sendmap, ARG_1CSTR) +COMMAND(sendmap, ARG_1STR) COMMAND(getmap, ARG_NONE) diff --git a/src/clientgame.mm b/src/clientgame.mm index 4ca0d60..9618c3a 100644 --- a/src/clientgame.mm +++ b/src/clientgame.mm @@ -2,6 +2,8 @@ #include "cube.h" +#include + int nextmode = 0; // nextmode becomes gamemode after next map load VAR(gamemode, 1, 0, 0); @@ -231,13 +233,13 @@ respawn() } int sleepwait = 0; -string sleepcmd; +static OFString *sleepcmd = nil; void -sleepf(char *msec, char *cmd) +sleepf(OFString *msec, OFString *cmd) { - sleepwait = atoi(msec) + lastmillis; - strcpy_s(sleepcmd, cmd); -}; + sleepwait = (int)msec.longLongValue + lastmillis; + sleepcmd = cmd; +} COMMANDN(sleep, sleepf, ARG_2STR) void @@ -247,8 +249,12 @@ updateworld(int millis) // main game update loop curtime = millis - lastmillis; if (sleepwait && lastmillis > sleepwait) { sleepwait = 0; - execute(sleepcmd); - }; + @autoreleasepool { + std::unique_ptr cmd( + strdup(sleepcmd.UTF8String)); + execute(cmd.get()); + } + } physicsframe(); checkquad(curtime); if (m_arena) @@ -508,9 +514,9 @@ startmap(char *name) // called just after a map load } if (editmode) toggleedit(); - setvar("gamespeed", 100); - setvar("fog", 180); - setvar("fogcolour", 0x8099B3); + setvar(@"gamespeed", 100); + setvar(@"fog", 180); + setvar(@"fogcolour", 0x8099B3); showscores(false); intermission = false; framesinmap = 0; diff --git a/src/command.mm b/src/command.mm index 638fe87..344caaf 100644 --- a/src/command.mm +++ b/src/command.mm @@ -3,6 +3,8 @@ #include "cube.h" +#include + enum { ID_VAR, ID_COMMAND, ID_ALIAS }; @interface Ident : OFObject @@ -36,77 +38,65 @@ exchangestr(char *o, const char *n) OFMutableDictionary *idents; void -alias(char *name, char *action) +alias(OFString *name, OFString *action) { - @autoreleasepool { - Ident *b = idents[@(name)]; + Ident *b = idents[name]; - if (!b) { - Ident *b = [[Ident alloc] init]; - b.type = ID_ALIAS; - b.name = @(name); - b.action = @(action); - b.persist = true; + if (b == nil) { + Ident *b = [[Ident alloc] init]; + b.type = ID_ALIAS; + b.name = name; + b.action = action; + b.persist = true; - idents[b.name] = b; - } else { - if (b.type == ID_ALIAS) - b.action = @(action); - else - conoutf( - @"cannot redefine builtin %s with an alias", - name); - } + idents[b.name] = b; + } else { + if (b.type == ID_ALIAS) + b.action = action; + else + conoutf( + @"cannot redefine builtin %s with an alias", name.UTF8String); } } - COMMAND(alias, ARG_2STR) int -variable(char *name, int min, int cur, int max, int *storage, void (*fun)(), +variable(OFString *name, int min, int cur, int max, int *storage, void (*fun)(), bool persist) { if (idents == nil) idents = [[OFMutableDictionary alloc] init]; - @autoreleasepool { - Ident *v = [[Ident alloc] init]; - v.type = ID_VAR; - v.name = @(name); - v.min = min; - v.max = max; - v.storage = storage; - v.fun = fun; - v.persist = persist; + Ident *v = [[Ident alloc] init]; + v.type = ID_VAR; + v.name = name; + v.min = min; + v.max = max; + v.storage = storage; + v.fun = fun; + v.persist = persist; - idents[v.name] = v; - } + idents[name] = v; return cur; } void -setvar(char *name, int i) +setvar(OFString *name, int i) { - @autoreleasepool { - *idents[@(name)].storage = i; - } + *idents[name].storage = i; } int -getvar(char *name) +getvar(OFString *name) { - @autoreleasepool { - return *idents[@(name)].storage; - } + return *idents[name].storage; } bool -identexists(char *name) +identexists(OFString *name) { - @autoreleasepool { - return (idents[@(name)] != nil); - } + return (idents[name] != nil); } OFString * @@ -296,34 +286,63 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively ((void(__cdecl *)()) ID.fun)(); break; - case ARG_1CSTR: - if (isdown) - ((void(__cdecl *)( - char *))ID.fun)( - w[1]); + case ARG_1STR: + if (isdown) { + @autoreleasepool { + ((void( + __cdecl *)( + OFString *)) + ID.fun)( + @(w[1])); + } + } break; case ARG_2STR: - if (isdown) - ((void(__cdecl *)( - char *, - char *))ID.fun)( - w[1], w[2]); + if (isdown) { + @autoreleasepool { + ((void( + __cdecl *)( + OFString *, + OFString *)) + ID.fun)( + @(w[1]), + @(w[2])); + } + } break; case ARG_3STR: - if (isdown) - ((void(__cdecl *)( - char *, char *, - char *))ID.fun)( - w[1], w[2], w[3]); + if (isdown) { + @autoreleasepool { + ((void( + __cdecl *)( + OFString *, + OFString *, + OFString *)) + ID.fun)( + @(w[1]), + @(w[2]), + @(w[3])); + } + } break; case ARG_5STR: - if (isdown) - ((void(__cdecl *)( - char *, char *, - char *, char *, - char *))ID.fun)( - w[1], w[2], w[3], - w[4], w[5]); + if (isdown) { + @autoreleasepool { + ((void( + __cdecl *)( + OFString *, + OFString *, + OFString *, + OFString *, + OFString *)) + ID.fun)( + @(w[1]), + @(w[2]), + @(w[3]), + @(w[4]), + @(w[5])); + } + } break; case ARG_DOWN: ((void(__cdecl *)(bool))ID.fun)( @@ -383,17 +402,6 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively char *))ID.fun)(r); break; } - case ARG_1STR: - if (isdown) { - @autoreleasepool { - ((void( - __cdecl *)( - OFString *)) - ID.fun)( - @(w[1])); - } - } - break; } break; @@ -479,11 +487,16 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively // variables case ID_ALIAS: for (int i = 1; i < numargs; i++) { - // set any arguments as - // (global) arg values so - // functions can access them - sprintf_sd(t)("arg%d", i); - alias(t, w[i]); + @autoreleasepool { + // set any arguments as + // (global) arg values + // so functions can + // access them + OFString *t = [OFString + stringWithFormat: + @"arg%d", i]; + alias(t, @(w[i])); + } } // create new string here because alias // could rebind itself @@ -541,23 +554,28 @@ complete(char *s) } bool -execfile(char *cfgfile) +execfile(OFString *cfgfile) { - string s; - strcpy_s(s, cfgfile); - char *buf = loadfile(path(s), NULL); - if (!buf) - return false; - execute(buf); - free(buf); - return true; + @autoreleasepool { + string s; + strcpy_s(s, cfgfile.UTF8String); + char *buf = loadfile(path(s), NULL); + if (!buf) + return false; + execute(buf); + free(buf); + return true; + } } void -exec(char *cfgfile) +exec(OFString *cfgfile) { - if (!execfile(cfgfile)) - conoutf(@"could not read \"%s\"", cfgfile); + if (!execfile(cfgfile)) { + @autoreleasepool { + conoutf(@"could not read \"%s\"", cfgfile.UTF8String); + } + } } void @@ -600,36 +618,50 @@ COMMAND(writecfg, ARG_NONE) // () and [] expressions, any control construct can be defined trivially. void -intset(char *name, int v) +intset(OFString *name, int v) { - string b; - itoa(b, v); - alias(name, b); -} - -void -ifthen(char *cond, char *thenp, char *elsep) -{ - execute(cond[0] != '0' ? thenp : elsep); -} - -void -loopa(char *times, char *body) -{ - int t = atoi(times); - loopi(t) - { - intset("i", i); - execute(body); + @autoreleasepool { + alias(name, [OFString stringWithFormat:@"%d", v]); } } void -whilea(char *cond, char *body) +ifthen(OFString *cond, OFString *thenp, OFString *elsep) { - while (execute(cond)) - execute(body); -} // can't get any simpler than this :) + @autoreleasepool { + std::unique_ptr cmd(strdup( + (cond.UTF8String[0] != '0' ? thenp : elsep).UTF8String)); + + execute(cmd.get()); + } +} + +void +loopa(OFString *times, OFString *body_) +{ + @autoreleasepool { + int t = (int)times.longLongValue; + std::unique_ptr body(strdup(body_.UTF8String)); + + loopi(t) + { + intset(@"i", i); + execute(body.get()); + } + } +} + +void +whilea(OFString *cond_, OFString *body_) +{ + @autoreleasepool { + std::unique_ptr cond(strdup(cond_.UTF8String)); + std::unique_ptr body(strdup(body_.UTF8String)); + + while (execute(cond.get())) + execute(body.get()); + } +} void onrelease(bool on, char *body) @@ -641,7 +673,9 @@ onrelease(bool on, char *body) void concat(char *s) { - alias("s", s); + @autoreleasepool { + alias(@"s", @(s)); + } } void @@ -666,19 +700,24 @@ listlen(char *a) } void -at(char *s, char *pos) +at(OFString *s_, OFString *pos) { - int n = atoi(pos); - loopi(n) s += strspn(s += strcspn(s, " \0"), " "); - s[strcspn(s, " \0")] = 0; - concat(s); + @autoreleasepool { + int n = (int)pos.longLongValue; + std::unique_ptr copy(strdup(s_.UTF8String)); + char *s = copy.get(); + + loopi(n) s += strspn(s += strcspn(s, " \0"), " "); + s[strcspn(s, " \0")] = 0; + concat(s); + } } COMMANDN(loop, loopa, ARG_2STR) COMMANDN(while, whilea, ARG_2STR) COMMANDN(if, ifthen, ARG_3STR) COMMAND(onrelease, ARG_DWN1) -COMMAND(exec, ARG_1CSTR) +COMMAND(exec, ARG_1STR) COMMAND(concat, ARG_VARI) COMMAND(concatword, ARG_VARI) COMMAND(at, ARG_2STR) diff --git a/src/console.mm b/src/console.mm index 1ebe662..7630de5 100644 --- a/src/console.mm +++ b/src/console.mm @@ -1,7 +1,9 @@ // console.cpp: the console buffer, its display, and command line control #include "cube.h" + #include +#include struct cline { char *cref; @@ -94,25 +96,30 @@ struct keym { int numkm = 0; void -keymap(char *code, char *key, char *action) +keymap(OFString *code, OFString *key, OFString *action) { - keyms[numkm].code = atoi(code); - keyms[numkm].name = newstring(key); - keyms[numkm++].action = newstringbuf(action); + @autoreleasepool { + keyms[numkm].code = (int)code.longLongValue; + keyms[numkm].name = newstring(key.UTF8String); + keyms[numkm++].action = newstringbuf(action.UTF8String); + } } COMMAND(keymap, ARG_3STR) void -bindkey(char *key, char *action) +bindkey(OFString *key_, OFString *action) { - for (char *x = key; *x; x++) - *x = toupper(*x); - loopi(numkm) if (strcmp(keyms[i].name, key) == 0) - { - strcpy_s(keyms[i].action, action); - return; - }; - conoutf(@"unknown key \"%s\"", key); + @autoreleasepool { + std::unique_ptr key(strdup(key_.UTF8String)); + for (char *x = key.get(); *x; x++) + *x = toupper(*x); + loopi(numkm) if (strcmp(keyms[i].name, key.get()) == 0) + { + strcpy_s(keyms[i].action, action.UTF8String); + return; + } + conoutf(@"unknown key \"%s\"", key.get()); + } } COMMANDN(bind, bindkey, ARG_2STR) @@ -125,16 +132,17 @@ saycommand(char *init) // turns input to the command line on or off if (!init) init = ""; strcpy_s(commandbuf, init); -}; +} +COMMAND(saycommand, ARG_VARI) void -mapmsg(char *s) +mapmsg(OFString *s) { - strn0cpy(hdr.maptitle, s, 128); + @autoreleasepool { + strn0cpy(hdr.maptitle, s.UTF8String, 128); + } } - -COMMAND(saycommand, ARG_VARI) -COMMAND(mapmsg, ARG_1CSTR) +COMMAND(mapmsg, ARG_1STR) #ifndef _WIN32 # include diff --git a/src/cube.h b/src/cube.h index 45a63c8..e1c5c60 100644 --- a/src/cube.h +++ b/src/cube.h @@ -110,7 +110,7 @@ struct block { }; struct mapmodelinfo { int rad, h, zoff, snap; - char *name; + const char *name; }; enum { @@ -379,7 +379,7 @@ enum // function signatures for script functions, see command.cpp ARG_3INT, ARG_4INT, ARG_NONE, - ARG_1CSTR, + ARG_1STR, ARG_2STR, ARG_3STR, ARG_5STR, @@ -389,8 +389,7 @@ enum // function signatures for script functions, see command.cpp ARG_2EXP, ARG_1EST, ARG_2EST, - ARG_VARI, - ARG_1STR + ARG_VARI }; // nasty macros for registering script functions, abuses globals to avoid @@ -408,8 +407,8 @@ enum // function signatures for script functions, see command.cpp OF_CONSTRUCTOR() \ { \ enqueueInit(^{ \ - name = \ - variable(#name, min, cur, max, &name, NULL, true); \ + name = variable( \ + @ #name, min, cur, max, &name, NULL, true); \ }); \ } #define VAR(name, min, cur, max) \ @@ -418,7 +417,7 @@ enum // function signatures for script functions, see command.cpp { \ enqueueInit(^{ \ name = variable( \ - #name, min, cur, max, &name, NULL, false); \ + @ #name, min, cur, max, &name, NULL, false); \ }); \ } #define VARF(name, min, cur, max, body) \ @@ -428,7 +427,7 @@ enum // function signatures for script functions, see command.cpp { \ enqueueInit(^{ \ name = variable( \ - #name, min, cur, max, &name, var_##name, false); \ + @ #name, min, cur, max, &name, var_##name, false); \ }); \ } \ void var_##name() { body; } @@ -439,7 +438,7 @@ enum // function signatures for script functions, see command.cpp { \ enqueueInit(^{ \ name = variable( \ - #name, min, cur, max, &name, var_##name, true); \ + @ #name, min, cur, max, &name, var_##name, true); \ }); \ } \ void var_##name() { body; } diff --git a/src/editing.mm b/src/editing.mm index 0e3a0a4..eee19d8 100644 --- a/src/editing.mm +++ b/src/editing.mm @@ -9,12 +9,19 @@ bool editmode = false; // invariant: all code assumes that these are kept inside MINBORD distance of // the edge of the map -block sel = { - variable("selx", 0, 0, 4096, &sel.x, NULL, false), - variable("sely", 0, 0, 4096, &sel.y, NULL, false), - variable("selxs", 0, 0, 4096, &sel.xs, NULL, false), - variable("selys", 0, 0, 4096, &sel.ys, NULL, false), -}; +block sel; + +OF_CONSTRUCTOR() +{ + enqueueInit(^{ + sel = { + variable(@"selx", 0, 0, 4096, &sel.x, NULL, false), + variable(@"sely", 0, 0, 4096, &sel.y, NULL, false), + variable(@"selxs", 0, 0, 4096, &sel.xs, NULL, false), + variable(@"selys", 0, 0, 4096, &sel.ys, NULL, false), + }; + }); +} int selh = 0; bool selset = false; @@ -593,12 +600,15 @@ edittag(int tag) }; void -newent(char *what, char *a1, char *a2, char *a3, char *a4) +newent(OFString *what, OFString *a1, OFString *a2, OFString *a3, OFString *a4) { EDITSEL; - newentity(sel.x, sel.y, (int)player1->o.z, what, ATOI(a1), ATOI(a2), - ATOI(a3), ATOI(a4)); -}; + @autoreleasepool { + newentity(sel.x, sel.y, (int)player1->o.z, what, + (int)a1.longLongValue, (int)a2.longLongValue, + (int)a3.longLongValue, (int)a4.longLongValue); + } +} COMMANDN(select, selectpos, ARG_4INT) COMMAND(edittag, ARG_1INT) diff --git a/src/entities.mm b/src/entities.mm index 0327811..b19ecb6 100644 --- a/src/entities.mm +++ b/src/entities.mm @@ -4,23 +4,23 @@ vector ents; -char *entmdlnames[] = { - "shells", - "bullets", - "rockets", - "rrounds", - "health", - "boost", - "g_armour", - "y_armour", - "quad", - "teleporter", +static OFString *entmdlnames[] = { + @"shells", + @"bullets", + @"rockets", + @"rrounds", + @"health", + @"boost", + @"g_armour", + @"y_armour", + @"quad", + @"teleporter", }; int triggertime = 0; void -renderent(entity &e, char *mdlname, float z, float yaw, int frame = 0, +renderent(entity &e, OFString *mdlname, float z, float yaw, int frame = 0, int numf = 1, int basetime = 0, float speed = 10.0f) { rendermodel(mdlname, frame, numf, 0, 1.1f, e.x, z + S(e.x, e.y)->floor, @@ -39,11 +39,15 @@ renderentities() mapmodelinfo *mmi = getmminfo(e.attr2); if (!mmi) continue; - rendermodel(mmi->name, 0, 1, e.attr4, (float)mmi->rad, - e.x, - (float)S(e.x, e.y)->floor + mmi->zoff + e.attr3, - e.y, (float)((e.attr1 + 7) - (e.attr1 + 7) % 15), 0, - false, 1.0f, 10.0f, mmi->snap); + @autoreleasepool { + rendermodel(@(mmi->name), 0, 1, e.attr4, + (float)mmi->rad, e.x, + (float)S(e.x, e.y)->floor + mmi->zoff + + e.attr3, + e.y, + (float)((e.attr1 + 7) - (e.attr1 + 7) % 15), + 0, false, 1.0f, 10.0f, mmi->snap); + } } else { if (OUTBORD(e.x, e.y)) continue; @@ -67,7 +71,7 @@ renderentities() case 0: if (!e.spawned) continue; - renderent(e, "carrot", + renderent(e, @"carrot", (float)(1 + sin(lastmillis / 100.0 + e.x + e.y) / 20), @@ -76,7 +80,7 @@ renderentities() break; case 4: - renderent(e, "switch2", 3, + renderent(e, @"switch2", 3, (float)e.attr3 * 90, (!e.spawned && !triggertime) ? 1 : 0, @@ -84,7 +88,7 @@ renderentities() triggertime, 1050.0f); break; case 5: - renderent(e, "switch1", -0.15f, + renderent(e, @"switch1", -0.15f, (float)e.attr3 * 90, (!e.spawned && !triggertime) ? 30 : 0, diff --git a/src/menus.mm b/src/menus.mm index af07c56..9920294 100644 --- a/src/menus.mm +++ b/src/menus.mm @@ -26,17 +26,21 @@ menuset(int menu) resetmovement(player1); if (vmenu == 1) menus[1].menusel = 0; -}; +} void -showmenu(char *name) +showmenu(OFString *name_) { - loopv(menus) if (i > 1 && strcmp(menus[i].name, name) == 0) - { - menuset(i); - return; - }; -}; + @autoreleasepool { + const char *name = name_.UTF8String; + loopv(menus) if (i > 1 && strcmp(menus[i].name, name) == 0) + { + menuset(i); + return; + } + } +} +COMMAND(showmenu, ARG_1STR) int menucompare(mitem *a, mitem *b) @@ -103,12 +107,15 @@ rendermenu() }; void -newmenu(char *name) +newmenu(OFString *name) { - gmenu &menu = menus.add(); - menu.name = newstring(name); - menu.menusel = 0; -}; + @autoreleasepool { + gmenu &menu = menus.add(); + menu.name = newstring(name.UTF8String); + menu.menusel = 0; + } +} +COMMAND(newmenu, ARG_1STR) void menumanual(int m, int n, char *text) @@ -121,18 +128,18 @@ menumanual(int m, int n, char *text) } void -menuitem(char *text, char *action) +menuitem(OFString *text, OFString *action) { - gmenu &menu = menus.last(); - mitem &mi = menu.items.add(); - mi.text = newstring(text); - mi.action = action[0] ? newstring(action) : mi.text; + @autoreleasepool { + gmenu &menu = menus.last(); + mitem &mi = menu.items.add(); + mi.text = newstring(text.UTF8String); + mi.action = + action.length > 0 ? newstring(action.UTF8String) : mi.text; + } } COMMAND(menuitem, ARG_2STR) -COMMAND(showmenu, ARG_1CSTR) -COMMAND(newmenu, ARG_1CSTR) - bool menukey(int code, bool isdown) { @@ -158,12 +165,15 @@ menukey(int code, bool isdown) } else { if (code == SDLK_RETURN || code == -2) { char *action = menus[vmenu].items[menusel].action; - if (vmenu == 1) - connects(getservername(menusel)); + if (vmenu == 1) { + @autoreleasepool { + connects(@(getservername(menusel))); + } + } menustack.add(vmenu); menuset(-1); execute(action, true); - }; - }; + } + } return true; }; diff --git a/src/monster.mm b/src/monster.mm index 66c7368..8d91c4d 100644 --- a/src/monster.mm +++ b/src/monster.mm @@ -26,26 +26,26 @@ struct monstertype // see docs for how these values modify behaviour short gun, speed, health, freq, lag, rate, pain, loyalty, mscale, bscale; short painsound, diesound; - char *name, *mdlname; + OFConstantString *name, *mdlname; } monstertypes[NUMMONSTERTYPES] = { {GUN_FIREBALL, 15, 100, 3, 0, 100, 800, 1, 10, 10, S_PAINO, S_DIE1, - "an ogre", "monster/ogro"}, - {GUN_CG, 18, 70, 2, 70, 10, 400, 2, 8, 9, S_PAINR, S_DEATHR, "a rhino", - "monster/rhino"}, + @"an ogre", @"monster/ogro"}, + {GUN_CG, 18, 70, 2, 70, 10, 400, 2, 8, 9, S_PAINR, S_DEATHR, @"a rhino", + @"monster/rhino"}, {GUN_SG, 14, 120, 1, 100, 300, 400, 4, 14, 14, S_PAINE, S_DEATHE, - "ratamahatta", "monster/rat"}, + @"ratamahatta", @"monster/rat"}, {GUN_RIFLE, 15, 200, 1, 80, 300, 300, 4, 18, 18, S_PAINS, S_DEATHS, - "a slith", "monster/slith"}, - {GUN_RL, 13, 500, 1, 0, 100, 200, 6, 24, 24, S_PAINB, S_DEATHB, "bauul", - "monster/bauul"}, + @"a slith", @"monster/slith"}, + {GUN_RL, 13, 500, 1, 0, 100, 200, 6, 24, 24, S_PAINB, S_DEATHB, @"bauul", + @"monster/bauul"}, {GUN_BITE, 22, 50, 3, 0, 100, 400, 1, 12, 15, S_PAINP, S_PIGGR2, - "a hellpig", "monster/hellpig"}, + @"a hellpig", @"monster/hellpig"}, {GUN_ICEBALL, 12, 250, 1, 0, 10, 400, 6, 18, 18, S_PAINH, S_DEATHH, - "a knight", "monster/knight"}, + @"a knight", @"monster/knight"}, {GUN_SLIMEBALL, 15, 100, 1, 0, 200, 400, 2, 13, 10, S_PAIND, S_DEATHD, - "a goblin", "monster/goblin"}, + @"a goblin", @"monster/goblin"}, }; dynent * @@ -54,7 +54,7 @@ basicmonster(int type, int yaw, int state, int trigger, int move) if (type >= NUMMONSTERTYPES) { conoutf(@"warning: unknown monster in spawn: %d", type); type = 0; - }; + } dynent *m = newdynent(); monstertype *t = &monstertypes[m->mtype = type]; m->eyeheight = 2.0f; @@ -78,7 +78,9 @@ basicmonster(int type, int yaw, int state, int trigger, int move) m->roll = 0; m->state = CS_ALIVE; m->anger = 0; - strcpy_s(m->name, t->name); + @autoreleasepool { + strcpy_s(m->name, t->name.UTF8String); + } monsters.add(m); return m; }; @@ -406,4 +408,4 @@ monsterrender() loopv(monsters) renderclient(monsters[i], false, monstertypes[monsters[i]->mtype].mdlname, monsters[i]->mtype == 5, monstertypes[monsters[i]->mtype].mscale / 10.0f); -}; +} diff --git a/src/protos.h b/src/protos.h index 8c52516..9a876b7 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,18 +1,18 @@ // protos for ALL external functions in cube... // command -extern int variable(char *name, int min, int cur, int max, int *storage, +extern int variable(OFString *name, int min, int cur, int max, int *storage, void (*fun)(), bool persist); -extern void setvar(char *name, int i); -extern int getvar(char *name); -extern bool identexists(char *name); +extern void setvar(OFString *name, int i); +extern int getvar(OFString *name); +extern bool identexists(OFString *name); extern bool addcommand(OFString *name, void (*fun)(), int narg); extern int execute(char *p, bool down = true); -extern void exec(char *cfgfile); -extern bool execfile(char *cfgfile); +extern void exec(OFString *cfgfile); +extern bool execfile(OFString *cfgfile); extern void resetcomplete(); extern void complete(char *s); -extern void alias(char *name, char *action); +extern void alias(OFString *name, OFString *action); extern OFString *getalias(OFString *name); extern void writecfg(); @@ -33,10 +33,10 @@ extern void menuset(int menu); extern void menumanual(int m, int n, char *text); extern void sortmenu(int start, int num); extern bool menukey(int code, bool isdown); -extern void newmenu(char *name); +extern void newmenu(OFString *name); // serverbrowser -extern void addserver(char *servername); +extern void addserver(OFString *servername); extern char *getservername(int n); extern void writeservercfg(); @@ -70,7 +70,7 @@ extern void setarraypointers(); // client extern void localservertoclient(uchar *buf, int len); -extern void connects(char *servername); +extern void connects(OFString *servername); extern void disconnect(int onlyclean = 0, int async = 0); extern void toserver(char *text); extern void addmsg(int rel, int num, int type, ...); @@ -106,7 +106,7 @@ extern void fixplayer1range(); // clientextras extern void renderclients(); extern void renderclient( - dynent *d, bool team, char *mdlname, bool hellpig, float scale); + dynent *d, bool team, OFString *mdlname, bool hellpig, float scale); void showscores(bool on); extern void renderscores(); @@ -121,7 +121,7 @@ extern void trigger(int tag, int type, bool savegame); extern void resettagareas(); extern void settagareas(); extern entity *newentity( - int x, int y, int z, char *what, int v1, int v2, int v3, int v4); + int x, int y, int z, OFString *what, int v1, int v2, int v3, int v4); // worldlight extern void calclight(); @@ -182,7 +182,7 @@ extern void particle_trail(int type, int fade, vec &from, vec &to); extern void render_particles(int time); // worldio -extern void save_world(const char *fname); +extern void save_world(OFString *fname); extern void load_world(char *mname); extern void writemap(char *mname, int msize, uchar *mdata); extern uchar *readmap(const char *mname, int *msize); @@ -208,7 +208,7 @@ extern void initsound(); extern void cleansound(); // rendermd2 -extern void rendermodel(char *mdl, int frame, int range, int tex, float rad, +extern void rendermodel(OFString *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap = 0, int basetime = 0); extern mapmodelinfo *getmminfo(int i); diff --git a/src/renderextras.mm b/src/renderextras.mm index 37b1d61..2445392 100644 --- a/src/renderextras.mm +++ b/src/renderextras.mm @@ -147,30 +147,30 @@ renderspheres(int time) }; string closeent; -char *entnames[] = { - "none?", - "light", - "playerstart", - "shells", - "bullets", - "rockets", - "riflerounds", - "health", - "healthboost", - "greenarmour", - "yellowarmour", - "quaddamage", - "teleport", - "teledest", - "mapmodel", - "monster", - "trigger", - "jumppad", - "?", - "?", - "?", - "?", - "?", +OFString *entnames[] = { + @"none?", + @"light", + @"playerstart", + @"shells", + @"bullets", + @"rockets", + @"riflerounds", + @"health", + @"healthboost", + @"greenarmour", + @"yellowarmour", + @"quaddamage", + @"teleport", + @"teledest", + @"mapmodel", + @"monster", + @"trigger", + @"jumppad", + @"?", + @"?", + @"?", + @"?", + @"?", }; void @@ -190,31 +190,38 @@ renderents() // show sparkly thingies for map entities in edit mode int e = closestent(); if (e >= 0) { entity &c = ents[e]; - sprintf_s(closeent)("closest entity = %s (%d, %d, %d, %d), " - "selection = (%d, %d)", - entnames[c.type], c.attr1, c.attr2, c.attr3, c.attr4, - getvar("selxs"), getvar("selys")); - }; -}; + @autoreleasepool { + sprintf_s(closeent)( + "closest entity = %s (%d, %d, %d, %d), " + "selection = (%d, %d)", + entnames[c.type].UTF8String, c.attr1, c.attr2, + c.attr3, c.attr4, getvar(@"selxs"), + getvar(@"selys")); + } + } +} void -loadsky(char *basename) +loadsky(OFString *basename) { - static string lastsky = ""; - if (strcmp(lastsky, basename) == 0) - return; - char *side[] = {"ft", "bk", "lf", "rt", "dn", "up"}; - int texnum = 14; - loopi(6) - { - sprintf_sd(name)("packages/%s_%s.jpg", basename, side[i]); - int xs, ys; - if (!installtex(texnum + i, path(name), xs, ys, true)) - conoutf(@"could not load sky textures"); - }; - strcpy_s(lastsky, basename); + @autoreleasepool { + static OFString *lastsky = @""; + if ([lastsky isEqual:basename]) + return; + char *side[] = {"ft", "bk", "lf", "rt", "dn", "up"}; + int texnum = 14; + loopi(6) + { + sprintf_sd(name)( + "packages/%s_%s.jpg", basename.UTF8String, side[i]); + int xs, ys; + if (!installtex(texnum + i, path(name), xs, ys, true)) + conoutf(@"could not load sky textures"); + } + lastsky = basename; + } } -COMMAND(loadsky, ARG_1CSTR) +COMMAND(loadsky, ARG_1STR) float cursordepth = 0.9f; GLint viewport[4]; diff --git a/src/rendergl.mm b/src/rendergl.mm index ea6c2d5..da8fb79 100644 --- a/src/rendergl.mm +++ b/src/rendergl.mm @@ -150,15 +150,17 @@ texturereset() COMMAND(texturereset, ARG_NONE) void -texture(char *aframe, char *name) +texture(OFString *aframe, OFString *name) { - int num = curtexnum++, frame = atoi(aframe); - if (num < 0 || num >= 256 || frame < 0 || frame >= MAXFRAMES) - return; - mapping[num][frame] = 1; - char *n = mapname[num][frame]; - strcpy_s(n, name); - path(n); + @autoreleasepool { + int num = curtexnum++, frame = (int)aframe.longLongValue; + if (num < 0 || num >= 256 || frame < 0 || frame >= MAXFRAMES) + return; + mapping[num][frame] = 1; + char *n = mapname[num][frame]; + strcpy_s(n, name.UTF8String); + path(n); + } } COMMAND(texture, ARG_2STR) @@ -302,8 +304,8 @@ VAR(fogcolour, 0, 0x8099B3, 0xFFFFFF); VARP(hudgun, 0, 1, 1); -char *hudgunnames[] = {"hudguns/fist", "hudguns/shotg", "hudguns/chaing", - "hudguns/rocket", "hudguns/rifle"}; +OFString *hudgunnames[] = {@"hudguns/fist", @"hudguns/shotg", @"hudguns/chaing", + @"hudguns/rocket", @"hudguns/rifle"}; void drawhudmodel(int start, int end, float speed, int base) @@ -311,7 +313,7 @@ drawhudmodel(int start, int end, float speed, int base) rendermodel(hudgunnames[player1->gunselect], start, end, 0, 1.0f, player1->o.x, player1->o.z, player1->o.y, player1->yaw + 90, player1->pitch, false, 1.0f, speed, 0, base); -}; +} void drawhudgun(float fovy, float aspect, int farplane) diff --git a/src/rendermd2.mm b/src/rendermd2.mm index fcfcf02..47761a7 100644 --- a/src/rendermd2.mm +++ b/src/rendermd2.mm @@ -216,34 +216,37 @@ delayedload(md2 *m) int xs, ys; installtex(FIRSTMDL + m->mdlnum, path(name2), xs, ys); m->loaded = true; - }; -}; + } +} int modelnum = 0; md2 * -loadmodel(char *name) +loadmodel(OFString *name) { - if (!mdllookup) - mdllookup = new hashtable; - md2 **mm = mdllookup->access(name); - if (mm) - return *mm; - md2 *m = new md2(); - m->mdlnum = modelnum++; - mapmodelinfo mmi = {2, 2, 0, 0, ""}; - m->mmi = mmi; - m->loadname = newstring(name); - mdllookup->access(m->loadname, &m); - return m; -}; + @autoreleasepool { + if (!mdllookup) + mdllookup = new hashtable; + md2 **mm = mdllookup->access(name.UTF8String); + if (mm) + return *mm; + md2 *m = new md2(); + m->mdlnum = modelnum++; + mapmodelinfo mmi = {2, 2, 0, 0, ""}; + m->mmi = mmi; + m->loadname = newstring(name.UTF8String); + mdllookup->access(m->loadname, &m); + return m; + } +} void -mapmodel(char *rad, char *h, char *zoff, char *snap, char *name) +mapmodel( + OFString *rad, OFString *h, OFString *zoff, OFString *snap, OFString *name) { md2 *m = loadmodel(name); - mapmodelinfo mmi = { - atoi(rad), atoi(h), atoi(zoff), atoi(snap), m->loadname}; + mapmodelinfo mmi = {(int)rad.longLongValue, (int)h.longLongValue, + (int)zoff.longLongValue, (int)snap.longLongValue, m->loadname}; m->mmi = mmi; mapmodels.add(m); } @@ -263,7 +266,7 @@ getmminfo(int i) } void -rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, +rendermodel(OFString *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap, int basetime) { diff --git a/src/savegamedemo.mm b/src/savegamedemo.mm index 3d8f299..bea2b4f 100644 --- a/src/savegamedemo.mm +++ b/src/savegamedemo.mm @@ -119,18 +119,20 @@ savestate(char *fn) } void -savegame(char *name) +savegame(OFString *name) { - if (!m_classicsp) { - conoutf(@"can only save classic sp games"); - return; + @autoreleasepool { + if (!m_classicsp) { + conoutf(@"can only save classic sp games"); + return; + } + sprintf_sd(fn)("savegames/%s.csgz", name.UTF8String); + savestate(fn); + stop(); + conoutf(@"wrote %s", fn); } - sprintf_sd(fn)("savegames/%s.csgz", name); - savestate(fn); - stop(); - conoutf(@"wrote %s", fn); } -COMMAND(savegame, ARG_1CSTR) +COMMAND(savegame, ARG_1STR) void loadstate(char *fn) @@ -157,9 +159,9 @@ loadstate(char *fn) gzread(f, mapname, _MAXDEFSTR); nextmode = gzgeti(); @autoreleasepool { - changemap( - @(mapname)); // continue below once map has been loaded and - // client & server have updated + // continue below once map has been loaded and client & server + // have updated + changemap(@(mapname)); } return; out: @@ -169,12 +171,14 @@ out: } void -loadgame(char *name) +loadgame(OFString *name) { - sprintf_sd(fn)("savegames/%s.csgz", name); - loadstate(fn); + @autoreleasepool { + sprintf_sd(fn)("savegames/%s.csgz", name.UTF8String); + loadstate(fn); + } } -COMMAND(loadgame, ARG_1CSTR) +COMMAND(loadgame, ARG_1STR) void loadgameout() @@ -243,24 +247,26 @@ int ddamage, bdamage; vec dorig; void -record(char *name) +record(OFString *name) { - if (m_sp) { - conoutf(@"cannot record singleplayer games"); - return; - }; - int cn = getclientnum(); - if (cn < 0) - return; - sprintf_sd(fn)("demos/%s.cdgz", name); - savestate(fn); - gzputi(cn); - conoutf(@"started recording demo to %s", fn); - demorecording = true; - starttime = lastmillis; - ddamage = bdamage = 0; + @autoreleasepool { + if (m_sp) { + conoutf(@"cannot record singleplayer games"); + return; + } + int cn = getclientnum(); + if (cn < 0) + return; + sprintf_sd(fn)("demos/%s.cdgz", name.UTF8String); + savestate(fn); + gzputi(cn); + conoutf(@"started recording demo to %s", fn); + demorecording = true; + starttime = lastmillis; + ddamage = bdamage = 0; + } } -COMMAND(record, ARG_1CSTR) +COMMAND(record, ARG_1STR) void demodamage(int damage, vec &o) @@ -306,13 +312,15 @@ incomingdemodata(uchar *buf, int len, bool extras) } void -demo(char *name) +demo(OFString *name) { - sprintf_sd(fn)("demos/%s.cdgz", name); - loadstate(fn); - demoloading = true; + @autoreleasepool { + sprintf_sd(fn)("demos/%s.cdgz", name.UTF8String); + loadstate(fn); + demoloading = true; + } } -COMMAND(demo, ARG_1CSTR) +COMMAND(demo, ARG_1STR) void stopreset() diff --git a/src/serverbrowser.mm b/src/serverbrowser.mm index 55f2e00..7af99c3 100644 --- a/src/serverbrowser.mm +++ b/src/serverbrowser.mm @@ -147,25 +147,29 @@ char * getservername(int n) { return servers[n].name; -}; +} void -addserver(char *servername) +addserver(OFString *servername_) { - loopv(servers) if (strcmp(servers[i].name, servername) == 0) return; - serverinfo &si = servers.insert(0, serverinfo()); - strcpy_s(si.name, servername); - si.full[0] = 0; - si.mode = 0; - si.numplayers = 0; - si.ping = 9999; - si.protocol = 0; - si.minremain = 0; - si.map[0] = 0; - si.sdesc[0] = 0; - si.address.host = ENET_HOST_ANY; - si.address.port = CUBE_SERVINFO_PORT; -}; + @autoreleasepool { + const char *servername = servername_.UTF8String; + loopv(servers) if (strcmp(servers[i].name, servername) == + 0) return; + serverinfo &si = servers.insert(0, serverinfo()); + strcpy_s(si.name, servername); + si.full[0] = 0; + si.mode = 0; + si.numplayers = 0; + si.ping = 9999; + si.protocol = 0; + si.minremain = 0; + si.map[0] = 0; + si.sdesc[0] = 0; + si.address.host = ENET_HOST_ANY; + si.address.port = CUBE_SERVINFO_PORT; + } +} void pingservers() @@ -314,7 +318,7 @@ updatefrommaster() servermenu(); } -COMMAND(addserver, ARG_1CSTR) +COMMAND(addserver, ARG_1STR) COMMAND(servermenu, ARG_NONE) COMMAND(updatefrommaster, ARG_NONE) @@ -327,4 +331,4 @@ writeservercfg() fprintf(f, "// servers connected to are added here automatically\n\n"); loopvrev(servers) fprintf(f, "addserver %s\n", servers[i].name); fclose(f); -}; +} diff --git a/src/sound.mm b/src/sound.mm index 2ad19f3..22b759a 100644 --- a/src/sound.mm +++ b/src/sound.mm @@ -74,45 +74,47 @@ initsound() if (!FSOUND_Init(SOUNDFREQ, MAXCHAN, FSOUND_INIT_GLOBALFOCUS)) { conoutf(@"sound init failed (FMOD): %d", FSOUND_GetError()); nosound = true; - }; + } #endif -}; +} void -music(char *name) +music(OFString *name) { if (nosound) return; stopsound(); if (soundvol && musicvol) { - string sn; - strcpy_s(sn, "packages/"); - strcat_s(sn, name); + @autoreleasepool { + string sn; + strcpy_s(sn, "packages/"); + strcat_s(sn, name.UTF8String); #ifdef USE_MIXER - if (mod = Mix_LoadMUS(path(sn))) { - Mix_PlayMusic(mod, -1); - Mix_VolumeMusic((musicvol * MAXVOL) / 255); - }; + if (mod = Mix_LoadMUS(path(sn))) { + Mix_PlayMusic(mod, -1); + Mix_VolumeMusic((musicvol * MAXVOL) / 255); + } #else - if (mod = FMUSIC_LoadSong(path(sn))) { - FMUSIC_PlaySong(mod); - FMUSIC_SetMasterVolume(mod, musicvol); - } else if (stream = FSOUND_Stream_Open( - path(sn), FSOUND_LOOP_NORMAL, 0, 0)) { - int chan = FSOUND_Stream_Play(FSOUND_FREE, stream); - if (chan >= 0) { - FSOUND_SetVolume( - chan, (musicvol * MAXVOL) / 255); - FSOUND_SetPaused(chan, false); - }; - } else { - conoutf(@"could not play music: %s", sn); - }; + if (mod = FMUSIC_LoadSong(path(sn))) { + FMUSIC_PlaySong(mod); + FMUSIC_SetMasterVolume(mod, musicvol); + } else if (stream = FSOUND_Stream_Open( + path(sn), FSOUND_LOOP_NORMAL, 0, 0)) { + int chan = + FSOUND_Stream_Play(FSOUND_FREE, stream); + if (chan >= 0) { + FSOUND_SetVolume( + chan, (musicvol * MAXVOL) / 255); + FSOUND_SetPaused(chan, false); + } + } else { + conoutf(@"could not play music: %s", sn); + } #endif - }; + } + } } - -COMMAND(music, ARG_1CSTR) +COMMAND(music, ARG_1STR) #ifdef USE_MIXER vector samples; @@ -129,8 +131,7 @@ registersound(char *name) snames.add(newstring(name)); samples.add(NULL); return samples.length() - 1; -}; - +} COMMAND(registersound, ARG_1EST) void @@ -161,10 +162,9 @@ updatechanvol(int chan, vec *loc) player1->yaw * (PI / 180.0f); // relative angle of // sound along X-Y axis - pan = int( - 255.9f * - (0.5 * sin(yaw) + - 0.5f)); // range is from 0 (left) to 255 (right) + pan = int(255.9f * (0.5 * sin(yaw) + + 0.5f)); // range is from 0 (left) + // to 255 (right) }; }; vol = (vol * MAXVOL) / 255; @@ -225,8 +225,8 @@ playsound(int n, vec *loc) soundsatonce = 1; lastsoundmillis = lastmillis; if (soundsatonce > 5) - return; // avoid bursts of sounds with heavy packetloss and in - // sp + return; // avoid bursts of sounds with heavy packetloss + // and in sp if (n < 0 || n >= samples.length()) { conoutf(@"unregistered sound: %d", n); return; diff --git a/src/tools.h b/src/tools.h index d5c457f..c3b9bcb 100644 --- a/src/tools.h +++ b/src/tools.h @@ -320,7 +320,7 @@ template struct vector { template struct hashtable { struct chain { chain *next; - char *key; + const char *key; T data; }; @@ -344,14 +344,15 @@ template struct hashtable { void operator=(hashtable &v); T * - access(char *key, T *data = NULL) + access(const char *key, T *data = NULL) { unsigned int h = 5381; for (int i = 0, k; k = key[i]; i++) h = ((h << 5) + h) ^ k; // bernstein k=33 xor h = h & (size - 1); // primes not much of an advantage for (chain *c = table[h]; c; c = c->next) { - for (char *p1 = key, *p2 = c->key, ch; + char ch; + for (const char *p1 = key, *p2 = c->key; (ch = *p1++) == *p2++;) if (!ch) // if(strcmp(key,c->key)==0) { @@ -359,8 +360,8 @@ template struct hashtable { if (data) c->data = *data; return d; - }; - }; + } + } if (data) { chain *c = (chain *)parent->alloc(sizeof(chain)); c->data = *data; @@ -368,9 +369,9 @@ template struct hashtable { c->next = table[h]; table[h] = c; numelems++; - }; + } return NULL; - }; + } }; #define enumerate(ht, t, e, b) \ diff --git a/src/weapon.mm b/src/weapon.mm index e6195c1..18ea821 100644 --- a/src/weapon.mm +++ b/src/weapon.mm @@ -60,10 +60,13 @@ reloadtime(int gun) }; void -weapon(char *a1, char *a2, char *a3) +weapon(OFString *a1, OFString *a2, OFString *a3) { - selectgun(a1[0] ? atoi(a1) : -1, a2[0] ? atoi(a2) : -1, - a3[0] ? atoi(a3) : -1); + @autoreleasepool { + selectgun(a1.UTF8String[0] ? atoi(a1.UTF8String) : -1, + a2.UTF8String[0] ? atoi(a2.UTF8String) : -1, + a3.UTF8String[0] ? atoi(a3.UTF8String) : -1); + } } COMMAND(weapon, ARG_3STR) diff --git a/src/world.mm b/src/world.mm index bea3268..cc9b875 100644 --- a/src/world.mm +++ b/src/world.mm @@ -2,7 +2,9 @@ #include "cube.h" -extern char *entnames[]; // lookup from map entities above to strings +#include + +extern OFString *entnames[]; // lookup from map entities above to strings sqr *world = NULL; int sfactor, ssize, cubicsize, mipsize; @@ -58,12 +60,22 @@ trigger(int tag, int type, bool savegame) { if (!tag) return; + settag(tag, type); + if (!savegame && type != 3) playsound(S_RUMBLE); - sprintf_sd(aliasname)("level_trigger_%d", tag); - if (identexists(aliasname)) - execute(aliasname); + + @autoreleasepool { + OFString *aliasname = + [OFString stringWithFormat:@"level_trigger_%d", tag]; + + if (identexists(aliasname)) { + std::unique_ptr cmd(strdup(aliasname.UTF8String)); + execute(cmd.get()); + } + } + if (type == 2) endsp(false); } @@ -80,7 +92,7 @@ remip(block &b, int level) { if (level >= SMALLEST_FACTOR) return; - int lighterr = getvar("lighterror") * 3; + int lighterr = getvar(@"lighterror") * 3; sqr *w = wmip[level]; sqr *v = wmip[level + 1]; int ws = ssize >> level; @@ -296,23 +308,27 @@ delent() return; }; int t = ents[e].type; - conoutf(@"%s entity deleted", entnames[t]); + @autoreleasepool { + conoutf(@"%s entity deleted", entnames[t].UTF8String); + } ents[e].type = NOTUSED; addmsg(1, 10, SV_EDITENT, e, NOTUSED, 0, 0, 0, 0, 0, 0, 0); if (t == LIGHT) calclight(); -}; +} int -findtype(char *what) +findtype(OFString *what) { - loopi(MAXENTTYPES) if (strcmp(what, entnames[i]) == 0) return i; - conoutf(@"unknown entity type \"%s\"", what); - return NOTUSED; + @autoreleasepool { + loopi(MAXENTTYPES) if ([what isEqual:entnames[i]]) return i; + conoutf(@"unknown entity type \"%s\"", what.UTF8String); + return NOTUSED; + } } entity * -newentity(int x, int y, int z, char *what, int v1, int v2, int v3, int v4) +newentity(int x, int y, int z, OFString *what, int v1, int v2, int v3, int v4) { int type = findtype(what); persistent_entity e = {(short)x, (short)y, (short)z, (short)v1, @@ -346,7 +362,7 @@ newentity(int x, int y, int z, char *what, int v1, int v2, int v3, int v4) }; void -clearents(char *name) +clearents(OFString *name) { int type = findtype(name); if (noteditmode() || multiplayer()) @@ -360,7 +376,7 @@ clearents(char *name) if (type == LIGHT) calclight(); } -COMMAND(clearents, ARG_1CSTR) +COMMAND(clearents, ARG_1STR) void scalecomp(uchar &c, int intens) diff --git a/src/worldio.mm b/src/worldio.mm index 0467d46..0aa7d8c 100644 --- a/src/worldio.mm +++ b/src/worldio.mm @@ -7,7 +7,7 @@ backup(char *name, char *backupname) { remove(backupname); rename(name, backupname); -}; +} string cgzname, bakname, pcfname, mcfname; @@ -43,7 +43,7 @@ inline bool nhf(sqr *s) { return s->type != FHF && s->type != CHF; -}; +} void voptimize() // reset vdeltas on non-hf cubes @@ -57,8 +57,8 @@ voptimize() // reset vdeltas on non-hf cubes s->vdelta = 0; } else s->vdelta = 0; - }; -}; + } +} void topt(sqr *s, bool &wf, bool &uf, int &wt, int &ut) @@ -77,28 +77,28 @@ topt(sqr *s, bool &wf, bool &uf, int &wt, int &ut) wt = s->wtex; ut = s->utex; return; - }; + } } else { loopi(4) if (!SOLID(o[i])) { if (o[i]->floor < s->floor) { wt = s->wtex; wf = false; - }; + } if (o[i]->ceil > s->ceil) { ut = s->utex; uf = false; - }; - }; - }; -}; + } + } + } +} void toptimize() // FIXME: only does 2x2, make atleast for 4x4 also { bool wf[4], uf[4]; sqr *s[4]; - for (int x = 2; x < ssize - 4; x += 2) + for (int x = 2; x < ssize - 4; x += 2) { for (int y = 2; y < ssize - 4; y += 2) { s[0] = S(x, y); int wt = s[0]->wtex, ut = s[0]->utex; @@ -115,9 +115,10 @@ toptimize() // FIXME: only does 2x2, make atleast for 4x4 also s[i]->wtex = wt; if (uf[i]) s[i]->utex = ut; - }; - }; -}; + } + } + } +} // these two are used by getmap/sendmap.. transfers compressed maps directly @@ -130,7 +131,7 @@ writemap(char *mname, int msize, uchar *mdata) 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); @@ -144,7 +145,7 @@ readmap(const char *mname, int *msize) if (!mdata) { conoutf(@"could not read map %s", cgzname); return NULL; - }; + } return mdata; } @@ -154,22 +155,22 @@ readmap(const char *mname, int *msize) // miniscule map sizes. void -save_world(const char *mname) +save_world(OFString *mname) { @autoreleasepool { resettagareas(); // wouldn't be able to reproduce tagged areas // otherwise voptimize(); toptimize(); - if (!*mname) - mname = getclientmap().UTF8String; - setnames(mname); + if (mname.length == 0) + mname = getclientmap(); + setnames(mname.UTF8String); backup(cgzname, bakname); gzFile f = gzopen(cgzname, "wb9"); if (!f) { conoutf(@"could not write map to %s", cgzname); return; - }; + } hdr.version = MAPVERSION; hdr.numents = 0; loopv(ents) if (ents[i].type != NOTUSED) hdr.numents++; @@ -183,8 +184,8 @@ save_world(const char *mname) entity tmp = ents[i]; endianswap(&tmp, sizeof(short), 4); gzwrite(f, &tmp, sizeof(persistent_entity)); - }; - }; + } + } sqr *t = NULL; int sc = 0; #define spurge \ @@ -197,7 +198,7 @@ save_world(const char *mname) gzputc(f, sc); \ sc = 0; \ } \ - }; + } loopk(cubicsize) { sqr *s = &world[k]; @@ -216,7 +217,7 @@ save_world(const char *mname) gzputc(f, s->type); gzputc(f, s->wtex); gzputc(f, s->vdelta); - }; + } } else { if (t && c(type) && c(floor) && c(ceil) && c(ctex) && c(ftex) && c(utex) && c(wtex) && @@ -233,16 +234,17 @@ save_world(const char *mname) gzputc(f, s->vdelta); gzputc(f, s->utex); gzputc(f, s->tag); - }; - }; + } + } t = s; - }; + } spurge; gzclose(f); conoutf(@"wrote map file %s", cgzname); settagareas(); } } +COMMANDN(savemap, save_world, ARG_1STR) void load_world(char *mname) // still supports all map formats that have existed @@ -256,7 +258,7 @@ load_world(char *mname) // still supports all map formats that have existed if (!f) { conoutf(@"could not read map %s", cgzname); return; - }; + } gzread(f, &hdr, sizeof(header) - sizeof(int) * 16); endianswap(&hdr.version, sizeof(int), 4); if (strncmp(hdr.head, "CUBE", 4) != 0) @@ -270,7 +272,7 @@ load_world(char *mname) // still supports all map formats that have existed endianswap(&hdr.waterlevel, sizeof(int), 16); } else { hdr.waterlevel = -100000; - }; + } ents.setsize(0); loopi(hdr.numents) { @@ -283,8 +285,8 @@ load_world(char *mname) // still supports all map formats that have existed e.attr2 = 255; // needed for MAPVERSION<=2 if (e.attr1 > 32) e.attr1 = 32; // 12_03 and below - }; - }; + } + } free(world); setupworld(hdr.sfactor); char texuse[256]; @@ -301,14 +303,14 @@ load_world(char *mname) // still supports all map formats that have existed memcpy(&world[k], t, sizeof(sqr)); k--; break; - }; + } case 254: // only in MAPVERSION<=2 { memcpy(s, t, sizeof(sqr)); s->r = s->g = s->b = gzgetc(f); gzgetc(f); break; - }; + } case SOLID: { s->type = SOLID; s->wtex = gzgetc(f); @@ -316,7 +318,7 @@ load_world(char *mname) // still supports all map formats that have existed if (hdr.version <= 2) { gzgetc(f); gzgetc(f); - }; + } s->ftex = DEFAULT_FLOOR; s->ctex = DEFAULT_CEIL; s->utex = s->wtex; @@ -324,13 +326,13 @@ load_world(char *mname) // still supports all map formats that have existed s->floor = 0; s->ceil = 16; break; - }; + } default: { if (type < 0 || type >= MAXTYPE) { sprintf_sd(t)("%d @ %d", type, k); fatal("while reading map: type out of range: ", t); - }; + } s->type = type; s->floor = gzgetc(f); s->ceil = gzgetc(f); @@ -342,19 +344,19 @@ load_world(char *mname) // still supports all map formats that have existed if (hdr.version <= 2) { gzgetc(f); gzgetc(f); - }; + } s->vdelta = gzgetc(f); s->utex = (hdr.version >= 2) ? gzgetc(f) : s->wtex; s->tag = (hdr.version >= 5) ? gzgetc(f) : 0; s->type = type; - }; - }; + } + } s->defer = 0; t = s; texuse[s->wtex] = 1; if (!SOLID(s)) texuse[s->utex] = texuse[s->ftex] = texuse[s->ctex] = 1; - }; + } gzclose(f); calclight(); settagareas(); @@ -366,14 +368,17 @@ load_world(char *mname) // still supports all map formats that have existed startmap(mname); loopl(256) { - sprintf_sd(aliasname)( - "level_trigger_%d", l); // can this be done smarter? - if (identexists(aliasname)) - alias(aliasname, ""); - }; - execfile("data/default_map_settings.cfg"); - execfile(pcfname); - execfile(mcfname); + @autoreleasepool { + // can this be done smarter? + OFString *aliasname = + [OFString stringWithFormat:@"level_trigger_%d", l]; + if (identexists(aliasname)) + alias(aliasname, @""); + } + } + execfile(@"data/default_map_settings.cfg"); + @autoreleasepool { + execfile(@(pcfname)); + execfile(@(mcfname)); + } } - -COMMANDN(savemap, save_world, ARG_1CSTR) diff --git a/src/worldlight.mm b/src/worldlight.mm index 1b39c1f..fd2fe9a 100644 --- a/src/worldlight.mm +++ b/src/worldlight.mm @@ -171,19 +171,19 @@ calclight() { sqr *s = S(x, y); s->r = s->g = s->b = 10; - }; + } loopv(ents) { entity &e = ents[i]; if (e.type == LIGHT) calclightsource(e); - }; + } block b = {1, 1, ssize - 2, ssize - 2}; postlightarea(b); - setvar("fullbright", 0); -}; + setvar(@"fullbright", 0); +} VARP(dynlight, 0, 16, 32); @@ -196,8 +196,8 @@ cleardlights() block *backup = dlights.pop(); blockpaste(*backup); free(backup); - }; -}; + } +} void dodynlight(vec &vold, vec &v, int reach, int strength, dynent *owner) @@ -230,7 +230,7 @@ dodynlight(vec &vold, vec &v, int reach, int strength, dynent *owner) LIGHT, (uchar)strength, 0, 0}; calclightsource(l); postlightarea(b); -}; +} // utility functions also used by editing code @@ -244,7 +244,7 @@ blockcopy(block &s) for (int y = s.y; y < s.ys + s.y; y++) *q++ = *S(x, y); return b; -}; +} void blockpaste(block &b) @@ -254,4 +254,4 @@ blockpaste(block &b) for (int y = b.y; y < b.ys + b.y; y++) *S(x, y) = *q++; remipmore(b); -}; +} diff --git a/src/worldocull.mm b/src/worldocull.mm index 926227f..e0a0cb1 100644 --- a/src/worldocull.mm +++ b/src/worldocull.mm @@ -24,10 +24,10 @@ computeraytable(float vx, float vy) if (!ocull) return; - odist = getvar("fog") * 1.5f; + odist = getvar(@"fog") * 1.5f; float apitch = (float)fabs(player1->pitch); - float af = getvar("fov") / 2 + apitch / 1.5f + 3; + float af = getvar(@"fov") / 2 + apitch / 1.5f + 3; float byaw = (player1->yaw - 90 + af) / 360 * PI2; float syaw = (player1->yaw - 90 - af) / 360 * PI2;