Skip to content

Commit 19447d6

Browse files
committed
revert briefing helicopter change from #bb4b4d1f525fc14603e9b8510921f9d4e9278fc0
1 parent e7d4bd8 commit 19447d6

6 files changed

Lines changed: 64 additions & 129 deletions

File tree

Source/Amiga/Graphics_Amiga.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,18 +1444,13 @@ void cGraphics_Amiga::Briefing_Intro_Helicopter_Play(
14441444
mFodder->String_CalculateWidth(320, mFont_Underlined_Width, pBottom);
14451445
auto bottomTextPos = mFodder->mGUI_Temp_X - 4;
14461446

1447-
auto last = std::chrono::steady_clock::now();
1448-
14491447
do {
1450-
const auto now = std::chrono::steady_clock::now();
1451-
double dtSeconds = std::chrono::duration<double>(now - last).count();
1452-
last = now;
14531448

14541449
if (mSurface->isPaletteAdjusting())
14551450
mSurface->palette_FadeTowardNew();
14561451

1457-
mFodder->Briefing_Helicopter_Check(dtSeconds);
1458-
HeliIntro_TickParallaxAndText(dtSeconds);
1452+
mFodder->Briefing_Helicopter_Check();
1453+
HeliIntro_TickParallaxAndText();
14591454

14601455
mFodder->String_Print(mFont_Underlined_Width, 1, -332 + (topTextPos + (Heli_TextPos)), 0x01, pTop);
14611456
mFodder->String_Print(mFont_Underlined_Width, 1, (Heli_TextPosBottom) + bottomTextPos, 0xB5 + 0x16, pBottom);

Source/Briefing.cpp

Lines changed: 25 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
5239
void 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

175145
std::string cFodder::Briefing_Get_Mission_Title() {
@@ -446,11 +416,11 @@ int16 cFodder::Briefing_Show() {
446416

447417
void 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;

Source/Fodder.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ class cFodder {
567567
double mBriefingHelicopter_TransitionCounterSeconds = 0;
568568
double mHeliParallax_SubPx = 0.0; // accumulates fractional scroll in 16.16 units
569569
double mHeliText_SubPx = 0.0; // accumulates fractional text movement in pixels
570+
float mBriefingHelicopter_TimeScale = 1.0f;
570571

571572
int16 mMouseButtonStatus;
572573
int16 mInputMouseX;
@@ -744,7 +745,7 @@ class cFodder {
744745
void Briefing_Intro_Helicopter_Start();
745746
void Briefing_Intro_Helicopter_Draw_Mission_Name();
746747

747-
void Briefing_Helicopter_Check(double dtSeconds);
748+
void Briefing_Helicopter_Check();
748749

749750
void CopyProtection();
750751
void CopyProtection_EncodeInput();
@@ -799,7 +800,6 @@ class cFodder {
799800

800801
int16 Squad_Join(sSprite* pSprite);
801802

802-
void Briefing_Update_Helicopter_Frame(double dtSeconds);
803803
void Briefing_Update_Helicopter();
804804

805805
std::string Briefing_Get_Mission_Title();

Source/Graphics.cpp

Lines changed: 32 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -163,62 +163,37 @@ void cGraphics::Sidebar_Copy_ScreenBuffer_Common(uint16 pRow, int16 pRows, int16
163163
}
164164

165165

166-
void cGraphics::HeliIntro_TickParallaxAndText(double dtSeconds)
166+
void cGraphics::HeliIntro_TickParallaxAndText()
167167
{
168-
// ----- Text slide (PAL) -----
169-
//
170-
// Original Amiga PAL behaviour:
171-
// Each step moves 4 pixels
172-
// => 4 * 50 = 200 px/sec toward 0x0C.
173-
const double textVelPxPerSec = 200.0;
174-
175-
if (Heli_TextPosBottom != 0x0C) {
176-
g_Fodder->mHeliText_SubPx += textVelPxPerSec * dtSeconds;
177-
178-
const int32_t stepPx = (int32_t)std::floor(g_Fodder->mHeliText_SubPx);
179-
if (stepPx > 0) {
180-
g_Fodder->mHeliText_SubPx -= (double)stepPx;
181-
Heli_TextPosBottom -= stepPx;
182-
183-
if (Heli_TextPosBottom <= 0x0C) {
184-
Heli_TextPosBottom = 0x0C;
185-
g_Fodder->mHeliText_SubPx = 0.0;
186-
}
187-
}
188-
}
189-
190-
Heli_TextPos = 344 - Heli_TextPosBottom;
191-
192-
// ----- Parallax scroll (PAL) -----
193-
//
194-
// Original behaviour per PAL frame (50Hz):
195-
// baseSpeed = 0x8000 (16.16 units) per frame
196-
// => per-second speed = 0x8000 * 50 (16.16 units/sec)
197-
const double baseSpeed_16_16_per_sec = (double)0x8000 * 50.0;
198-
199-
g_Fodder->mHeliParallax_SubPx += baseSpeed_16_16_per_sec * dtSeconds;
200-
201-
const int32_t baseStep = (int32_t)std::floor(g_Fodder->mHeliParallax_SubPx);
202-
if (baseStep != 0) {
203-
g_Fodder->mHeliParallax_SubPx -= (double)baseStep;
204-
205-
const int32_t wrap = 320 << 16;
206-
207-
int32_t d0 = baseStep;
208-
209-
Heli_VeryBack -= d0;
210-
if (Heli_VeryBack < 0) Heli_VeryBack += wrap;
211-
212-
d0 <<= 1;
213-
Heli_Back -= d0;
214-
if (Heli_Back < 0) Heli_Back += wrap;
215-
216-
d0 <<= 1;
217-
Heli_middle -= d0;
218-
if (Heli_middle < 0) Heli_middle += wrap;
219-
220-
d0 <<= 1;
221-
Heli_Front -= d0;
222-
if (Heli_Front < 0) Heli_Front += wrap;
223-
}
168+
const float scale = mFodder->mBriefingHelicopter_TimeScale;
169+
170+
if (Heli_TextPosBottom != 0x0C) {
171+
Heli_TextPosBottom -= static_cast<int32_t>(4 * scale);
172+
173+
if (Heli_TextPosBottom <= 0x0C)
174+
Heli_TextPosBottom = 0x0C;
175+
}
176+
Heli_TextPos = 344 - Heli_TextPosBottom;
177+
178+
int32_t baseSpeed = static_cast<int32_t>(0x8000 * scale);
179+
int32_t d0 = baseSpeed;
180+
181+
Heli_VeryBack -= d0;
182+
if (Heli_VeryBack < 0)
183+
Heli_VeryBack += 320 << 16;
184+
185+
d0 <<= 1;
186+
Heli_Back -= d0;
187+
if (Heli_Back < 0)
188+
Heli_Back += 320 << 16;
189+
190+
d0 <<= 1;
191+
Heli_middle -= d0;
192+
if (Heli_middle < 0)
193+
Heli_middle += 320 << 16;
194+
195+
d0 <<= 1;
196+
Heli_Front -= d0;
197+
if (Heli_Front < 0)
198+
Heli_Front += 320 << 16;
224199
}

Source/Graphics.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class cGraphics {
184184

185185
virtual void Load_And_Draw_Image( const std::string &pFilename, unsigned int pColors, size_t pBackColor = 0) = 0;
186186

187-
virtual void HeliIntro_TickParallaxAndText(double dtSeconds);
187+
virtual void HeliIntro_TickParallaxAndText();
188188

189189
virtual void Map_Tile_Draw(cSurface *pTarget, uint16 pTile, uint16 pX, uint16 pY, uint16 pOffset) = 0;
190190
virtual void MapTiles_Draw() = 0;

Source/PC/Graphics_PC.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -897,18 +897,13 @@ void cGraphics_PC::Briefing_Intro_Helicopter_Play( const bool pShowHelicopter, c
897897
mFodder->String_CalculateWidth(320, mFont_Underlined_Width, pBottom);
898898
auto bottomTextPos = mFodder->mGUI_Temp_X - 4;
899899

900-
auto last = std::chrono::steady_clock::now();
901-
902900
do {
903-
const auto now = std::chrono::steady_clock::now();
904-
double dtSeconds = std::chrono::duration<double>(now - last).count();
905-
last = now;
906901

907902
if (mSurface->isPaletteAdjusting())
908903
mSurface->palette_FadeTowardNew();
909904

910-
mFodder->Briefing_Helicopter_Check(dtSeconds);
911-
HeliIntro_TickParallaxAndText(dtSeconds);
905+
mFodder->Briefing_Helicopter_Check();
906+
HeliIntro_TickParallaxAndText();
912907

913908
mFodder->String_Print(mFont_Underlined_Width, 1, -332 + (topTextPos + (Heli_TextPos)), 0x01, pTop);
914909
mFodder->String_Print(mFont_Underlined_Width, 1, (Heli_TextPosBottom)+bottomTextPos, 0xB5, pBottom);

0 commit comments

Comments
 (0)