Use one autorelease pool per frame
This way, nowhere else autorelease pools need to be managed. FossilOrigin-Name: 489124a92fd2a7e6d543b58ce50e454f2cb1647c81b4ba637d6c252404012ddd
This commit is contained in:
parent
a67b134eb2
commit
875c395ce1
22 changed files with 1262 additions and 1443 deletions
97
src/Cube.mm
97
src/Cube.mm
|
@ -21,6 +21,7 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(OFNotification *)notification
|
- (void)applicationDidFinishLaunching:(OFNotification *)notification
|
||||||
{
|
{
|
||||||
|
@autoreleasepool {
|
||||||
bool dedicated, windowed;
|
bool dedicated, windowed;
|
||||||
int par = 0, uprate = 0, maxcl = 4;
|
int par = 0, uprate = 0, maxcl = 4;
|
||||||
OFString *__autoreleasing sdesc, *__autoreleasing ip;
|
OFString *__autoreleasing sdesc, *__autoreleasing ip;
|
||||||
|
@ -31,8 +32,8 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
#define log(s) conoutf(@"init: %@", s)
|
#define log(s) conoutf(@"init: %@", s)
|
||||||
log(@"sdl");
|
log(@"sdl");
|
||||||
|
|
||||||
const OFOptionsParserOption options[] = { { 'd', @"dedicated", 0,
|
const OFOptionsParserOption options[] = {
|
||||||
&dedicated, NULL },
|
{ 'd', @"dedicated", 0, &dedicated, NULL },
|
||||||
{ 't', @"window", 0, &windowed, NULL },
|
{ 't', @"window", 0, &windowed, NULL },
|
||||||
{ 'w', @"width", 1, NULL, NULL },
|
{ 'w', @"width", 1, NULL, NULL },
|
||||||
{ 'h', @"height", 1, NULL, NULL },
|
{ 'h', @"height", 1, NULL, NULL },
|
||||||
|
@ -42,7 +43,8 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
{ 'm', @"master", 1, NULL, &master },
|
{ 'm', @"master", 1, NULL, &master },
|
||||||
{ 'p', @"password", 1, NULL, &passwd },
|
{ 'p', @"password", 1, NULL, &passwd },
|
||||||
{ 'c', @"max-clients", 1, NULL, NULL },
|
{ 'c', @"max-clients", 1, NULL, NULL },
|
||||||
{ '\0', nil, 0, NULL, NULL } };
|
{ '\0', nil, 0, NULL, NULL }
|
||||||
|
};
|
||||||
OFOptionsParser *optionsParser =
|
OFOptionsParser *optionsParser =
|
||||||
[OFOptionsParser parserWithOptions:options];
|
[OFOptionsParser parserWithOptions:options];
|
||||||
OFUnichar option;
|
OFUnichar option;
|
||||||
|
@ -75,16 +77,18 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
if (passwd == nil)
|
if (passwd == nil)
|
||||||
passwd = @"";
|
passwd = @"";
|
||||||
|
|
||||||
_gameDataIRI = [OFFileManager.defaultManager currentDirectoryIRI];
|
_gameDataIRI =
|
||||||
_userDataIRI = [OFFileManager.defaultManager currentDirectoryIRI];
|
[OFFileManager.defaultManager currentDirectoryIRI];
|
||||||
|
_userDataIRI =
|
||||||
|
[OFFileManager.defaultManager currentDirectoryIRI];
|
||||||
|
|
||||||
[OFFileManager.defaultManager
|
[OFFileManager.defaultManager
|
||||||
createDirectoryAtIRI:[_userDataIRI
|
createDirectoryAtIRI:
|
||||||
IRIByAppendingPathComponent:@"demos"]
|
[_userDataIRI IRIByAppendingPathComponent:@"demos"]
|
||||||
createParents:true];
|
createParents:true];
|
||||||
[OFFileManager.defaultManager
|
[OFFileManager.defaultManager
|
||||||
createDirectoryAtIRI:[_userDataIRI
|
createDirectoryAtIRI:
|
||||||
IRIByAppendingPathComponent:@"savegames"]
|
[_userDataIRI IRIByAppendingPathComponent:@"savegames"]
|
||||||
createParents:true];
|
createParents:true];
|
||||||
|
|
||||||
if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | par) < 0)
|
if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | par) < 0)
|
||||||
|
@ -121,10 +125,12 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
|
|
||||||
log(@"video: mode");
|
log(@"video: mode");
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
if ((_window = SDL_CreateWindow("cube engine", SDL_WINDOWPOS_UNDEFINED,
|
if ((_window = SDL_CreateWindow("cube engine",
|
||||||
SDL_WINDOWPOS_UNDEFINED, _width, _height,
|
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||||
|
_width, _height,
|
||||||
SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL |
|
SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL |
|
||||||
(!windowed ? SDL_WINDOW_FULLSCREEN : 0))) == NULL ||
|
(!windowed ? SDL_WINDOW_FULLSCREEN : 0))) ==
|
||||||
|
NULL ||
|
||||||
SDL_GL_CreateContext(_window) == NULL)
|
SDL_GL_CreateContext(_window) == NULL)
|
||||||
fatal(@"Unable to create OpenGL screen");
|
fatal(@"Unable to create OpenGL screen");
|
||||||
|
|
||||||
|
@ -139,41 +145,43 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
log(@"basetex");
|
log(@"basetex");
|
||||||
int xs, ys;
|
int xs, ys;
|
||||||
if (!installtex(2,
|
if (!installtex(2,
|
||||||
[_gameDataIRI IRIByAppendingPathComponent:@"data/newchars.png"],
|
[_gameDataIRI
|
||||||
|
IRIByAppendingPathComponent:@"data/newchars.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(3,
|
!installtex(3,
|
||||||
[_gameDataIRI
|
[_gameDataIRI IRIByAppendingPathComponent:
|
||||||
IRIByAppendingPathComponent:@"data/martin/base.png"],
|
@"data/martin/base.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(6,
|
!installtex(6,
|
||||||
[_gameDataIRI
|
[_gameDataIRI IRIByAppendingPathComponent:
|
||||||
IRIByAppendingPathComponent:@"data/martin/ball1.png"],
|
@"data/martin/ball1.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(7,
|
!installtex(7,
|
||||||
[_gameDataIRI
|
[_gameDataIRI IRIByAppendingPathComponent:
|
||||||
IRIByAppendingPathComponent:@"data/martin/smoke.png"],
|
@"data/martin/smoke.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(8,
|
!installtex(8,
|
||||||
[_gameDataIRI
|
[_gameDataIRI IRIByAppendingPathComponent:
|
||||||
IRIByAppendingPathComponent:@"data/martin/ball2.png"],
|
@"data/martin/ball2.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(9,
|
!installtex(9,
|
||||||
[_gameDataIRI
|
[_gameDataIRI IRIByAppendingPathComponent:
|
||||||
IRIByAppendingPathComponent:@"data/martin/ball3.png"],
|
@"data/martin/ball3.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(4,
|
!installtex(4,
|
||||||
[_gameDataIRI
|
[_gameDataIRI
|
||||||
IRIByAppendingPathComponent:@"data/explosion.jpg"],
|
IRIByAppendingPathComponent:@"data/explosion.jpg"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(5,
|
!installtex(5,
|
||||||
[_gameDataIRI IRIByAppendingPathComponent:@"data/items.png"],
|
[_gameDataIRI
|
||||||
|
IRIByAppendingPathComponent:@"data/items.png"],
|
||||||
&xs, &ys, false) ||
|
&xs, &ys, false) ||
|
||||||
!installtex(1,
|
!installtex(1,
|
||||||
[_gameDataIRI
|
[_gameDataIRI
|
||||||
IRIByAppendingPathComponent:@"data/crosshair.png"],
|
IRIByAppendingPathComponent:@"data/crosshair.png"],
|
||||||
&xs, &ys, false))
|
&xs, &ys, false))
|
||||||
fatal(@"could not find core textures (hint: run cube from the "
|
fatal(@"could not find core textures (hint: run cube "
|
||||||
@"parent of the bin directory)");
|
@"from the parent of the bin directory)");
|
||||||
|
|
||||||
log(@"sound");
|
log(@"sound");
|
||||||
initsound();
|
initsound();
|
||||||
|
@ -186,7 +194,8 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
exec(@"data/prefabs.cfg");
|
exec(@"data/prefabs.cfg");
|
||||||
exec(@"data/sounds.cfg");
|
exec(@"data/sounds.cfg");
|
||||||
exec(@"servers.cfg");
|
exec(@"servers.cfg");
|
||||||
if (!execfile([_userDataIRI IRIByAppendingPathComponent:@"config.cfg"]))
|
if (!execfile([_userDataIRI
|
||||||
|
IRIByAppendingPathComponent:@"config.cfg"]))
|
||||||
execfile([_gameDataIRI
|
execfile([_gameDataIRI
|
||||||
IRIByAppendingPathComponent:@"data/defaults.cfg"]);
|
IRIByAppendingPathComponent:@"data/defaults.cfg"]);
|
||||||
exec(@"autoexec.cfg");
|
exec(@"autoexec.cfg");
|
||||||
|
@ -197,9 +206,12 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
changemap(@"metl3");
|
changemap(@"metl3");
|
||||||
|
|
||||||
log(@"mainloop");
|
log(@"mainloop");
|
||||||
int ignore = 5;
|
}
|
||||||
|
|
||||||
OFDate *past = [OFDate date];
|
OFDate *past = [OFDate date];
|
||||||
|
int ignore = 5;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@autoreleasepool {
|
||||||
[OFRunLoop.mainRunLoop runUntilDate:past];
|
[OFRunLoop.mainRunLoop runUntilDate:past];
|
||||||
|
|
||||||
int millis = SDL_GetTicks() * gamespeed / 100;
|
int millis = SDL_GetTicks() * gamespeed / 100;
|
||||||
|
@ -225,8 +237,8 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
extern void updatevol();
|
extern void updatevol();
|
||||||
updatevol();
|
updatevol();
|
||||||
|
|
||||||
// cheap hack to get rid of initial sparklies, even when triple
|
// cheap hack to get rid of initial sparklies, even when
|
||||||
// buffering etc.
|
// triple buffering etc.
|
||||||
if (_framesInMap++ < 5) {
|
if (_framesInMap++ < 5) {
|
||||||
player1.yaw += 5;
|
player1.yaw += 5;
|
||||||
gl_drawframe(_width, _height, fps);
|
gl_drawframe(_width, _height, fps);
|
||||||
|
@ -244,27 +256,29 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
break;
|
break;
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
if (_repeatsKeys || event.key.repeat == 0)
|
if (_repeatsKeys ||
|
||||||
|
event.key.repeat == 0)
|
||||||
keypress(event.key.keysym.sym,
|
keypress(event.key.keysym.sym,
|
||||||
event.key.state == SDL_PRESSED);
|
event.key.state ==
|
||||||
|
SDL_PRESSED);
|
||||||
break;
|
break;
|
||||||
case SDL_TEXTINPUT:
|
case SDL_TEXTINPUT:
|
||||||
@autoreleasepool {
|
|
||||||
input(@(event.text.text));
|
input(@(event.text.text));
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
if (ignore) {
|
if (ignore) {
|
||||||
ignore--;
|
ignore--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mousemove(event.motion.xrel, event.motion.yrel);
|
mousemove(event.motion.xrel,
|
||||||
|
event.motion.yrel);
|
||||||
break;
|
break;
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
case SDL_MOUSEBUTTONUP:
|
case SDL_MOUSEBUTTONUP:
|
||||||
if (lasttype == event.type &&
|
if (lasttype == event.type &&
|
||||||
lastbut == event.button.button)
|
lastbut == event.button.button)
|
||||||
// why?? get event twice without it
|
// why?? get event twice without
|
||||||
|
// it
|
||||||
break;
|
break;
|
||||||
|
|
||||||
keypress(-event.button.button,
|
keypress(-event.button.button,
|
||||||
|
@ -275,8 +289,7 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
[self quit];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)applicationWillTerminate:(OFNotification *)notification
|
- (void)applicationWillTerminate:(OFNotification *)notification
|
||||||
|
@ -323,16 +336,12 @@ VARP(minmillis, 0, 5, 1000);
|
||||||
endianswap(dest, 3, _width);
|
endianswap(dest, 3, _width);
|
||||||
}
|
}
|
||||||
|
|
||||||
@autoreleasepool {
|
|
||||||
OFString *path = [OFString
|
OFString *path = [OFString
|
||||||
stringWithFormat:
|
stringWithFormat:@"screenshots/screenshot_%d.bmp",
|
||||||
@"screenshots/screenshot_%d.bmp",
|
|
||||||
lastmillis];
|
lastmillis];
|
||||||
SDL_SaveBMP(temp,
|
SDL_SaveBMP(temp,
|
||||||
[_userDataIRI
|
[_userDataIRI IRIByAppendingPathComponent:path]
|
||||||
IRIByAppendingPathComponent:path]
|
|
||||||
.fileSystemRepresentation.UTF8String);
|
.fileSystemRepresentation.UTF8String);
|
||||||
}
|
|
||||||
SDL_FreeSurface(temp);
|
SDL_FreeSurface(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
src/MD2.mm
13
src/MD2.mm
|
@ -54,11 +54,11 @@ snap(int sn, float f)
|
||||||
|
|
||||||
- (bool)loadWithIRI:(OFIRI *)IRI
|
- (bool)loadWithIRI:(OFIRI *)IRI
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
OFSeekableStream *stream;
|
OFSeekableStream *stream;
|
||||||
@try {
|
@try {
|
||||||
stream = (OFSeekableStream *)[[OFIRIHandler
|
stream = (OFSeekableStream *)[[OFIRIHandler handlerForIRI:IRI]
|
||||||
handlerForIRI:IRI] openItemAtIRI:IRI mode:@"r"];
|
openItemAtIRI:IRI
|
||||||
|
mode:@"r"];
|
||||||
} @catch (id e) {
|
} @catch (id e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -68,8 +68,7 @@ snap(int sn, float f)
|
||||||
|
|
||||||
md2_header header;
|
md2_header header;
|
||||||
[stream readIntoBuffer:&header exactLength:sizeof(md2_header)];
|
[stream readIntoBuffer:&header exactLength:sizeof(md2_header)];
|
||||||
endianswap(
|
endianswap(&header, sizeof(int), sizeof(md2_header) / sizeof(int));
|
||||||
&header, sizeof(int), sizeof(md2_header) / sizeof(int));
|
|
||||||
|
|
||||||
if (header.magic != 844121161 || header.version != 8)
|
if (header.magic != 844121161 || header.version != 8)
|
||||||
return false;
|
return false;
|
||||||
|
@ -83,8 +82,7 @@ snap(int sn, float f)
|
||||||
exactLength:header.frameSize * header.numFrames];
|
exactLength:header.frameSize * header.numFrames];
|
||||||
|
|
||||||
for (int i = 0; i < header.numFrames; ++i)
|
for (int i = 0; i < header.numFrames; ++i)
|
||||||
endianswap(
|
endianswap(_frames + i * header.frameSize, sizeof(float), 6);
|
||||||
_frames + i * header.frameSize, sizeof(float), 6);
|
|
||||||
|
|
||||||
_glCommands = new int[header.numGlCommands];
|
_glCommands = new int[header.numGlCommands];
|
||||||
if (_glCommands == NULL)
|
if (_glCommands == NULL)
|
||||||
|
@ -107,7 +105,6 @@ snap(int sn, float f)
|
||||||
loopj(_numFrames) _mverts[j] = NULL;
|
loopj(_numFrames) _mverts[j] = NULL;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)scaleWithFrame:(int)frame scale:(float)scale snap:(int)sn
|
- (void)scaleWithFrame:(int)frame scale:(float)scale snap:(int)sn
|
||||||
|
|
|
@ -63,28 +63,24 @@ throttle()
|
||||||
void
|
void
|
||||||
newname(OFString *name)
|
newname(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
c2sinit = false;
|
c2sinit = false;
|
||||||
|
|
||||||
if (name.length > 16)
|
if (name.length > 16)
|
||||||
name = [name substringToIndex:16];
|
name = [name substringToIndex:16];
|
||||||
|
|
||||||
player1.name = name;
|
player1.name = name;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMANDN(name, newname, ARG_1STR)
|
COMMANDN(name, newname, ARG_1STR)
|
||||||
|
|
||||||
void
|
void
|
||||||
newteam(OFString *name)
|
newteam(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
c2sinit = false;
|
c2sinit = false;
|
||||||
|
|
||||||
if (name.length > 5)
|
if (name.length > 5)
|
||||||
name = [name substringToIndex:5];
|
name = [name substringToIndex:5];
|
||||||
|
|
||||||
player1.team = name;
|
player1.team = name;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMANDN(team, newteam, ARG_1STR)
|
COMMANDN(team, newteam, ARG_1STR)
|
||||||
|
|
||||||
|
@ -103,13 +99,10 @@ connects(OFString *servername)
|
||||||
|
|
||||||
conoutf(@"attempting to connect to %@", servername);
|
conoutf(@"attempting to connect to %@", servername);
|
||||||
ENetAddress address = { ENET_HOST_ANY, CUBE_SERVER_PORT };
|
ENetAddress address = { ENET_HOST_ANY, CUBE_SERVER_PORT };
|
||||||
@autoreleasepool {
|
if (enet_address_set_host(&address, servername.UTF8String) < 0) {
|
||||||
if (enet_address_set_host(&address, servername.UTF8String) <
|
|
||||||
0) {
|
|
||||||
conoutf(@"could not resolve server %@", servername);
|
conoutf(@"could not resolve server %@", servername);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
clienthost = enet_host_create(NULL, 1, rate, rate);
|
clienthost = enet_host_create(NULL, 1, rate, rate);
|
||||||
|
|
||||||
|
@ -287,18 +280,17 @@ sendpackettoserv(void *packet)
|
||||||
void
|
void
|
||||||
c2sinfo(DynamicEntity *d)
|
c2sinfo(DynamicEntity *d)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
if (clientnum < 0)
|
if (clientnum < 0)
|
||||||
return; // we haven't had a welcome message from the
|
return; // we haven't had a welcome message from the server yet
|
||||||
// server yet
|
|
||||||
if (lastmillis - lastupdate < 40)
|
if (lastmillis - lastupdate < 40)
|
||||||
return; // don't update faster than 25fps
|
return; // don't update faster than 25fps
|
||||||
ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, 0);
|
ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, 0);
|
||||||
uchar *start = packet->data;
|
uchar *start = packet->data;
|
||||||
uchar *p = start + 2;
|
uchar *p = start + 2;
|
||||||
bool serveriteminitdone = false;
|
bool serveriteminitdone = false;
|
||||||
if (toservermap.length > 0) // suggest server to change map
|
// suggest server to change map
|
||||||
{ // do this exclusively as map change may invalidate rest of
|
if (toservermap.length > 0) {
|
||||||
|
// do this exclusively as map change may invalidate rest of
|
||||||
// update
|
// update
|
||||||
packet->flags = ENET_PACKET_FLAG_RELIABLE;
|
packet->flags = ENET_PACKET_FLAG_RELIABLE;
|
||||||
putint(p, SV_MAPCHANGE);
|
putint(p, SV_MAPCHANGE);
|
||||||
|
@ -308,8 +300,8 @@ c2sinfo(DynamicEntity *d)
|
||||||
} else {
|
} else {
|
||||||
putint(p, SV_POS);
|
putint(p, SV_POS);
|
||||||
putint(p, clientnum);
|
putint(p, clientnum);
|
||||||
// quantize coordinates to 1/16th of a cube, between 1
|
// quantize coordinates to 1/16th of a cube, between 1 and 3
|
||||||
// and 3 bytes
|
// bytes
|
||||||
putint(p, (int)(d.o.x * DMF));
|
putint(p, (int)(d.o.x * DMF));
|
||||||
putint(p, (int)(d.o.y * DMF));
|
putint(p, (int)(d.o.y * DMF));
|
||||||
putint(p, (int)(d.o.z * DMF));
|
putint(p, (int)(d.o.z * DMF));
|
||||||
|
@ -320,8 +312,7 @@ c2sinfo(DynamicEntity *d)
|
||||||
putint(p, (int)(d.vel.x * DVF));
|
putint(p, (int)(d.vel.x * DVF));
|
||||||
putint(p, (int)(d.vel.y * DVF));
|
putint(p, (int)(d.vel.y * DVF));
|
||||||
putint(p, (int)(d.vel.z * DVF));
|
putint(p, (int)(d.vel.z * DVF));
|
||||||
// pack rest in 1 byte: strafe:2, move:2, onfloor:1,
|
// pack rest in 1 byte: strafe:2, move:2, onfloor:1, state:3
|
||||||
// state:3
|
|
||||||
putint(p,
|
putint(p,
|
||||||
(d.strafe & 3) | ((d.move & 3) << 2) |
|
(d.strafe & 3) | ((d.move & 3) << 2) |
|
||||||
(((int)d.onfloor) << 4) |
|
(((int)d.onfloor) << 4) |
|
||||||
|
@ -353,11 +344,9 @@ c2sinfo(DynamicEntity *d)
|
||||||
putint(p, player1.lifesequence);
|
putint(p, player1.lifesequence);
|
||||||
}
|
}
|
||||||
for (OFData *msg in messages) {
|
for (OFData *msg in messages) {
|
||||||
// send messages collected during the previous
|
// send messages collected during the previous frames
|
||||||
// frames
|
|
||||||
if (*(int *)[msg itemAtIndex:1])
|
if (*(int *)[msg itemAtIndex:1])
|
||||||
packet->flags =
|
packet->flags = ENET_PACKET_FLAG_RELIABLE;
|
||||||
ENET_PACKET_FLAG_RELIABLE;
|
|
||||||
loopi(*(int *)[msg itemAtIndex:0])
|
loopi(*(int *)[msg itemAtIndex:0])
|
||||||
putint(p, *(int *)[msg itemAtIndex:i + 2]);
|
putint(p, *(int *)[msg itemAtIndex:i + 2]);
|
||||||
}
|
}
|
||||||
|
@ -379,7 +368,6 @@ c2sinfo(DynamicEntity *d)
|
||||||
lastupdate = lastmillis;
|
lastupdate = lastmillis;
|
||||||
if (serveriteminitdone)
|
if (serveriteminitdone)
|
||||||
loadgamerest(); // hack
|
loadgamerest(); // hack
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -107,13 +107,12 @@ static OFMutableArray<OFString *> *scoreLines;
|
||||||
void
|
void
|
||||||
renderscore(DynamicEntity *d)
|
renderscore(DynamicEntity *d)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
OFString *lag = [OFString stringWithFormat:@"%d", d.plag];
|
OFString *lag = [OFString stringWithFormat:@"%d", d.plag];
|
||||||
OFString *name = [OFString stringWithFormat:@"(%@)", d.name];
|
OFString *name = [OFString stringWithFormat:@"(%@)", d.name];
|
||||||
OFString *line =
|
OFString *line =
|
||||||
[OFString stringWithFormat:@"%d\t%@\t%d\t%@\t%@", d.frags,
|
[OFString stringWithFormat:@"%d\t%@\t%d\t%@\t%@", d.frags,
|
||||||
(d.state == CS_LAGGED ? @"LAG" : lag), d.ping,
|
(d.state == CS_LAGGED ? @"LAG" : lag), d.ping, d.team,
|
||||||
d.team, (d.state == CS_DEAD ? name : d.name)];
|
(d.state == CS_DEAD ? name : d.name)];
|
||||||
|
|
||||||
if (scoreLines == nil)
|
if (scoreLines == nil)
|
||||||
scoreLines = [[OFMutableArray alloc] init];
|
scoreLines = [[OFMutableArray alloc] init];
|
||||||
|
@ -121,7 +120,6 @@ renderscore(DynamicEntity *d)
|
||||||
[scoreLines addObject:line];
|
[scoreLines addObject:line];
|
||||||
|
|
||||||
menumanual(0, scoreLines.count - 1, line);
|
menumanual(0, scoreLines.count - 1, line);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int maxTeams = 4;
|
static const int maxTeams = 4;
|
||||||
|
@ -132,7 +130,6 @@ static size_t teamsUsed;
|
||||||
void
|
void
|
||||||
addteamscore(DynamicEntity *d)
|
addteamscore(DynamicEntity *d)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
for (size_t i = 0; i < teamsUsed; i++) {
|
for (size_t i = 0; i < teamsUsed; i++) {
|
||||||
if ([teamName[i] isEqual:d.team]) {
|
if ([teamName[i] isEqual:d.team]) {
|
||||||
teamScore[i] += d.frags;
|
teamScore[i] += d.frags;
|
||||||
|
@ -145,7 +142,6 @@ addteamscore(DynamicEntity *d)
|
||||||
|
|
||||||
teamName[teamsUsed] = d.team;
|
teamName[teamsUsed] = d.team;
|
||||||
teamScore[teamsUsed++] = d.frags;
|
teamScore[teamsUsed++] = d.frags;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -172,10 +168,8 @@ renderscores()
|
||||||
[teamScores appendFormat:@"[ %@: %d ]", teamName[j],
|
[teamScores appendFormat:@"[ %@: %d ]", teamName[j],
|
||||||
teamScore[j]];
|
teamScore[j]];
|
||||||
menumanual(0, scoreLines.count, @"");
|
menumanual(0, scoreLines.count, @"");
|
||||||
@autoreleasepool {
|
|
||||||
menumanual(0, scoreLines.count + 1, teamScores);
|
menumanual(0, scoreLines.count + 1, teamScores);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendmap/getmap commands, should be replaced by more intuitive map downloading
|
// sendmap/getmap commands, should be replaced by more intuitive map downloading
|
||||||
|
@ -183,7 +177,6 @@ renderscores()
|
||||||
void
|
void
|
||||||
sendmap(OFString *mapname)
|
sendmap(OFString *mapname)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
if (mapname.length > 0)
|
if (mapname.length > 0)
|
||||||
save_world(mapname);
|
save_world(mapname);
|
||||||
changemap(mapname);
|
changemap(mapname);
|
||||||
|
@ -214,7 +207,6 @@ sendmap(OFString *mapname)
|
||||||
@"\"getmap\" to receive it]",
|
@"\"getmap\" to receive it]",
|
||||||
mapname];
|
mapname];
|
||||||
toserver(msg);
|
toserver(msg);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -95,16 +95,13 @@ localservertoclient(uchar *buf, int len)
|
||||||
// map
|
// map
|
||||||
toservermap = getclientmap();
|
toservermap = getclientmap();
|
||||||
sgetstr();
|
sgetstr();
|
||||||
@autoreleasepool {
|
|
||||||
if (text[0] &&
|
if (text[0] &&
|
||||||
strcmp(text, clientpassword.UTF8String)) {
|
strcmp(text, clientpassword.UTF8String)) {
|
||||||
conoutf(@"you need to set the correct "
|
conoutf(@"you need to set the correct password "
|
||||||
@"password "
|
|
||||||
@"to join this server!");
|
@"to join this server!");
|
||||||
disconnect();
|
disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (getint(p) == 1)
|
if (getint(p) == 1)
|
||||||
conoutf(@"server is FULL, disconnecting..");
|
conoutf(@"server is FULL, disconnecting..");
|
||||||
break;
|
break;
|
||||||
|
@ -150,9 +147,7 @@ localservertoclient(uchar *buf, int len)
|
||||||
|
|
||||||
case SV_MAPCHANGE:
|
case SV_MAPCHANGE:
|
||||||
sgetstr();
|
sgetstr();
|
||||||
@autoreleasepool {
|
|
||||||
changemapserv(@(text), getint(p));
|
changemapserv(@(text), getint(p));
|
||||||
}
|
|
||||||
mapchanged = true;
|
mapchanged = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -378,12 +373,10 @@ localservertoclient(uchar *buf, int len)
|
||||||
conoutf(@"received map \"%s\" from server, reloading..",
|
conoutf(@"received map \"%s\" from server, reloading..",
|
||||||
text);
|
text);
|
||||||
int mapsize = getint(p);
|
int mapsize = getint(p);
|
||||||
@autoreleasepool {
|
|
||||||
OFString *string = @(text);
|
OFString *string = @(text);
|
||||||
writemap(string, mapsize, p);
|
writemap(string, mapsize, p);
|
||||||
p += mapsize;
|
p += mapsize;
|
||||||
changemapserv(string, gamemode);
|
changemapserv(string, gamemode);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -123,17 +123,14 @@ parseexp(char *&p, int right)
|
||||||
}
|
}
|
||||||
char *s = strndup(word, p - word - 1);
|
char *s = strndup(word, p - word - 1);
|
||||||
if (left == '(') {
|
if (left == '(') {
|
||||||
@autoreleasepool {
|
|
||||||
OFString *t;
|
OFString *t;
|
||||||
@try {
|
@try {
|
||||||
t = [OFString
|
t = [OFString stringWithFormat:@"%d", execute(@(s))];
|
||||||
stringWithFormat:@"%d", execute(@(s))];
|
|
||||||
} @finally {
|
} @finally {
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
s = strdup(t.UTF8String);
|
s = strdup(t.UTF8String);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,19 +161,16 @@ parseword(char *&p)
|
||||||
return strndup(word, p - word);
|
return strndup(word, p - word);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// find value of ident referenced with $ in exp
|
||||||
OFString *
|
OFString *
|
||||||
lookup(OFString *n) // find value of ident referenced with $ in exp
|
lookup(OFString *n)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
__kindof Identifier *identifier = identifiers[[n substringFromIndex:1]];
|
||||||
__kindof Identifier *identifier =
|
|
||||||
identifiers[[n substringFromIndex:1]];
|
|
||||||
|
|
||||||
if ([identifier isKindOfClass:Variable.class]) {
|
if ([identifier isKindOfClass:Variable.class]) {
|
||||||
return [OFString
|
return [OFString stringWithFormat:@"%d", *[identifier storage]];
|
||||||
stringWithFormat:@"%d", *[identifier storage]];
|
|
||||||
} else if ([identifier isKindOfClass:Alias.class])
|
} else if ([identifier isKindOfClass:Alias.class])
|
||||||
return [identifier action];
|
return [identifier action];
|
||||||
}
|
|
||||||
|
|
||||||
conoutf(@"unknown alias lookup: %@", [n substringFromIndex:1]);
|
conoutf(@"unknown alias lookup: %@", [n substringFromIndex:1]);
|
||||||
return n;
|
return n;
|
||||||
|
@ -234,7 +228,6 @@ executeIdentifier(__kindof Identifier *identifier,
|
||||||
int
|
int
|
||||||
execute(OFString *string, bool isDown)
|
execute(OFString *string, bool isDown)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
std::unique_ptr<char> copy(strdup(string.UTF8String));
|
std::unique_ptr<char> copy(strdup(string.UTF8String));
|
||||||
char *p = copy.get();
|
char *p = copy.get();
|
||||||
const int MAXWORDS = 25; // limit, remove
|
const int MAXWORDS = 25; // limit, remove
|
||||||
|
@ -284,7 +277,6 @@ execute(OFString *string, bool isDown)
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// tab-completion of all identifiers
|
// tab-completion of all identifiers
|
||||||
|
@ -300,7 +292,6 @@ resetcomplete()
|
||||||
void
|
void
|
||||||
complete(OFMutableString *s)
|
complete(OFMutableString *s)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
if (![s hasPrefix:@"/"])
|
if (![s hasPrefix:@"/"])
|
||||||
[s insertString:@"/" atIndex:0];
|
[s insertString:@"/" atIndex:0];
|
||||||
|
|
||||||
|
@ -315,11 +306,10 @@ complete(OFMutableString *s)
|
||||||
__block int idx = 0;
|
__block int idx = 0;
|
||||||
[identifiers enumerateKeysAndObjectsUsingBlock:^(
|
[identifiers enumerateKeysAndObjectsUsingBlock:^(
|
||||||
OFString *name, Identifier *identifier, bool *stop) {
|
OFString *name, Identifier *identifier, bool *stop) {
|
||||||
if (strncmp(identifier.name.UTF8String,
|
if (strncmp(identifier.name.UTF8String, s.UTF8String + 1,
|
||||||
s.UTF8String + 1, completesize) == 0 &&
|
completesize) == 0 &&
|
||||||
idx++ == completeidx)
|
idx++ == completeidx)
|
||||||
[s replaceCharactersInRange:OFMakeRange(
|
[s replaceCharactersInRange:OFMakeRange(1, s.length - 1)
|
||||||
1, s.length - 1)
|
|
||||||
withString:identifier.name];
|
withString:identifier.name];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
@ -327,13 +317,11 @@ complete(OFMutableString *s)
|
||||||
|
|
||||||
if (completeidx >= idx)
|
if (completeidx >= idx)
|
||||||
completeidx = 0;
|
completeidx = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
execfile(OFIRI *cfgfile)
|
execfile(OFIRI *cfgfile)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
OFString *command;
|
OFString *command;
|
||||||
@try {
|
@try {
|
||||||
command = [OFString stringWithContentsOfIRI:cfgfile];
|
command = [OFString stringWithContentsOfIRI:cfgfile];
|
||||||
|
@ -345,19 +333,16 @@ execfile(OFIRI *cfgfile)
|
||||||
|
|
||||||
execute(command);
|
execute(command);
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
exec(OFString *cfgfile)
|
exec(OFString *cfgfile)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
if (!execfile([Cube.sharedInstance.userDataIRI
|
if (!execfile([Cube.sharedInstance.userDataIRI
|
||||||
IRIByAppendingPathComponent:cfgfile]) &&
|
IRIByAppendingPathComponent:cfgfile]) &&
|
||||||
!execfile([Cube.sharedInstance.gameDataIRI
|
!execfile([Cube.sharedInstance.gameDataIRI
|
||||||
IRIByAppendingPathComponent:cfgfile]))
|
IRIByAppendingPathComponent:cfgfile]))
|
||||||
conoutf(@"could not read \"%@\"", cfgfile);
|
conoutf(@"could not read \"%@\"", cfgfile);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -418,9 +403,7 @@ COMMAND(writecfg, ARG_NONE)
|
||||||
void
|
void
|
||||||
intset(OFString *name, int v)
|
intset(OFString *name, int v)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
alias(name, [OFString stringWithFormat:@"%d", v]);
|
alias(name, [OFString stringWithFormat:@"%d", v]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -432,7 +415,6 @@ ifthen(OFString *cond, OFString *thenp, OFString *elsep)
|
||||||
void
|
void
|
||||||
loopa(OFString *times, OFString *body)
|
loopa(OFString *times, OFString *body)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
int t = times.cube_intValue;
|
int t = times.cube_intValue;
|
||||||
|
|
||||||
loopi(t)
|
loopi(t)
|
||||||
|
@ -440,7 +422,6 @@ loopa(OFString *times, OFString *body)
|
||||||
intset(@"i", i);
|
intset(@"i", i);
|
||||||
execute(body);
|
execute(body);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -472,7 +453,6 @@ concatword(OFString *s)
|
||||||
int
|
int
|
||||||
listlen(OFString *a_)
|
listlen(OFString *a_)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
const char *a = a_.UTF8String;
|
const char *a = a_.UTF8String;
|
||||||
|
|
||||||
if (!*a)
|
if (!*a)
|
||||||
|
@ -484,20 +464,17 @@ listlen(OFString *a_)
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
return n + 1;
|
return n + 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
at(OFString *s_, OFString *pos)
|
at(OFString *s_, OFString *pos)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
int n = pos.cube_intValue;
|
int n = pos.cube_intValue;
|
||||||
std::unique_ptr<char> copy(strdup(s_.UTF8String));
|
std::unique_ptr<char> copy(strdup(s_.UTF8String));
|
||||||
char *s = copy.get();
|
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)
|
||||||
|
|
|
@ -83,7 +83,6 @@ conline(OFString *sf, bool highlight) // add a line to the console buffer
|
||||||
void
|
void
|
||||||
conoutf(OFConstantString *format, ...)
|
conoutf(OFConstantString *format, ...)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
va_list arguments;
|
va_list arguments;
|
||||||
va_start(arguments, format);
|
va_start(arguments, format);
|
||||||
|
|
||||||
|
@ -98,7 +97,6 @@ conoutf(OFConstantString *format, ...)
|
||||||
string = [string substringFromIndex:WORDWRAP];
|
string = [string substringFromIndex:WORDWRAP];
|
||||||
}
|
}
|
||||||
conline(string, n != 0);
|
conline(string, n != 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// render buffer taking into account time & scrolling
|
// render buffer taking into account time & scrolling
|
||||||
|
@ -181,19 +179,15 @@ COMMAND(saycommand, ARG_VARI)
|
||||||
void
|
void
|
||||||
mapmsg(OFString *s)
|
mapmsg(OFString *s)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
memset(hdr.maptitle, '\0', sizeof(hdr.maptitle));
|
memset(hdr.maptitle, '\0', sizeof(hdr.maptitle));
|
||||||
strncpy(hdr.maptitle, s.UTF8String, 127);
|
strncpy(hdr.maptitle, s.UTF8String, 127);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(mapmsg, ARG_1STR)
|
COMMAND(mapmsg, ARG_1STR)
|
||||||
|
|
||||||
void
|
void
|
||||||
pasteconsole()
|
pasteconsole()
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
[commandbuf appendString:@(SDL_GetClipboardText())];
|
[commandbuf appendString:@(SDL_GetClipboardText())];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static OFMutableArray<OFString *> *vhistory;
|
static OFMutableArray<OFString *> *vhistory;
|
||||||
|
@ -262,22 +256,18 @@ keypress(int code, bool isDown)
|
||||||
} else {
|
} else {
|
||||||
if (code == SDLK_RETURN) {
|
if (code == SDLK_RETURN) {
|
||||||
if (commandbuf.length > 0) {
|
if (commandbuf.length > 0) {
|
||||||
@autoreleasepool {
|
|
||||||
if (vhistory == nil)
|
if (vhistory == nil)
|
||||||
vhistory =
|
vhistory =
|
||||||
[[OFMutableArray
|
[[OFMutableArray alloc]
|
||||||
alloc] init];
|
init];
|
||||||
|
|
||||||
if (vhistory.count == 0 ||
|
if (vhistory.count == 0 ||
|
||||||
![vhistory.lastObject
|
![vhistory.lastObject
|
||||||
isEqual:commandbuf]) {
|
isEqual:commandbuf]) {
|
||||||
// cap this?
|
// cap this?
|
||||||
[vhistory
|
[vhistory addObject:[commandbuf
|
||||||
addObject:
|
|
||||||
[commandbuf
|
|
||||||
copy]];
|
copy]];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
histpos = vhistory.count;
|
histpos = vhistory.count;
|
||||||
if ([commandbuf hasPrefix:@"/"])
|
if ([commandbuf hasPrefix:@"/"])
|
||||||
execute(commandbuf, true);
|
execute(commandbuf, true);
|
||||||
|
|
|
@ -604,11 +604,9 @@ void
|
||||||
newent(OFString *what, OFString *a1, OFString *a2, OFString *a3, OFString *a4)
|
newent(OFString *what, OFString *a1, OFString *a2, OFString *a3, OFString *a4)
|
||||||
{
|
{
|
||||||
EDITSEL;
|
EDITSEL;
|
||||||
@autoreleasepool {
|
|
||||||
newentity(sel.x, sel.y, (int)player1.o.z, what,
|
newentity(sel.x, sel.y, (int)player1.o.z, what,
|
||||||
[a1 cube_intValueWithBase:0], [a2 cube_intValueWithBase:0],
|
[a1 cube_intValueWithBase:0], [a2 cube_intValueWithBase:0],
|
||||||
[a3 cube_intValueWithBase:0], [a4 cube_intValueWithBase:0]);
|
[a3 cube_intValueWithBase:0], [a4 cube_intValueWithBase:0]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
COMMANDN(select, selectpos, ARG_4INT)
|
COMMANDN(select, selectpos, ARG_4INT)
|
||||||
|
|
|
@ -42,15 +42,10 @@ renderentities()
|
||||||
MapModelInfo *mmi = getmminfo(e.attr2);
|
MapModelInfo *mmi = getmminfo(e.attr2);
|
||||||
if (mmi == nil)
|
if (mmi == nil)
|
||||||
continue;
|
continue;
|
||||||
@autoreleasepool {
|
rendermodel(mmi.name, 0, 1, e.attr4, (float)mmi.rad,
|
||||||
rendermodel(mmi.name, 0, 1, e.attr4,
|
e.x, (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;
|
||||||
|
|
14
src/menus.mm
14
src/menus.mm
|
@ -43,7 +43,6 @@ void refreshservers();
|
||||||
bool
|
bool
|
||||||
rendermenu()
|
rendermenu()
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
if (vmenu < 0) {
|
if (vmenu < 0) {
|
||||||
[menuStack removeAllObjects];
|
[menuStack removeAllObjects];
|
||||||
return false;
|
return false;
|
||||||
|
@ -55,8 +54,7 @@ rendermenu()
|
||||||
Menu *m = menus[vmenu];
|
Menu *m = menus[vmenu];
|
||||||
OFString *title;
|
OFString *title;
|
||||||
if (vmenu > 1)
|
if (vmenu > 1)
|
||||||
title =
|
title = [OFString stringWithFormat:@"[ %@ menu ]", m.name];
|
||||||
[OFString stringWithFormat:@"[ %@ menu ]", m.name];
|
|
||||||
else
|
else
|
||||||
title = m.name;
|
title = m.name;
|
||||||
int mdisp = m.items.count;
|
int mdisp = m.items.count;
|
||||||
|
@ -80,8 +78,8 @@ rendermenu()
|
||||||
y += FONTH * 2;
|
y += FONTH * 2;
|
||||||
if (vmenu) {
|
if (vmenu) {
|
||||||
int bh = y + m.menusel * step;
|
int bh = y + m.menusel * step;
|
||||||
blendbox(x - FONTH, bh - 10, x + w + FONTH,
|
blendbox(
|
||||||
bh + FONTH + 10, false);
|
x - FONTH, bh - 10, x + w + FONTH, bh + FONTH + 10, false);
|
||||||
}
|
}
|
||||||
loopj(mdisp)
|
loopj(mdisp)
|
||||||
{
|
{
|
||||||
|
@ -89,7 +87,6 @@ rendermenu()
|
||||||
y += step;
|
y += step;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -154,11 +151,8 @@ menukey(int code, bool isdown)
|
||||||
} else {
|
} else {
|
||||||
if (code == SDLK_RETURN || code == -2) {
|
if (code == SDLK_RETURN || code == -2) {
|
||||||
OFString *action = menus[vmenu].items[menusel].action;
|
OFString *action = menus[vmenu].items[menusel].action;
|
||||||
if (vmenu == 1) {
|
if (vmenu == 1)
|
||||||
@autoreleasepool {
|
|
||||||
connects(getservername(menusel));
|
connects(getservername(menusel));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (menuStack == nil)
|
if (menuStack == nil)
|
||||||
menuStack = [[OFMutableArray alloc] init];
|
menuStack = [[OFMutableArray alloc] init];
|
||||||
|
|
|
@ -203,7 +203,6 @@ renderents() // show sparkly thingies for map entities in edit mode
|
||||||
void
|
void
|
||||||
loadsky(OFString *basename)
|
loadsky(OFString *basename)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
static OFString *lastsky = @"";
|
static OFString *lastsky = @"";
|
||||||
|
|
||||||
basename = [basename stringByReplacingOccurrencesOfString:@"\\"
|
basename = [basename stringByReplacingOccurrencesOfString:@"\\"
|
||||||
|
@ -212,14 +211,13 @@ loadsky(OFString *basename)
|
||||||
if ([lastsky isEqual:basename])
|
if ([lastsky isEqual:basename])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static const OFString *side[] = { @"ft", @"bk", @"lf", @"rt",
|
static const OFString *side[] = { @"ft", @"bk", @"lf", @"rt", @"dn",
|
||||||
@"dn", @"up" };
|
@"up" };
|
||||||
int texnum = 14;
|
int texnum = 14;
|
||||||
loopi(6)
|
loopi(6)
|
||||||
{
|
{
|
||||||
OFString *path =
|
OFString *path = [OFString
|
||||||
[OFString stringWithFormat:@"packages/%@_%@.jpg",
|
stringWithFormat:@"packages/%@_%@.jpg", basename, side[i]];
|
||||||
basename, side[i]];
|
|
||||||
|
|
||||||
int xs, ys;
|
int xs, ys;
|
||||||
if (!installtex(texnum + i,
|
if (!installtex(texnum + i,
|
||||||
|
@ -230,7 +228,6 @@ loadsky(OFString *basename)
|
||||||
}
|
}
|
||||||
|
|
||||||
lastsky = basename;
|
lastsky = basename;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(loadsky, ARG_1STR)
|
COMMAND(loadsky, ARG_1STR)
|
||||||
|
|
||||||
|
@ -367,7 +364,6 @@ gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwater)
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
@autoreleasepool {
|
|
||||||
OFString *command = getcurcommand();
|
OFString *command = getcurcommand();
|
||||||
OFString *player = playerincrosshair();
|
OFString *player = playerincrosshair();
|
||||||
|
|
||||||
|
@ -377,7 +373,6 @@ gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwater)
|
||||||
draw_text(closeent, 20, 1570, 2);
|
draw_text(closeent, 20, 1570, 2);
|
||||||
else if (player != nil)
|
else if (player != nil)
|
||||||
draw_text(player, 20, 1570, 2);
|
draw_text(player, 20, 1570, 2);
|
||||||
}
|
|
||||||
|
|
||||||
renderscores();
|
renderscores();
|
||||||
if (!rendermenu()) {
|
if (!rendermenu()) {
|
||||||
|
|
|
@ -78,9 +78,7 @@ cleangl()
|
||||||
bool
|
bool
|
||||||
installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
SDL_Surface *s = IMG_Load(IRI.fileSystemRepresentation.UTF8String);
|
||||||
SDL_Surface *s =
|
|
||||||
IMG_Load(IRI.fileSystemRepresentation.UTF8String);
|
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
conoutf(@"couldn't load texture %@", IRI.string);
|
conoutf(@"couldn't load texture %@", IRI.string);
|
||||||
return false;
|
return false;
|
||||||
|
@ -90,8 +88,7 @@ installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
||||||
SDL_PixelFormat *format =
|
SDL_PixelFormat *format =
|
||||||
SDL_AllocFormat(SDL_PIXELFORMAT_RGB24);
|
SDL_AllocFormat(SDL_PIXELFORMAT_RGB24);
|
||||||
if (format == NULL) {
|
if (format == NULL) {
|
||||||
conoutf(
|
conoutf(@"texture cannot be converted to 24bpp: %@",
|
||||||
@"texture cannot be converted to 24bpp: %@",
|
|
||||||
IRI.string);
|
IRI.string);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -126,8 +123,7 @@ installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
||||||
clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
|
clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
|
||||||
clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
|
clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
|
||||||
glTexParameteri(
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||||
GL_LINEAR_MIPMAP_LINEAR); // NEAREST);
|
GL_LINEAR_MIPMAP_LINEAR); // NEAREST);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
@ -145,8 +141,8 @@ installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
||||||
conoutf(@"warning: quality loss: scaling %@",
|
conoutf(@"warning: quality loss: scaling %@",
|
||||||
IRI.string); // for voodoo cards under linux
|
IRI.string); // for voodoo cards under linux
|
||||||
scaledimg = OFAllocMemory(1, *xs * *ys * 3);
|
scaledimg = OFAllocMemory(1, *xs * *ys * 3);
|
||||||
gluScaleImage(GL_RGB, s->w, s->h, GL_UNSIGNED_BYTE,
|
gluScaleImage(GL_RGB, s->w, s->h, GL_UNSIGNED_BYTE, s->pixels,
|
||||||
s->pixels, *xs, *ys, GL_UNSIGNED_BYTE, scaledimg);
|
*xs, *ys, GL_UNSIGNED_BYTE, scaledimg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, *xs, *ys, GL_RGB,
|
if (gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, *xs, *ys, GL_RGB,
|
||||||
|
@ -159,7 +155,6 @@ installtex(int tnum, OFIRI *IRI, int *xs, int *ys, bool clamp)
|
||||||
SDL_FreeSurface(s);
|
SDL_FreeSurface(s);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// management of texture slots
|
// management of texture slots
|
||||||
|
@ -197,17 +192,14 @@ COMMAND(texturereset, ARG_NONE)
|
||||||
void
|
void
|
||||||
texture(OFString *aframe, OFString *name)
|
texture(OFString *aframe, OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
int num = curtexnum++, frame = aframe.cube_intValue;
|
int num = curtexnum++, frame = aframe.cube_intValue;
|
||||||
|
|
||||||
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;
|
||||||
mapname[num][frame] =
|
mapname[num][frame] = [name stringByReplacingOccurrencesOfString:@"\\"
|
||||||
[name stringByReplacingOccurrencesOfString:@"\\"
|
|
||||||
withString:@"/"];
|
withString:@"/"];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(texture, ARG_2STR)
|
COMMAND(texture, ARG_2STR)
|
||||||
|
|
||||||
|
@ -243,7 +235,6 @@ lookuptexture(int tex, int *xs, int *ys)
|
||||||
int tnum = curtex + FIRSTTEX;
|
int tnum = curtex + FIRSTTEX;
|
||||||
texname[curtex] = mapname[tex][frame];
|
texname[curtex] = mapname[tex][frame];
|
||||||
|
|
||||||
@autoreleasepool {
|
|
||||||
OFString *path =
|
OFString *path =
|
||||||
[OFString stringWithFormat:@"packages/%@", texname[curtex]];
|
[OFString stringWithFormat:@"packages/%@", texname[curtex]];
|
||||||
|
|
||||||
|
@ -259,7 +250,6 @@ lookuptexture(int tex, int *xs, int *ys)
|
||||||
} else {
|
} else {
|
||||||
return mapping[tex][frame] = FIRSTTEX; // temp fix
|
return mapping[tex][frame] = FIRSTTEX; // temp fix
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -16,30 +16,25 @@ void
|
||||||
delayedload(MD2 *m)
|
delayedload(MD2 *m)
|
||||||
{
|
{
|
||||||
if (!m.loaded) {
|
if (!m.loaded) {
|
||||||
@autoreleasepool {
|
|
||||||
OFString *path = [OFString
|
OFString *path = [OFString
|
||||||
stringWithFormat:@"packages/models/%@", m.loadname];
|
stringWithFormat:@"packages/models/%@", m.loadname];
|
||||||
OFIRI *baseIRI = [Cube.sharedInstance.gameDataIRI
|
OFIRI *baseIRI = [Cube.sharedInstance.gameDataIRI
|
||||||
IRIByAppendingPathComponent:path];
|
IRIByAppendingPathComponent:path];
|
||||||
|
|
||||||
OFIRI *IRI1 =
|
OFIRI *IRI1 = [baseIRI IRIByAppendingPathComponent:@"tris.md2"];
|
||||||
[baseIRI IRIByAppendingPathComponent:@"tris.md2"];
|
|
||||||
if (![m loadWithIRI:IRI1])
|
if (![m loadWithIRI:IRI1])
|
||||||
fatal(@"loadmodel: ", IRI1.string);
|
fatal(@"loadmodel: ", IRI1.string);
|
||||||
|
|
||||||
OFIRI *IRI2 =
|
OFIRI *IRI2 = [baseIRI IRIByAppendingPathComponent:@"skin.jpg"];
|
||||||
[baseIRI IRIByAppendingPathComponent:@"skin.jpg"];
|
|
||||||
int xs, ys;
|
int xs, ys;
|
||||||
installtex(FIRSTMDL + m.mdlnum, IRI2, &xs, &ys, false);
|
installtex(FIRSTMDL + m.mdlnum, IRI2, &xs, &ys, false);
|
||||||
m.loaded = true;
|
m.loaded = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MD2 *
|
MD2 *
|
||||||
loadmodel(OFString *name)
|
loadmodel(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
static int modelnum = 0;
|
static int modelnum = 0;
|
||||||
|
|
||||||
MD2 *m = mdllookup[name];
|
MD2 *m = mdllookup[name];
|
||||||
|
@ -48,11 +43,7 @@ loadmodel(OFString *name)
|
||||||
|
|
||||||
m = [[MD2 alloc] init];
|
m = [[MD2 alloc] init];
|
||||||
m.mdlnum = modelnum++;
|
m.mdlnum = modelnum++;
|
||||||
m.mmi = [[MapModelInfo alloc] initWithRad:2
|
m.mmi = [[MapModelInfo alloc] initWithRad:2 h:2 zoff:0 snap:0 name:@""];
|
||||||
h:2
|
|
||||||
zoff:0
|
|
||||||
snap:0
|
|
||||||
name:@""];
|
|
||||||
m.loadname = name;
|
m.loadname = name;
|
||||||
|
|
||||||
if (mdllookup == nil)
|
if (mdllookup == nil)
|
||||||
|
@ -61,7 +52,6 @@ loadmodel(OFString *name)
|
||||||
mdllookup[name] = m;
|
mdllookup[name] = m;
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -102,7 +102,6 @@ short char_coords[96][4] = {
|
||||||
int
|
int
|
||||||
text_width(OFString *string)
|
text_width(OFString *string)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
const char *str = string.UTF8String;
|
const char *str = string.UTF8String;
|
||||||
size_t len = string.UTF8StringLength;
|
size_t len = string.UTF8StringLength;
|
||||||
|
|
||||||
|
@ -131,26 +130,22 @@ text_width(OFString *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
draw_textf(OFConstantString *format, int left, int top, int gl_num, ...)
|
draw_textf(OFConstantString *format, int left, int top, int gl_num, ...)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
va_list arguments;
|
va_list arguments;
|
||||||
va_start(arguments, gl_num);
|
va_start(arguments, gl_num);
|
||||||
OFString *str = [[OFString alloc] initWithFormat:format
|
OFString *str = [[OFString alloc] initWithFormat:format
|
||||||
arguments:arguments];
|
arguments:arguments];
|
||||||
va_end(arguments);
|
va_end(arguments);
|
||||||
draw_text(str, left, top, gl_num);
|
draw_text(str, left, top, gl_num);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
draw_text(OFString *string, int left, int top, int gl_num)
|
draw_text(OFString *string, int left, int top, int gl_num)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
glBlendFunc(GL_ONE, GL_ONE);
|
||||||
glBindTexture(GL_TEXTURE_2D, gl_num);
|
glBindTexture(GL_TEXTURE_2D, gl_num);
|
||||||
glColor3ub(255, 255, 255);
|
glColor3ub(255, 255, 255);
|
||||||
|
@ -168,9 +163,7 @@ draw_text(OFString *string, int left, int top, int gl_num)
|
||||||
int c = str[i];
|
int c = str[i];
|
||||||
|
|
||||||
if (c == '\t') {
|
if (c == '\t') {
|
||||||
x = (x - left + PIXELTAB) / PIXELTAB *
|
x = (x - left + PIXELTAB) / PIXELTAB * PIXELTAB + left;
|
||||||
PIXELTAB +
|
|
||||||
left;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +203,6 @@ draw_text(OFString *string, int left, int top, int gl_num)
|
||||||
xtraverts += 4;
|
xtraverts += 4;
|
||||||
x += in_width + 1;
|
x += in_width + 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// also Don's code, so goes in here too :)
|
// also Don's code, so goes in here too :)
|
||||||
|
|
|
@ -91,7 +91,6 @@ stopifrecording()
|
||||||
void
|
void
|
||||||
savestate(OFIRI *IRI)
|
savestate(OFIRI *IRI)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
stop();
|
stop();
|
||||||
f = gzopen([IRI.fileSystemRepresentation
|
f = gzopen([IRI.fileSystemRepresentation
|
||||||
cStringWithEncoding:OFLocale.encoding],
|
cStringWithEncoding:OFLocale.encoding],
|
||||||
|
@ -125,7 +124,6 @@ savestate(OFIRI *IRI)
|
||||||
data = [player dataBySerializing];
|
data = [player dataBySerializing];
|
||||||
gzwrite(f, data.items, data.count);
|
gzwrite(f, data.items, data.count);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -136,22 +134,18 @@ savegame(OFString *name)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@autoreleasepool {
|
OFString *path = [OFString stringWithFormat:@"savegames/%@.csgz", name];
|
||||||
OFString *path =
|
OFIRI *IRI =
|
||||||
[OFString stringWithFormat:@"savegames/%@.csgz", name];
|
[Cube.sharedInstance.userDataIRI IRIByAppendingPathComponent:path];
|
||||||
OFIRI *IRI = [Cube.sharedInstance.userDataIRI
|
|
||||||
IRIByAppendingPathComponent:path];
|
|
||||||
savestate(IRI);
|
savestate(IRI);
|
||||||
stop();
|
stop();
|
||||||
conoutf(@"wrote %@", IRI.string);
|
conoutf(@"wrote %@", IRI.string);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(savegame, ARG_1STR)
|
COMMAND(savegame, ARG_1STR)
|
||||||
|
|
||||||
void
|
void
|
||||||
loadstate(OFIRI *IRI)
|
loadstate(OFIRI *IRI)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
stop();
|
stop();
|
||||||
if (multiplayer())
|
if (multiplayer())
|
||||||
return;
|
return;
|
||||||
|
@ -177,29 +171,23 @@ loadstate(OFIRI *IRI)
|
||||||
goto out;
|
goto out;
|
||||||
gzread(f, mapname, _MAXDEFSTR);
|
gzread(f, mapname, _MAXDEFSTR);
|
||||||
nextmode = gzgeti();
|
nextmode = gzgeti();
|
||||||
@autoreleasepool {
|
// continue below once map has been loaded and client & server
|
||||||
// continue below once map has been loaded and client &
|
// have updated
|
||||||
// server have updated
|
|
||||||
changemap(@(mapname));
|
changemap(@(mapname));
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
out:
|
out:
|
||||||
conoutf(@"aborting: savegame/demo from a different version of "
|
conoutf(@"aborting: savegame/demo from a different version of "
|
||||||
@"cube or cpu architecture");
|
@"cube or cpu architecture");
|
||||||
stop();
|
stop();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
loadgame(OFString *name)
|
loadgame(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
OFString *path = [OFString stringWithFormat:@"savegames/%@.csgz", name];
|
||||||
OFString *path =
|
OFIRI *IRI =
|
||||||
[OFString stringWithFormat:@"savegames/%@.csgz", name];
|
[Cube.sharedInstance.userDataIRI IRIByAppendingPathComponent:path];
|
||||||
OFIRI *IRI = [Cube.sharedInstance.userDataIRI
|
|
||||||
IRIByAppendingPathComponent:path];
|
|
||||||
loadstate(IRI);
|
loadstate(IRI);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(loadgame, ARG_1STR)
|
COMMAND(loadgame, ARG_1STR)
|
||||||
|
|
||||||
|
@ -286,18 +274,15 @@ record(OFString *name)
|
||||||
if (cn < 0)
|
if (cn < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@autoreleasepool {
|
OFString *path = [OFString stringWithFormat:@"demos/%@.cdgz", name];
|
||||||
OFString *path =
|
OFIRI *IRI =
|
||||||
[OFString stringWithFormat:@"demos/%@.cdgz", name];
|
[Cube.sharedInstance.userDataIRI IRIByAppendingPathComponent:path];
|
||||||
OFIRI *IRI = [Cube.sharedInstance.userDataIRI
|
|
||||||
IRIByAppendingPathComponent:path];
|
|
||||||
savestate(IRI);
|
savestate(IRI);
|
||||||
gzputi(cn);
|
gzputi(cn);
|
||||||
conoutf(@"started recording demo to %@", IRI.string);
|
conoutf(@"started recording demo to %@", IRI.string);
|
||||||
demorecording = true;
|
demorecording = true;
|
||||||
starttime = lastmillis;
|
starttime = lastmillis;
|
||||||
ddamage = bdamage = 0;
|
ddamage = bdamage = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(record, ARG_1STR)
|
COMMAND(record, ARG_1STR)
|
||||||
|
|
||||||
|
@ -348,14 +333,11 @@ incomingdemodata(uchar *buf, int len, bool extras)
|
||||||
void
|
void
|
||||||
demo(OFString *name)
|
demo(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
OFString *path = [OFString stringWithFormat:@"demos/%@.cdgz", name];
|
||||||
OFString *path =
|
OFIRI *IRI =
|
||||||
[OFString stringWithFormat:@"demos/%@.cdgz", name];
|
[Cube.sharedInstance.userDataIRI IRIByAppendingPathComponent:path];
|
||||||
OFIRI *IRI = [Cube.sharedInstance.userDataIRI
|
|
||||||
IRIByAppendingPathComponent:path];
|
|
||||||
loadstate(IRI);
|
loadstate(IRI);
|
||||||
demoloading = true;
|
demoloading = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(demo, ARG_1STR)
|
COMMAND(demo, ARG_1STR)
|
||||||
|
|
||||||
|
|
|
@ -173,13 +173,10 @@ vote(OFString *map, int reqmode, int sender)
|
||||||
if (yes == 1 && no == 0)
|
if (yes == 1 && no == 0)
|
||||||
return true; // single player
|
return true; // single player
|
||||||
|
|
||||||
@autoreleasepool {
|
OFString *msg = [OFString
|
||||||
OFString *msg =
|
stringWithFormat:@"%@ suggests %@ on map %@ (set map to vote)",
|
||||||
[OFString stringWithFormat:
|
|
||||||
@"%@ suggests %@ on map %@ (set map to vote)",
|
|
||||||
clients[sender].name, modestr(reqmode), map];
|
clients[sender].name, modestr(reqmode), map];
|
||||||
sendservmsg(msg);
|
sendservmsg(msg);
|
||||||
}
|
|
||||||
|
|
||||||
if (yes / (float)(yes + no) <= 0.5f)
|
if (yes / (float)(yes + no) <= 0.5f)
|
||||||
return false;
|
return false;
|
||||||
|
@ -215,9 +212,7 @@ process(ENetPacket *packet, int sender) // sender may be -1
|
||||||
|
|
||||||
case SV_INITC2S:
|
case SV_INITC2S:
|
||||||
sgetstr();
|
sgetstr();
|
||||||
@autoreleasepool {
|
|
||||||
clients[cn].name = @(text);
|
clients[cn].name = @(text);
|
||||||
}
|
|
||||||
sgetstr();
|
sgetstr();
|
||||||
getint(p);
|
getint(p);
|
||||||
break;
|
break;
|
||||||
|
@ -227,19 +222,15 @@ process(ENetPacket *packet, int sender) // sender may be -1
|
||||||
int reqmode = getint(p);
|
int reqmode = getint(p);
|
||||||
if (reqmode < 0)
|
if (reqmode < 0)
|
||||||
reqmode = 0;
|
reqmode = 0;
|
||||||
@autoreleasepool {
|
|
||||||
if (smapname.length > 0 && !mapreload &&
|
if (smapname.length > 0 && !mapreload &&
|
||||||
!vote(@(text), reqmode, sender))
|
!vote(@(text), reqmode, sender))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
mapreload = false;
|
mapreload = false;
|
||||||
mode = reqmode;
|
mode = reqmode;
|
||||||
minremain = mode & 1 ? 15 : 10;
|
minremain = mode & 1 ? 15 : 10;
|
||||||
mapend = lastsec + minremain * 60;
|
mapend = lastsec + minremain * 60;
|
||||||
interm = 0;
|
interm = 0;
|
||||||
@autoreleasepool {
|
|
||||||
smapname = @(text);
|
smapname = @(text);
|
||||||
}
|
|
||||||
resetitems();
|
resetitems();
|
||||||
sender = -1;
|
sender = -1;
|
||||||
break;
|
break;
|
||||||
|
@ -284,9 +275,7 @@ process(ENetPacket *packet, int sender) // sender may be -1
|
||||||
case SV_SENDMAP: {
|
case SV_SENDMAP: {
|
||||||
sgetstr();
|
sgetstr();
|
||||||
int mapsize = getint(p);
|
int mapsize = getint(p);
|
||||||
@autoreleasepool {
|
|
||||||
sendmaps(sender, @(text), mapsize, p);
|
sendmaps(sender, @(text), mapsize, p);
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,9 +318,7 @@ send_welcome(int n)
|
||||||
putint(p, SV_INITS2C);
|
putint(p, SV_INITS2C);
|
||||||
putint(p, n);
|
putint(p, n);
|
||||||
putint(p, PROTOCOL_VERSION);
|
putint(p, PROTOCOL_VERSION);
|
||||||
@autoreleasepool {
|
|
||||||
putint(p, *smapname.UTF8String);
|
putint(p, *smapname.UTF8String);
|
||||||
}
|
|
||||||
sendstring(serverpassword, p);
|
sendstring(serverpassword, p);
|
||||||
putint(p, clients.count > maxclients);
|
putint(p, clients.count > maxclients);
|
||||||
if (smapname.length > 0) {
|
if (smapname.length > 0) {
|
||||||
|
@ -493,13 +480,10 @@ serverslice(int seconds,
|
||||||
c.peer = event.peer;
|
c.peer = event.peer;
|
||||||
c.peer->data = (void *)(clients.count - 1);
|
c.peer->data = (void *)(clients.count - 1);
|
||||||
char hn[1024];
|
char hn[1024];
|
||||||
@autoreleasepool {
|
c.hostname = (enet_address_get_host(
|
||||||
c.hostname =
|
|
||||||
(enet_address_get_host(
|
|
||||||
&c.peer->address, hn, sizeof(hn)) == 0
|
&c.peer->address, hn, sizeof(hn)) == 0
|
||||||
? @(hn)
|
? @(hn)
|
||||||
: @"localhost");
|
: @"localhost");
|
||||||
}
|
|
||||||
[OFStdOut
|
[OFStdOut
|
||||||
writeFormat:@"client connected (%@)\n", c.hostname];
|
writeFormat:@"client connected (%@)\n", c.hostname];
|
||||||
send_welcome(lastconnect = clients.count - 1);
|
send_welcome(lastconnect = clients.count - 1);
|
||||||
|
@ -566,11 +550,9 @@ initserver(bool dedicated, int uprate, OFString *sdesc, OFString *ip,
|
||||||
|
|
||||||
if ((isdedicated = dedicated)) {
|
if ((isdedicated = dedicated)) {
|
||||||
ENetAddress address = { ENET_HOST_ANY, CUBE_SERVER_PORT };
|
ENetAddress address = { ENET_HOST_ANY, CUBE_SERVER_PORT };
|
||||||
@autoreleasepool {
|
|
||||||
if (ip.length > 0 &&
|
if (ip.length > 0 &&
|
||||||
enet_address_set_host(&address, ip.UTF8String) < 0)
|
enet_address_set_host(&address, ip.UTF8String) < 0)
|
||||||
printf("WARNING: server ip not resolved");
|
printf("WARNING: server ip not resolved");
|
||||||
}
|
|
||||||
serverhost = enet_host_create(&address, MAXCLIENTS, 0, uprate);
|
serverhost = enet_host_create(&address, MAXCLIENTS, 0, uprate);
|
||||||
if (!serverhost)
|
if (!serverhost)
|
||||||
fatal(@"could not create server host\n");
|
fatal(@"could not create server host\n");
|
||||||
|
@ -589,6 +571,9 @@ initserver(bool dedicated, int uprate, OFString *sdesc, OFString *ip,
|
||||||
atexit(cleanupserver);
|
atexit(cleanupserver);
|
||||||
atexit(enet_deinitialize);
|
atexit(enet_deinitialize);
|
||||||
for (;;)
|
for (;;)
|
||||||
serverslice(/*enet_time_get_sec()*/ time(NULL), 5);
|
@autoreleasepool {
|
||||||
|
serverslice(
|
||||||
|
/*enet_time_get_sec()*/ time(NULL), 5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,6 @@ getservername(int n)
|
||||||
void
|
void
|
||||||
addserver(OFString *servername)
|
addserver(OFString *servername)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
for (ServerInfo *si in servers)
|
for (ServerInfo *si in servers)
|
||||||
if ([si.name isEqual:servername])
|
if ([si.name isEqual:servername])
|
||||||
return;
|
return;
|
||||||
|
@ -188,9 +187,7 @@ addserver(OFString *servername)
|
||||||
if (servers == nil)
|
if (servers == nil)
|
||||||
servers = [[OFMutableArray alloc] init];
|
servers = [[OFMutableArray alloc] init];
|
||||||
|
|
||||||
[servers
|
[servers addObject:[[ServerInfo alloc] initWithName:servername]];
|
||||||
addObject:[[ServerInfo alloc] initWithName:servername]];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -260,13 +257,9 @@ checkpings()
|
||||||
si.numplayers = getint(p);
|
si.numplayers = getint(p);
|
||||||
si.minremain = getint(p);
|
si.minremain = getint(p);
|
||||||
sgetstr();
|
sgetstr();
|
||||||
@autoreleasepool {
|
|
||||||
si.map = @(text);
|
si.map = @(text);
|
||||||
}
|
|
||||||
sgetstr();
|
sgetstr();
|
||||||
@autoreleasepool {
|
|
||||||
si.sdesc = @(text);
|
si.sdesc = @(text);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -306,10 +299,8 @@ refreshservers()
|
||||||
si.name];
|
si.name];
|
||||||
|
|
||||||
// cut off too long server descriptions
|
// cut off too long server descriptions
|
||||||
@autoreleasepool {
|
|
||||||
if (si.full.length > 50)
|
if (si.full.length > 50)
|
||||||
si.full = [si.full substringToIndex:50];
|
si.full = [si.full substringToIndex:50];
|
||||||
}
|
|
||||||
|
|
||||||
menumanual(1, i, si.full);
|
menumanual(1, i, si.full);
|
||||||
|
|
||||||
|
@ -348,10 +339,8 @@ updatefrommaster()
|
||||||
conoutf(@"master server not replying");
|
conoutf(@"master server not replying");
|
||||||
else {
|
else {
|
||||||
[servers removeAllObjects];
|
[servers removeAllObjects];
|
||||||
@autoreleasepool {
|
|
||||||
execute(@((char *)reply));
|
execute(@((char *)reply));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
servermenu();
|
servermenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,9 +355,7 @@ writeservercfg()
|
||||||
if (!f)
|
if (!f)
|
||||||
return;
|
return;
|
||||||
fprintf(f, "// servers connected to are added here automatically\n\n");
|
fprintf(f, "// servers connected to are added here automatically\n\n");
|
||||||
@autoreleasepool {
|
|
||||||
for (ServerInfo *si in servers.reversedArray)
|
for (ServerInfo *si in servers.reversedArray)
|
||||||
fprintf(f, "addserver %s\n", si.name.UTF8String);
|
fprintf(f, "addserver %s\n", si.name.UTF8String);
|
||||||
}
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,7 @@ httpgetsend(ENetAddress &ad, OFString *hostname, OFString *req, OFString *ref,
|
||||||
{
|
{
|
||||||
if (ad.host == ENET_HOST_ANY) {
|
if (ad.host == ENET_HOST_ANY) {
|
||||||
[OFStdOut writeFormat:@"looking up %@...\n", hostname];
|
[OFStdOut writeFormat:@"looking up %@...\n", hostname];
|
||||||
@autoreleasepool {
|
|
||||||
enet_address_set_host(&ad, hostname.UTF8String);
|
enet_address_set_host(&ad, hostname.UTF8String);
|
||||||
}
|
|
||||||
if (ad.host == ENET_HOST_ANY)
|
if (ad.host == ENET_HOST_ANY)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -79,13 +77,10 @@ updatemasterserver(int seconds)
|
||||||
{
|
{
|
||||||
// send alive signal to masterserver every hour of uptime
|
// send alive signal to masterserver every hour of uptime
|
||||||
if (seconds > updmaster) {
|
if (seconds > updmaster) {
|
||||||
@autoreleasepool {
|
|
||||||
OFString *path = [OFString
|
OFString *path = [OFString
|
||||||
stringWithFormat:@"%@register.do?action=add",
|
stringWithFormat:@"%@register.do?action=add", masterpath];
|
||||||
masterpath];
|
httpgetsend(masterserver, masterbase, path, @"cubeserver",
|
||||||
httpgetsend(masterserver, masterbase, path,
|
@"Cube Server");
|
||||||
@"cubeserver", @"Cube Server");
|
|
||||||
}
|
|
||||||
masterrep[0] = 0;
|
masterrep[0] = 0;
|
||||||
masterb.data = masterrep;
|
masterb.data = masterrep;
|
||||||
masterb.dataLength = MAXTRANS - 1;
|
masterb.dataLength = MAXTRANS - 1;
|
||||||
|
@ -105,12 +100,10 @@ checkmasterreply()
|
||||||
uchar *
|
uchar *
|
||||||
retrieveservers(uchar *buf, int buflen)
|
retrieveservers(uchar *buf, int buflen)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
OFString *path =
|
||||||
OFString *path = [OFString
|
[OFString stringWithFormat:@"%@retrieve.do?item=list", masterpath];
|
||||||
stringWithFormat:@"%@retrieve.do?item=list", masterpath];
|
httpgetsend(
|
||||||
httpgetsend(masterserver, masterbase, path, @"cubeserver",
|
masterserver, masterbase, path, @"cubeserver", @"Cube Server");
|
||||||
@"Cube Server");
|
|
||||||
}
|
|
||||||
ENetBuffer eb;
|
ENetBuffer eb;
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
eb.data = buf;
|
eb.data = buf;
|
||||||
|
@ -160,7 +153,6 @@ serverms(int mode, int numplayers, int minremain, OFString *smapname,
|
||||||
void
|
void
|
||||||
servermsinit(OFString *master_, OFString *sdesc, bool listen)
|
servermsinit(OFString *master_, OFString *sdesc, bool listen)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
const char *master = master_.UTF8String;
|
const char *master = master_.UTF8String;
|
||||||
const char *mid = strstr(master, "/");
|
const char *mid = strstr(master, "/");
|
||||||
if (!mid)
|
if (!mid)
|
||||||
|
@ -171,12 +163,10 @@ servermsinit(OFString *master_, OFString *sdesc, bool listen)
|
||||||
serverdesc = sdesc;
|
serverdesc = sdesc;
|
||||||
|
|
||||||
if (listen) {
|
if (listen) {
|
||||||
ENetAddress address = { ENET_HOST_ANY,
|
ENetAddress address = { ENET_HOST_ANY, CUBE_SERVINFO_PORT };
|
||||||
CUBE_SERVINFO_PORT };
|
pongsock =
|
||||||
pongsock = enet_socket_create(
|
enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, &address);
|
||||||
ENET_SOCKET_TYPE_DATAGRAM, &address);
|
|
||||||
if (pongsock == ENET_SOCKET_NULL)
|
if (pongsock == ENET_SOCKET_NULL)
|
||||||
fatal(@"could not create server info socket\n");
|
fatal(@"could not create server info socket\n");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,14 +45,12 @@ getint(uchar *&p)
|
||||||
void
|
void
|
||||||
sendstring(OFString *t_, uchar *&p)
|
sendstring(OFString *t_, uchar *&p)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
const char *t = t_.UTF8String;
|
const char *t = t_.UTF8String;
|
||||||
|
|
||||||
for (size_t i = 0; i < _MAXDEFSTR && *t != '\0'; i++)
|
for (size_t i = 0; i < _MAXDEFSTR && *t != '\0'; i++)
|
||||||
putint(p, *t++);
|
putint(p, *t++);
|
||||||
|
|
||||||
putint(p, 0);
|
putint(p, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const OFString *modenames[] = {
|
static const OFString *modenames[] = {
|
||||||
|
|
14
src/sound.mm
14
src/sound.mm
|
@ -87,7 +87,6 @@ music(OFString *name)
|
||||||
return;
|
return;
|
||||||
stopsound();
|
stopsound();
|
||||||
if (soundvol && musicvol) {
|
if (soundvol && musicvol) {
|
||||||
@autoreleasepool {
|
|
||||||
name = [name stringByReplacingOccurrencesOfString:@"\\"
|
name = [name stringByReplacingOccurrencesOfString:@"\\"
|
||||||
withString:@"/"];
|
withString:@"/"];
|
||||||
OFString *path =
|
OFString *path =
|
||||||
|
@ -97,34 +96,29 @@ music(OFString *name)
|
||||||
|
|
||||||
#ifdef USE_MIXER
|
#ifdef USE_MIXER
|
||||||
if ((mod = Mix_LoadMUS(
|
if ((mod = Mix_LoadMUS(
|
||||||
IRI.fileSystemRepresentation.UTF8String)) !=
|
IRI.fileSystemRepresentation.UTF8String)) != NULL) {
|
||||||
NULL) {
|
|
||||||
Mix_PlayMusic(mod, -1);
|
Mix_PlayMusic(mod, -1);
|
||||||
Mix_VolumeMusic((musicvol * MAXVOL) / 255);
|
Mix_VolumeMusic((musicvol * MAXVOL) / 255);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if ((mod = FMUSIC_LoadSong(
|
if ((mod = FMUSIC_LoadSong(
|
||||||
IRI.fileSystemRepresentation.UTF8String)) !=
|
IRI.fileSystemRepresentation.UTF8String)) != NULL) {
|
||||||
NULL) {
|
|
||||||
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(
|
||||||
IRI.fileSystemRepresentation.UTF8String,
|
IRI.fileSystemRepresentation.UTF8String,
|
||||||
FSOUND_LOOP_NORMAL, 0, 0)) {
|
FSOUND_LOOP_NORMAL, 0, 0)) {
|
||||||
int chan =
|
int chan = FSOUND_Stream_Play(FSOUND_FREE, stream);
|
||||||
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(
|
conoutf(@"could not play music: %@", IRI.string);
|
||||||
@"could not play music: %@", IRI.string);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMAND(music, ARG_1STR)
|
COMMAND(music, ARG_1STR)
|
||||||
|
|
||||||
|
|
|
@ -67,13 +67,11 @@ trigger(int tag, int type, bool savegame)
|
||||||
if (!savegame && type != 3)
|
if (!savegame && type != 3)
|
||||||
playsound(S_RUMBLE);
|
playsound(S_RUMBLE);
|
||||||
|
|
||||||
@autoreleasepool {
|
|
||||||
OFString *aliasname =
|
OFString *aliasname =
|
||||||
[OFString stringWithFormat:@"level_trigger_%d", tag];
|
[OFString stringWithFormat:@"level_trigger_%d", tag];
|
||||||
|
|
||||||
if (identexists(aliasname))
|
if (identexists(aliasname))
|
||||||
execute(aliasname);
|
execute(aliasname);
|
||||||
}
|
|
||||||
|
|
||||||
if (type == 2)
|
if (type == 2)
|
||||||
endsp(false);
|
endsp(false);
|
||||||
|
@ -306,9 +304,7 @@ delent()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int t = ents[e].type;
|
int t = ents[e].type;
|
||||||
@autoreleasepool {
|
|
||||||
conoutf(@"%@ entity deleted", entnames[t]);
|
conoutf(@"%@ entity deleted", entnames[t]);
|
||||||
}
|
|
||||||
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)
|
||||||
|
@ -318,11 +314,9 @@ delent()
|
||||||
int
|
int
|
||||||
findtype(OFString *what)
|
findtype(OFString *what)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
loopi(MAXENTTYPES) if ([what isEqual:entnames[i]]) return i;
|
loopi(MAXENTTYPES) if ([what isEqual:entnames[i]]) return i;
|
||||||
conoutf(@"unknown entity type \"%@\"", what);
|
conoutf(@"unknown entity type \"%@\"", what);
|
||||||
return NOTUSED;
|
return NOTUSED;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
entity *
|
entity *
|
||||||
|
|
|
@ -14,7 +14,6 @@ static OFString *cgzname, *bakname, *pcfname, *mcfname;
|
||||||
static void
|
static void
|
||||||
setnames(OFString *name)
|
setnames(OFString *name)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
OFCharacterSet *cs =
|
OFCharacterSet *cs =
|
||||||
[OFCharacterSet characterSetWithCharactersInString:@"/\\"];
|
[OFCharacterSet characterSetWithCharactersInString:@"/\\"];
|
||||||
OFRange range = [name rangeOfCharacterFromSet:cs];
|
OFRange range = [name rangeOfCharacterFromSet:cs];
|
||||||
|
@ -30,14 +29,12 @@ setnames(OFString *name)
|
||||||
|
|
||||||
cgzname = [[OFString alloc]
|
cgzname = [[OFString alloc]
|
||||||
initWithFormat:@"packages/%@/%@.cgz", pakname, mapname];
|
initWithFormat:@"packages/%@/%@.cgz", pakname, mapname];
|
||||||
bakname =
|
bakname = [[OFString alloc] initWithFormat:@"packages/%@/%@_%d.BAK",
|
||||||
[[OFString alloc] initWithFormat:@"packages/%@/%@_%d.BAK",
|
|
||||||
pakname, mapname, lastmillis];
|
pakname, mapname, lastmillis];
|
||||||
pcfname = [[OFString alloc]
|
pcfname = [[OFString alloc]
|
||||||
initWithFormat:@"packages/%@/package.cfg", pakname];
|
initWithFormat:@"packages/%@/package.cfg", pakname];
|
||||||
mcfname = [[OFString alloc]
|
mcfname = [[OFString alloc]
|
||||||
initWithFormat:@"packages/%@/%@.cfg", pakname, mapname];
|
initWithFormat:@"packages/%@/%@.cfg", pakname, mapname];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// the optimize routines below are here to reduce the detrimental effects of
|
// the optimize routines below are here to reduce the detrimental effects of
|
||||||
|
@ -160,7 +157,6 @@ readmap(OFString *mname)
|
||||||
void
|
void
|
||||||
save_world(OFString *mname)
|
save_world(OFString *mname)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
resettagareas(); // wouldn't be able to reproduce tagged areas
|
resettagareas(); // wouldn't be able to reproduce tagged areas
|
||||||
// otherwise
|
// otherwise
|
||||||
voptimize();
|
voptimize();
|
||||||
|
@ -169,8 +165,8 @@ save_world(OFString *mname)
|
||||||
mname = getclientmap();
|
mname = getclientmap();
|
||||||
setnames(mname);
|
setnames(mname);
|
||||||
backup(cgzname, bakname);
|
backup(cgzname, bakname);
|
||||||
gzFile f = gzopen(
|
gzFile f =
|
||||||
[cgzname cStringWithEncoding:OFLocale.encoding], "wb9");
|
gzopen([cgzname cStringWithEncoding:OFLocale.encoding], "wb9");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
conoutf(@"could not write map to %@", cgzname);
|
conoutf(@"could not write map to %@", cgzname);
|
||||||
return;
|
return;
|
||||||
|
@ -223,9 +219,9 @@ save_world(OFString *mname)
|
||||||
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(ctex) && c(ftex) && c(utex) && c(wtex) &&
|
c(ftex) && c(utex) && c(wtex) && c(vdelta) &&
|
||||||
c(vdelta) && c(tag)) {
|
c(tag)) {
|
||||||
sc++;
|
sc++;
|
||||||
} else {
|
} else {
|
||||||
spurge;
|
spurge;
|
||||||
|
@ -246,7 +242,6 @@ save_world(OFString *mname)
|
||||||
gzclose(f);
|
gzclose(f);
|
||||||
conoutf(@"wrote map file %@", cgzname);
|
conoutf(@"wrote map file %@", cgzname);
|
||||||
settagareas();
|
settagareas();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
COMMANDN(savemap, save_world, ARG_1STR)
|
COMMANDN(savemap, save_world, ARG_1STR)
|
||||||
|
|
||||||
|
@ -254,13 +249,12 @@ void
|
||||||
load_world(OFString *mname) // still supports all map formats that have existed
|
load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
// since the earliest cube betas!
|
// since the earliest cube betas!
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
stopifrecording();
|
stopifrecording();
|
||||||
cleardlights();
|
cleardlights();
|
||||||
pruneundos();
|
pruneundos();
|
||||||
setnames(mname);
|
setnames(mname);
|
||||||
gzFile f = gzopen(
|
gzFile f =
|
||||||
[cgzname cStringWithEncoding:OFLocale.encoding], "rb9");
|
gzopen([cgzname cStringWithEncoding:OFLocale.encoding], "rb9");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
conoutf(@"could not read map %@", cgzname);
|
conoutf(@"could not read map %@", cgzname);
|
||||||
return;
|
return;
|
||||||
|
@ -288,8 +282,7 @@ load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
e.spawned = false;
|
e.spawned = false;
|
||||||
if (e.type == LIGHT) {
|
if (e.type == LIGHT) {
|
||||||
if (!e.attr2)
|
if (!e.attr2)
|
||||||
e.attr2 =
|
e.attr2 = 255; // needed for MAPVERSION<=2
|
||||||
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
|
||||||
}
|
}
|
||||||
|
@ -337,8 +330,7 @@ load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
default: {
|
default: {
|
||||||
if (type < 0 || type >= MAXTYPE) {
|
if (type < 0 || type >= MAXTYPE) {
|
||||||
OFString *t = [OFString
|
OFString *t = [OFString
|
||||||
stringWithFormat:@"%d @ %d", type,
|
stringWithFormat:@"%d @ %d", type, k];
|
||||||
k];
|
|
||||||
fatal(@"while reading map: type out of "
|
fatal(@"while reading map: type out of "
|
||||||
@"range: ",
|
@"range: ",
|
||||||
t);
|
t);
|
||||||
|
@ -356,8 +348,7 @@ load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
gzgetc(f);
|
gzgetc(f);
|
||||||
}
|
}
|
||||||
s->vdelta = gzgetc(f);
|
s->vdelta = gzgetc(f);
|
||||||
s->utex =
|
s->utex = (hdr.version >= 2) ? gzgetc(f) : s->wtex;
|
||||||
(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;
|
||||||
}
|
}
|
||||||
|
@ -366,8 +357,7 @@ load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
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->utex] = texuse[s->ftex] = texuse[s->ctex] = 1;
|
||||||
texuse[s->ctex] = 1;
|
|
||||||
}
|
}
|
||||||
gzclose(f);
|
gzclose(f);
|
||||||
calclight();
|
calclight();
|
||||||
|
@ -387,9 +377,8 @@ load_world(OFString *mname) // still supports all map formats that have existed
|
||||||
alias(aliasname, @"");
|
alias(aliasname, @"");
|
||||||
}
|
}
|
||||||
OFIRI *gameDataIRI = Cube.sharedInstance.gameDataIRI;
|
OFIRI *gameDataIRI = Cube.sharedInstance.gameDataIRI;
|
||||||
execfile([gameDataIRI IRIByAppendingPathComponent:
|
execfile([gameDataIRI
|
||||||
@"data/default_map_settings.cfg"]);
|
IRIByAppendingPathComponent:@"data/default_map_settings.cfg"]);
|
||||||
execfile([gameDataIRI IRIByAppendingPathComponent:pcfname]);
|
execfile([gameDataIRI IRIByAppendingPathComponent:pcfname]);
|
||||||
execfile([gameDataIRI IRIByAppendingPathComponent:mcfname]);
|
execfile([gameDataIRI IRIByAppendingPathComponent:mcfname]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue