Migrate more strings

FossilOrigin-Name: e7b5d33cada1ff8db653655ab2c77ead76ab7625a5d2f793b9aee3ec21e3778b
This commit is contained in:
Jonathan Schleifer 2025-03-03 23:52:52 +00:00
parent b00de734e8
commit 2860953c0b
24 changed files with 692 additions and 556 deletions

View file

@ -202,16 +202,16 @@ int framesinmap = 0;
initsound(); initsound();
log("cfg"); log("cfg");
newmenu("frags\tpj\tping\tteam\tname"); newmenu(@"frags\tpj\tping\tteam\tname");
newmenu("ping\tplr\tserver"); newmenu(@"ping\tplr\tserver");
exec("data/keymap.cfg"); exec(@"data/keymap.cfg");
exec("data/menus.cfg"); exec(@"data/menus.cfg");
exec("data/prefabs.cfg"); exec(@"data/prefabs.cfg");
exec("data/sounds.cfg"); exec(@"data/sounds.cfg");
exec("servers.cfg"); exec(@"servers.cfg");
if (!execfile("config.cfg")) if (!execfile(@"config.cfg"))
execfile("data/defaults.cfg"); execfile(@"data/defaults.cfg");
exec("autoexec.cfg"); exec(@"autoexec.cfg");
log("localconnect"); log("localconnect");
localconnect(); localconnect();

View file

@ -57,21 +57,24 @@ throttle()
} }
void void
newname(char *name) newname(OFString *name)
{ {
c2sinit = false; c2sinit = false;
strn0cpy(player1->name, name, 16); @autoreleasepool {
strn0cpy(player1->name, name.UTF8String, 16);
}
} }
COMMANDN(name, newname, ARG_1STR)
void void
newteam(char *name) newteam(OFString *name)
{ {
c2sinit = false; c2sinit = false;
strn0cpy(player1->team, name, 5); @autoreleasepool {
strn0cpy(player1->team, name.UTF8String, 5);
}
} }
COMMANDN(team, newteam, ARG_1STR)
COMMANDN(team, newteam, ARG_1CSTR)
COMMANDN(name, newname, ARG_1CSTR)
void void
writeclientinfo(FILE *f) writeclientinfo(FILE *f)
@ -80,17 +83,19 @@ writeclientinfo(FILE *f)
} }
void void
connects(char *servername) connects(OFString *servername)
{ {
@autoreleasepool {
disconnect(1); // reset state disconnect(1); // reset state
addserver(servername); addserver(servername);
conoutf(@"attempting to connect to %s", servername); conoutf(@"attempting to connect to %s", servername.UTF8String);
ENetAddress address = {ENET_HOST_ANY, CUBE_SERVER_PORT}; ENetAddress address = {ENET_HOST_ANY, CUBE_SERVER_PORT};
if (enet_address_set_host(&address, servername) < 0) { if (enet_address_set_host(&address, servername.UTF8String) <
0) {
conoutf(@"could not resolve server %s", servername); conoutf(@"could not resolve server %s", servername);
return; return;
}; }
clienthost = enet_host_create(NULL, 1, rate, rate); clienthost = enet_host_create(NULL, 1, rate, rate);
@ -103,6 +108,7 @@ connects(char *servername)
conoutf(@"could not connect to server"); conoutf(@"could not connect to server");
disconnect(); disconnect();
} }
}
} }
void void
@ -173,7 +179,7 @@ echo(char *text)
COMMAND(echo, ARG_VARI) COMMAND(echo, ARG_VARI)
COMMANDN(say, toserver, ARG_VARI) COMMANDN(say, toserver, ARG_VARI)
COMMANDN(connect, connects, ARG_1CSTR) COMMANDN(connect, connects, ARG_1STR)
COMMANDN(disconnect, trydisconnect, ARG_NONE) COMMANDN(disconnect, trydisconnect, ARG_NONE)
// collect c2s messages conveniently // collect c2s messages conveniently
@ -218,11 +224,13 @@ bool senditemstoserver =
string clientpassword; string clientpassword;
void 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 bool
netmapstart() netmapstart()
@ -237,8 +245,8 @@ initclientnet()
ctext[0] = 0; ctext[0] = 0;
toservermap = @""; toservermap = @"";
clientpassword[0] = 0; clientpassword[0] = 0;
newname("unnamed"); newname(@"unnamed");
newteam("red"); newteam(@"red");
} }
void void

View file

@ -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}; int range[] = {6, 6, 8, 28, 1, 1, 1, 1, 8, 19, 4, 18, 40, 1, 6, 15, 1, 1, 1, 1};
void 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; int n = 3;
float speed = 100.0f; float speed = 100.0f;
@ -27,7 +27,7 @@ renderclient(dynent *d, bool team, char *mdlname, bool hellpig, float scale)
} else { } else {
n = (intptr_t)d % 3; n = (intptr_t)d % 3;
r = range[n]; r = range[n];
}; }
basetime = d->lastaction; basetime = d->lastaction;
int t = lastmillis - d->lastaction; int t = lastmillis - d->lastaction;
if (t < 0 || t > 20000) 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; speed = 1200 / d->maxspeed * scale;
if (hellpig) if (hellpig)
speed = 300 / d->maxspeed; speed = 300 / d->maxspeed;
}; }
if (hellpig) { if (hellpig) {
n++; n++;
scale *= 32; scale *= 32;
mz -= 1.9f; mz -= 1.9f;
}; }
rendermodel(mdlname, frame[n], range[n], 0, 1.5f, d->o.x, mz, d->o.y, 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); d->yaw + 90, d->pitch / 2, team, scale, speed, 0, basetime);
}; }
extern int democlientnum; extern int democlientnum;
@ -79,9 +79,9 @@ renderclients()
dynent *d; dynent *d;
loopv(players) if ((d = players[i]) && loopv(players) if ((d = players[i]) &&
(!demoplayback || i != democlientnum)) (!demoplayback || i != democlientnum))
renderclient( renderclient(d, isteam(player1->team, d->team), @"monster/ogro",
d, isteam(player1->team, d->team), "monster/ogro", false, 1.0f); false, 1.0f);
}; }
// creation of scoreboard pseudo-menu // creation of scoreboard pseudo-menu
@ -161,15 +161,15 @@ renderscores()
// sendmap/getmap commands, should be replaced by more intuitive map downloading // sendmap/getmap commands, should be replaced by more intuitive map downloading
void void
sendmap(const char *mapname) sendmap(OFString *mapname)
{ {
@autoreleasepool { @autoreleasepool {
if (*mapname) if (mapname.length > 0)
save_world(mapname); save_world(mapname);
changemap(@(mapname)); changemap(mapname);
mapname = getclientmap().UTF8String; mapname = getclientmap();
int mapsize; int mapsize;
uchar *mapdata = readmap(mapname, &mapsize); uchar *mapdata = readmap(mapname.UTF8String, &mapsize);
if (!mapdata) if (!mapdata)
return; return;
ENetPacket *packet = enet_packet_create( ENetPacket *packet = enet_packet_create(
@ -177,10 +177,11 @@ sendmap(const char *mapname)
uchar *start = packet->data; uchar *start = packet->data;
uchar *p = start + 2; uchar *p = start + 2;
putint(p, SV_SENDMAP); putint(p, SV_SENDMAP);
sendstring(mapname, p); sendstring(mapname.UTF8String, p);
putint(p, mapsize); putint(p, mapsize);
if (65535 - (p - start) < 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); free(mapdata);
enet_packet_destroy(packet); enet_packet_destroy(packet);
return; return;
@ -191,10 +192,10 @@ sendmap(const char *mapname)
*(ushort *)start = ENET_HOST_TO_NET_16(p - start); *(ushort *)start = ENET_HOST_TO_NET_16(p - start);
enet_packet_resize(packet, p - start); enet_packet_resize(packet, p - start);
sendpackettoserv(packet); sendpackettoserv(packet);
conoutf(@"sending map %s to server...", mapname); conoutf(@"sending map %s to server...", mapname.UTF8String);
sprintf_sd(msg)( sprintf_sd(msg)(
"[map %s uploaded to server, \"getmap\" to receive it]", "[map %s uploaded to server, \"getmap\" to receive it]",
mapname); mapname.UTF8String);
toserver(msg); toserver(msg);
} }
} }
@ -213,5 +214,5 @@ getmap()
conoutf(@"requesting map from server..."); conoutf(@"requesting map from server...");
} }
COMMAND(sendmap, ARG_1CSTR) COMMAND(sendmap, ARG_1STR)
COMMAND(getmap, ARG_NONE) COMMAND(getmap, ARG_NONE)

View file

