- changed screen job list to work without per-job completion callbacks.

They made things more complex than necessary and do not translate well to scripting.
This commit is contained in:
Christoph Oelckers 2021-04-22 00:25:55 +02:00
parent fb5e2fe0c0
commit 71e5f9b70f
6 changed files with 107 additions and 50 deletions

View file

@ -56,6 +56,11 @@
IMPLEMENT_CLASS(DScreenJob, true, false) IMPLEMENT_CLASS(DScreenJob, true, false)
IMPLEMENT_CLASS(DImageScreen, true, false) IMPLEMENT_CLASS(DImageScreen, true, false)
void DScreenJob::OnDestroy()
{
if (flags & stopmusic) Mus_Stop();
if (flags & stopsound) FX_StopAllSounds();
}
bool DSkippableScreenJob::OnEvent(event_t* evt) bool DSkippableScreenJob::OnEvent(event_t* evt)
{ {
@ -164,7 +169,7 @@ public:
{ {
if (index >= 0) if (index >= 0)
{ {
if (jobs[index].postAction) jobs[index].postAction(); //if (jobs[index].postAction) jobs[index].postAction();
jobs[index].job->Destroy(); jobs[index].job->Destroy();
} }
index++; index++;
@ -176,7 +181,7 @@ public:
actionState = clearbefore ? State_Clear : State_Run; actionState = clearbefore ? State_Clear : State_Run;
if (index < jobs.Size()) if (index < jobs.Size())
{ {
jobs[index].job->fadestate = !paused && jobs[index].job->fadestyle & DScreenJob::fadein? DScreenJob::fadein : DScreenJob::visible; jobs[index].job->fadestate = !paused && jobs[index].job->flags & DScreenJob::fadein? DScreenJob::fadein : DScreenJob::visible;
jobs[index].job->Start(); jobs[index].job->Start();
} }
inputState.ClearAllInput(); inputState.ClearAllInput();
@ -289,7 +294,7 @@ public:
if (terminateState < 1) if (terminateState < 1)
{ {
// Must lock before displaying. // Must lock before displaying.
if (jobs[index].job->fadestyle & DScreenJob::fadeout) if (jobs[index].job->flags & DScreenJob::fadeout)
{ {
jobs[index].job->fadestate = DScreenJob::fadeout; jobs[index].job->fadestate = DScreenJob::fadeout;
jobs[index].job->state = DScreenJob::stopping; jobs[index].job->state = DScreenJob::stopping;

View file

@ -3,6 +3,7 @@
#include "dobject.h" #include "dobject.h"
#include "v_2ddrawer.h" #include "v_2ddrawer.h"
#include "d_eventbase.h" #include "d_eventbase.h"
#include "s_soundinternal.h"
using CompletionFunc = std::function<void(bool)>; using CompletionFunc = std::function<void(bool)>;
struct JobDesc; struct JobDesc;
@ -11,7 +12,7 @@ class ScreenJobRunner;
class DScreenJob : public DObject class DScreenJob : public DObject
{ {
DECLARE_CLASS(DScreenJob, DObject) DECLARE_CLASS(DScreenJob, DObject)
const int fadestyle; const int flags;
const float fadetime; // in milliseconds const float fadetime; // in milliseconds
int fadestate = fadein; int fadestate = fadein;
@ -35,9 +36,11 @@ public:
visible = 0, visible = 0,
fadein = 1, fadein = 1,
fadeout = 2, fadeout = 2,
stopmusic = 4,
stopsound = 8,
}; };
DScreenJob(int fade = 0, float fadet = 250.f) : fadestyle(fade), fadetime(fadet) {} DScreenJob(int fade = 0, float fadet = 250.f) : flags(fade), fadetime(fadet) {}
virtual bool ProcessInput() virtual bool ProcessInput()
{ {
@ -60,6 +63,7 @@ public:
int GetFadeState() const { return fadestate; } int GetFadeState() const { return fadestate; }
virtual void OnDestroy() override;
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -90,7 +94,7 @@ class DBlackScreen : public DScreenJob
bool cleared = false; bool cleared = false;
public: public:
DBlackScreen(int w) : wait(w) {} DBlackScreen(int w, int flags = 0) : DScreenJob(flags & ~(fadein|fadeout)), wait(w) {}
void OnTick() override; void OnTick() override;
void Draw(double smooth) override; void Draw(double smooth) override;
}; };
@ -134,8 +138,7 @@ public:
struct JobDesc struct JobDesc
{ {
DScreenJob* job; DScreenJob* job;
void (*postAction)(); //void (*postAction)();
//bool ignoreifskipped;
}; };
enum enum

View file

@ -36,6 +36,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
class DBloodIntroImage : public DImageScreen
{
bool mus;
public:
DBloodIntroImage(int tilenum, int flags = 0, bool withmusic = false) : DImageScreen(tilenum, flags), mus(withmusic)
{}
void Start() override
{
sndStartSample("THUNDER2", 128, -1);
if (mus) sndPlaySpecialMusicOrNothing(MUS_INTRO);
}
};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
@ -70,8 +84,7 @@ void playlogos()
} }
else else
{ {
jobs[job++] = { Create<DBlackScreen>(1), []() { sndStartSample("THUNDER2", 128, -1); } }; jobs[job++] = { Create<DBloodIntroImage>(2050) };
jobs[job++] = { Create<DImageScreen>(2050) };
} }
if (fileSystem.FindFile("gti.smk") != -1) if (fileSystem.FindFile("gti.smk") != -1)
{ {
@ -79,12 +92,11 @@ void playlogos()
} }
else else
{ {
jobs[job++] = { Create<DBlackScreen>(1), []() { sndStartSample("THUNDER2", 128, -1); } }; jobs[job++] = { Create<DBloodIntroImage>(2052) };
jobs[job++] = { Create<DImageScreen>(2052) };
} }
} }
jobs[job++] = { Create<DBlackScreen>(1), []() { sndPlaySpecialMusicOrNothing(MUS_INTRO); sndStartSample("THUNDER2", 128, -1); }}; jobs[job++] = { Create<DBlackScreen>(1) };
jobs[job++] = { Create<DImageScreen>(2518, DScreenJob::fadein) }; jobs[job++] = { Create<DBloodIntroImage>(2518, DScreenJob::fadein, true) };
RunScreenJob(jobs, job, [](bool) { RunScreenJob(jobs, job, [](bool) {
Mus_Stop(); Mus_Stop();

View file

@ -170,6 +170,11 @@ class DDRealmsScreen : public DSkippableScreenJob
public: public:
DDRealmsScreen() : DSkippableScreenJob(fadein | fadeout) {} DDRealmsScreen() : DSkippableScreenJob(fadein | fadeout) {}
void Start() override
{
S_PlaySpecialMusic(MUS_INTRO);
}
void OnTick() override void OnTick() override
{ {
if (ticks >= 7 * GameTicRate) state = finished; if (ticks >= 7 * GameTicRate) state = finished;
@ -200,6 +205,11 @@ public:
{ {
} }
void Start() override
{
if (isNam() || userConfig.nologo) S_PlaySpecialMusic(MUS_INTRO);
}
void OnTick() override void OnTick() override
{ {
int clock = ticks * 120 / GameTicRate; int clock = ticks * 120 / GameTicRate;
@ -276,6 +286,11 @@ public:
} }
} }
} }
void OnDestroy() override
{
S_PlaySound(NITEVISION_ONOFF, CHAN_AUTO, CHANF_UI);
}
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -301,12 +316,10 @@ void Logo_d(const CompletionFunc &completion)
int job = 0; int job = 0;
if (!userConfig.nologo) if (!userConfig.nologo)
{ {
if (!isShareware()) jobs[job++] = { PlayVideo("logo.anm", logosound, logoframetimes), []() { S_PlaySpecialMusic(MUS_INTRO); } }; if (!isShareware()) jobs[job++] = { PlayVideo("logo.anm", logosound, logoframetimes) };
else jobs[job++] = { Create<DBlackScreen>(1), []() { S_PlaySpecialMusic(MUS_INTRO); } }; if (!isNam()) jobs[job++] = { Create<DDRealmsScreen>(), };
if (!isNam()) jobs[job++] = { Create<DDRealmsScreen>(), nullptr };
} }
else S_PlaySpecialMusic(MUS_INTRO); jobs[job++] = { Create<DTitleScreen>() };
jobs[job++] = { Create<DTitleScreen>(), []() { S_PlaySound(NITEVISION_ONOFF, CHAN_AUTO, CHANF_UI); } };
RunScreenJob(jobs, job, completion, SJ_BLOCKUI); RunScreenJob(jobs, job, completion, SJ_BLOCKUI);
} }
@ -422,6 +435,18 @@ public:
} }
}; };
class DE2EndScreen : public DImageScreen
{
public:
DE2EndScreen() : DImageScreen(E2ENDSCREEN, DScreenJob::fadein | DScreenJob::fadeout | DScreenJob::stopsound, 0x7fffffff, 0)
{}
void Start() override
{
S_PlaySound(PIPEBOMB_EXPLODE, CHAN_AUTO, CHANF_UI);
}
};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// //
@ -513,6 +538,11 @@ public:
} }
if (state != running) FX_StopAllSounds(); if (state != running) FX_StopAllSounds();
} }
void OnDestroy() override
{
if (!isPlutoPak()) S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI);
}
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -535,6 +565,11 @@ public:
BigText(160, 70 + 16 + 16 + 16, GStrings("Look for a Duke Nukem 3D")); BigText(160, 70 + 16 + 16 + 16, GStrings("Look for a Duke Nukem 3D"));
BigText(160, 70 + 16 + 16 + 16 + 16, GStrings("sequel soon.")); BigText(160, 70 + 16 + 16 + 16 + 16, GStrings("sequel soon."));
} }
void Start() override
{
S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI);
}
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -548,7 +583,7 @@ class DEpisode5End : public DImageScreen
int sound = 0; int sound = 0;
public: public:
DEpisode5End() : DImageScreen(FIREFLYGROWEFFECT, fadein|fadeout) DEpisode5End() : DImageScreen(FIREFLYGROWEFFECT, fadein|fadeout|stopsound)
{ {
} }
@ -644,45 +679,45 @@ static void bonussequence_d(int num, JobDesc *jobs, int &job)
switch (num) switch (num)
{ {
case 0: case 0:
jobs[job++] = { Create<DEpisode1End1>(), nullptr }; jobs[job++] = { Create<DEpisode1End1>() };
jobs[job++] = { Create<DImageScreen>(E1ENDSCREEN, DScreenJob::fadein|DScreenJob::fadeout, 0x7fffffff), []() { Mus_Stop(); } }; jobs[job++] = { Create<DImageScreen>(E1ENDSCREEN, DScreenJob::fadein|DScreenJob::fadeout|DScreenJob::stopmusic, 0x7fffffff) };
break; break;
case 1: case 1:
Mus_Stop(); Mus_Stop();
jobs[job++] = { PlayVideo("cineov2.anm", cineov2sound, framespeed_18), []() { S_PlaySound(PIPEBOMB_EXPLODE, CHAN_AUTO, CHANF_UI); } }; jobs[job++] = { PlayVideo("cineov2.anm", cineov2sound, framespeed_18) };
jobs[job++] = { Create<DImageScreen>(E2ENDSCREEN, DScreenJob::fadein | DScreenJob::fadeout, 0x7fffffff), []() { FX_StopAllSounds(); } }; jobs[job++] = { Create<DE2EndScreen>() };
break; break;
case 2: case 2:
Mus_Stop(); Mus_Stop();
if (g_gameType & GAMEFLAG_DUKEDC) if (g_gameType & GAMEFLAG_DUKEDC)
{ {
jobs[job++] = { PlayVideo("radlogo.anm", dukedcsound, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("radlogo.anm", dukedcsound, framespeed_10) };
} }
else else
{ {
jobs[job++] = { PlayVideo("cineov3.anm", cineov3sound, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("cineov3.anm", cineov3sound, framespeed_10) };
jobs[job++] = { Create<DBlackScreen>(200), []() { FX_StopAllSounds(); } }; jobs[job++] = { Create<DBlackScreen>(200, DScreenJob::stopsound) };
jobs[job++] = { Create<DEpisode3End>(), []() { if (!isPlutoPak()) S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI); } }; jobs[job++] = { Create<DEpisode3End>() };
if (!isPlutoPak()) jobs[job++] = { Create<DImageScreen>(TexMan.GetGameTextureByName("DUKETEAM.ANM", false, FTextureManager::TEXMAN_ForceLookup), if (!isPlutoPak()) jobs[job++] = { Create<DImageScreen>(TexMan.GetGameTextureByName("DUKETEAM.ANM", false, FTextureManager::TEXMAN_ForceLookup),
DScreenJob::fadein | DScreenJob::fadeout, 0x7fffffff), []() { FX_StopAllSounds(); } }; DScreenJob::fadein | DScreenJob::fadeout | DScreenJob::stopsound, 0x7fffffff) };
} }
break; break;
case 3: case 3:
Mus_Stop(); Mus_Stop();
jobs[job++] = { PlayVideo("vol4e1.anm", vol4e1, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("vol4e1.anm", vol4e1, framespeed_10) };
jobs[job++] = { PlayVideo("vol4e2.anm", vol4e2, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("vol4e2.anm", vol4e2, framespeed_10) };
jobs[job++] = { PlayVideo("vol4e3.anm", vol4e3, framespeed_10), []() { S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI); } }; jobs[job++] = { PlayVideo("vol4e3.anm", vol4e3, framespeed_10) };
jobs[job++] = { Create<DEpisode4Text>(), nullptr }; jobs[job++] = { Create<DEpisode4Text>() };
jobs[job++] = { Create<DImageScreen>(TexMan.GetGameTextureByName("DUKETEAM.ANM", false, FTextureManager::TEXMAN_ForceLookup), jobs[job++] = { Create<DImageScreen>(TexMan.GetGameTextureByName("DUKETEAM.ANM", false, FTextureManager::TEXMAN_ForceLookup),
DScreenJob::fadein | DScreenJob::fadeout, 0x7fffffff), []() { FX_StopAllSounds(); } }; DScreenJob::fadein | DScreenJob::fadeout | DScreenJob::stopsound, 0x7fffffff) };
break; break;
case 4: case 4:
Mus_Stop(); Mus_Stop();
jobs[job++] = { Create<DEpisode5End>(), []() { FX_StopAllSounds(); } }; jobs[job++] = { Create<DEpisode5End>() };
break; break;
} }
} }
@ -698,8 +733,8 @@ void showtwoscreens(const CompletionFunc& completion)
JobDesc jobs[2]; JobDesc jobs[2];
int job = 0; int job = 0;
jobs[job++] = { Create<DImageScreen>(3291), nullptr }; jobs[job++] = { Create<DImageScreen>(3291) };
jobs[job++] = { Create<DImageScreen>(3290), nullptr }; jobs[job++] = { Create<DImageScreen>(3290) };
RunScreenJob(jobs, job, completion); RunScreenJob(jobs, job, completion);
} }
@ -709,7 +744,7 @@ void doorders(const CompletionFunc& completion)
int job = 0; int job = 0;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
jobs[job++] = { Create<DImageScreen>(ORDERING + i), nullptr }; jobs[job++] = { Create<DImageScreen>(ORDERING + i) };
RunScreenJob(jobs, job, completion); RunScreenJob(jobs, job, completion);
} }
@ -1128,9 +1163,9 @@ void e4intro(const CompletionFunc& completion)
static const int framespeed_14[] = { 14, 14, 14 }; static const int framespeed_14[] = { 14, 14, 14 };
S_PlaySpecialMusic(MUS_BRIEFING); S_PlaySpecialMusic(MUS_BRIEFING);
jobs[job++] = { PlayVideo("vol41a.anm", vol41a, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("vol41a.anm", vol41a, framespeed_10) };
jobs[job++] = { PlayVideo("vol42a.anm", vol42a, framespeed_14), nullptr }; jobs[job++] = { PlayVideo("vol42a.anm", vol42a, framespeed_14) };
jobs[job++] = { PlayVideo("vol43a.anm", vol43a, framespeed_10), nullptr }; jobs[job++] = { PlayVideo("vol43a.anm", vol43a, framespeed_10) };
RunScreenJob(jobs, job, completion, SJ_SKIPALL); RunScreenJob(jobs, job, completion, SJ_SKIPALL);
} }

