Migrate more strings
FossilOrigin-Name: e7b5d33cada1ff8db653655ab2c77ead76ab7625a5d2f793b9aee3ec21e3778b
This commit is contained in:
parent
b00de734e8
commit
2860953c0b
24 changed files with 692 additions and 556 deletions
20
src/Cube.mm
20
src/Cube.mm
|
@ -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();
|
||||||
|
|
|
@ -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_1CSTR)
|
COMMANDN(team, newteam, ARG_1STR)
|
||||||
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);
|
||||||
|
|
||||||
|
@ -104,6 +109,7 @@ connects(char *servername)
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
disconnect(int onlyclean, int async)
|
disconnect(int onlyclean, int async)
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
215
src/command.mm
215
src/command.mm
|
@ -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,10 +554,11 @@ 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;
|
||||||
|
@ -552,12 +566,16 @@ execfile(char *cfgfile)
|
||||||
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
|
void
|
||||||
ifthen(char *cond, char *thenp, char *elsep)
|
ifthen(OFString *cond, OFString *thenp, OFString *elsep)
|
||||||
{
|
{
|
||||||
execute(cond[0] != '0' ? thenp : elsep);
|
@autoreleasepool {
|
||||||
|
std::unique_ptr<char> cmd(strdup(
|
||||||
|
(cond.UTF8String[0] != '0' ? thenp : elsep).UTF8String));
|
||||||
|
|
||||||
|
execute(cmd.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
loopa(char *times, char *body)
|
loopa(OFString *times, OFString *body_)
|
||||||
{
|
{
|
||||||
int t = atoi(times);
|
@autoreleasepool {
|
||||||
|
int t = (int)times.longLongValue;
|
||||||
|
std::unique_ptr<char> body(strdup(body_.UTF8String));
|
||||||
|
|
||||||
loopi(t)
|
loopi(t)
|
||||||
{
|
{
|
||||||
intset("i", i);
|
intset(@"i", i);
|
||||||
execute(body);
|
execute(body.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
whilea(char *cond, char *body)
|
whilea(OFString *cond_, OFString *body_)
|
||||||
{
|
{
|
||||||
while (execute(cond))
|
@autoreleasepool {
|
||||||
execute(body);
|
std::unique_ptr<char> cond(strdup(cond_.UTF8String));
|
||||||
} // can't get any simpler than this :)
|
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)
|
||||||
|
|
|
@ -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(saycommand, ARG_VARI)
|
COMMAND(mapmsg, ARG_1STR)
|
||||||
COMMAND(mapmsg, ARG_1CSTR)
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
# include <SDL_syswm.h>
|
# include <SDL_syswm.h>
|
||||||
|
|
17
src/cube.h
17
src/cube.h
|
@ -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; }
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
44
src/menus.mm
44
src/menus.mm
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
};
|
}
|
||||||
|
|
28
src/protos.h
28
src/protos.h
|
@ -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);
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
COMMAND(loadsky, ARG_1CSTR)
|
lastsky = basename;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
COMMAND(loadsky, ARG_1STR)
|
||||||
|
|
||||||
float cursordepth = 0.9f;
|
float cursordepth = 0.9f;
|
||||||
GLint viewport[4];
|
GLint viewport[4];
|
||||||
|
|
|
@ -150,16 +150,18 @@ 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)
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,16 +247,17 @@ 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);
|
||||||
|
@ -260,7 +265,8 @@ record(char *name)
|
||||||
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()
|
||||||
|
|
|
@ -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);
|
||||||
};
|
}
|
||||||
|
|
40
src/sound.mm
40
src/sound.mm
|
@ -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_1CSTR)
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
COMMAND(music, ARG_1STR)
|
||||||
|
|
||||||
#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;
|
||||||
|
|
15
src/tools.h
15
src/tools.h
|
@ -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) \
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
42
src/world.mm
42
src/world.mm
|
@ -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)
|
||||||
|
|
105
src/worldio.mm
105
src/worldio.mm
|
@ -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)
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue