@@ -1533,14 +1533,21 @@ bool idGameLocal::InitFromSaveGame( const char *mapName, idRenderWorld *renderWo
15331533 if ( gameSoundWorld ) {
15341534 gameSoundWorld->SetSlowmo ( false );
15351535 }
1536- } else {
1536+ // DG: not saving/restoring msecPrecise to avoid breaking savegames
1537+ // if slowmo is off, this is the value msec(Precise) should have
1538+ msecPrecise = USERCMD_MSEC_PRECISE;
1539+ }
1540+ else {
15371541 if ( gameSoundWorld ) {
15381542 gameSoundWorld->SetSlowmo ( true );
15391543 }
1544+ // DG: msec(Precise) should be set frequently anyway, so using the approximate msec
1545+ // in the slowmo-case should be good enough (I know, famous last words etc)
1546+ msecPrecise = msec;
15401547 }
15411548
15421549 if ( gameSoundWorld ) {
1543- gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / ( float )USERCMD_MSEC );
1550+ gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / USERCMD_MSEC_PRECISE ); // DG: slowmoMsec now is precise
15441551 }
15451552#endif
15461553
@@ -2393,7 +2400,7 @@ void idGameLocal::RunTimeGroup2( int msec_fast ) { // dezo2/DG: added argument f
23932400 int num = 0 ;
23942401
23952402 fast.Increment ( msec_fast );
2396- fast.Get ( time, previousTime, msec, framenum, realClientTime );
2403+ fast.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
23972404
23982405 for ( ent = activeEntities.Next (); ent != NULL ; ent = ent->activeNode .Next () ) {
23992406 if ( ent->timeGroup != TIME_GROUP2 ) {
@@ -2404,7 +2411,7 @@ void idGameLocal::RunTimeGroup2( int msec_fast ) { // dezo2/DG: added argument f
24042411 num++;
24052412 }
24062413
2407- slow.Get ( time, previousTime, msec, framenum, realClientTime );
2414+ slow.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
24082415}
24092416#endif
24102417
@@ -2446,8 +2453,9 @@ gameReturn_t idGameLocal::RunFrame( const usercmd_t *clientCmds, int activeEdito
24462453#ifdef _D3XP
24472454 ComputeSlowMsec ();
24482455
2449- slow.Get ( time, previousTime, msec, framenum, realClientTime );
2456+ slow.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
24502457 msec = slowmoMsec;
2458+ msecPrecise = slowmoMsec;
24512459#endif
24522460
24532461 if ( !isMultiplayer && g_stopTime.GetBool () ) {
@@ -2467,14 +2475,16 @@ gameReturn_t idGameLocal::RunFrame( const usercmd_t *clientCmds, int activeEdito
24672475
24682476 // dezo2/DG: recalculate each frame, see comment at CalcMSec()
24692477 int msec_fast = CalcMSec ( framenum );
2470- if ( slowmoState == SLOWMO_STATE_OFF )
2478+ if ( slowmoState == SLOWMO_STATE_OFF ) {
24712479 msec = msec_fast;
2480+ msecPrecise = USERCMD_MSEC_PRECISE;
2481+ }
24722482
24732483 time += msec;
24742484 realClientTime = time;
24752485
24762486#ifdef _D3XP
2477- slow.Set ( time, previousTime, msec, framenum, realClientTime );
2487+ slow.Set ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
24782488#endif
24792489
24802490#ifdef GAME_DLL
@@ -2594,9 +2604,9 @@ gameReturn_t idGameLocal::RunFrame( const usercmd_t *clientCmds, int activeEdito
25942604
25952605#ifdef _D3XP
25962606 // service pending fast events
2597- fast.Get ( time, previousTime, msec, framenum, realClientTime );
2607+ fast.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
25982608 idEvent::ServiceFastEvents ();
2599- slow.Get ( time, previousTime, msec, framenum, realClientTime );
2609+ slow.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
26002610#endif
26012611
26022612 timer_events.Stop ();
@@ -4810,9 +4820,9 @@ idGameLocal::SelectTimeGroup
48104820*/
48114821void idGameLocal::SelectTimeGroup ( int timeGroup ) {
48124822 if ( timeGroup ) {
4813- fast.Get ( time, previousTime, msec, framenum, realClientTime );
4823+ fast.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
48144824 } else {
4815- slow.Get ( time, previousTime, msec, framenum, realClientTime );
4825+ slow.Get ( time, previousTime, msec, framenum, realClientTime, msecPrecise );
48164826 }
48174827}
48184828
@@ -4862,7 +4872,7 @@ void idGameLocal::ComputeSlowMsec() {
48624872
48634873 // stop the state
48644874 slowmoState = SLOWMO_STATE_OFF;
4865- slowmoMsec = USERCMD_MSEC;
4875+ slowmoMsec = USERCMD_MSEC_PRECISE; // DG: slowmoMsec now is precise
48664876 }
48674877
48684878 // check the player state
@@ -4880,10 +4890,10 @@ void idGameLocal::ComputeSlowMsec() {
48804890 if ( powerupOn && slowmoState == SLOWMO_STATE_OFF ) {
48814891 slowmoState = SLOWMO_STATE_RAMPUP;
48824892
4883- slowmoMsec = msec ;
4893+ slowmoMsec = msecPrecise ;
48844894 if ( gameSoundWorld ) {
48854895 gameSoundWorld->SetSlowmo ( true );
4886- gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / ( float )USERCMD_MSEC );
4896+ gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / USERCMD_MSEC_PRECISE ); // DG: slowmoMsec now is precise
48874897 }
48884898 }
48894899 else if ( !powerupOn && slowmoState == SLOWMO_STATE_ON ) {
@@ -4895,27 +4905,30 @@ void idGameLocal::ComputeSlowMsec() {
48954905 }
48964906 }
48974907
4908+ // DG: for more precision in slowmo timing
4909+ static const float quarterFrameTime = USERCMD_MSEC_PRECISE * 0.25 ;
4910+
48984911 // do any necessary ramping
48994912 if ( slowmoState == SLOWMO_STATE_RAMPUP ) {
4900- delta = 4 - slowmoMsec;
4913+ delta = quarterFrameTime - slowmoMsec; // DG: slowmoMsec now is precise
49014914
49024915 if ( fabs ( delta ) < g_slowmoStepRate.GetFloat () ) {
4903- slowmoMsec = 4 ;
4916+ slowmoMsec = quarterFrameTime; // DG: slowmoMsec now is precise
49044917 slowmoState = SLOWMO_STATE_ON;
49054918 }
49064919 else {
49074920 slowmoMsec += delta * g_slowmoStepRate.GetFloat ();
49084921 }
49094922
49104923 if ( gameSoundWorld ) {
4911- gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / ( float )USERCMD_MSEC );
4924+ gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / USERCMD_MSEC_PRECISE ); // DG: slowmoMsec now is precise
49124925 }
49134926 }
49144927 else if ( slowmoState == SLOWMO_STATE_RAMPDOWN ) {
4915- delta = 16 - slowmoMsec;
4928+ delta = USERCMD_MSEC_PRECISE - slowmoMsec; // DG: slowmoMsec now is precise
49164929
49174930 if ( fabs ( delta ) < g_slowmoStepRate.GetFloat () ) {
4918- slowmoMsec = 16 ;
4931+ slowmoMsec = USERCMD_MSEC_PRECISE; // DG: slowmoMsec now is precise
49194932 slowmoState = SLOWMO_STATE_OFF;
49204933 if ( gameSoundWorld ) {
49214934 gameSoundWorld->SetSlowmo ( false );
@@ -4926,7 +4939,7 @@ void idGameLocal::ComputeSlowMsec() {
49264939 }
49274940
49284941 if ( gameSoundWorld ) {
4929- gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / ( float )USERCMD_MSEC );
4942+ gameSoundWorld->SetSlowmoSpeed ( slowmoMsec / USERCMD_MSEC_PRECISE ); // DG: slowmoMsec now is precise
49304943 }
49314944 }
49324945}
@@ -4938,18 +4951,21 @@ idGameLocal::ResetSlowTimeVars
49384951*/
49394952void idGameLocal::ResetSlowTimeVars () {
49404953 msec = USERCMD_MSEC;
4941- slowmoMsec = USERCMD_MSEC;
4954+ msecPrecise = USERCMD_MSEC_PRECISE;
4955+ slowmoMsec = USERCMD_MSEC_PRECISE; // DG: slowmoMsec now is precise
49424956 slowmoState = SLOWMO_STATE_OFF;
49434957
49444958 fast.framenum = 0 ;
49454959 fast.previousTime = 0 ;
49464960 fast.time = 0 ;
49474961 fast.msec = USERCMD_MSEC;
4962+ fast.msecPrecise = USERCMD_MSEC_PRECISE;
49484963
49494964 slow.framenum = 0 ;
49504965 slow.previousTime = 0 ;
49514966 slow.time = 0 ;
49524967 slow.msec = USERCMD_MSEC;
4968+ fast.msecPrecise = USERCMD_MSEC_PRECISE;
49534969}
49544970
49554971/*
0 commit comments