- 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(DImageScreen, true, false)
void DScreenJob::OnDestroy()
{
if (flags & stopmusic) Mus_Stop();
if (flags & stopsound) FX_StopAllSounds();
}
bool DSkippableScreenJob::OnEvent(event_t* evt)
{
@ -164,7 +169,7 @@ public:
{
if (index >= 0)
{
if (jobs[index].postAction) jobs[index].postAction();
//if (jobs[index].postAction) jobs[index].postAction();
jobs[index].job->Destroy();
}
index++;
@ -176,7 +181,7 @@ public:
actionState = clearbefore ? State_Clear : State_Run;
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();
}
inputState.ClearAllInput();
@ -289,7 +294,7 @@ public:
if (terminateState < 1)
{
// 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->state = DScreenJob::stopping;

View file

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

View file

@ -36,6 +36,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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
{
jobs[job++] = { Create<DBlackScreen>(1), []() { sndStartSample("THUNDER2", 128, -1); } };
jobs[job++] = { Create<DImageScreen>(2050) };
jobs[job++] = { Create<DBloodIntroImage>(2050) };
}
if (fileSystem.FindFile("gti.smk") != -1)
{
@ -79,12 +92,11 @@ void playlogos()
}
else
{
jobs[job++] = { Create<DBlackScreen>(1), []() { sndStartSample("THUNDER2", 128, -1); } };
jobs[job++] = { Create<DImageScreen>(2052) };
jobs[job++] = { Create<DBloodIntroImage>(2052) };
}
}
jobs[job++] = { Create<DBlackScreen>(1), []() { sndPlaySpecialMusicOrNothing(MUS_INTRO); sndStartSample("THUNDER2", 128, -1); }};
jobs[job++] = { Create<DImageScreen>(2518, DScreenJob::fadein) };
jobs[job++] = { Create<DBlackScreen>(1) };
jobs[job++] = { Create<DBloodIntroImage>(2518, DScreenJob::fadein, true) };
RunScreenJob(jobs, job, [](bool) {
Mus_Stop();

View file

@ -170,6 +170,11 @@ class DDRealmsScreen : public DSkippableScreenJob
public:
DDRealmsScreen() : DSkippableScreenJob(fadein | fadeout) {}
void Start() override
{
S_PlaySpecialMusic(MUS_INTRO);
}
void OnTick() override
{
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
{
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;
if (!userConfig.nologo)
{
if (!isShareware()) jobs[job++] = { PlayVideo("logo.anm", logosound, logoframetimes), []() { S_PlaySpecialMusic(MUS_INTRO); } };
else jobs[job++] = { Create<DBlackScreen>(1), []() { S_PlaySpecialMusic(MUS_INTRO); } };
if (!isNam()) jobs[job++] = { Create<DDRealmsScreen>(), nullptr };
if (!isShareware()) jobs[job++] = { PlayVideo("logo.anm", logosound, logoframetimes) };
if (!isNam()) jobs[job++] = { Create<DDRealmsScreen>(), };
}
else S_PlaySpecialMusic(MUS_INTRO);
jobs[job++] = { Create<DTitleScreen>(), []() { S_PlaySound(NITEVISION_ONOFF, CHAN_AUTO, CHANF_UI); } };
jobs[job++] = { Create<DTitleScreen>() };
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();
}
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 + 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;
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)
{
case 0:
jobs[job++] = { Create<DEpisode1End1>(), nullptr };
jobs[job++] = { Create<DImageScreen>(E1ENDSCREEN, DScreenJob::fadein|DScreenJob::fadeout, 0x7fffffff), []() { Mus_Stop(); } };
jobs[job++] = { Create<DEpisode1End1>() };
jobs[job++] = { Create<DImageScreen>(E1ENDSCREEN, DScreenJob::fadein|DScreenJob::fadeout|DScreenJob::stopmusic, 0x7fffffff) };
break;
case 1:
Mus_Stop();
jobs[job++] = { PlayVideo("cineov2.anm", cineov2sound, framespeed_18), []() { S_PlaySound(PIPEBOMB_EXPLODE, CHAN_AUTO, CHANF_UI); } };
jobs[job++] = { Create<DImageScreen>(E2ENDSCREEN, DScreenJob::fadein | DScreenJob::fadeout, 0x7fffffff), []() { FX_StopAllSounds(); } };
jobs[job++] = { PlayVideo("cineov2.anm", cineov2sound, framespeed_18) };
jobs[job++] = { Create<DE2EndScreen>() };
break;
case 2:
Mus_Stop();
if (g_gameType & GAMEFLAG_DUKEDC)
{
jobs[job++] = { PlayVideo("radlogo.anm", dukedcsound, framespeed_10), nullptr };
jobs[job++] = { PlayVideo("radlogo.anm", dukedcsound, framespeed_10) };
}
else
{
jobs[job++] = { PlayVideo("cineov3.anm", cineov3sound, framespeed_10), nullptr };
jobs[job++] = { Create<DBlackScreen>(200), []() { FX_StopAllSounds(); } };
jobs[job++] = { Create<DEpisode3End>(), []() { if (!isPlutoPak()) S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI); } };
jobs[job++] = { PlayVideo("cineov3.anm", cineov3sound, framespeed_10) };
jobs[job++] = { Create<DBlackScreen>(200, DScreenJob::stopsound) };
jobs[job++] = { Create<DEpisode3End>() };
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;
case 3:
Mus_Stop();
jobs[job++] = { PlayVideo("vol4e1.anm", vol4e1, framespeed_10), nullptr };
jobs[job++] = { PlayVideo("vol4e2.anm", vol4e2, framespeed_10), nullptr };
jobs[job++] = { PlayVideo("vol4e3.anm", vol4e3, framespeed_10), []() { S_PlaySound(ENDSEQVOL3SND4, CHAN_AUTO, CHANF_UI); } };
jobs[job++] = { Create<DEpisode4Text>(), nullptr };
jobs[job++] = { PlayVideo("vol4e1.anm", vol4e1, framespeed_10) };
jobs[job++] = { PlayVideo("vol4e2.anm", vol4e2, framespeed_10) };
jobs[job++] = { PlayVideo("vol4e3.anm", vol4e3, framespeed_10) };
jobs[job++] = { Create<DEpisode4Text>() };
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;
case 4:
Mus_Stop();
jobs[job++] = { Create<DEpisode5End>(), []() { FX_StopAllSounds(); } };
jobs[job++] = { Create<DEpisode5End>() };
break;
}
}
@ -698,8 +733,8 @@ void showtwoscreens(const CompletionFunc& completion)
JobDesc jobs[2];
int job = 0;
jobs[job++] = { Create<DImageScreen>(3291), nullptr };
jobs[job++] = { Create<DImageScreen>(3290), nullptr };
jobs[job++] = { Create<DImageScreen>(3291) };
jobs[job++] = { Create<DImageScreen>(3290) };
RunScreenJob(jobs, job, completion);
}
@ -709,7 +744,7 @@ void doorders(const CompletionFunc& completion)
int job = 0;
for (int i = 0; i < 4; i++)
jobs[job++] = { Create<DImageScreen>(ORDERING + i), nullptr };
jobs[job++] = { Create<DImageScreen>(ORDERING + i) };
RunScreenJob(jobs, job, completion);
}
@ -1128,9 +1163,9 @@ void e4intro(const CompletionFunc& completion)
static const int framespeed_14[] = { 14, 14, 14 };
S_PlaySpecialMusic(MUS_BRIEFING);
jobs[job++] = { PlayVideo("vol41a.anm", vol41a, framespeed_10), nullptr };
jobs[job++] = { PlayVideo("vol42a.anm", vol42a, framespeed_14), nullptr };
jobs[job++] = { PlayVideo("vol43a.anm", vol43a, framespeed_10), nullptr };
jobs[job++] = { PlayVideo("vol41a.anm", vol41a, framespeed_10) };
jobs[job++] = { PlayVideo("vol42a.anm", vol42a, framespeed_14) };
jobs[job++] = { PlayVideo("vol43a.anm", vol43a, framespeed_10) };
RunScreenJob(jobs, job, completion, SJ_SKIPALL);
}

View file

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

View file

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