@ -2,6 +2,8 @@
#include "cube.h" #include "cube.h"
#include <memory>
int nextmode = 0; // nextmode becomes gamemode after next map load int nextmode = 0; // nextmode becomes gamemode after next map load
VAR(gamemode, 1, 0, 0); VAR(gamemode, 1, 0, 0);
@ -231,13 +233,13 @@ respawn()
} }
int sleepwait = 0; int sleepwait = 0;
string sleepcmd; static OFString *sleepcmd = nil;
void void
sleepf(char *msec, char *cmd) sleepf(OFString *msec, OFString *cmd)
{ {
sleepwait = atoi(msec) + lastmillis; sleepwait = (int)msec.longLongValue + lastmillis;
strcpy_s(sleepcmd, cmd); sleepcmd = cmd;
}; }
COMMANDN(sleep, sleepf, ARG_2STR) COMMANDN(sleep, sleepf, ARG_2STR)
void void
@ -247,8 +249,12 @@ updateworld(int millis) // main game update loop
curtime = millis - lastmillis; curtime = millis - lastmillis;
if (sleepwait && lastmillis > sleepwait) { if (sleepwait && lastmillis > sleepwait) {
sleepwait = 0; sleepwait = 0;
execute(sleepcmd); @autoreleasepool {
}; std::unique_ptr<char> cmd(
strdup(sleepcmd.UTF8String));
execute(cmd.get());
}
}
physicsframe(); physicsframe();
checkquad(curtime); checkquad(curtime);
if (m_arena) if (m_arena)
@ -508,9 +514,9 @@ startmap(char *name) // called just after a map load
} }
if (editmode) if (editmode)
toggleedit(); toggleedit();
setvar("gamespeed", 100); setvar(@"gamespeed", 100);
setvar("fog", 180); setvar(@"fog", 180);
setvar("fogcolour", 0x8099B3); setvar(@"fogcolour", 0x8099B3);
showscores(false); showscores(false);
intermission = false; intermission = false;
framesinmap = 0; framesinmap = 0;

View file

@ -3,6 +3,8 @@
#include "cube.h" #include "cube.h"
#include <memory>
enum { ID_VAR, ID_COMMAND, ID_ALIAS }; enum { ID_VAR, ID_COMMAND, ID_ALIAS };
@interface Ident : OFObject @interface Ident : OFObject
@ -36,77 +38,65 @@ exchangestr(char *o, const char *n)
OFMutableDictionary<OFString *, Ident *> *idents; OFMutableDictionary<OFString *, Ident *> *idents;
void void
alias(char *name, char *action) alias(OFString *name, OFString *action)
{ {
@autoreleasepool { Ident *b = idents[name];
Ident *b = idents[@(name)];
if (!b) { if (b == nil) {
Ident *b = [[Ident alloc] init]; Ident *b = [[Ident alloc] init];
b.type = ID_ALIAS; b.type = ID_ALIAS;
b.name = @(name); b.name = name;
b.action = @(action); b.action = action;
b.persist = true; b.persist = true;
idents[b.name] = b; idents[b.name] = b;
} else { } else {
if (b.type == ID_ALIAS) if (b.type == ID_ALIAS)
b.action = @(action); b.action = action;
else else
conoutf( conoutf(
@"cannot redefine builtin %s with an alias", @"cannot redefine builtin %s with an alias", name.UTF8String);
name);
}
} }
} }
COMMAND(alias, ARG_2STR) COMMAND(alias, ARG_2STR)
int 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) bool persist)
{ {
if (idents == nil) if (idents == nil)
idents = [[OFMutableDictionary alloc] init]; idents = [[OFMutableDictionary alloc] init];
@autoreleasepool {
Ident *v = [[Ident alloc] init]; Ident *v = [[Ident alloc] init];
v.type = ID_VAR; v.type = ID_VAR;
v.name = @(name); v.name = name;
v.min = min; v.min = min;
v.max = max; v.max = max;
v.storage = storage; v.storage = storage;
v.fun = fun; v.fun = fun;
v.persist = persist; v.persist = persist;
idents[v.name] = v; idents[name] = v;
}
return cur; return cur;
} }
void void
setvar(char *name, int i) setvar(OFString *name, int i)
{ {
@autoreleasepool { *idents[name].storage = i;
*idents[@(name)].storage = i;
}
} }
int int
getvar(char *name) getvar(OFString *name)
{ {
@autoreleasepool { return *idents[name].storage;
return *idents[@(name)].storage;
}
} }
bool bool
identexists(char *name) identexists(OFString *name)
{ {
@autoreleasepool { return (idents[name] != nil);
return (idents[@(name)] != nil);
}
} }
OFString * OFString *
@ -296,34 +286,63 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively
((void(__cdecl *)()) ((void(__cdecl *)())
ID.fun)(); ID.fun)();
break; break;
case ARG_1CSTR: case ARG_1STR:
if (isdown) if (isdown) {
((void(__cdecl *)( @autoreleasepool {
char *))ID.fun)( ((void(
w[1]); __cdecl *)(
OFString *))
ID.fun)(
@(w[1]));
}
}
break; break;
case ARG_2STR: case ARG_2STR:
if (isdown) if (isdown) {
((void(__cdecl *)( @autoreleasepool {
char *, ((void(
char *))ID.fun)( __cdecl *)(
w[1], w[2]); OFString *,
OFString *))
ID.fun)(
@(w[1]),
@(w[2]));
}
}
break; break;
case ARG_3STR: case ARG_3STR:
if (isdown) if (isdown) {
((void(__cdecl *)( @autoreleasepool {
char *, char *, ((void(
char *))ID.fun)( __cdecl *)(
w[1], w[2], w[3]); OFString *,
OFString *,
OFString *))
ID.fun)(
@(w[1]),
@(w[2]),
@(w[3]));
}
}
break; break;
case ARG_5STR: case ARG_5STR:
if (isdown) if (isdown) {
((void(__cdecl *)( @autoreleasepool {
char *, char *, ((void(
char *, char *, __cdecl *)(
char *))ID.fun)( OFString *,
w[1], w[2], w[3], OFString *,
w[4], w[5]); OFString *,
OFString *,
OFString *))
ID.fun)(
@(w[1]),
@(w[2]),
@(w[3]),
@(w[4]),
@(w[5]));
}
}
break; break;
case ARG_DOWN: case ARG_DOWN:
((void(__cdecl *)(bool))ID.fun)( ((void(__cdecl *)(bool))ID.fun)(
@ -383,17 +402,6 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively
char *))ID.fun)(r); char *))ID.fun)(r);
break; break;
} }
case ARG_1STR:
if (isdown) {
@autoreleasepool {
((void(
__cdecl *)(
OFString *))
ID.fun)(
@(w[1]));
}
}
break;
} }
break; break;
@ -479,11 +487,16 @@ execute(char *p, bool isdown) // all evaluation happens here, recursively
// variables // variables
case ID_ALIAS: case ID_ALIAS:
for (int i = 1; i < numargs; i++) { for (int i = 1; i < numargs; i++) {
@autoreleasepool {
// set any arguments as // set any arguments as
// (global) arg values so // (global) arg values
// functions can access them // so functions can
sprintf_sd(t)("arg%d", i); // access them
alias(t, w[i]); OFString *t = [OFString
stringWithFormat:
@"arg%d", i];
alias(t, @(w[i]));
}
} }
// create new string here because alias // create new string here because alias
// could rebind itself // could rebind itself
@ -541,23 +554,28 @@ complete(char *s)
} }
bool bool
execfile(char *cfgfile) execfile(OFString *cfgfile)
{ {
@autoreleasepool {
string s; string s;
strcpy_s(s, cfgfile); strcpy_s(s, cfgfile.UTF8String);
char *buf = loadfile(path(s), NULL); char *buf = loadfile(path(s), NULL);
if (!buf) if (!buf)
return false; return false;
execute(buf); execute(buf);
free(buf); free(buf);
return true; return true;
}
} }
void void
exec(char *cfgfile) exec(OFString *cfgfile)
{ {
if (!execfile(cfgfile)) if (!execfile(cfgfile)) {
conoutf(@"could not read \"%s\"", cfgfile); @autoreleasepool {
conoutf(@"could not read \"%s\"", cfgfile.UTF8String);
}
}
} }
void void
@ -600,36 +618,50 @@ COMMAND(writecfg, ARG_NONE)
// () and [] expressions, any control construct can be defined trivially. // () and [] expressions, any control construct can be defined trivially.
void void
intset(char *name, int v) intset(OFString *name, int v)
{ {
string b; @autoreleasepool {
itoa(b, v); alias(name, [OFString stringWithFormat:@"%d", 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);
} }
} }
void void
whilea(char *cond, char *body) ifthen(OFString *cond, OFString *thenp, OFString *elsep)
{ {
while (execute(cond)) @autoreleasepool {
execute(body); std::unique_ptr<char> cmd(strdup(
} // can't get any simpler than this :) (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<char> body(strdup(body_.UTF8String));
loopi(t)
{
intset(@"i", i);
execute(body.get());
}
}
}
void
whilea(OFString *cond_, OFString *body_)
{
@autoreleasepool {
std::unique_ptr<char> cond(strdup(cond_.UTF8String));
std::unique_ptr<char> body(strdup(body_.UTF8String));
while (execute(cond.get()))
execute(body.get());
}
}
void void
onrelease(bool on, char *body) onrelease(bool on, char *body)
@ -641,7 +673,9 @@ onrelease(bool on, char *body)
void void
concat(char *s) concat(char *s)
{ {
alias("s", s); @autoreleasepool {
alias(@"s", @(s));
}
} }
void void
@ -666,19 +700,24 @@ listlen(char *a)
} }
void void
at(char *s, char *pos) at(OFString *s_, OFString *pos)
{ {
int n = atoi(pos); @autoreleasepool {
int n = (int)pos.longLongValue;
std::unique_ptr<char> copy(strdup(s_.UTF8String));
char *s = copy.get();
loopi(n) s += strspn(s += strcspn(s, " \0"), " "); loopi(n) s += strspn(s += strcspn(s, " \0"), " ");
s[strcspn(s, " \0")] = 0; s[strcspn(s, " \0")] = 0;
concat(s); concat(s);
}
} }
COMMANDN(loop, loopa, ARG_2STR) COMMANDN(loop, loopa, ARG_2STR)
COMMANDN(while, whilea, ARG_2STR) COMMANDN(while, whilea, ARG_2STR)
COMMANDN(if, ifthen, ARG_3STR) COMMANDN(if, ifthen, ARG_3STR)
COMMAND(onrelease, ARG_DWN1) COMMAND(onrelease, ARG_DWN1)
COMMAND(exec, ARG_1CSTR) COMMAND(exec, ARG_1STR)
COMMAND(concat, ARG_VARI) COMMAND(concat, ARG_VARI)
COMMAND(concatword, ARG_VARI) COMMAND(concatword, ARG_VARI)
COMMAND(at, ARG_2STR) COMMAND(at, ARG_2STR)