View file

@ -196,13 +196,13 @@ void Logo_r(const CompletionFunc& completion)
} }
else if (!isRRRA()) else if (!isRRRA())
{ {
jobs[job++] = { PlayVideo("rr_intro.anm", introsound, framespeed), nullptr }; jobs[job++] = { PlayVideo("rr_intro.anm", introsound, framespeed) };
jobs[job++] = { PlayVideo("redneck.anm", rednecksound, framespeed), nullptr }; jobs[job++] = { PlayVideo("redneck.anm", rednecksound, framespeed) };
jobs[job++] = { PlayVideo("xatlogo.anm", xatrixsound, framespeed), nullptr }; jobs[job++] = { PlayVideo("xatlogo.anm", xatrixsound, framespeed) };
} }
else else
{ {
jobs[job++] = { PlayVideo("redint.mve"), nullptr }; jobs[job++] = { PlayVideo("redint.mve") };
} }
RunScreenJob(jobs, job, completion, SJ_BLOCKUI); RunScreenJob(jobs, job, completion, SJ_BLOCKUI);
} }
@ -235,13 +235,13 @@ static void bonussequence_r(int num, JobDesc* jobs, int& job)
switch (num) switch (num)
{ {
case 0: case 0:
jobs[job++] = { PlayVideo("turdmov.anm", turdmov, framespeed), nullptr }; jobs[job++] = { PlayVideo("turdmov.anm", turdmov, framespeed) };
jobs[job++] = { Create<DImageScreen>(TENSCREEN), nullptr }; jobs[job++] = { Create<DImageScreen>(TENSCREEN) };
break; break;
case 1: case 1:
jobs[job++] = { PlayVideo("rr_outro.anm", rr_outro, framespeed), nullptr }; jobs[job++] = { PlayVideo("rr_outro.anm", rr_outro, framespeed) };
jobs[job++] = { Create<DImageScreen>(TENSCREEN), nullptr }; jobs[job++] = { Create<DImageScreen>(TENSCREEN) };
break; break;
default: default:

View file

@ -356,6 +356,7 @@ public:
seconds = (second_tics % 60); seconds = (second_tics % 60);
} }
private: private:
static void gNextState(STATE** State) static void gNextState(STATE** State)
{ {
// Transition to the next state // Transition to the next state
@ -403,6 +404,7 @@ private:
void Start() override void Start() override
{ {
FX_StopAllSounds();
PlaySong(nullptr, ThemeSongs[1], ThemeTrack[1]); PlaySong(nullptr, ThemeSongs[1], ThemeTrack[1]);
} }
@ -610,7 +612,7 @@ void StatScreen(int FinishAnim, CompletionFunc completion)
if (FinishAnim) if (FinishAnim)
{ {
StopSound(); StopSound();
jobs[job++] = { GetFinishAnim(FinishAnim), []() { soundEngine->StopAllChannels(); } }; jobs[job++] = { GetFinishAnim(FinishAnim) };
jobs[job++] = { Create<DSWLevelSummaryScreen>() }; jobs[job++] = { Create<DSWLevelSummaryScreen>() };
if (FinishAnim == ANIM_ZILLA) if (FinishAnim == ANIM_ZILLA)
jobs[job++] = { Create<DSWCreditsScreen>() }; jobs[job++] = { Create<DSWCreditsScreen>() };