@@ -36,26 +36,12 @@ const int16 mBriefing_Helicopter_Offsets_Amiga[30] =
3636 -1 , -1 , -1
3737};
3838
39- void cFodder::Briefing_Update_Helicopter_Frame (double dtSeconds)
40- {
41- if (!mBriefingHelicopter_Moving )
42- return ;
43-
44- mBriefingHelicopter_AccumSeconds += dtSeconds;
45-
46- while (mBriefingHelicopter_AccumSeconds >= mBriefingHelicopter_StepSeconds ) {
47- Briefing_Update_Helicopter ();
48- mBriefingHelicopter_AccumSeconds -= mBriefingHelicopter_StepSeconds ;
49- }
50- }
51-
5239void cFodder::Briefing_Update_Helicopter ()
5340{
5441 mBriefingHelicopter_ScreenX = (((int )mHelicopterPosX - 0x20 ) >> 16 );
5542 mBriefingHelicopter_ScreenY = (((int )mHelicopterPosY ) >> 16 );
5643
57- // countdown is in 50Hz ticks now
58- mBriefingHelicopter_NextUpdateCountdown -= 1 .0f ;
44+ mBriefingHelicopter_NextUpdateCountdown -= mBriefingHelicopter_TimeScale ;
5945
6046 if (mBriefingHelicopter_NextUpdateCountdown <= 0 .0f ) {
6147
@@ -76,33 +62,32 @@ void cFodder::Briefing_Update_Helicopter()
7662 float ax = (float )mDirectionVectorTable [(bx / 2 ) & 0xFF ];
7763 ax /= 4 .0f ;
7864
79- mHelicopterPosX += (ax * mBriefingHelicopter_Speed );
65+ mHelicopterPosX += (ax * mBriefingHelicopter_Speed * mBriefingHelicopter_TimeScale );
8066
8167 bx += 0x80 ;
8268 bx &= 0x1FE ;
8369
8470 ax = (float )mDirectionVectorTable [(bx / 2 ) & 0xFF ];
8571 ax /= 4 .0f ;
8672
87- mHelicopterPosY += (ax * mBriefingHelicopter_Speed );
73+ mHelicopterPosY += (ax * mBriefingHelicopter_Speed * mBriefingHelicopter_TimeScale );
8874
8975 bx = mBriefingHelicopter_TargetDirection - mBriefingHelicopter_DirectionIndex ;
9076 bx >>= 5 ;
9177 --bx;
9278 bx ^= 0x0F ;
9379 bx &= 0x0F ;
9480
95- int16 al = mDirectionStepTable [bx];
96- al <<= 2 ;
97-
98- mBriefingHelicopter_DirectionIndex += al;
81+ float al = (float )mDirectionStepTable [bx];
82+ al *= 4 .0f ;
83+ mBriefingHelicopter_DirectionIndex += static_cast <int16>(al * mBriefingHelicopter_TimeScale );
9984 mBriefingHelicopter_DirectionIndex &= 0x1FE ;
10085
10186 if (mBriefingHelicopter_TargetSpeed != mBriefingHelicopter_Speed ) {
10287 if (mBriefingHelicopter_Speed > mBriefingHelicopter_TargetSpeed )
103- mBriefingHelicopter_Speed -= 1 .0f ;
88+ mBriefingHelicopter_Speed -= ( 1 .0f * mBriefingHelicopter_TimeScale ) ;
10489 else
105- mBriefingHelicopter_Speed += 1 .0f ;
90+ mBriefingHelicopter_Speed += ( 1 .0f * mBriefingHelicopter_TimeScale ) ;
10691 }
10792
10893 if (mVersionCurrent ->isCannonFodder1 () && mVersionCurrent ->isPC ())
@@ -112,49 +97,35 @@ void cFodder::Briefing_Update_Helicopter()
11297 mBriefingHelicopter_FrameCounter = 0 ;
11398}
11499
115- void cFodder::Briefing_Helicopter_Check (double dtSeconds )
100+ void cFodder::Briefing_Helicopter_Check ()
116101{
117102 Music_Increase_Channel_Volume ();
103+ const int targetSteps = static_cast <int >(16 .0f / mBriefingHelicopter_TimeScale );
104+ mBriefingHelicopter_TransitionCounterSeconds += mBriefingHelicopter_TimeScale ;
118105
119- // Transition gate: original “every 2nd frame @ 50 Hz” => 25 steps/sec.
120- // That is a step period of 1/25 = 0.04s. Every time we pass it, we do one palette/moving step.
121- const double kTransitionStepSeconds = 1.0 / 25.0 ;
122-
123- mBriefingHelicopter_TransitionCounterSeconds += dtSeconds;
124-
125- auto doTransitionStepIfDue = [&]() -> bool {
126- 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 ;
132- };
133-
134- // ---- “Fade in until ready, then start heli movement” ----
135106 if (!mMouse_Exit_Loop || !mPhase_Aborted ) {
136107
137108 if (mBriefingHelicopter_ScreenX > 0x30 ) {
138109
139- if (doTransitionStepIfDue () ) {
140- // Original: 16 steps total for fade-in.
141- if (mBriefingHelicopter_Moving < 16 ) {
110+ if (mBriefingHelicopter_TransitionCounterSeconds >= 2 . 0f ) {
111+ mBriefingHelicopter_TransitionCounterSeconds = 0 . 0f ;
112+ if (mBriefingHelicopter_Moving < targetSteps ) {
142113 mBriefingHelicopter_Moving ++;
143114 mPaletteLevel ++;
144115 return ;
145116 }
146117 }
147118
148- // Once fade-in complete, advance helicopter sim (60Hz tick wrapper)
149- if (mBriefingHelicopter_Moving >= 16 ) {
150- Briefing_Update_Helicopter_Frame (dtSeconds);
119+ if (mBriefingHelicopter_Moving >= targetSteps) {
120+ Briefing_Update_Helicopter ();
151121 }
152122 return ;
153123 }
154124 }
155125
156- // ---- “Fade out / exit path” ----
157- if (doTransitionStepIfDue ()) {
126+ if (mBriefingHelicopter_TransitionCounterSeconds >= 2 .0f ) {
127+ mBriefingHelicopter_TransitionCounterSeconds = 0 .0f ;
128+
158129 if (mBriefingHelicopter_Moving == 0 && mBriefingHelicopter_NotDone ) {
159130 mBriefingHelicopter_NotDone = 0 ;
160131 mGraphics ->mImageMissionIntro .CopyPalette (mGraphics ->mPalette , 0x100 , 0 );
@@ -168,8 +139,7 @@ void cFodder::Briefing_Helicopter_Check(double dtSeconds)
168139 }
169140 }
170141
171- // Always keep heli sim running on the exit path too (matches your original behaviour)
172- Briefing_Update_Helicopter_Frame (dtSeconds);
142+ Briefing_Update_Helicopter ();
173143}
174144
175145std::string cFodder::Briefing_Get_Mission_Title () {
@@ -446,11 +416,11 @@ int16 cFodder::Briefing_Show() {
446416
447417void cFodder::Briefing_Intro_Helicopter_Start () {
448418
449- mBriefingHelicopter_TransitionCounterSeconds = 0 ;
450- mBriefingHelicopter_AccumSeconds = 0.0 ;
451- mBriefingHelicopter_StepSeconds = 1.0 / 60.0 ;
452- mHeliParallax_SubPx = 0 ;
453- mHeliText_SubPx = 0 ;
419+ if ( mWindow -> GetRefreshRate () > 0 )
420+ mBriefingHelicopter_TimeScale = 60 . 0f / ( float ) mWindow -> GetRefreshRate () ;
421+ else
422+ mBriefingHelicopter_TimeScale = 1 . 0f ;
423+ mBriefingHelicopter_TransitionCounterSeconds = 0. 0 ;
454424
455425 mHelicopterPosX = 0x01500000 ;
456426 mHelicopterPosY = 0x001E0000 ;
0 commit comments