View file

@ -1,7 +1,9 @@
// console.cpp: the console buffer, its display, and command line control // console.cpp: the console buffer, its display, and command line control
#include "cube.h" #include "cube.h"
#include <ctype.h> #include <ctype.h>
#include <memory>
struct cline { struct cline {
char *cref; char *cref;
@ -94,25 +96,30 @@ struct keym {
int numkm = 0; int numkm = 0;
void void
keymap(char *code, char *key, char *action) keymap(OFString *code, OFString *key, OFString *action)
{ {
keyms[numkm].code = atoi(code); @autoreleasepool {
keyms[numkm].name = newstring(key); keyms[numkm].code = (int)code.longLongValue;
keyms[numkm++].action = newstringbuf(action); keyms[numkm].name = newstring(key.UTF8String);
keyms[numkm++].action = newstringbuf(action.UTF8String);
}
} }
COMMAND(keymap, ARG_3STR) COMMAND(keymap, ARG_3STR)
void void
bindkey(char *key, char *action) bindkey(OFString *key_, OFString *action)
{ {
for (char *x = key; *x; x++) @autoreleasepool {
std::unique_ptr<char> key(strdup(key_.UTF8String));
for (char *x = key.get(); *x; x++)
*x = toupper(*x); *x = toupper(*x);
loopi(numkm) if (strcmp(keyms[i].name, key) == 0) loopi(numkm) if (strcmp(keyms[i].name, key.get()) == 0)
{ {
strcpy_s(keyms[i].action, action); strcpy_s(keyms[i].action, action.UTF8String);
return; return;
}; }
conoutf(@"unknown key \"%s\"", key); conoutf(@"unknown key \"%s\"", key.get());
}
} }
COMMANDN(bind, bindkey, ARG_2STR) COMMANDN(bind, bindkey, ARG_2STR)
@ -125,16 +132,17 @@ saycommand(char *init) // turns input to the command line on or off
if (!init) if (!init)
init = ""; init = "";
strcpy_s(commandbuf, init); strcpy_s(commandbuf, init);
}; }
COMMAND(saycommand, ARG_VARI)
void void
mapmsg(char *s) mapmsg(OFString *s)
{ {
strn0cpy(hdr.maptitle, s, 128); @autoreleasepool {
strn0cpy(hdr.maptitle, s.UTF8String, 128);
}
} }
COMMAND(mapmsg, ARG_1STR)
COMMAND(saycommand, ARG_VARI)
COMMAND(mapmsg, ARG_1CSTR)
#ifndef _WIN32 #ifndef _WIN32
# include <SDL_syswm.h> # include <SDL_syswm.h>

View file

@ -110,7 +110,7 @@ struct block {
}; };
struct mapmodelinfo { struct mapmodelinfo {
int rad, h, zoff, snap; int rad, h, zoff, snap;
char *name; const char *name;
}; };
enum { enum {
@ -379,7 +379,7 @@ enum // function signatures for script functions, see command.cpp
ARG_3INT, ARG_3INT,
ARG_4INT, ARG_4INT,
ARG_NONE, ARG_NONE,
ARG_1CSTR, ARG_1STR,
ARG_2STR, ARG_2STR,
ARG_3STR, ARG_3STR,
ARG_5STR, ARG_5STR,
@ -389,8 +389,7 @@ enum // function signatures for script functions, see command.cpp
ARG_2EXP, ARG_2EXP,
ARG_1EST, ARG_1EST,
ARG_2EST, ARG_2EST,
ARG_VARI, ARG_VARI
ARG_1STR
}; };
// nasty macros for registering script functions, abuses globals to avoid // 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() \ OF_CONSTRUCTOR() \
{ \ { \
enqueueInit(^{ \ enqueueInit(^{ \
name = \ name = variable( \
variable(#name, min, cur, max, &name, NULL, true); \ @ #name, min, cur, max, &name, NULL, true); \
}); \ }); \
} }
#define VAR(name, min, cur, max) \ #define VAR(name, min, cur, max) \
@ -418,7 +417,7 @@ enum // function signatures for script functions, see command.cpp
{ \ { \
enqueueInit(^{ \ enqueueInit(^{ \
name = variable( \ name = variable( \
#name, min, cur, max, &name, NULL, false); \ @ #name, min, cur, max, &name, NULL, false); \
}); \ }); \
} }
#define VARF(name, min, cur, max, body) \ #define VARF(name, min, cur, max, body) \
@ -428,7 +427,7 @@ enum // function signatures for script functions, see command.cpp
{ \ { \
enqueueInit(^{ \ enqueueInit(^{ \
name = variable( \ name = variable( \
#name, min, cur, max, &name, var_##name, false); \ @ #name, min, cur, max, &name, var_##name, false); \
}); \ }); \
} \ } \
void var_##name() { body; } void var_##name() { body; }
@ -439,7 +438,7 @@ enum // function signatures for script functions, see command.cpp
{ \ { \
enqueueInit(^{ \ enqueueInit(^{ \
name = variable( \ name = variable( \
#name, min, cur, max, &name, var_##name, true); \ @ #name, min, cur, max, &name, var_##name, true); \
}); \ }); \
} \ } \
void var_##name() { body; } void var_##name() { body; }

View file

@ -9,12 +9,19 @@ bool editmode = false;
// invariant: all code assumes that these are kept inside MINBORD distance of // invariant: all code assumes that these are kept inside MINBORD distance of
// the edge of the map // the edge of the map
block sel = { block sel;
variable("selx", 0, 0, 4096, &sel.x, NULL, false),
variable("sely", 0, 0, 4096, &sel.y, NULL, false), OF_CONSTRUCTOR()
variable("selxs", 0, 0, 4096, &sel.xs, NULL, false), {
variable("selys", 0, 0, 4096, &sel.ys, NULL, false), 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; int selh = 0;
bool selset = false; bool selset = false;
@ -593,12 +600,15 @@ edittag(int tag)
}; };
void void
newent(char *what, char *a1, char *a2, char *a3, char *a4) newent(OFString *what, OFString *a1, OFString *a2, OFString *a3, OFString *a4)
{ {
EDITSEL; EDITSEL;
newentity(sel.x, sel.y, (int)player1->o.z, what, ATOI(a1), ATOI(a2), @autoreleasepool {
ATOI(a3), ATOI(a4)); 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) COMMANDN(select, selectpos, ARG_4INT)
COMMAND(edittag, ARG_1INT) COMMAND(edittag, ARG_1INT)

View file

@ -4,23 +4,23 @@
vector<entity> ents; vector<entity> ents;
char *entmdlnames[] = { static OFString *entmdlnames[] = {
"shells", @"shells",
"bullets", @"bullets",
"rockets", @"rockets",
"rrounds", @"rrounds",
"health", @"health",
"boost", @"boost",
"g_armour", @"g_armour",
"y_armour", @"y_armour",
"quad", @"quad",
"teleporter", @"teleporter",
}; };
int triggertime = 0; int triggertime = 0;
void 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) 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, 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); mapmodelinfo *mmi = getmminfo(e.attr2);
if (!mmi) if (!mmi)
continue; continue;
rendermodel(mmi->name, 0, 1, e.attr4, (float)mmi->rad, @autoreleasepool {
e.x, rendermodel(@(mmi->name), 0, 1, e.attr4,
(float)S(e.x, e.y)->floor + mmi->zoff + e.attr3, (float)mmi->rad, e.x,
e.y, (float)((e.attr1 + 7) - (e.attr1 + 7) % 15), 0, (float)S(e.x, e.y)->floor + mmi->zoff +
false, 1.0f, 10.0f, mmi->snap); e.attr3,
e.y,
(float)((e.attr1 + 7) - (e.attr1 + 7) % 15),
0, false, 1.0f, 10.0f, mmi->snap);
}
} else { } else {
if (OUTBORD(e.x, e.y)) if (OUTBORD(e.x, e.y))
continue; continue;
@ -67,7 +71,7 @@ renderentities()
case 0: case 0:
if (!e.spawned) if (!e.spawned)
continue; continue;
renderent(e, "carrot", renderent(e, @"carrot",
(float)(1 + sin(lastmillis / 100.0 + (float)(1 + sin(lastmillis / 100.0 +
e.x + e.y) / e.x + e.y) /
20), 20),
@ -76,7 +80,7 @@ renderentities()
break; break;
case 4: case 4:
renderent(e, "switch2", 3, renderent(e, @"switch2", 3,
(float)e.attr3 * 90, (float)e.attr3 * 90,
(!e.spawned && !triggertime) ? 1 (!e.spawned && !triggertime) ? 1
: 0, : 0,
@ -84,7 +88,7 @@ renderentities()
triggertime, 1050.0f); triggertime, 1050.0f);
break; break;
case 5: case 5:
renderent(e, "switch1", -0.15f, renderent(e, @"switch1", -0.15f,
(float)e.attr3 * 90, (float)e.attr3 * 90,
(!e.spawned && !triggertime) ? 30 (!e.spawned && !triggertime) ? 30
: 0, : 0,

View file

@ -26,17 +26,21 @@ menuset(int menu)
resetmovement(player1); resetmovement(player1);
if (vmenu == 1) if (vmenu == 1)
menus[1].menusel = 0; menus[1].menusel = 0;
}; }
void void
showmenu(char *name) showmenu(OFString *name_)
{ {
@autoreleasepool {
const char *name = name_.UTF8String;
loopv(menus) if (i > 1 && strcmp(menus[i].name, name) == 0) loopv(menus) if (i > 1 && strcmp(menus[i].name, name) == 0)
{ {
menuset(i); menuset(i);
return; return;
}; }
}; }
}
COMMAND(showmenu, ARG_1STR)
int int
menucompare(mitem *a, mitem *b) menucompare(mitem *a, mitem *b)
@ -103,12 +107,15 @@ rendermenu()
}; };
void void
newmenu(char *name) newmenu(OFString *name)
{ {
@autoreleasepool {
gmenu &menu = menus.add(); gmenu &menu = menus.add();
menu.name = newstring(name); menu.name = newstring(name.UTF8String);
menu.menusel = 0; menu.menusel = 0;
}; }
}
COMMAND(newmenu, ARG_1STR)
void void
menumanual(int m, int n, char *text) menumanual(int m, int n, char *text)
@ -121,18 +128,18 @@ menumanual(int m, int n, char *text)
} }
void void
menuitem(char *text, char *action) menuitem(OFString *text, OFString *action)
{ {
@autoreleasepool {
gmenu &menu = menus.last(); gmenu &menu = menus.last();
mitem &mi = menu.items.add(); mitem &mi = menu.items.add();
mi.text = newstring(text); mi.text = newstring(text.UTF8String);
mi.action = action[0] ? newstring(action) : mi.text; mi.action =
action.length > 0 ? newstring(action.UTF8String) : mi.text;
}
} }
COMMAND(menuitem, ARG_2STR) COMMAND(menuitem, ARG_2STR)
COMMAND(showmenu, ARG_1CSTR)
COMMAND(newmenu, ARG_1CSTR)
bool bool
menukey(int code, bool isdown) menukey(int code, bool isdown)
{ {
@ -158,12 +165,15 @@ menukey(int code, bool isdown)
} else { } else {
if (code == SDLK_RETURN || code == -2) { if (code == SDLK_RETURN || code == -2) {
char *action = menus[vmenu].items[menusel].action; char *action = menus[vmenu].items[menusel].action;
if (vmenu == 1) if (vmenu == 1) {
connects(getservername(menusel)); @autoreleasepool {
connects(@(getservername(menusel)));
}
}
menustack.add(vmenu); menustack.add(vmenu);
menuset(-1); menuset(-1);
execute(action, true); execute(action, true);
}; }
}; }
return true; return true;
}; };

View file

@ -26,26 +26,26 @@ struct monstertype // see docs for how these values modify behaviour
short gun, speed, health, freq, lag, rate, pain, loyalty, mscale, short gun, speed, health, freq, lag, rate, pain, loyalty, mscale,
bscale; bscale;
short painsound, diesound; short painsound, diesound;
char *name, *mdlname; OFConstantString *name, *mdlname;
} }
monstertypes[NUMMONSTERTYPES] = { monstertypes[NUMMONSTERTYPES] = {
{GUN_FIREBALL, 15, 100, 3, 0, 100, 800, 1, 10, 10, S_PAINO, S_DIE1, {GUN_FIREBALL, 15, 100, 3, 0, 100, 800, 1, 10, 10, S_PAINO, S_DIE1,
"an ogre", "monster/ogro"}, @"an ogre", @"monster/ogro"},
{GUN_CG, 18, 70, 2, 70, 10, 400, 2, 8, 9, S_PAINR, S_DEATHR, "a rhino", {GUN_CG, 18, 70, 2, 70, 10, 400, 2, 8, 9, S_PAINR, S_DEATHR, @"a rhino",
"monster/rhino"}, @"monster/rhino"},
{GUN_SG, 14, 120, 1, 100, 300, 400, 4, 14, 14, S_PAINE, S_DEATHE, {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, {GUN_RIFLE, 15, 200, 1, 80, 300, 300, 4, 18, 18, S_PAINS, S_DEATHS,
"a slith", "monster/slith"}, @"a slith", @"monster/slith"},
{GUN_RL, 13, 500, 1, 0, 100, 200, 6, 24, 24, S_PAINB, S_DEATHB, "bauul", {GUN_RL, 13, 500, 1, 0, 100, 200, 6, 24, 24, S_PAINB, S_DEATHB, @"bauul",
"monster/bauul"}, @"monster/bauul"},
{GUN_BITE, 22, 50, 3, 0, 100, 400, 1, 12, 15, S_PAINP, S_PIGGR2, {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, {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, {GUN_SLIMEBALL, 15, 100, 1, 0, 200, 400, 2, 13, 10, S_PAIND, S_DEATHD,
"a goblin", "monster/goblin"}, @"a goblin", @"monster/goblin"},
}; };
dynent * dynent *
@ -54,7 +54,7 @@ basicmonster(int type, int yaw, int state, int trigger, int move)
if (type >= NUMMONSTERTYPES) { if (type >= NUMMONSTERTYPES) {
conoutf(@"warning: unknown monster in spawn: %d", type); conoutf(@"warning: unknown monster in spawn: %d", type);
type = 0; type = 0;
}; }
dynent *m = newdynent(); dynent *m = newdynent();
monstertype *t = &monstertypes[m->mtype = type]; monstertype *t = &monstertypes[m->mtype = type];
m->eyeheight = 2.0f; m->eyeheight = 2.0f;
@ -78,7 +78,9 @@ basicmonster(int type, int yaw, int state, int trigger, int move)
m->roll = 0; m->roll = 0;
m->state = CS_ALIVE; m->state = CS_ALIVE;
m->anger = 0; m->anger = 0;
strcpy_s(m->name, t->name); @autoreleasepool {
strcpy_s(m->name, t->name.UTF8String);
}
monsters.add(m); monsters.add(m);
return m; return m;
}; };
@ -406,4 +408,4 @@ monsterrender()
loopv(monsters) renderclient(monsters[i], false, loopv(monsters) renderclient(monsters[i], false,
monstertypes[monsters[i]->mtype].mdlname, monsters[i]->mtype == 5, monstertypes[monsters[i]->mtype].mdlname, monsters[i]->mtype == 5,
monstertypes[monsters[i]->mtype].mscale / 10.0f); monstertypes[monsters[i]->mtype].mscale / 10.0f);
}; }

View file

@ -1,18 +1,18 @@
// protos for ALL external functions in cube... // protos for ALL external functions in cube...
// command // 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); void (*fun)(), bool persist);
extern void setvar(char *name, int i); extern void setvar(OFString *name, int i);
extern int getvar(char *name); extern int getvar(OFString *name);
extern bool identexists(char *name); extern bool identexists(OFString *name);
extern bool addcommand(OFString *name, void (*fun)(), int narg); extern bool addcommand(OFString *name, void (*fun)(), int narg);
extern int execute(char *p, bool down = true); extern int execute(char *p, bool down = true);
extern void exec(char *cfgfile); extern void exec(OFString *cfgfile);
extern bool execfile(char *cfgfile); extern bool execfile(OFString *cfgfile);
extern void resetcomplete(); extern void resetcomplete();
extern void complete(char *s); 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 OFString *getalias(OFString *name);
extern void writecfg(); extern void writecfg();
@ -33,10 +33,10 @@ extern void menuset(int menu);
extern void menumanual(int m, int n, char *text); extern void menumanual(int m, int n, char *text);
extern void sortmenu(int start, int num); extern void sortmenu(int start, int num);
extern bool menukey(int code, bool isdown); extern bool menukey(int code, bool isdown);
extern void newmenu(char *name); extern void newmenu(OFString *name);
// serverbrowser // serverbrowser
extern void addserver(char *servername); extern void addserver(OFString *servername);
extern char *getservername(int n); extern char *getservername(int n);
extern void writeservercfg(); extern void writeservercfg();
@ -70,7 +70,7 @@ extern void setarraypointers();
// client // client
extern void localservertoclient(uchar *buf, int len); 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 disconnect(int onlyclean = 0, int async = 0);
extern void toserver(char *text); extern void toserver(char *text);
extern void addmsg(int rel, int num, int type, ...); extern void addmsg(int rel, int num, int type, ...);
@ -106,7 +106,7 @@ extern void fixplayer1range();
// clientextras // clientextras
extern void renderclients(); extern void renderclients();
extern void renderclient( 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); void showscores(bool on);
extern void renderscores(); extern void renderscores();
@ -121,7 +121,7 @@ extern void trigger(int tag, int type, bool savegame);
extern void resettagareas(); extern void resettagareas();
extern void settagareas(); extern void settagareas();
extern entity *newentity( 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 // worldlight
extern void calclight(); 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); extern void render_particles(int time);
// worldio // worldio
extern void save_world(const char *fname); extern void save_world(OFString *fname);
extern void load_world(char *mname); extern void load_world(char *mname);
extern void writemap(char *mname, int msize, uchar *mdata); extern void writemap(char *mname, int msize, uchar *mdata);
extern uchar *readmap(const char *mname, int *msize); extern uchar *readmap(const char *mname, int *msize);
@ -208,7 +208,7 @@ extern void initsound();
extern void cleansound(); extern void cleansound();
// rendermd2 // 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 x, float y, float z, float yaw, float pitch, bool teammate,
float scale, float speed, int snap = 0, int basetime = 0); float scale, float speed, int snap = 0, int basetime = 0);
extern mapmodelinfo *getmminfo(int i); extern mapmodelinfo *getmminfo(int i);

