@@ -122,30 +122,30 @@ void cFodder::Briefing_Helicopter_Check(double dtSeconds)
122122
123123 mBriefingHelicopter_TransitionCounterSeconds += dtSeconds;
124124
125- auto doTransitionStepIfDue = [&]() -> bool {
125+ auto consumeTransitionSteps = [&]() -> int {
126126 if (mBriefingHelicopter_TransitionCounterSeconds < kTransitionStepSeconds )
127- return false ;
128- // keep remainder so it’s stable under varying dt
129- mBriefingHelicopter_TransitionCounterSeconds =
130- std::fmod ( mBriefingHelicopter_TransitionCounterSeconds , kTransitionStepSeconds ) ;
131- return true ;
127+ return 0 ;
128+
129+ const int steps = ( int )( mBriefingHelicopter_TransitionCounterSeconds / kTransitionStepSeconds );
130+ mBriefingHelicopter_TransitionCounterSeconds -= ( double )steps * kTransitionStepSeconds ;
131+ return steps ;
132132 };
133133
134134 // ---- “Fade in until ready, then start heli movement” ----
135135 if (!mMouse_Exit_Loop || !mPhase_Aborted ) {
136136
137137 if (mBriefingHelicopter_ScreenX > 0x30 ) {
138138
139- if (doTransitionStepIfDue ()) {
139+ int transitionSteps = consumeTransitionSteps ();
140+ while (transitionSteps-- > 0 ) {
140141 // Original: 16 steps total for fade-in.
141142 if (mBriefingHelicopter_Moving < 16 ) {
142143 mBriefingHelicopter_Moving ++;
143144 mPaletteLevel ++;
144- return ;
145145 }
146146 }
147147
148- // Once fade-in complete, advance helicopter sim (60Hz tick wrapper)
148+ // Once fade-in complete, advance helicopter sim (50Hz tick wrapper)
149149 if (mBriefingHelicopter_Moving >= 16 ) {
150150 Briefing_Update_Helicopter_Frame (dtSeconds);
151151 }
@@ -154,15 +154,19 @@ void cFodder::Briefing_Helicopter_Check(double dtSeconds)
154154 }
155155
156156 // ---- “Fade out / exit path” ----
157- if (doTransitionStepIfDue ()) {
157+ int transitionSteps = consumeTransitionSteps ();
158+ while (transitionSteps-- > 0 ) {
158159 if (mBriefingHelicopter_Moving == 0 && mBriefingHelicopter_NotDone ) {
159160 mBriefingHelicopter_NotDone = 0 ;
160161 mGraphics ->mImageMissionIntro .CopyPalette (mGraphics ->mPalette , 0x100 , 0 );
162+ break ;
161163 }
162164 else {
163165 if (mBriefingHelicopter_Moving > 0 || mPaletteLevel > 0 ) {
164- mBriefingHelicopter_Moving --;
165- mPaletteLevel --;
166+ if (mBriefingHelicopter_Moving > 0 )
167+ mBriefingHelicopter_Moving --;
168+ if (mPaletteLevel > 0 )
169+ mPaletteLevel --;
166170 mSurface ->paletteNew_SetToBlack ();
167171 }
168172 }
@@ -448,7 +452,10 @@ void cFodder::Briefing_Intro_Helicopter_Start() {
448452
449453 mBriefingHelicopter_TransitionCounterSeconds = 0 ;
450454 mBriefingHelicopter_AccumSeconds = 0.0 ;
451- mBriefingHelicopter_StepSeconds = 1.0 / 60.0 ;
455+ mHeliIntro_AccumSeconds = 0.0 ;
456+ // Original briefing helicopter simulation cadence is PAL 50Hz.
457+ // Keep this in sync with offsets/countdowns that are defined in 50Hz ticks.
458+ mBriefingHelicopter_StepSeconds = 1.0 / 50.0 ;
452459 mHeliParallax_SubPx = 0 ;
453460 mHeliText_SubPx = 0 ;
454461
0 commit comments