diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index 54672525..5e6ccda3 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -555,6 +555,9 @@ CL_DemoCompleted */ void CL_DemoCompleted( void ) { + if( cls.demonum != -1 ) + cls.changedemo = true; + CL_StopPlayback(); if( !CL_NextDemo() && host.developer <= 2 ) @@ -663,6 +666,10 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length ) return false; } + // HACKHACK: changedemo issues + if( !cls.netchan.remote_address.type ) + cls.netchan.remote_address.type = NA_LOOPBACK; + if( cl.refdef.paused || cls.key_dest != key_game ) { demo.starttime += host.frametime; @@ -790,10 +797,15 @@ void CL_StopPlayback( void ) demo.directory.entries = NULL; demo.entry = NULL; - // let game known about movie state - cls.state = ca_disconnected; cls.demoname[0] = '\0'; // clear demoname too menu.globals->demoname[0] = '\0'; + + if( !cls.changedemo ) + { + // let game known about movie state + cls.state = ca_disconnected; + cls.demonum = -1; + } } /* @@ -1022,6 +1034,17 @@ void CL_PlayDemo_f( void ) return; } + if( cls.demoplayback ) + { + CL_StopPlayback(); + } + + if( cls.demorecording ) + { + Msg( "Can't playback during demo record.\n"); + return; + } + Q_strncpy( demoname, Cmd_Argv( 1 ), sizeof( demoname ) - 1 ); Q_snprintf( filename, sizeof( filename ), "demos/%s.dem", demoname ); @@ -1075,15 +1098,27 @@ void CL_PlayDemo_f( void ) FS_Close( cls.demofile ); cls.demofile = NULL; cls.demonum = -1; // stop demo loop + cls.changedemo = false; return; } - // NOTE: at this point demo is still valid - CL_Disconnect(); - Host_ShutdownServer(); + if( cls.changedemo ) + { + S_StopAllSounds(); + SCR_BeginLoadingPlaque( cl.background ); - Con_Close(); - UI_SetActiveMenu( false ); + CL_ClearState (); + CL_InitEdicts (); // re-arrange edicts + } + else + { + // NOTE: at this point demo is still valid + CL_Disconnect(); + Host_ShutdownServer(); + + Con_Close(); + UI_SetActiveMenu( false ); + } // allocate demo entries demo.directory.entries = Mem_Alloc( cls.mempool, sizeof( demoentry_t ) * demo.directory.numentries ); @@ -1154,7 +1189,7 @@ Return to looping demos void CL_Demos_f( void ) { if( cls.demonum == -1 ) - cls.demonum = 1; + cls.demonum = 0; CL_Disconnect (); CL_NextDemo (); diff --git a/engine/client/cl_frame.c b/engine/client/cl_frame.c index ff2224ee..d0be979a 100644 --- a/engine/client/cl_frame.c +++ b/engine/client/cl_frame.c @@ -791,6 +791,7 @@ void CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta ) cls.state = ca_active; cl.force_refdef = true; cls.changelevel = false; // changelevel is done + cls.changedemo = false; // changedemo is done SCR_MakeLevelShot(); // make levelshot if needs Cvar_SetFloat( "scr_loading", 0.0f ); // reset progress bar diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 6f84aed0..527b190e 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -629,7 +629,7 @@ can be modulated void CL_DrawScreenFade( void ) { screenfade_t *sf = &clgame.fade; - int iFadeAlpha; + int iFadeAlpha, testFlags; // keep pushing reset time out indefinitely if( sf->fadeFlags & FFADE_STAYOUT ) @@ -645,8 +645,10 @@ void CL_DrawScreenFade( void ) return; } + testFlags = (sf->fadeFlags & ~FFADE_MODULATE); + // fading... - if( sf->fadeFlags == FFADE_STAYOUT ) + if( testFlags == FFADE_STAYOUT ) { iFadeAlpha = sf->fadealpha; } @@ -659,7 +661,9 @@ void CL_DrawScreenFade( void ) pglColor4ub( sf->fader, sf->fadeg, sf->fadeb, iFadeAlpha ); - GL_SetRenderMode( kRenderTransTexture ); + if( sf->fadeFlags & FFADE_MODULATE ) + GL_SetRenderMode( kRenderTransAdd ); + else GL_SetRenderMode( kRenderTransTexture ); R_DrawStretchPic( 0, 0, scr_width->integer, scr_height->integer, 0, 0, 1, 1, cls.fillImage ); pglColor4ub( 255, 255, 255, 255 ); } diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 45060328..8ad4f770 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -786,6 +786,7 @@ void CL_Disconnect( void ) return; cls.connect_time = 0; + cls.changedemo = false; CL_Stop_f(); // send a disconnect message to the server diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index d7f7c514..d14f3201 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -541,7 +541,7 @@ void CL_ParseServerData( sizebuf_t *msg ) clgame.load_sequence++; // now all hud sprites are invalid // wipe the client_t struct - if( !cls.changelevel ) + if( !cls.changelevel && !cls.changedemo ) CL_ClearState (); cls.state = ca_connected; @@ -583,7 +583,8 @@ void CL_ParseServerData( sizebuf_t *msg ) menu.globals->maxClients = cl.maxclients; Q_strncpy( menu.globals->maptitle, clgame.maptitle, sizeof( menu.globals->maptitle )); - if( !cls.changelevel ) CL_InitEdicts (); // re-arrange edicts + if( !cls.changelevel && !cls.changedemo ) + CL_InitEdicts (); // re-arrange edicts // get splash name Cvar_Set( "cl_levelshot_name", va( "levelshots/%s", clgame.mapname )); diff --git a/engine/client/client.h b/engine/client/client.h index 7afb3899..4cd6cbec 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -434,6 +434,7 @@ typedef struct connstate_t state; qboolean initialized; qboolean changelevel; // during changelevel + qboolean changedemo; // during changedemo // screen rendering information float disable_screen; // showing loading plaque between levels @@ -612,6 +613,7 @@ void CL_Demos_f( void ); void CL_DeleteDemo_f( void ); void CL_Record_f( void ); void CL_Stop_f( void ); +void CL_FreeDemo( void ); // // cl_events.c diff --git a/engine/client/gl_rmath.c b/engine/client/gl_rmath.c index 43438a49..040cd222 100644 --- a/engine/client/gl_rmath.c +++ b/engine/client/gl_rmath.c @@ -16,6 +16,7 @@ GNU General Public License for more details. #include "common.h" #include "gl_local.h" #include "mathlib.h" +#include "client.h" /* ==================== @@ -28,7 +29,8 @@ float V_CalcFov( float *fov_x, float width, float height ) if( *fov_x < 1 || *fov_x > 170 ) { - MsgDev( D_ERROR, "V_CalcFov: bad fov %g!\n", *fov_x ); + if( !cls.demoplayback ) + MsgDev( D_ERROR, "V_CalcFov: bad fov %g!\n", *fov_x ); *fov_x = 90; } diff --git a/engine/client/gl_rpart.c b/engine/client/gl_rpart.c index af7148aa..bda8cfcc 100644 --- a/engine/client/gl_rpart.c +++ b/engine/client/gl_rpart.c @@ -1023,14 +1023,14 @@ void CL_RocketTrail( vec3_t start, vec3_t end, int type ) switch( type ) { case 0: // rocket trail - p->ramp = Com_RandomLong( 0, 4 ); + p->ramp = (rand() & 3); p->color = ramp3[(int)p->ramp]; p->type = pt_fire; for( j = 0; j < 3; j++ ) p->org[j] = start[j] + ((rand() % 6 ) - 3 ); break; case 1: // smoke smoke - p->ramp = Com_RandomLong( 2, 6 ); + p->ramp = (rand() & 3) + 2; p->color = ramp3[(int)p->ramp]; p->type = pt_fire; for( j = 0; j < 3; j++ ) @@ -1038,7 +1038,7 @@ void CL_RocketTrail( vec3_t start, vec3_t end, int type ) break; case 2: // blood p->type = pt_grav; - p->color = Com_RandomLong( 67, 71 ); + p->color = 67 + (rand() & 3); for( j = 0; j < 3; j++ ) p->org[j] = start[j] + ((rand() % 6 ) - 3 ); break; @@ -1066,17 +1066,17 @@ void CL_RocketTrail( vec3_t start, vec3_t end, int type ) break; case 4: // slight blood p->type = pt_grav; - p->color = Com_RandomLong( 67, 71 ); + p->color = 67 + (rand() & 3); for( j = 0; j < 3; j++ ) - p->org[j] = start[j] + Com_RandomFloat( -3.0f, 3.0f ); + p->org[j] = start[j] + ((rand() % 6) - 3); len -= 3; break; case 6: // voor trail - p->color = Com_RandomLong( 152, 156 ); + p->color = 9 * 16 + 8 + (rand() & 3); p->type = pt_static; p->die += 0.3f; for( j = 0; j < 3; j++ ) - p->org[j] = start[j] + Com_RandomFloat( -16.0f, 16.0f ); + p->org[j] = start[j] + ((rand() & 15) - 8); break; } VectorAdd( start, vec, start ); diff --git a/engine/client/gl_studio.c b/engine/client/gl_studio.c index f1c573a0..5d8a9057 100644 --- a/engine/client/gl_studio.c +++ b/engine/client/gl_studio.c @@ -1892,7 +1892,7 @@ static void R_StudioDrawPoints( void ) if( g_nForceFaceFlags & STUDIO_NF_CHROME ) { - scale = 1.0f + RI.currententity->curstate.renderamt * (1.0f / 255.0f); + scale = RI.currententity->curstate.renderamt * (1.0f / 255.0f); for( i = 0; i < m_pSubModel->numnorms; i++ ) Matrix3x4_VectorRotate( g_bonestransform[pnormbone[i]], pstudionorms[i], g_xformnorms[i] ); diff --git a/engine/common/build.c b/engine/common/build.c index 58b572f9..c768a4d5 100644 --- a/engine/common/build.c +++ b/engine/common/build.c @@ -48,6 +48,6 @@ int Q_buildnum( void ) return b; #else - return 2015; + return 2032; #endif } \ No newline at end of file diff --git a/engine/common/console.c b/engine/common/console.c index 28a3473f..250d1e5a 100644 --- a/engine/common/console.c +++ b/engine/common/console.c @@ -1767,7 +1767,7 @@ Con_DrawConsole void Con_DrawConsole( void ) { // never draw console whel changelevel in-progress - if( cls.changelevel ) return; + if( cls.changelevel || cls.changedemo ) return; // check for console width changes from a vid mode change Con_CheckResize (); diff --git a/engine/common/cvar.c b/engine/common/cvar.c index f09120a1..1a7063f6 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -1034,7 +1034,10 @@ void Cvar_List_f( void ) if( var->flags & CVAR_CHEAT ) Msg( "CHEAT " ); else Msg( " " ); - Msg(" %s \"%s\" %s\n", var->name, var->string, var->description ); + + if( var->flags & ( CVAR_EXTDLL|CVAR_CLIENTDLL )) + Msg(" %s \"%s\" %s\n", var->name, var->string ); + else Msg(" %s \"%s\" %s\n", var->name, var->string, var->description ); j++; } diff --git a/engine/common/host.c b/engine/common/host.c index 7c888528..75ef27e0 100644 --- a/engine/common/host.c +++ b/engine/common/host.c @@ -365,7 +365,7 @@ void Host_RestartAmbientSounds( void ) if( !soundInfo[i].looping || soundInfo[i].entnum == -1 ) continue; - Msg( "Restarting sound %s...\n", soundInfo[i].name ); + MsgDev( D_NOTE, "Restarting sound %s...\n", soundInfo[i].name ); S_StopSound( soundInfo[i].entnum, soundInfo[i].channel, soundInfo[i].name ); SV_StartSound( pfnPEntityOfEntIndex( soundInfo[i].entnum ), CHAN_STATIC, soundInfo[i].name, soundInfo[i].volume, soundInfo[i].attenuation, 0, soundInfo[i].pitch ); diff --git a/engine/common/model.c b/engine/common/model.c index 529de085..6da8e784 100644 --- a/engine/common/model.c +++ b/engine/common/model.c @@ -2721,7 +2721,7 @@ void Mod_LoadWorld( const char *name, uint *checksum, qboolean force ) if( !Q_stricmp( cm_models[0].name, name ) && !force ) { - // singleplayer mode: server already loading map + // singleplayer mode: server already loaded map com_models[1] = cm_models; // make link to world if( checksum ) *checksum = world.checksum; @@ -2938,9 +2938,9 @@ Mod_Handle */ model_t *Mod_Handle( int handle ) { - if( handle < 0 || handle > MAX_MODELS ) + if( handle < 0 || handle >= MAX_MODELS ) { - Host_Error( "Mod_Handle: bad handle #%i\n", handle ); + MsgDev( D_NOTE, "Mod_Handle: bad handle #%i\n", handle ); return NULL; } return com_models[handle]; diff --git a/engine/server/server.h b/engine/server/server.h index bdc1adcf..fc5e1378 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -110,6 +110,7 @@ typedef struct server_s qboolean background; // this is background map qboolean loadgame; // client begins should reuse existing entity + qboolean changelevel; // set if changelevel in-action (smooth or classic) int viewentity; // applied on client restore. this is temporare place // until client connected diff --git a/engine/server/sv_client.c b/engine/server/sv_client.c index 63b66ac9..5a2d3aef 100644 --- a/engine/server/sv_client.c +++ b/engine/server/sv_client.c @@ -1041,6 +1041,7 @@ void SV_PutClientInServer( edict_t *ent ) } // clear any temp states + sv.changelevel = false; sv.loadgame = false; sv.paused = false; diff --git a/engine/server/sv_cmds.c b/engine/server/sv_cmds.c index 8c523254..27a4ed8d 100644 --- a/engine/server/sv_cmds.c +++ b/engine/server/sv_cmds.c @@ -209,6 +209,7 @@ void SV_Map_f( void ) SCR_BeginLoadingPlaque( false ); + sv.changelevel = false; sv.background = false; sv.loadgame = false; // set right state SV_ClearSaveDir (); // delete all temporary *.hl files @@ -261,6 +262,7 @@ void SV_MapBackground_f( void ) SV_Shutdown( true ); NET_Config ( false ); // close network sockets + sv.changelevel = false; sv.background = true; sv.loadgame = false; // set right state diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index e15234f5..c011e067 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -351,6 +351,7 @@ void SV_ActivateServer( void ) sv.state = ss_active; physinfo->modified = true; + sv.changelevel = false; sv.paused = false; Host_SetServerState( sv.state ); @@ -463,13 +464,14 @@ qboolean SV_SpawnServer( const char *mapname, const char *startspot ) { int i, current_skill; qboolean loadgame, paused; - qboolean background; + qboolean background, changelevel; Cmd_ExecuteString( "latch\n", src_command ); // save state loadgame = sv.loadgame; background = sv.background; + changelevel = sv.changelevel; paused = sv.paused; if( sv.state == ss_dead ) @@ -499,6 +501,7 @@ qboolean SV_SpawnServer( const char *mapname, const char *startspot ) sv.paused = paused; sv.loadgame = loadgame; sv.background = background; + sv.changelevel = changelevel; sv.time = 1.0f; // server spawn time it's always 1.0 second svgame.globals->time = sv.time; @@ -710,6 +713,7 @@ qboolean SV_NewGame( const char *mapName, qboolean loadGame ) sv.loadgame = loadGame; sv.background = false; + sv.changelevel = false; if( !SV_SpawnServer( mapName, NULL )) return false; diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 0b034a9b..3b6a4197 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -745,7 +745,7 @@ void SV_FinalMessage( char *message, qboolean reconnect ) { BF_WriteByte( &msg, svc_changing ); - if( sv.loadgame || sv_maxclients->integer > 1 ) + if( sv.loadgame || sv_maxclients->integer > 1 || sv.changelevel ) BF_WriteOneBit( &msg, 1 ); // changelevel else BF_WriteOneBit( &msg, 0 ); } diff --git a/engine/server/sv_save.c b/engine/server/sv_save.c index d9117ec7..8ffc2e8c 100644 --- a/engine/server/sv_save.c +++ b/engine/server/sv_save.c @@ -1889,6 +1889,8 @@ void SV_ChangeLevel( qboolean loadfromsavedgame, const char *mapname, const char Q_strncpy( level, mapname, MAX_STRING ); Q_strncpy( oldlevel, sv.name, MAX_STRING ); sv.background = false; + sv.changelevel = true; // NOTE: this is used to indicate changelevel for classic Quake changelevel + // because demos wan't properly update clock on a new level while recording if( loadfromsavedgame ) { diff --git a/game_launch/game.ncb b/game_launch/game.ncb deleted file mode 100644 index e7e750a9..00000000 Binary files a/game_launch/game.ncb and /dev/null differ diff --git a/game_launch/game.opt b/game_launch/game.opt deleted file mode 100644 index 2727d69d..00000000 Binary files a/game_launch/game.opt and /dev/null differ diff --git a/game_launch/hl.exe b/game_launch/hl.exe deleted file mode 100644 index 6a1b6aaf..00000000 Binary files a/game_launch/hl.exe and /dev/null differ diff --git a/mainui/basemenu.cpp b/mainui/basemenu.cpp index e3a8fb95..aa46b885 100644 --- a/mainui/basemenu.cpp +++ b/mainui/basemenu.cpp @@ -1034,7 +1034,7 @@ void UI_UpdateMenu( float flTime ) if( first ) { - BACKGROUND_TRACK( "gamestartup.mp3", NULL ); + BACKGROUND_TRACK( "gamestartup.mp3", "gamestartup.mp3" ); first = FALSE; } } diff --git a/unused/Feb2012-06.rar b/unused/Feb2012-06.rar new file mode 100644 index 00000000..50fef7ab Binary files /dev/null and b/unused/Feb2012-06.rar differ diff --git a/unused/Feb2012-07.rar b/unused/Feb2012-07.rar new file mode 100644 index 00000000..f3bf525c Binary files /dev/null and b/unused/Feb2012-07.rar differ diff --git a/unused/Feb2012-08.rar b/unused/Feb2012-08.rar new file mode 100644 index 00000000..3f04878b Binary files /dev/null and b/unused/Feb2012-08.rar differ