View file

@ -147,30 +147,30 @@ renderspheres(int time)
}; };
string closeent; string closeent;
char *entnames[] = { OFString *entnames[] = {
"none?", @"none?",
"light", @"light",
"playerstart", @"playerstart",
"shells", @"shells",
"bullets", @"bullets",
"rockets", @"rockets",
"riflerounds", @"riflerounds",
"health", @"health",
"healthboost", @"healthboost",
"greenarmour", @"greenarmour",
"yellowarmour", @"yellowarmour",
"quaddamage", @"quaddamage",
"teleport", @"teleport",
"teledest", @"teledest",
"mapmodel", @"mapmodel",
"monster", @"monster",
"trigger", @"trigger",
"jumppad", @"jumppad",
"?", @"?",
"?", @"?",
"?", @"?",
"?", @"?",
"?", @"?",
}; };
void void
@ -190,31 +190,38 @@ renderents() // show sparkly thingies for map entities in edit mode
int e = closestent(); int e = closestent();
if (e >= 0) { if (e >= 0) {
entity &c = ents[e]; entity &c = ents[e];
sprintf_s(closeent)("closest entity = %s (%d, %d, %d, %d), " @autoreleasepool {
sprintf_s(closeent)(
"closest entity = %s (%d, %d, %d, %d), "
"selection = (%d, %d)", "selection = (%d, %d)",
entnames[c.type], c.attr1, c.attr2, c.attr3, c.attr4, entnames[c.type].UTF8String, c.attr1, c.attr2,
getvar("selxs"), getvar("selys")); c.attr3, c.attr4, getvar(@"selxs"),
}; getvar(@"selys"));
}; }
}
}
void void
loadsky(char *basename) loadsky(OFString *basename)
{ {
static string lastsky = ""; @autoreleasepool {
if (strcmp(lastsky, basename) == 0) static OFString *lastsky = @"";
if ([lastsky isEqual:basename])
return; return;
char *side[] = {"ft", "bk", "lf", "rt", "dn", "up"}; char *side[] = {"ft", "bk", "lf", "rt", "dn", "up"};
int texnum = 14; int texnum = 14;
loopi(6) loopi(6)
{ {
sprintf_sd(name)("packages/%s_%s.jpg", basename, side[i]); sprintf_sd(name)(
"packages/%s_%s.jpg", basename.UTF8String, side[i]);
int xs, ys; int xs, ys;
if (!installtex(texnum + i, path(name), xs, ys, true)) if (!installtex(texnum + i, path(name), xs, ys, true))
conoutf(@"could not load sky textures"); conoutf(@"could not load sky textures");
}; }
strcpy_s(lastsky, basename); lastsky = basename;
}
} }
COMMAND(loadsky, ARG_1CSTR) COMMAND(loadsky, ARG_1STR)
float cursordepth = 0.9f; float cursordepth = 0.9f;
GLint viewport[4]; GLint viewport[4];

