mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 20:20:40 +00:00
- final cleanup on new cutscene interfacw
* fixed frame gaps when exiting a cutscene. This must be properly synchronized with the state handler in the main loop. * reactivated the loading screens. With texture precaching working the delay when loading a map becomes significant enough to require a visual feedback. * RR does not play 'bonusmusic' on its summary screen.
This commit is contained in:
parent
ad01aee5ec
commit
cdccdec3e7
10 changed files with 77 additions and 213 deletions
|
@ -242,7 +242,7 @@ void changeMap(int player, uint8_t** stream, bool skip)
|
||||||
|
|
||||||
void endScreenJob(int player, uint8_t** stream, bool skip)
|
void endScreenJob(int player, uint8_t** stream, bool skip)
|
||||||
{
|
{
|
||||||
if (!skip) EndScreenJob();
|
if (!skip) gameaction = ga_endscreenjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -43,6 +43,7 @@ enum gameaction_t : int
|
||||||
ga_nextlevel, // Actually start the next level.
|
ga_nextlevel, // Actually start the next level.
|
||||||
ga_loadgamehidecon,
|
ga_loadgamehidecon,
|
||||||
ga_newgamenostopsound, // start a new game
|
ga_newgamenostopsound, // start a new game
|
||||||
|
ga_endscreenjob,
|
||||||
|
|
||||||
ga_fullconsole,
|
ga_fullconsole,
|
||||||
};
|
};
|
||||||
|
|
|
@ -133,23 +133,6 @@ void G_BuildTiccmd(ticcmd_t* cmd)
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
bool newGameStarted;
|
bool newGameStarted;
|
||||||
|
|
||||||
void NewGame(MapRecord* map, int skill, bool ns = false)
|
|
||||||
{
|
|
||||||
newGameStarted = true;
|
|
||||||
int volume = map->cluster - 1;
|
|
||||||
if (volume >= 0 && volume < MAXVOLUMES)
|
|
||||||
{
|
|
||||||
if (StartCutscene(volumeList[volume].intro, 0, [=](bool) { gi->NewGame(map, skill, ns); })) return;
|
|
||||||
}
|
|
||||||
gi->NewGame(map, skill, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
static void GameTicker()
|
static void GameTicker()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -176,6 +159,7 @@ static void GameTicker()
|
||||||
FX_SetReverb(0);
|
FX_SetReverb(0);
|
||||||
gi->FreeLevelData();
|
gi->FreeLevelData();
|
||||||
gameaction = ga_level;
|
gameaction = ga_level;
|
||||||
|
newGameStarted = true;
|
||||||
NewGame(g_nextmap, -1);
|
NewGame(g_nextmap, -1);
|
||||||
BackupSaveGame = "";
|
BackupSaveGame = "";
|
||||||
}
|
}
|
||||||
|
@ -213,6 +197,7 @@ static void GameTicker()
|
||||||
C_FlushDisplay();
|
C_FlushDisplay();
|
||||||
gameaction = ga_level;
|
gameaction = ga_level;
|
||||||
BackupSaveGame = "";
|
BackupSaveGame = "";
|
||||||
|
newGameStarted = true;
|
||||||
NewGame(g_nextmap, g_nextskill, ga == ga_newgamenostopsound);
|
NewGame(g_nextmap, g_nextskill, ga == ga_newgamenostopsound);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -269,6 +254,10 @@ static void GameTicker()
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ga_endscreenjob:
|
||||||
|
EndScreenJob();
|
||||||
|
break;
|
||||||
|
|
||||||
// for later
|
// for later
|
||||||
// case ga_recordgame, // start a new demo recording (later)
|
// case ga_recordgame, // start a new demo recording (later)
|
||||||
// case ga_loadgameplaydemo, // load a savegame and play a demo.
|
// case ga_loadgameplaydemo, // load a savegame and play a demo.
|
||||||
|
@ -659,6 +648,7 @@ void MainLoop ()
|
||||||
userConfig.CommandMap = "";
|
userConfig.CommandMap = "";
|
||||||
if (maprecord)
|
if (maprecord)
|
||||||
{
|
{
|
||||||
|
newGameStarted = true;
|
||||||
NewGame(maprecord, /*userConfig.skill*/2); // todo: fix the skill.
|
NewGame(maprecord, /*userConfig.skill*/2); // todo: fix the skill.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,7 @@ struct GlobalCutscenes
|
||||||
CutsceneDef DefaultMapIntro;
|
CutsceneDef DefaultMapIntro;
|
||||||
CutsceneDef DefaultMapOutro;
|
CutsceneDef DefaultMapOutro;
|
||||||
CutsceneDef SharewareEnd;
|
CutsceneDef SharewareEnd;
|
||||||
|
CutsceneDef LoadingScreen;
|
||||||
FString MPSummaryScreen;
|
FString MPSummaryScreen;
|
||||||
FString SummaryScreen;
|
FString SummaryScreen;
|
||||||
};
|
};
|
||||||
|
|
|
@ -100,6 +100,10 @@ void parseDefineCutscene(FScanner& sc, FScriptPosition& pos)
|
||||||
{
|
{
|
||||||
parseCutscene(sc, globalCutscenes.SharewareEnd);
|
parseCutscene(sc, globalCutscenes.SharewareEnd);
|
||||||
}
|
}
|
||||||
|
else if (sc.Compare("loading")) // sets the loading screen when entering a level.
|
||||||
|
{
|
||||||
|
parseCutscene(sc, globalCutscenes.LoadingScreen);
|
||||||
|
}
|
||||||
else if (sc.Compare({ "episode", "volume", "cluster" }))
|
else if (sc.Compare({ "episode", "volume", "cluster" }))
|
||||||
{
|
{
|
||||||
FScanner::SavedPos eblockend;
|
FScanner::SavedPos eblockend;
|
||||||
|
|
|
@ -356,7 +356,7 @@ bool ScreenJobValidate()
|
||||||
|
|
||||||
bool StartCutscene(CutsceneDef& cs, int flags, const CompletionFunc& completion_)
|
bool StartCutscene(CutsceneDef& cs, int flags, const CompletionFunc& completion_)
|
||||||
{
|
{
|
||||||
if (cs.function.IsNotEmpty() && cs.video.IsNotEmpty()cs.function.CompareNoCase("none") != 0)
|
if (cs.function.IsNotEmpty() && cs.video.IsNotEmpty() && cs.function.CompareNoCase("none") != 0)
|
||||||
{
|
{
|
||||||
completion = completion_;
|
completion = completion_;
|
||||||
runner = CreateRunner();
|
runner = CreateRunner();
|
||||||
|
@ -440,6 +440,43 @@ void ShowScoreboard(int numplayers, const CompletionFunc& completion_)
|
||||||
gameaction = ga_intermission;
|
gameaction = ga_intermission;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void NewGame(MapRecord* map, int skill, bool ns)
|
||||||
|
{
|
||||||
|
completion = [=](bool) { gi->NewGame(map, skill, ns); };
|
||||||
|
runner = CreateRunner();
|
||||||
|
GC::WriteBarrier(runner);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int volume = map->cluster - 1;
|
||||||
|
if (volume >= 0 && volume < MAXVOLUMES)
|
||||||
|
volumeList[volume].intro.Create(runner);
|
||||||
|
|
||||||
|
globalCutscenes.LoadingScreen.Create(runner, map);
|
||||||
|
if (!ScreenJobValidate())
|
||||||
|
{
|
||||||
|
runner->Destroy();
|
||||||
|
runner = nullptr;
|
||||||
|
completion(false);
|
||||||
|
completion = nullptr;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gameaction = ga_intermission;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
if (runner) runner->Destroy();
|
||||||
|
runner = nullptr;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -468,8 +505,10 @@ void ShowIntermission(MapRecord* fromMap, MapRecord* toMap, SummaryInfo* info, C
|
||||||
|
|
||||||
if (toMap)
|
if (toMap)
|
||||||
{
|
{
|
||||||
if (!toMap->intro.Create(runner, fromMap))
|
if (!toMap->intro.Create(runner, toMap))
|
||||||
globalCutscenes.DefaultMapIntro.Create(runner, fromMap);
|
globalCutscenes.DefaultMapIntro.Create(runner, toMap);
|
||||||
|
|
||||||
|
globalCutscenes.LoadingScreen.Create(runner, toMap);
|
||||||
}
|
}
|
||||||
else if (isShareware())
|
else if (isShareware())
|
||||||
{
|
{
|
||||||
|
@ -502,9 +541,7 @@ CCMD(testcutscene)
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CutsceneDef def;
|
if (StartCutscene(argv[1], 0, [](bool) {}))
|
||||||
def.function = argv[1];
|
|
||||||
if (StartCutscene(def, 0, [](bool) {}))
|
|
||||||
{
|
{
|
||||||
C_HideConsole();
|
C_HideConsole();
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,193 +7,14 @@
|
||||||
#include "gamestate.h"
|
#include "gamestate.h"
|
||||||
|
|
||||||
using CompletionFunc = std::function<void(bool)>;
|
using CompletionFunc = std::function<void(bool)>;
|
||||||
struct JobDesc;
|
|
||||||
class ScreenJobRunner;
|
|
||||||
|
|
||||||
void Job_Init();
|
void Job_Init();
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
class DScreenJob : public DObject
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(DScreenJob, DObject)
|
|
||||||
public:
|
|
||||||
const int flags;
|
|
||||||
const float fadetime; // in milliseconds
|
|
||||||
int fadestate = fadein;
|
|
||||||
|
|
||||||
friend class ScreenJobRunner;
|
|
||||||
//protected:
|
|
||||||
int ticks = 0;
|
|
||||||
int state = running;
|
|
||||||
bool pausable = true;
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
running = 1, // normal operation
|
|
||||||
skipped = 2, // finished by user skipping
|
|
||||||
finished = 3, // finished by completing its sequence
|
|
||||||
stopping = 4, // running ending animations / fadeout, etc. Will not accept more input.
|
|
||||||
stopped = 5, // we're done here.
|
|
||||||
};
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
visible = 0,
|
|
||||||
fadein = 1,
|
|
||||||
fadeout = 2,
|
|
||||||
stopmusic = 4,
|
|
||||||
stopsound = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
DScreenJob(int fade = 0, float fadet = 250.f) : flags(fade), fadetime(fadet) {}
|
|
||||||
|
|
||||||
virtual bool ProcessInput()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void Start() {}
|
|
||||||
virtual bool OnEvent(event_t* evt) { return false; }
|
|
||||||
virtual void OnTick() { /*state = finished;*/ }
|
|
||||||
virtual void Draw(double smoothratio) {}
|
|
||||||
|
|
||||||
int DrawFrame(double smoothratio)
|
|
||||||
{
|
|
||||||
if (state != running) smoothratio = 1; // this is necessary because the ticker won't be incremented anymore to avoid having a negative time span.
|
|
||||||
Draw(smoothratio);
|
|
||||||
if (state == skipped) return -1;
|
|
||||||
if (state == finished) return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetFadeState() const { return fadestate; }
|
|
||||||
|
|
||||||
virtual void OnDestroy() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class DSkippableScreenJob : public DScreenJob
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(DSkippableScreenJob, DScreenJob)
|
|
||||||
public:
|
|
||||||
DSkippableScreenJob(int fade = 0, float fadet = 250.f) : DScreenJob(fade, fadet)
|
|
||||||
{}
|
|
||||||
|
|
||||||
bool OnEvent(event_t* evt) override;
|
|
||||||
virtual void Skipped() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class DBlackScreen : public DScreenJob
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(DBlackScreen, DScreenJob)
|
|
||||||
public:
|
|
||||||
int wait;
|
|
||||||
bool cleared = false;
|
|
||||||
|
|
||||||
public:
|
|
||||||
DBlackScreen(int w, int flags = 0) : DScreenJob(flags & ~(fadein|fadeout)), wait(w) {}
|
|
||||||
void OnTick() override;
|
|
||||||
void Draw(double smooth) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class DImageScreen : public DSkippableScreenJob
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(DImageScreen, DScreenJob)
|
|
||||||
|
|
||||||
public:
|
|
||||||
int tilenum = -1;
|
|
||||||
int trans;
|
|
||||||
int waittime; // in ms.
|
|
||||||
bool cleared = false;
|
|
||||||
FTextureID texid;
|
|
||||||
FGameTexture* tex = nullptr;
|
|
||||||
|
|
||||||
public:
|
|
||||||
DImageScreen(FGameTexture* tile, int fade = DScreenJob::fadein | DScreenJob::fadeout, int wait = 3000, int translation = 0) : DSkippableScreenJob(fade), waittime(wait)
|
|
||||||
{
|
|
||||||
tex = tile;
|
|
||||||
trans = translation;
|
|
||||||
}
|
|
||||||
|
|
||||||
DImageScreen(int tile, int fade = DScreenJob::fadein | DScreenJob::fadeout, int wait = 3000, int translation = 0) : DSkippableScreenJob(fade), waittime(wait)
|
|
||||||
{
|
|
||||||
tilenum = tile;
|
|
||||||
trans = translation;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnTick() override;
|
|
||||||
void Draw(double smooth) override;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class ScreenJobRunner
|
|
||||||
{
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
State_Clear,
|
|
||||||
State_Run,
|
|
||||||
State_Fadeout
|
|
||||||
};
|
|
||||||
TArray<DScreenJob*> jobs;
|
|
||||||
CompletionFunc completion;
|
|
||||||
int index = -1;
|
|
||||||
float screenfade;
|
|
||||||
bool clearbefore;
|
|
||||||
bool skipall;
|
|
||||||
int actionState;
|
|
||||||
int terminateState;
|
|
||||||
int fadeticks = 0;
|
|
||||||
int last_paused_tic = -1;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ScreenJobRunner(TArray<DScreenJob*>& jobs, CompletionFunc completion_, bool clearbefore_, bool skipall_);
|
|
||||||
~ScreenJobRunner();
|
|
||||||
void DeleteJobs();
|
|
||||||
void AdvanceJob(bool skip);
|
|
||||||
int DisplayFrame(double smoothratio);
|
|
||||||
int FadeoutFrame(double smoothratio);
|
|
||||||
bool OnEvent(event_t* ev);
|
|
||||||
void OnFinished();
|
|
||||||
void OnTick();
|
|
||||||
bool RunFrame();
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
SJ_BLOCKUI = 1,
|
SJ_BLOCKUI = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
void RunScreenJob(TArray<DScreenJob*>& jobs, CompletionFunc completion, int flags = 0);
|
|
||||||
#endif
|
|
||||||
void EndScreenJob();
|
void EndScreenJob();
|
||||||
void DeleteScreenJob();
|
void DeleteScreenJob();
|
||||||
bool ScreenJobResponder(event_t* ev);
|
bool ScreenJobResponder(event_t* ev);
|
||||||
|
@ -203,8 +24,8 @@ void ScreenJobDraw();
|
||||||
struct CutsceneDef;
|
struct CutsceneDef;
|
||||||
struct MapRecord;
|
struct MapRecord;
|
||||||
struct SummaryInfo;
|
struct SummaryInfo;
|
||||||
bool StartCutscene(CutsceneDef& cs, int flags, const CompletionFunc& completion);
|
|
||||||
bool StartCutscene(const char* s, int flags, const CompletionFunc& completion);
|
bool StartCutscene(const char* s, int flags, const CompletionFunc& completion);
|
||||||
void PlayLogos(gameaction_t complete_ga, gameaction_t def_ga, bool stopmusic);
|
void PlayLogos(gameaction_t complete_ga, gameaction_t def_ga, bool stopmusic);
|
||||||
void ShowScoreboard(int numplayers, const CompletionFunc& completion_);
|
void ShowScoreboard(int numplayers, const CompletionFunc& completion_);
|
||||||
void ShowIntermission(MapRecord* fromMap, MapRecord* toMap, SummaryInfo* info, CompletionFunc completion_);
|
void ShowIntermission(MapRecord* fromMap, MapRecord* toMap, SummaryInfo* info, CompletionFunc completion_);
|
||||||
|
void NewGame(MapRecord* map, int skill, bool ns = false);
|
||||||
|
|
|
@ -54,6 +54,11 @@ definecutscene sharewareend
|
||||||
function DukeCutscenes.BuildSharewareEnd
|
function DukeCutscenes.BuildSharewareEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
definecutscene loading
|
||||||
|
{
|
||||||
|
function DukeCutscenes.BuildLoading
|
||||||
|
}
|
||||||
|
|
||||||
definecutscene summary DukeCutscenes.BuildSPSummary
|
definecutscene summary DukeCutscenes.BuildSPSummary
|
||||||
definecutscene mpsummary DukeCutscenes.BuildMPSummary
|
definecutscene mpsummary DukeCutscenes.BuildMPSummary
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,15 @@ definecutscene episode 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
definecutscene summary RRCutscenes.BuildSPSummary
|
|
||||||
definecutscene mpsummary DukeCutscenes.BuildMPSummary // identical with Duke's
|
|
||||||
definecutscene mapintro
|
definecutscene mapintro
|
||||||
{
|
{
|
||||||
function RRCutscenes.BuildMapIntro // this plays the 'travel' animation.
|
function RRCutscenes.BuildMapIntro // this plays the 'travel' animation.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
definecutscene loading
|
||||||
|
{
|
||||||
|
function DukeCutscenes.BuildLoading // identical with Duke's
|
||||||
|
}
|
||||||
|
|
||||||
|
definecutscene summary RRCutscenes.BuildSPSummary
|
||||||
|
definecutscene mpsummary DukeCutscenes.BuildMPSummary // identical with Duke's
|
||||||
|
|
|
@ -459,7 +459,7 @@ class DukeMultiplayerBonusScreen : SkippableScreenJob
|
||||||
|
|
||||||
override void Start()
|
override void Start()
|
||||||
{
|
{
|
||||||
Duke.PlayBonusMusic();
|
if (!Raze.isRR()) Duke.PlayBonusMusic();
|
||||||
}
|
}
|
||||||
|
|
||||||
override void Draw(double smoothratio)
|
override void Draw(double smoothratio)
|
||||||
|
@ -853,11 +853,6 @@ class RRLevelSummaryScreen : SummaryScreenBase
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override void Start()
|
|
||||||
{
|
|
||||||
Duke.PlayBonusMusic();
|
|
||||||
}
|
|
||||||
|
|
||||||
override void OnTick()
|
override void OnTick()
|
||||||
{
|
{
|
||||||
if ((displaystate & printStatsAll) != printStatsAll)
|
if ((displaystate & printStatsAll) != printStatsAll)
|
||||||
|
@ -1031,10 +1026,15 @@ class DukeLoadScreen : ScreenJob
|
||||||
|
|
||||||
ScreenJob Init(MapRecord maprec)
|
ScreenJob Init(MapRecord maprec)
|
||||||
{
|
{
|
||||||
Super.Init();
|
Super.Init(fadein);
|
||||||
rec = maprec;
|
rec = maprec;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void OnTick()
|
||||||
|
{
|
||||||
|
if (fadestate == visible) jobstate = finished;
|
||||||
|
}
|
||||||
|
|
||||||
override void Draw(double sr)
|
override void Draw(double sr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue