diff --git a/config/menus_multiplayer.cfg b/config/menus_multiplayer.cfg index 6618ace1..2b04da85 100644 --- a/config/menus_multiplayer.cfg +++ b/config/menus_multiplayer.cfg @@ -54,7 +54,7 @@ menuitem "" -1 menuitemtextinput "Nickname: " "result $curname" "name $arg1" menuitem "Change weapon..." "showmenu Weapons" [__ingamemenu_showmodel "In-game admin" 0] menuitem "Change to the enemy team" "changeteam" [__ingamemenu_showmodel "In-game admin" 1] -menuitem "Change to spectate mode" "gospectate" [__ingamemenu_showmodel "In-game admin" 1] +menuitem "Change to spectate mode" "spectate" [__ingamemenu_showmodel "In-game admin" 1] menuitem "Change player skin..." [showmenu (at [CLA RVSF] (curteam))] [__ingamemenu_showmodel "In-game admin" 1] menuitem "Demos..." "showmenu Demo" [__ingamemenu_showmodel "In-game admin" 0] menuitem "" -1 diff --git a/docs/commandline.html b/docs/commandline.html index deb6213f..dcce0cef 100644 --- a/docs/commandline.html +++ b/docs/commandline.html @@ -624,6 +624,14 @@ e.g. -D5 + + + -DI + + + Limit the demo downloading to intermission (it doubles the intermission time if someone is downloading a demo). + + -Wf diff --git a/source/src/command.cpp b/source/src/command.cpp index fc4da58d..60422969 100644 --- a/source/src/command.cpp +++ b/source/src/command.cpp @@ -701,6 +701,16 @@ void exec(const char *cfgfile) if(!execfile(cfgfile)) conoutf("could not read \"%s\"", cfgfile); } +void execdir(const char *dir) +{ + vector files; + listfiles(dir, "cfg", files); + loopv(files) { + defformatstring(d)("%s/%s.cfg",dir,files[i]); + exec(d); + } +} +COMMAND(execdir,ARG_1STR); // below the commands that implement a small imperative language. thanks to the semantics of // () and [] expressions, any control construct can be defined trivially. diff --git a/source/src/cube.h b/source/src/cube.h index 3f094e49..d1e5972b 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -52,7 +52,7 @@ extern int verbose; #include "protos.h" // external function decls -#define AC_VERSION 1101 +#define AC_VERSION 1102 #define AC_MASTER_URI "assault.cubers.net" #define AC_MASTER_PORT 28760 #define MAXCL 20 diff --git a/source/src/main.cpp b/source/src/main.cpp index d6117e6f..adeca1b9 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -739,7 +739,7 @@ void checkinput() { if (event.key.state==SDL_PRESSED) { - extern void tsens(int x); + extern int tsens(int x); tsens(event.key.keysym.sym); } } @@ -876,212 +876,212 @@ int main(int argc, char **argv) else conoutf("\f3unknown commandline argument: %c", argv[i][0]); } } - if(quitdirectly) return EXIT_SUCCESS; + if(quitdirectly) return EXIT_SUCCESS; - i18nmanager i18n("AC", path("packages/locale", true)); + i18nmanager i18n("AC", path("packages/locale", true)); - initing = NOT_INITING; + initing = NOT_INITING; - initlog("sdl"); - int par = 0; - #ifdef _DEBUG - par = SDL_INIT_NOPARACHUTE; - #endif - if(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO|par)<0) fatal("Unable to initialize SDL"); + initlog("sdl"); + int par = 0; +#ifdef _DEBUG + par = SDL_INIT_NOPARACHUTE; +#endif + if(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO|par)<0) fatal("Unable to initialize SDL"); - #if 0 - if(highprocesspriority) setprocesspriority(true); - #endif +#if 0 + if(highprocesspriority) setprocesspriority(true); +#endif - if (!dedicated) initlog("net"); - if(enet_initialize()<0) fatal("Unable to initialise network module"); + if (!dedicated) initlog("net"); + if(enet_initialize()<0) fatal("Unable to initialise network module"); - if (!dedicated) initclient(); + if (!dedicated) initclient(); //FIXME the server executed in this way does not catch the SIGTERM or ^C - initserver(dedicated,argc,argv); // never returns if dedicated + initserver(dedicated,argc,argv); // never returns if dedicated - initlog("world"); - empty_world(7, true); + initlog("world"); + empty_world(7, true); - initlog("video: sdl"); - if(SDL_InitSubSystem(SDL_INIT_VIDEO)<0) fatal("Unable to initialize SDL Video"); + initlog("video: sdl"); + if(SDL_InitSubSystem(SDL_INIT_VIDEO)<0) fatal("Unable to initialize SDL Video"); - initlog("video: mode"); - int usedcolorbits = 0, useddepthbits = 0, usedfsaa = 0; - setupscreen(usedcolorbits, useddepthbits, usedfsaa); + initlog("video: mode"); + int usedcolorbits = 0, useddepthbits = 0, usedfsaa = 0; + setupscreen(usedcolorbits, useddepthbits, usedfsaa); // no more TTF ATM. - //initlog("font"); - //initfont(); + //initlog("font"); + //initfont(); - initlog("video: misc"); - SDL_WM_SetCaption("AssaultCube", NULL); - keyrepeat(false); - SDL_ShowCursor(0); + initlog("video: misc"); + SDL_WM_SetCaption("AssaultCube", NULL); + keyrepeat(false); + SDL_ShowCursor(0); - initlog("gl"); - gl_checkextensions(); - gl_init(scr_w, scr_h, usedcolorbits, useddepthbits, usedfsaa); + initlog("gl"); + gl_checkextensions(); + gl_init(scr_w, scr_h, usedcolorbits, useddepthbits, usedfsaa); - notexture = noworldtexture = textureload("packages/misc/notexture.jpg"); - if(!notexture) fatal("could not find core textures (hint: run AssaultCube from the parent of the bin directory)"); + notexture = noworldtexture = textureload("packages/misc/notexture.jpg"); + if(!notexture) fatal("could not find core textures (hint: run AssaultCube from the parent of the bin directory)"); - initlog("console"); - persistidents = false; - if(!execfile("config/font.cfg")) fatal("cannot find default font definitions"); - if(!execfile("config/mono.cfg")) fatal("cannot find default font definitions"); - if(!setfont("mono")) fatal("no mono font specified"); - if(!setfont("default")) fatal("no default font specified"); + initlog("console"); + persistidents = false; + if(!execfile("config/font.cfg")) fatal("cannot find default font definitions"); + if(!execfile("config/mono.cfg")) fatal("cannot find default font definitions"); + if(!setfont("mono")) fatal("no mono font specified"); + if(!setfont("default")) fatal("no default font specified"); - loadingscreen(); + loadingscreen(); - particleinit(); + particleinit(); - initlog("sound"); - audiomgr.initsound(); + initlog("sound"); + audiomgr.initsound(); - initlog("cfg"); - extern void *scoremenu, *teammenu, *ctfmenu, *servmenu, *searchmenu, *serverinfomenu, *kickmenu, *banmenu, *forceteammenu, *giveadminmenu, *docmenu, *applymenu; + initlog("cfg"); + extern void *scoremenu, *teammenu, *ctfmenu, *servmenu, *searchmenu, *serverinfomenu, *kickmenu, *banmenu, *forceteammenu, *giveadminmenu, *docmenu, *applymenu; scoremenu = addmenu("score", "columns", false, renderscores, NULL, false, true); teammenu = addmenu("team score", "columns", false, renderscores, NULL, false, true); ctfmenu = addmenu("ctf score", "columns", false, renderscores, NULL, false, true); reorderscorecolumns(); - servmenu = addmenu("server", NULL, true, refreshservers, serverskey); - searchmenu = addmenu("search", NULL, true, refreshservers, serverskey); - serverinfomenu = addmenu("serverinfo", NULL, true, refreshservers, serverinfokey); - kickmenu = addmenu("kick player", NULL, true, refreshsopmenu); - banmenu = addmenu("ban player", NULL, true, refreshsopmenu); - forceteammenu = addmenu("force team", NULL, true, refreshsopmenu); - giveadminmenu = addmenu("give admin", NULL, true, refreshsopmenu); - docmenu = addmenu("reference", NULL, true, renderdocmenu); - applymenu = addmenu("apply", "apply changes now?", true, refreshapplymenu); + servmenu = addmenu("server", NULL, true, refreshservers, serverskey); + searchmenu = addmenu("search", NULL, true, refreshservers, serverskey); + serverinfomenu = addmenu("serverinfo", NULL, true, refreshservers, serverinfokey); + kickmenu = addmenu("kick player", NULL, true, refreshsopmenu); + banmenu = addmenu("ban player", NULL, true, refreshsopmenu); + forceteammenu = addmenu("force team", NULL, true, refreshsopmenu); + giveadminmenu = addmenu("give admin", NULL, true, refreshsopmenu); + docmenu = addmenu("reference", NULL, true, renderdocmenu); + applymenu = addmenu("apply", "apply changes now?", true, refreshapplymenu); - exec("config/scontext.cfg"); - exec("config/locale.cfg"); - exec("config/keymap.cfg"); - exec("config/menus.cfg"); - exec("config/scripts.cfg"); - exec("config/prefabs.cfg"); - exec("config/sounds.cfg"); - exec("config/securemaps.cfg"); - exec("config/admin.cfg"); - execfile("config/servers.cfg"); - persistidents = true; + exec("config/scontext.cfg"); + exec("config/locale.cfg"); + exec("config/keymap.cfg"); + exec("config/menus.cfg"); + exec("config/scripts.cfg"); + exec("config/prefabs.cfg"); + exec("config/sounds.cfg"); + exec("config/securemaps.cfg"); + exec("config/admin.cfg"); + execfile("config/servers.cfg"); + persistidents = true; - static char resdata[] = { 112, 97, 99, 107, 97, 103, 101, 115, 47, 116, 101, 120, 116, 117, 114, 101, 115, 47, 107, 117, 114, 116, 47, 107, 108, 105, 116, 101, 50, 46, 106, 112, 103, 0 }; - stream *f = opengzfile(resdata, "rb"); - if(f) - { - int n = f->getlil(); - loopi(n) - { - string s; - f->read(s, sizeof(string)); - enet_uint32 c = f->getlil(); - setresdata(s, c); - } + static char resdata[] = { 112, 97, 99, 107, 97, 103, 101, 115, 47, 116, 101, 120, 116, 117, 114, 101, 115, 47, 107, 117, 114, 116, 47, 107, 108, 105, 116, 101, 50, 46, 106, 112, 103, 0 }; + stream *f = opengzfile(resdata, "rb"); + if(f) + { + int n = f->getlil(); + loopi(n) + { + string s; + f->read(s, sizeof(string)); + enet_uint32 c = f->getlil(); + setresdata(s, c); + } delete f; - } + } - initing = INIT_LOAD; - if(!execfile("config/saved.cfg")) - { - exec("config/defaults.cfg"); - firstrun = true; - } - execfile("config/autoexec.cfg"); - execute("addallfavcatmenus"); // exec here, to add all categories (including those defined in autoexec.cfg) - initing = NOT_INITING; + initing = INIT_LOAD; + if(!execfile("config/saved.cfg")) + { + exec("config/defaults.cfg"); + firstrun = true; + } + execfile("config/autoexec.cfg"); + execute("addallfavcatmenus"); // exec here, to add all categories (including those defined in autoexec.cfg) + initing = NOT_INITING; - initlog("models"); - preload_playermodels(); - preload_hudguns(); - preload_entmodels(); + initlog("models"); + preload_playermodels(); + preload_hudguns(); + preload_entmodels(); - initlog("docs"); - persistidents = false; - execfile("config/docs.cfg"); - persistidents = true; + initlog("docs"); + persistidents = false; + execfile("config/docs.cfg"); + persistidents = true; - initlog("localconnect"); - extern string clientmap; + initlog("localconnect"); + extern string clientmap; - if(initdemo) - { - extern int gamemode; - gamemode = -1; - copystring(clientmap, initdemo); - } - else - copystring(clientmap, initmap); // ac_complex for 1.0, ac_shine for 1.1, .. + if(initdemo) + { + extern int gamemode; + gamemode = -1; + copystring(clientmap, initdemo); + } + else + copystring(clientmap, initmap); // ac_complex for 1.0, ac_shine for 1.1, .. - localconnect(); + localconnect(); - if(initscript) execute(initscript); + if(initscript) execute(initscript); - initlog("mainloop"); + initlog("mainloop"); - inputgrab(grabinput = true); + inputgrab(grabinput = true); - inmainloop = true; + inmainloop = true; #ifdef _DEBUG - int lastflush = 0; + int lastflush = 0; #endif - for(;;) - { - static int frames = 0; - static float fps = 10.0f; - int millis = SDL_GetTicks() - clockrealbase; - if(clockfix) millis = int(millis*(double(clockerror)/1000000)); - millis += clockvirtbase; - if(milliso.x, camera1->o.y, dynfov()); - if(frames>3 && !minimized) - { - gl_drawframe(screen->w, screen->h, fpshighfps ? fps/highfps : 1.0f), fps); - if(frames>4) SDL_GL_SwapBuffers(); - } + computeraytable(camera1->o.x, camera1->o.y, dynfov()); + if(frames>3 && !minimized) + { + gl_drawframe(screen->w, screen->h, fpshighfps ? fps/highfps : 1.0f), fps); + if(frames>4) SDL_GL_SwapBuffers(); + } - if(needsautoscreenshot) makeautoscreenshot(); + if(needsautoscreenshot) makeautoscreenshot(); #ifdef _DEBUG - if(millis>lastflush+60000) { fflush(stdout); lastflush = millis; } + if(millis>lastflush+60000) { fflush(stdout); lastflush = millis; } #endif - } + } - quit(); + quit(); return EXIT_SUCCESS; - #if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__) +#if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__) } __except(stackdumper(0, GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) { return 0; } - #endif +#endif } VAR(version, 1, AC_VERSION, 0); diff --git a/source/src/physics.cpp b/source/src/physics.cpp index 61dad459..760fbfcb 100644 --- a/source/src/physics.cpp +++ b/source/src/physics.cpp @@ -760,65 +760,95 @@ VARP(invmouse, 0, 0, 1); FVARP(mouseaccel, 0, 0, 1000); FVARP(mfilter, 0.0f, 0.0f, 6.0f); VARP(autoscopesens, 0, 0, 1); -float fdx = 0, fdy = 0; - - float testsens=0; bool senst=0; -void tsens(int x) +int tsens(int x) { static bool highlock=0,lowlock=0; + static bool hightry=0,lowtry=0; static float sensn=0,sensl=0,sensh=0; + static int nstep=1; + if (x==-2000) { // RENDERING PART!!! + if(senst) { + draw_textf( + "\fJSensitivity Training (hotkeys):\n\fE1. try High Sens. %s\n2. try Low Sens. %s\n\fJ%s :" + "\fE\n3. choose: High Sens.\n4. choose: Low Sens.\n\fIrepeat the steps above until the training stops.\n\f35. Stop Training.", + VIRTW/4 , VIRTH/3, + hightry?"(TRYED)":"" , lowtry?"(TRYED)":"", + hightry&&lowtry?"after trying both choose the one you liked most":"now you can choose the sensitivity you preferred"); + glPushMatrix(); glScalef(2,2,2); + draw_textf("step: \f0%d",VIRTW/2 , VIRTH/3*2,nstep); + glPopMatrix(); + } + return 0; + } if (x == SDLK_3 || x == SDLK_4) { - if (x == SDLK_3) //high sens - { - lowlock=1; - if (highlock) - { - sensl=sensn; - sensn=(sensh+sensl)/2.0f; + if(!hightry || !lowtry) { + if(!hightry && !lowtry) { + conoutf("--- \f3ERROR:\f0before choosing a sensitivity, first try both higher and lower sens."); + } else { + conoutf("--- \f3ERROR:\f0try the %s%ser sensitivity too.",hightry?"":"high",lowtry?"":"low"); } - else + } else { + if (x == SDLK_3) //high sens { - sensl=sensn; - sensn=sensh; - sensh=sensn*2.0f; + lowlock=1; + if (highlock) + { + sensl=sensn; + sensn=(sensh+sensl)/2.0f; + } + else + { + sensl=sensn; + sensn=sensh; + sensh=sensn*2.0f; + } } + if (x == SDLK_4) //low sens + { + highlock=1; + if (lowlock) + { + sensh=sensn; + sensn=(sensh+sensl)/2.0f; + } + else + { + sensh=sensn; + sensn=sensl; + sensl=sensn/2.0f; + } + } + if(sensh/sensn > 1.04f) { + conoutf("--- \f0you choose: the %ser sensitivity.",x==SDLK_3?"higher":"lower"); + conoutf("--- \f0repeat previous steps by trying both higher and lower sens and then by choosing the one you like most."); + hudoutf("next step!"); + nstep++; + } + testsens=sensn; + hightry=lowtry=0; } - if (x == SDLK_4) //low sens - { - highlock=1; - if (lowlock) - { - sensh=sensn; - sensn=(sensh+sensl)/2.0f; - } - else - { - sensh=sensn; - sensn=sensl; - sensl=sensn/2.0f; - } - } - conoutf("--- \f0you choose: the %s sens",x==SDLK_3?"higher":"lower"); - testsens=sensn; + } if (x == SDLK_2) { testsens=sensl; - conoutf("--- \f0You are now trying the lower sens."); + conoutf("--- \f0You are now %strying the lower sensitivity.",lowtry?"re-":""); lowtry=1; } if (x == SDLK_1) { testsens=sensh; - conoutf("--- \f0You are now trying the higher sens."); + conoutf("--- \f0You are now %strying the higher sensitivity.",hightry?"re-":""); hightry=1; } if (x==-1000) { - sensh=sensitivity*2.0f; - sensl=sensitivity/2.0f; - sensn=sensitivity; + float factor=rnd(800)+600; + factor/=1000; + sensh=sensitivity*factor*2.0f; + sensl=sensitivity*factor/2.0f; + sensn=sensitivity*factor; } if (sensh/sensn <= 1.04f || x == SDLK_5) { @@ -829,17 +859,22 @@ void tsens(int x) } else { conoutf("--- \f0Sensitivity Training Stopped."); } - highlock=lowlock=0; + hightry=lowtry=highlock=lowlock=0; sensn=sensl=sensh=0; testsens=0; + nstep=1; } +return 0; } void findsens() { - senst=1; - tsens(-1000); - testsens=sensitivity; - conoutf("--- \f0Sensitivity Training Started."); + if(!watchingdemo) { + senst=1; + tsens(-1000); + testsens=sensitivity; + conoutf("--- \f0Sensitivity Training Started."); + return; + } } COMMAND(findsens,ARG_NONE); @@ -848,9 +883,8 @@ inline bool zooming(playerent *plx) { return (plx->weaponsel->type == GUN_SNIPER void mousemove(int odx, int ody) { - if(intermission) return; - if(player1->isspectating() && player1->spectatemode==SM_FOLLOW1ST) return; - + static float fdx = 0, fdy = 0; + if(intermission || (player1->isspectating() && player1->spectatemode==SM_FOLLOW1ST)) return; float dx = odx, dy = ody; if(mfilter > 0.0f) { @@ -858,7 +892,6 @@ void mousemove(int odx, int ody) dx = fdx = dx * ( 1.0f - k ) + fdx * k; dy = fdy = dy * ( 1.0f - k ) + fdy * k; } - float cursens = sensitivity; if(senst) {cursens=testsens;} if(mouseaccel && curtime && (dx || dy)) cursens += 0.02f * mouseaccel * sqrtf(dx*dx + dy*dy)/curtime; @@ -866,8 +899,8 @@ void mousemove(int odx, int ody) if( zooming(player1) ) { - extern float fov; extern int scopefov; - cursens *= autoscopesens ? ((float)scopefov*0.66f/fov) : scopesensscale; + extern float scopesensfunc; + cursens *= autoscopesens ? scopesensfunc : scopesensscale; } camera1->yaw += dx*cursens; diff --git a/source/src/rendergl.cpp b/source/src/rendergl.cpp index b55adb49..8704730e 100644 --- a/source/src/rendergl.cpp +++ b/source/src/rendergl.cpp @@ -419,10 +419,15 @@ void fixresizedscreen() #endif } -FVARP(fov, 75, 90, 120); -VARP(scopefov, 5, 50, 60); +float scopesensfunc = 0.4663077f +void scopefunc(); +FVARFP(fov, 75, 90, 120, scopefunc()); +VARFP(scopefov, 5, 50, 60, scopefunc()); VARP(spectfov, 5, 110, 120); - +void scopefunc() +{ + scopesensfunc = tan(((float)scopefov)*0.5f*RAD)/tan(fov*0.5f*RAD); +} // map old fov values to new ones void fovcompat(int oldfov) diff --git a/source/src/renderhud.cpp b/source/src/renderhud.cpp index 7d7a7410..1b54c991 100644 --- a/source/src/renderhud.cpp +++ b/source/src/renderhud.cpp @@ -766,10 +766,8 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat glLoadIdentity(); glOrtho(0, VIRTW*2, VIRTH*2, 0, -1, 1); - extern bool senst; - if(senst) { - draw_textf("\fJSensitivity Training (hotkeys):\n\fE1. try High Sens.\n2. try Low Sens.\n\fJafter trying both choose the one you liked most:\fE\n3. choose: High Sens.\n4. choose: Low Sens.\n\fIrepeat the steps above until the training stops.\n\f35. Stop Training.", VIRTW/4, VIRTH/3); - } + extern int tsens(int x); + tsens(-2000); if(!hideconsole) renderconsole(); if(showstats)