View file

@ -150,15 +150,17 @@ texturereset()
COMMAND(texturereset, ARG_NONE) COMMAND(texturereset, ARG_NONE)
void void
texture(char *aframe, char *name) texture(OFString *aframe, OFString *name)
{ {
int num = curtexnum++, frame = atoi(aframe); @autoreleasepool {
int num = curtexnum++, frame = (int)aframe.longLongValue;
if (num < 0 || num >= 256 || frame < 0 || frame >= MAXFRAMES) if (num < 0 || num >= 256 || frame < 0 || frame >= MAXFRAMES)
return; return;
mapping[num][frame] = 1; mapping[num][frame] = 1;
char *n = mapname[num][frame]; char *n = mapname[num][frame];
strcpy_s(n, name); strcpy_s(n, name.UTF8String);
path(n); path(n);
}
} }
COMMAND(texture, ARG_2STR) COMMAND(texture, ARG_2STR)
@ -302,8 +304,8 @@ VAR(fogcolour, 0, 0x8099B3, 0xFFFFFF);
VARP(hudgun, 0, 1, 1); VARP(hudgun, 0, 1, 1);
char *hudgunnames[] = {"hudguns/fist", "hudguns/shotg", "hudguns/chaing", OFString *hudgunnames[] = {@"hudguns/fist", @"hudguns/shotg", @"hudguns/chaing",
"hudguns/rocket", "hudguns/rifle"}; @"hudguns/rocket", @"hudguns/rifle"};
void void
drawhudmodel(int start, int end, float speed, int base) 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, rendermodel(hudgunnames[player1->gunselect], start, end, 0, 1.0f,
player1->o.x, player1->o.z, player1->o.y, player1->yaw + 90, player1->o.x, player1->o.z, player1->o.y, player1->yaw + 90,
player1->pitch, false, 1.0f, speed, 0, base); player1->pitch, false, 1.0f, speed, 0, base);
}; }
void void
drawhudgun(float fovy, float aspect, int farplane) drawhudgun(float fovy, float aspect, int farplane)

View file

