// main.cpp: initialisation & main loop #include "cube.h" void cleanup(char *msg) // single program exit point; { stop(); disconnect(true); writecfg(); cleangl(); cleansound(); cleanupserver(); SDL_ShowCursor(1); if(msg) { #ifdef _WIN32 MessageBox(NULL, msg, "cube fatal error", MB_OK|MB_SYSTEMMODAL); #else printf(msg); #endif }; SDL_Quit(); exit(1); }; void quit() // normal exit { writeservercfg(); cleanup(NULL); }; void fatal(char *s, char *o) // failure exit { sprintf_sd(msg)("%s%s (%s)\n", s, o, SDL_GetError()); cleanup(msg); }; void *alloc(int s) // for some big chunks... most other allocs use the memory pool { void *b = calloc(1,s); if(!b) fatal("out of memory!"); return b; }; int scr_w = 640; int scr_h = 480; void screenshot() { SDL_Surface *image; SDL_Surface *temp; int idx; if(image = SDL_CreateRGBSurface(SDL_SWSURFACE, scr_w, scr_h, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0)) { if(temp = SDL_CreateRGBSurface(SDL_SWSURFACE, scr_w, scr_h, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0)) { glReadPixels(0, 0, scr_w, scr_h, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); for (idx = 0; idxpixels+3*scr_w*idx; memcpy(dest, (char *)image->pixels+3*scr_w*(scr_h-1-idx), 3*scr_w); endianswap(dest, 3, scr_w); }; sprintf_sd(buf)("screenshots/screenshot_%d.bmp", lastmillis); SDL_SaveBMP(temp, path(buf)); SDL_FreeSurface(temp); }; SDL_FreeSurface(image); }; }; COMMAND(screenshot, ARG_NONE); COMMAND(quit, ARG_NONE); void keyrepeat(bool on) { SDL_EnableKeyRepeat(on ? SDL_DEFAULT_REPEAT_DELAY : 0, SDL_DEFAULT_REPEAT_INTERVAL); }; VARF(gamespeed, 10, 100, 1000, if(multiplayer()) gamespeed = 100); VARP(minmillis, 0, 5, 1000); int islittleendian = 1; int framesinmap = 0; int main(int argc, char **argv) { bool dedicated = false; int fs = SDL_FULLSCREEN, par = 0, uprate = 0, maxcl = 4; char *sdesc = "", *ip = "", *master = NULL, *passwd = ""; islittleendian = *((char *)&islittleendian); #define log(s) conoutf("init: %s", s) log("sdl"); for(int i = 1; i200) lastmillis = millis-200; else if(millis-lastmillis<1) lastmillis = millis-1; if(millis-lastmilliso.x, player1->o.y); readdepth(scr_w, scr_h); SDL_GL_SwapBuffers(); extern void updatevol(); updatevol(); if(framesinmap++<5) // cheap hack to get rid of initial sparklies, even when triple buffering etc. { player1->yaw += 5; gl_drawframe(scr_w, scr_h, fps); player1->yaw -= 5; }; gl_drawframe(scr_w, scr_h, fps); SDL_Event event; int lasttype = 0, lastbut = 0; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: quit(); break; case SDL_KEYDOWN: case SDL_KEYUP: keypress(event.key.keysym.sym, event.key.state==SDL_PRESSED, event.key.keysym.unicode); break; case SDL_MOUSEMOTION: if(ignore) { ignore--; break; }; mousemove(event.motion.xrel, event.motion.yrel); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if(lasttype==event.type && lastbut==event.button.button) break; // why?? get event twice without it keypress(-event.button.button, event.button.state!=0, 0); lasttype = event.type; lastbut = event.button.button; break; }; }; }; quit(); return 1; };