@ -216,34 +216,37 @@ delayedload(md2 *m)
int xs, ys; int xs, ys;
installtex(FIRSTMDL + m->mdlnum, path(name2), xs, ys); installtex(FIRSTMDL + m->mdlnum, path(name2), xs, ys);
m->loaded = true; m->loaded = true;
}; }
}; }
int modelnum = 0; int modelnum = 0;
md2 * md2 *
loadmodel(char *name) loadmodel(OFString *name)
{ {
@autoreleasepool {
if (!mdllookup) if (!mdllookup)
mdllookup = new hashtable<md2 *>; mdllookup = new hashtable<md2 *>;
md2 **mm = mdllookup->access(name); md2 **mm = mdllookup->access(name.UTF8String);
if (mm) if (mm)
return *mm; return *mm;
md2 *m = new md2(); md2 *m = new md2();
m->mdlnum = modelnum++; m->mdlnum = modelnum++;
mapmodelinfo mmi = {2, 2, 0, 0, ""}; mapmodelinfo mmi = {2, 2, 0, 0, ""};
m->mmi = mmi; m->mmi = mmi;
m->loadname = newstring(name); m->loadname = newstring(name.UTF8String);
mdllookup->access(m->loadname, &m); mdllookup->access(m->loadname, &m);
return m; return m;
}; }
}
void 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); md2 *m = loadmodel(name);
mapmodelinfo mmi = { mapmodelinfo mmi = {(int)rad.longLongValue, (int)h.longLongValue,
atoi(rad), atoi(h), atoi(zoff), atoi(snap), m->loadname}; (int)zoff.longLongValue, (int)snap.longLongValue, m->loadname};
m->mmi = mmi; m->mmi = mmi;
mapmodels.add(m); mapmodels.add(m);
} }
@ -263,7 +266,7 @@ getmminfo(int i)
} }
void 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 y, float z, float yaw, float pitch, bool teammate, float scale,
float speed, int snap, int basetime) float speed, int snap, int basetime)
{ {

View file

@ -119,18 +119,20 @@ savestate(char *fn)
} }
void void
savegame(char *name) savegame(OFString *name)
{ {
@autoreleasepool {
if (!m_classicsp) { if (!m_classicsp) {
conoutf(@"can only save classic sp games"); conoutf(@"can only save classic sp games");
return; return;
} }
sprintf_sd(fn)("savegames/%s.csgz", name); sprintf_sd(fn)("savegames/%s.csgz", name.UTF8String);
savestate(fn); savestate(fn);
stop(); stop();
conoutf(@"wrote %s", fn); conoutf(@"wrote %s", fn);
}
} }
COMMAND(savegame, ARG_1CSTR) COMMAND(savegame, ARG_1STR)
void void
loadstate(char *fn) loadstate(char *fn)
@ -157,9 +159,9 @@ loadstate(char *fn)
gzread(f, mapname, _MAXDEFSTR); gzread(f, mapname, _MAXDEFSTR);
nextmode = gzgeti(); nextmode = gzgeti();
@autoreleasepool { @autoreleasepool {
changemap( // continue below once map has been loaded and client & server
@(mapname)); // continue below once map has been loaded and // have updated
// client & server have updated changemap(@(mapname));
} }
return; return;
out: out:
@ -169,12 +171,14 @@ out:
} }
void void
loadgame(char *name) loadgame(OFString *name)
{ {
sprintf_sd(fn)("savegames/%s.csgz", name); @autoreleasepool {
sprintf_sd(fn)("savegames/%s.csgz", name.UTF8String);
loadstate(fn); loadstate(fn);
}
} }
COMMAND(loadgame, ARG_1CSTR) COMMAND(loadgame, ARG_1STR)
void void
loadgameout() loadgameout()
@ -243,24 +247,26 @@ int ddamage, bdamage;
vec dorig; vec dorig;
void void
record(char *name) record(OFString *name)
{ {
@autoreleasepool {
if (m_sp) { if (m_sp) {
conoutf(@"cannot record singleplayer games"); conoutf(@"cannot record singleplayer games");
return; return;
}; }
int cn = getclientnum(); int cn = getclientnum();
if (cn < 0) if (cn < 0)
return; return;
sprintf_sd(fn)("demos/%s.cdgz", name); sprintf_sd(fn)("demos/%s.cdgz", name.UTF8String);
savestate(fn); savestate(fn);
gzputi(cn); gzputi(cn);
conoutf(@"started recording demo to %s", fn); conoutf(@"started recording demo to %s", fn);
demorecording = true; demorecording = true;
starttime = lastmillis; starttime = lastmillis;
ddamage = bdamage = 0; ddamage = bdamage = 0;
}
} }
COMMAND(record, ARG_1CSTR) COMMAND(record, ARG_1STR)
void void
demodamage(int damage, vec &o) demodamage(int damage, vec &o)
@ -306,13 +312,15 @@ incomingdemodata(uchar *buf, int len, bool extras)
} }
void void
demo(char *name) demo(OFString *name)
{ {
sprintf_sd(fn)("demos/%s.cdgz", name); @autoreleasepool {
sprintf_sd(fn)("demos/%s.cdgz", name.UTF8String);
loadstate(fn); loadstate(fn);
demoloading = true; demoloading = true;
}
} }
COMMAND(demo, ARG_1CSTR) COMMAND(demo, ARG_1STR)
void void
stopreset() stopreset()

View file

@ -147,12 +147,15 @@ char *
getservername(int n) getservername(int n)
{ {
return servers[n].name; return servers[n].name;
}; }
void void
addserver(char *servername) addserver(OFString *servername_)
{ {
loopv(servers) if (strcmp(servers[i].name, servername) == 0) return; @autoreleasepool {
const char *servername = servername_.UTF8String;
loopv(servers) if (strcmp(servers[i].name, servername) ==
0) return;
serverinfo &si = servers.insert(0, serverinfo()); serverinfo &si = servers.insert(0, serverinfo());
strcpy_s(si.name, servername); strcpy_s(si.name, servername);
si.full[0] = 0; si.full[0] = 0;
@ -165,7 +168,8 @@ addserver(char *servername)
si.sdesc[0] = 0; si.sdesc[0] = 0;
si.address.host = ENET_HOST_ANY; si.address.host = ENET_HOST_ANY;
si.address.port = CUBE_SERVINFO_PORT; si.address.port = CUBE_SERVINFO_PORT;
}; }
}
void void
pingservers() pingservers()
@ -314,7 +318,7 @@ updatefrommaster()
servermenu(); servermenu();
} }
COMMAND(addserver, ARG_1CSTR) COMMAND(addserver, ARG_1STR)
COMMAND(servermenu, ARG_NONE) COMMAND(servermenu, ARG_NONE)
COMMAND(updatefrommaster, ARG_NONE) COMMAND(updatefrommaster, ARG_NONE)
@ -327,4 +331,4 @@ writeservercfg()
fprintf(f, "// servers connected to are added here automatically\n\n"); fprintf(f, "// servers connected to are added here automatically\n\n");
loopvrev(servers) fprintf(f, "addserver %s\n", servers[i].name); loopvrev(servers) fprintf(f, "addserver %s\n", servers[i].name);
fclose(f); fclose(f);
}; }

View file

@ -74,45 +74,47 @@ initsound()
if (!FSOUND_Init(SOUNDFREQ, MAXCHAN, FSOUND_INIT_GLOBALFOCUS)) { if (!FSOUND_Init(SOUNDFREQ, MAXCHAN, FSOUND_INIT_GLOBALFOCUS)) {
conoutf(@"sound init failed (FMOD): %d", FSOUND_GetError()); conoutf(@"sound init failed (FMOD): %d", FSOUND_GetError());
nosound = true; nosound = true;
}; }
#endif #endif
}; }
void void
music(char *name) music(OFString *name)
{ {
if (nosound) if (nosound)
return; return;
stopsound(); stopsound();
if (soundvol && musicvol) { if (soundvol && musicvol) {
@autoreleasepool {
string sn; string sn;
strcpy_s(sn, "packages/"); strcpy_s(sn, "packages/");
strcat_s(sn, name); strcat_s(sn, name.UTF8String);
#ifdef USE_MIXER #ifdef USE_MIXER
if (mod = Mix_LoadMUS(path(sn))) { if (mod = Mix_LoadMUS(path(sn))) {
Mix_PlayMusic(mod, -1); Mix_PlayMusic(mod, -1);
Mix_VolumeMusic((musicvol * MAXVOL) / 255); Mix_VolumeMusic((musicvol * MAXVOL) / 255);
}; }
#else #else
if (mod = FMUSIC_LoadSong(path(sn))) { if (mod = FMUSIC_LoadSong(path(sn))) {
FMUSIC_PlaySong(mod); FMUSIC_PlaySong(mod);
FMUSIC_SetMasterVolume(mod, musicvol); FMUSIC_SetMasterVolume(mod, musicvol);
} else if (stream = FSOUND_Stream_Open( } else if (stream = FSOUND_Stream_Open(
path(sn), FSOUND_LOOP_NORMAL, 0, 0)) { path(sn), FSOUND_LOOP_NORMAL, 0, 0)) {
int chan = FSOUND_Stream_Play(FSOUND_FREE, stream); int chan =
FSOUND_Stream_Play(FSOUND_FREE, stream);
if (chan >= 0) { if (chan >= 0) {
FSOUND_SetVolume( FSOUND_SetVolume(
chan, (musicvol * MAXVOL) / 255); chan, (musicvol * MAXVOL) / 255);
FSOUND_SetPaused(chan, false); FSOUND_SetPaused(chan, false);
}; }
} else { } else {
conoutf(@"could not play music: %s", sn); conoutf(@"could not play music: %s", sn);
}; }
#endif #endif
}; }
}
} }
COMMAND(music, ARG_1STR)
COMMAND(music, ARG_1CSTR)
#ifdef USE_MIXER #ifdef USE_MIXER
vector<Mix_Chunk *> samples; vector<Mix_Chunk *> samples;
@ -129,8 +131,7 @@ registersound(char *name)
snames.add(newstring(name)); snames.add(newstring(name));
samples.add(NULL); samples.add(NULL);
return samples.length() - 1; return samples.length() - 1;
}; }
COMMAND(registersound, ARG_1EST) COMMAND(registersound, ARG_1EST)
void void
@ -161,10 +162,9 @@ updatechanvol(int chan, vec *loc)
player1->yaw * player1->yaw *
(PI / 180.0f); // relative angle of (PI / 180.0f); // relative angle of
// sound along X-Y axis // sound along X-Y axis
pan = int( pan = int(255.9f * (0.5 * sin(yaw) +
255.9f * 0.5f)); // range is from 0 (left)
(0.5 * sin(yaw) + // to 255 (right)
0.5f)); // range is from 0 (left) to 255 (right)
}; };
}; };
vol = (vol * MAXVOL) / 255; vol = (vol * MAXVOL) / 255;
@ -225,8 +225,8 @@ playsound(int n, vec *loc)
soundsatonce = 1; soundsatonce = 1;
lastsoundmillis = lastmillis; lastsoundmillis = lastmillis;
if (soundsatonce > 5) if (soundsatonce > 5)
return; // avoid bursts of sounds with heavy packetloss and in return; // avoid bursts of sounds with heavy packetloss
// sp // and in sp
if (n < 0 || n >= samples.length()) { if (n < 0 || n >= samples.length()) {
conoutf(@"unregistered sound: %d", n); conoutf(@"unregistered sound: %d", n);
return; return;

View file

@ -320,7 +320,7 @@ template <class T> struct vector {
template <class T> struct hashtable { template <class T> struct hashtable {
struct chain { struct chain {
chain *next; chain *next;
char *key; const char *key;
T data; T data;
}; };
@ -344,14 +344,15 @@ template <class T> struct hashtable {
void operator=(hashtable<T> &v); void operator=(hashtable<T> &v);
T * T *
access(char *key, T *data = NULL) access(const char *key, T *data = NULL)
{ {
unsigned int h = 5381; unsigned int h = 5381;
for (int i = 0, k; k = key[i]; i++) for (int i = 0, k; k = key[i]; i++)
h = ((h << 5) + h) ^ k; // bernstein k=33 xor h = ((h << 5) + h) ^ k; // bernstein k=33 xor
h = h & (size - 1); // primes not much of an advantage h = h & (size - 1); // primes not much of an advantage
for (chain *c = table[h]; c; c = c->next) { 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++;) (ch = *p1++) == *p2++;)
if (!ch) // if(strcmp(key,c->key)==0) if (!ch) // if(strcmp(key,c->key)==0)
{ {
@ -359,8 +360,8 @@ template <class T> struct hashtable {
if (data) if (data)
c->data = *data; c->data = *data;
return d; return d;
}; }
}; }
if (data) { if (data) {
chain *c = (chain *)parent->alloc(sizeof(chain)); chain *c = (chain *)parent->alloc(sizeof(chain));
c->data = *data; c->data = *data;
@ -368,9 +369,9 @@ template <class T> struct hashtable {
c->next = table[h]; c->next = table[h];
table[h] = c; table[h] = c;
numelems++; numelems++;
}; }
return NULL; return NULL;
}; }
}; };
#define enumerate(ht, t, e, b) \ #define enumerate(ht, t, e, b) \

View file

@ -60,10 +60,13 @@ reloadtime(int gun)
}; };
void 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, @autoreleasepool {
a3[0] ? atoi(a3) : -1); 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) COMMAND(weapon, ARG_3STR)

View file

@ -2,7 +2,9 @@
#include "cube.h" #include "cube.h"
extern char *entnames[]; // lookup from map entities above to strings #include <memory>
extern OFString *entnames[]; // lookup from map entities above to strings
sqr *world = NULL; sqr *world = NULL;
int sfactor, ssize, cubicsize, mipsize; int sfactor, ssize, cubicsize, mipsize;
@ -58,12 +60,22 @@ trigger(int tag, int type, bool savegame)
{ {
if (!tag) if (!tag)
return; return;
settag(tag, type); settag(tag, type);
if (!savegame && type != 3) if (!savegame && type != 3)
playsound(S_RUMBLE); playsound(S_RUMBLE);
sprintf_sd(aliasname)("level_trigger_%d", tag);
if (identexists(aliasname)) @autoreleasepool {
execute(aliasname); OFString *aliasname =
[OFString stringWithFormat:@"level_trigger_%d", tag];
if (identexists(aliasname)) {
std::unique_ptr<char> cmd(strdup(aliasname.UTF8String));
execute(cmd.get());
}
}
if (type == 2) if (type == 2)
endsp(false); endsp(false);
} }
@ -80,7 +92,7 @@ remip(block &b, int level)
{ {
if (level >= SMALLEST_FACTOR) if (level >= SMALLEST_FACTOR)
return; return;
int lighterr = getvar("lighterror") * 3; int lighterr = getvar(@"lighterror") * 3;
sqr *w = wmip[level]; sqr *w = wmip[level];
sqr *v = wmip[level + 1]; sqr *v = wmip[level + 1];
int ws = ssize >> level; int ws = ssize >> level;
@ -296,23 +308,27 @@ delent()
return; return;
}; };
int t = ents[e].type; int t = ents[e].type;
conoutf(@"%s entity deleted", entnames[t]); @autoreleasepool {
conoutf(@"%s entity deleted", entnames[t].UTF8String);
}
ents[e].type = NOTUSED; ents[e].type = NOTUSED;
addmsg(1, 10, SV_EDITENT, e, NOTUSED, 0, 0, 0, 0, 0, 0, 0); addmsg(1, 10, SV_EDITENT, e, NOTUSED, 0, 0, 0, 0, 0, 0, 0);
if (t == LIGHT) if (t == LIGHT)
calclight(); calclight();
}; }
int int
findtype(char *what) findtype(OFString *what)
{ {
loopi(MAXENTTYPES) if (strcmp(what, entnames[i]) == 0) return i; @autoreleasepool {
conoutf(@"unknown entity type \"%s\"", what); loopi(MAXENTTYPES) if ([what isEqual:entnames[i]]) return i;
conoutf(@"unknown entity type \"%s\"", what.UTF8String);
return NOTUSED; return NOTUSED;
}
} }
entity * 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); int type = findtype(what);
persistent_entity e = {(short)x, (short)y, (short)z, (short)v1, 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 void
clearents(char *name) clearents(OFString *name)
{ {
int type = findtype(name); int type = findtype(name);
if (noteditmode() || multiplayer()) if (noteditmode() || multiplayer())
@ -360,7 +376,7 @@ clearents(char *name)
if (type == LIGHT) if (type == LIGHT)
calclight(); calclight();
} }
COMMAND(clearents, ARG_1CSTR) COMMAND(clearents, ARG_1STR)
void void
scalecomp(uchar &c, int intens) scalecomp(uchar &c, int intens)

View file

@ -7,7 +7,7 @@ backup(char *name, char *backupname)
{ {
remove(backupname); remove(backupname);
rename(name, backupname); rename(name, backupname);
}; }
string cgzname, bakname, pcfname, mcfname; string cgzname, bakname, pcfname, mcfname;
@ -43,7 +43,7 @@ inline bool
nhf(sqr *s) nhf(sqr *s)
{ {
return s->type != FHF && s->type != CHF; return s->type != FHF && s->type != CHF;
}; }
void void
voptimize() // reset vdeltas on non-hf cubes voptimize() // reset vdeltas on non-hf cubes
@ -57,8 +57,8 @@ voptimize() // reset vdeltas on non-hf cubes
s->vdelta = 0; s->vdelta = 0;
} else } else
s->vdelta = 0; s->vdelta = 0;
}; }
}; }
void void
topt(sqr *s, bool &wf, bool &uf, int &wt, int &ut) 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; wt = s->wtex;
ut = s->utex; ut = s->utex;
return; return;
}; }
} else { } else {
loopi(4) if (!SOLID(o[i])) loopi(4) if (!SOLID(o[i]))
{ {
if (o[i]->floor < s->floor) { if (o[i]->floor < s->floor) {
wt = s->wtex; wt = s->wtex;
wf = false; wf = false;
}; }
if (o[i]->ceil > s->ceil) { if (o[i]->ceil > s->ceil) {
ut = s->utex; ut = s->utex;
uf = false; uf = false;
}; }
}; }
}; }
}; }
void void
toptimize() // FIXME: only does 2x2, make atleast for 4x4 also toptimize() // FIXME: only does 2x2, make atleast for 4x4 also
{ {
bool wf[4], uf[4]; bool wf[4], uf[4];
sqr *s[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) { for (int y = 2; y < ssize - 4; y += 2) {
s[0] = S(x, y); s[0] = S(x, y);
int wt = s[0]->wtex, ut = s[0]->utex; 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; s[i]->wtex = wt;
if (uf[i]) if (uf[i])
s[i]->utex = ut; s[i]->utex = ut;
}; }
}; }
}; }
}
// these two are used by getmap/sendmap.. transfers compressed maps directly // these two are used by getmap/sendmap.. transfers compressed maps directly
@ -130,7 +131,7 @@ writemap(char *mname, int msize, uchar *mdata)
if (!f) { if (!f) {
conoutf(@"could not write map to %s", cgzname); conoutf(@"could not write map to %s", cgzname);
return; return;
}; }
fwrite(mdata, 1, msize, f); fwrite(mdata, 1, msize, f);
fclose(f); fclose(f);
conoutf(@"wrote map %s as file %s", mname, cgzname); conoutf(@"wrote map %s as file %s", mname, cgzname);
@ -144,7 +145,7 @@ readmap(const char *mname, int *msize)
if (!mdata) { if (!mdata) {
conoutf(@"could not read map %s", cgzname); conoutf(@"could not read map %s", cgzname);
return NULL; return NULL;
}; }
return mdata; return mdata;
} }
@ -154,22 +155,22 @@ readmap(const char *mname, int *msize)
// miniscule map sizes. // miniscule map sizes.
void void
save_world(const char *mname) save_world(OFString *mname)
{ {
@autoreleasepool { @autoreleasepool {
resettagareas(); // wouldn't be able to reproduce tagged areas resettagareas(); // wouldn't be able to reproduce tagged areas
// otherwise // otherwise
voptimize(); voptimize();
toptimize(); toptimize();
if (!*mname) if (mname.length == 0)
mname = getclientmap().UTF8String; mname = getclientmap();
setnames(mname); setnames(mname.UTF8String);
backup(cgzname, bakname); backup(cgzname, bakname);
gzFile f = gzopen(cgzname, "wb9"); gzFile f = gzopen(cgzname, "wb9");
if (!f) { if (!f) {
conoutf(@"could not write map to %s", cgzname); conoutf(@"could not write map to %s", cgzname);
return; return;
}; }
hdr.version = MAPVERSION; hdr.version = MAPVERSION;
hdr.numents = 0; hdr.numents = 0;
loopv(ents) if (ents[i].type != NOTUSED) hdr.numents++; loopv(ents) if (ents[i].type != NOTUSED) hdr.numents++;
@ -183,8 +184,8 @@ save_world(const char *mname)
entity tmp = ents[i]; entity tmp = ents[i];
endianswap(&tmp, sizeof(short), 4); endianswap(&tmp, sizeof(short), 4);
gzwrite(f, &tmp, sizeof(persistent_entity)); gzwrite(f, &tmp, sizeof(persistent_entity));
}; }
}; }
sqr *t = NULL; sqr *t = NULL;
int sc = 0; int sc = 0;
#define spurge \ #define spurge \
@ -197,7 +198,7 @@ save_world(const char *mname)
gzputc(f, sc); \ gzputc(f, sc); \
sc = 0; \ sc = 0; \
} \ } \
}; }
loopk(cubicsize) loopk(cubicsize)
{ {
sqr *s = &world[k]; sqr *s = &world[k];
@ -216,7 +217,7 @@ save_world(const char *mname)
gzputc(f, s->type); gzputc(f, s->type);
gzputc(f, s->wtex); gzputc(f, s->wtex);
gzputc(f, s->vdelta); gzputc(f, s->vdelta);
}; }
} else { } else {
if (t && c(type) && c(floor) && c(ceil) && if (t && c(type) && c(floor) && c(ceil) &&
c(ctex) && c(ftex) && c(utex) && c(wtex) && c(ctex) && c(ftex) && c(utex) && c(wtex) &&
@ -233,16 +234,17 @@ save_world(const char *mname)
gzputc(f, s->vdelta); gzputc(f, s->vdelta);
gzputc(f, s->utex); gzputc(f, s->utex);
gzputc(f, s->tag); gzputc(f, s->tag);
}; }
}; }
t = s; t = s;
}; }
spurge; spurge;
gzclose(f); gzclose(f);
conoutf(@"wrote map file %s", cgzname); conoutf(@"wrote map file %s", cgzname);
settagareas(); settagareas();
} }
} }
COMMANDN(savemap, save_world, ARG_1STR)
void void
load_world(char *mname) // still supports all map formats that have existed 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) { if (!f) {
conoutf(@"could not read map %s", cgzname); conoutf(@"could not read map %s", cgzname);
return; return;
}; }
gzread(f, &hdr, sizeof(header) - sizeof(int) * 16); gzread(f, &hdr, sizeof(header) - sizeof(int) * 16);
endianswap(&hdr.version, sizeof(int), 4); endianswap(&hdr.version, sizeof(int), 4);
if (strncmp(hdr.head, "CUBE", 4) != 0) 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); endianswap(&hdr.waterlevel, sizeof(int), 16);
} else { } else {
hdr.waterlevel = -100000; hdr.waterlevel = -100000;
}; }
ents.setsize(0); ents.setsize(0);
loopi(hdr.numents) 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 e.attr2 = 255; // needed for MAPVERSION<=2
if (e.attr1 > 32) if (e.attr1 > 32)
e.attr1 = 32; // 12_03 and below e.attr1 = 32; // 12_03 and below
}; }
}; }
free(world); free(world);
setupworld(hdr.sfactor); setupworld(hdr.sfactor);
char texuse[256]; 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)); memcpy(&world[k], t, sizeof(sqr));
k--; k--;
break; break;
}; }
case 254: // only in MAPVERSION<=2 case 254: // only in MAPVERSION<=2
{ {
memcpy(s, t, sizeof(sqr)); memcpy(s, t, sizeof(sqr));
s->r = s->g = s->b = gzgetc(f); s->r = s->g = s->b = gzgetc(f);
gzgetc(f); gzgetc(f);
break; break;
}; }
case SOLID: { case SOLID: {
s->type = SOLID; s->type = SOLID;
s->wtex = gzgetc(f); s->wtex = gzgetc(f);
@ -316,7 +318,7 @@ load_world(char *mname) // still supports all map formats that have existed
if (hdr.version <= 2) { if (hdr.version <= 2) {
gzgetc(f); gzgetc(f);
gzgetc(f); gzgetc(f);
}; }
s->ftex = DEFAULT_FLOOR; s->ftex = DEFAULT_FLOOR;
s->ctex = DEFAULT_CEIL; s->ctex = DEFAULT_CEIL;
s->utex = s->wtex; s->utex = s->wtex;
@ -324,13 +326,13 @@ load_world(char *mname) // still supports all map formats that have existed
s->floor = 0; s->floor = 0;
s->ceil = 16; s->ceil = 16;
break; break;
}; }
default: { default: {
if (type < 0 || type >= MAXTYPE) { if (type < 0 || type >= MAXTYPE) {
sprintf_sd(t)("%d @ %d", type, k); sprintf_sd(t)("%d @ %d", type, k);
fatal("while reading map: type out of range: ", fatal("while reading map: type out of range: ",
t); t);
}; }
s->type = type; s->type = type;
s->floor = gzgetc(f); s->floor = gzgetc(f);
s->ceil = 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) { if (hdr.version <= 2) {
gzgetc(f); gzgetc(f);
gzgetc(f); gzgetc(f);
}; }
s->vdelta = gzgetc(f); s->vdelta = gzgetc(f);
s->utex = (hdr.version >= 2) ? gzgetc(f) : s->wtex; s->utex = (hdr.version >= 2) ? gzgetc(f) : s->wtex;
s->tag = (hdr.version >= 5) ? gzgetc(f) : 0; s->tag = (hdr.version >= 5) ? gzgetc(f) : 0;
s->type = type; s->type = type;
}; }
}; }
s->defer = 0; s->defer = 0;
t = s; t = s;
texuse[s->wtex] = 1; texuse[s->wtex] = 1;
if (!SOLID(s)) if (!SOLID(s))
texuse[s->utex] = texuse[s->ftex] = texuse[s->ctex] = 1; texuse[s->utex] = texuse[s->ftex] = texuse[s->ctex] = 1;
}; }
gzclose(f); gzclose(f);
calclight(); calclight();
settagareas(); settagareas();
@ -366,14 +368,17 @@ load_world(char *mname) // still supports all map formats that have existed
startmap(mname); startmap(mname);
loopl(256) loopl(256)
{ {
sprintf_sd(aliasname)( @autoreleasepool {
"level_trigger_%d", l); // can this be done smarter? // can this be done smarter?
OFString *aliasname =
[OFString stringWithFormat:@"level_trigger_%d", l];
if (identexists(aliasname)) if (identexists(aliasname))
alias(aliasname, ""); alias(aliasname, @"");
}; }
execfile("data/default_map_settings.cfg"); }
execfile(pcfname); execfile(@"data/default_map_settings.cfg");
execfile(mcfname); @autoreleasepool {
execfile(@(pcfname));
execfile(@(mcfname));
}
} }
COMMANDN(savemap, save_world, ARG_1CSTR)

View file

@ -171,19 +171,19 @@ calclight()
{ {
sqr *s = S(x, y); sqr *s = S(x, y);
s->r = s->g = s->b = 10; s->r = s->g = s->b = 10;
}; }
loopv(ents) loopv(ents)
{ {
entity &e = ents[i]; entity &e = ents[i];
if (e.type == LIGHT) if (e.type == LIGHT)
calclightsource(e); calclightsource(e);
}; }
block b = {1, 1, ssize - 2, ssize - 2}; block b = {1, 1, ssize - 2, ssize - 2};
postlightarea(b); postlightarea(b);
setvar("fullbright", 0); setvar(@"fullbright", 0);
}; }
VARP(dynlight, 0, 16, 32); VARP(dynlight, 0, 16, 32);
@ -196,8 +196,8 @@ cleardlights()
block *backup = dlights.pop(); block *backup = dlights.pop();
blockpaste(*backup); blockpaste(*backup);
free(backup); free(backup);
}; }
}; }
void void
dodynlight(vec &vold, vec &v, int reach, int strength, dynent *owner) 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}; LIGHT, (uchar)strength, 0, 0};
calclightsource(l); calclightsource(l);
postlightarea(b); postlightarea(b);
}; }
// utility functions also used by editing code // 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++) for (int y = s.y; y < s.ys + s.y; y++)
*q++ = *S(x, y); *q++ = *S(x, y);
return b; return b;
}; }
void void
blockpaste(block &b) blockpaste(block &b)
@ -254,4 +254,4 @@ blockpaste(block &b)
for (int y = b.y; y < b.ys + b.y; y++) for (int y = b.y; y < b.ys + b.y; y++)
*S(x, y) = *q++; *S(x, y) = *q++;
remipmore(b); remipmore(b);
}; }

View file

@ -24,10 +24,10 @@ computeraytable(float vx, float vy)
if (!ocull) if (!ocull)
return; return;
odist = getvar("fog") * 1.5f; odist = getvar(@"fog") * 1.5f;
float apitch = (float)fabs(player1->pitch); 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 byaw = (player1->yaw - 90 + af) / 360 * PI2;
float syaw = (player1->yaw - 90 - af) / 360 * PI2; float syaw = (player1->yaw - 90 - af) / 360 * PI2;