Screenjob WIP stuff

This commit is contained in:
Christoph Oelckers 2022-04-11 13:12:37 +02:00
parent 80200da947
commit 1bb750c061
13 changed files with 161 additions and 132 deletions

View file

@ -143,7 +143,6 @@ extern bool playedtitlemusic;
gameaction_t gameaction; gameaction_t gameaction;
gamestate_t gamestate = GS_STARTUP; gamestate_t gamestate = GS_STARTUP;
FName SelectedSlideshow; // what to start when ga_slideshow
int paused; int paused;
bool pauseext; bool pauseext;
@ -1169,9 +1168,6 @@ void G_Ticker ()
case ga_completed: case ga_completed:
G_DoCompleted (); G_DoCompleted ();
break; break;
case ga_slideshow:
if (gamestate == GS_LEVEL) F_StartIntermission(SelectedSlideshow, FSTATE_InLevel);
break;
case ga_worlddone: case ga_worlddone:
G_DoWorldDone (); G_DoWorldDone ();
break; break;
@ -1192,6 +1188,11 @@ void G_Ticker ()
P_ResumeConversation (); P_ResumeConversation ();
gameaction = ga_nothing; gameaction = ga_nothing;
break; break;
case ga_intermission:
gamestate = GS_CUTSCENE;
break;
default: default:
case ga_nothing: case ga_nothing:
break; break;
@ -3058,8 +3059,16 @@ bool G_CheckDemoStatus (void)
void G_StartSlideshow(FLevelLocals *Level, FName whichone) void G_StartSlideshow(FLevelLocals *Level, FName whichone)
{ {
gameaction = ga_slideshow; auto SelectedSlideshow = whichone == NAME_None ? Level->info->slideshow : whichone;
SelectedSlideshow = whichone == NAME_None ? Level->info->slideshow : whichone; auto slide = F_StartIntermission(SelectedSlideshow);
RunIntermission(slide, nullptr, [](bool)
{
primaryLevel->SetMusic();
gamestate = GS_LEVEL;
wipegamestate = GS_LEVEL;
gameaction = ga_resumeconversation;
});
} }
DEFINE_ACTION_FUNCTION(FLevelLocals, StartSlideshow) DEFINE_ACTION_FUNCTION(FLevelLocals, StartSlideshow)

View file

@ -106,6 +106,8 @@ void G_AddViewAngle (int yaw, bool mouse = false);
class FBaseCVar; class FBaseCVar;
FBaseCVar* G_GetUserCVar(int playernum, const char* cvarname); FBaseCVar* G_GetUserCVar(int playernum, const char* cvarname);
void RunIntermission(DIntermissionController* intermissionScreen, DObject* statusScreen, std::function<void(bool)> completionf);
extern const AActor *SendItemUse, *SendItemDrop; extern const AActor *SendItemUse, *SendItemDrop;
extern int SendItemDropAmount; extern int SendItemDropAmount;

View file

@ -839,7 +839,8 @@ DIntermissionController* FLevelLocals::CreateIntermission()
thiscluster = FindClusterInfo (cluster); thiscluster = FindClusterInfo (cluster);
if (strncmp (nextlevel, "enDSeQ", 6) == 0) bool endgame = strncmp (nextlevel, "enDSeQ", 6) == 0;
if (endgame)
{ {
FName endsequence = ENamedName(strtoll(nextlevel.GetChars()+6, NULL, 16)); FName endsequence = ENamedName(strtoll(nextlevel.GetChars()+6, NULL, 16));
// Strife needs a special case here to choose between good and sad ending. Bad is handled elsewhere. // Strife needs a special case here to choose between good and sad ending. Bad is handled elsewhere.
@ -902,6 +903,7 @@ DIntermissionController* FLevelLocals::CreateIntermission()
ext->mDefined & FExitText::DEF_LOOKUP, ext->mDefined & FExitText::DEF_LOOKUP,
false); false);
} }
if (controller) controller->mEndGame = false;
return controller; return controller;
} }
@ -933,9 +935,35 @@ DIntermissionController* FLevelLocals::CreateIntermission()
} }
} }
} }
if (controller) controller->mEndGame = endgame;
return controller; return controller;
} }
void RunIntermission(DIntermissionController* intermissionScreen, DObject* statusScreen, std::function<void(bool)> completionf)
{
runner = CreateRunner();
GC::WriteBarrier(runner);
completion = std::move(completionf);
auto func = LookupFunction("DoomCutscenes.BuildMapTransition");
if (func == nullptr)
{
I_Error("Script function 'DoomCutscenes.BuildMapTransition' not found");
}
VMValue val[3] = { runner, intermissionScreen, statusScreen };
VMCall(func, val, 3, nullptr, 0);
if (!ScreenJobValidate())
{
runner->Destroy();
runner = nullptr;
if (completion) completion(false);
completion = nullptr;
return;
}
gameaction = ga_intermission;
}
void G_DoCompleted (void) void G_DoCompleted (void)
{ {
gameaction = ga_nothing; gameaction = ga_nothing;
@ -972,17 +1000,16 @@ void G_DoCompleted (void)
DObject* statusScreen = nullptr, *intermissionScreen = nullptr; DObject* statusScreen = nullptr, *intermissionScreen = nullptr;
if (playinter) if (playinter)
{ {
viewactive = false;
automapactive = false;
// [RH] If you ever get a statistics driver operational, adapt this. // [RH] If you ever get a statistics driver operational, adapt this.
// if (statcopy) // if (statcopy)
// memcpy (statcopy, &wminfo, sizeof(wminfo)); // memcpy (statcopy, &wminfo, sizeof(wminfo));
statusScreen = WI_Start (&staticWmInfo); statusScreen = WI_Start (&staticWmInfo);
} }
bool endgame = intermissionScreen && intermissionScreen->mEndGame;
intermissionScreen = primaryLevel->CreateIntermission(); intermissionScreen = primaryLevel->CreateIntermission();
// todo: create start of level screenjob. RunIntermission(intermissionScreen, statusScreen, [=](bool) { if (!endgame) primaryLevel->WorldDone(); }
)
} }
//========================================================================== //==========================================================================

View file

@ -196,9 +196,9 @@ void DIntermissionScreen::Init(FIntermissionAction *desc, bool first)
} }
int DIntermissionScreen::Responder (event_t *ev) int DIntermissionScreen::Responder (FInputEvent *ev)
{ {
if (ev->type == EV_KeyDown) if (ev->Type == EV_KeyDown)
{ {
return -1; return -1;
} }
@ -275,9 +275,9 @@ void DIntermissionScreenFader::Init(FIntermissionAction *desc, bool first)
// //
//=========================================================================== //===========================================================================
int DIntermissionScreenFader::Responder (event_t *ev) int DIntermissionScreenFader::Responder (FInputEvent *ev)
{ {
if (ev->type == EV_KeyDown) if (ev->Type == EV_KeyDown)
{ {
return -1; return -1;
} }
@ -367,9 +367,9 @@ void DIntermissionScreenText::Init(FIntermissionAction *desc, bool first)
if (mDuration > 0) mDuration += mTextDelay + mTextSpeed * mTextLen; if (mDuration > 0) mDuration += mTextDelay + mTextSpeed * mTextLen;
} }
int DIntermissionScreenText::Responder (event_t *ev) int DIntermissionScreenText::Responder (FInputEvent *ev)
{ {
if (ev->type == EV_KeyDown) if (ev->Type == EV_KeyDown)
{ {
if (mTicker < mTextDelay + (mTextLen * mTextSpeed)) if (mTicker < mTextDelay + (mTextLen * mTextSpeed))
{ {
@ -517,9 +517,9 @@ void DIntermissionScreenCast::Init(FIntermissionAction *desc, bool first)
} }
} }
int DIntermissionScreenCast::Responder (event_t *ev) int DIntermissionScreenCast::Responder (FInputEvent *ev)
{ {
if (ev->type != EV_KeyDown) return 0; if (ev->Type != EV_KeyDown) return 0;
if (castdeath) if (castdeath)
return 1; // already in dying frames return 1; // already in dying frames
@ -715,7 +715,7 @@ void DIntermissionScreenScroller::Init(FIntermissionAction *desc, bool first)
mScrollDir = static_cast<FIntermissionActionScroller*>(desc)->mScrollDir; mScrollDir = static_cast<FIntermissionActionScroller*>(desc)->mScrollDir;
} }
int DIntermissionScreenScroller::Responder (event_t *ev) int DIntermissionScreenScroller::Responder (FInputEvent *ev)
{ {
int res = Super::Responder(ev); int res = Super::Responder(ev);
if (res == -1 && !nointerscrollabort) if (res == -1 && !nointerscrollabort)
@ -835,7 +835,7 @@ void DIntermissionScreenScroller::Drawer ()
// //
//========================================================================== //==========================================================================
DIntermissionController::DIntermissionController(FIntermissionDescriptor *Desc, bool DeleteDesc, uint8_t state) DIntermissionController::DIntermissionController(FIntermissionDescriptor *Desc, bool DeleteDesc)
{ {
mDesc = Desc; mDesc = Desc;
mDeleteDesc = DeleteDesc; mDeleteDesc = DeleteDesc;
@ -844,7 +844,6 @@ DIntermissionController::DIntermissionController(FIntermissionDescriptor *Desc,
mSentAdvance = false; mSentAdvance = false;
mScreen = nullptr; mScreen = nullptr;
mFirst = true; mFirst = true;
mGameState = state;
} }
bool DIntermissionController::NextPage () bool DIntermissionController::NextPage ()
@ -903,13 +902,13 @@ again:
return false; return false;
} }
bool DIntermissionController::Responder (event_t *ev) bool DIntermissionController::Responder (FInputEvent *ev)
{ {
if (mScreen != NULL) if (mScreen != NULL)
{ {
if (ev->type == EV_KeyDown) if (ev->Type == EV_KeyDown)
{ {
const char *cmd = Bindings.GetBind (ev->data1); const char *cmd = Bindings.GetBind (ev->KeyScan);
if (cmd != nullptr) if (cmd != nullptr)
{ {
@ -954,25 +953,6 @@ void DIntermissionController::Ticker ()
mAdvance = false; mAdvance = false;
if (!NextPage()) if (!NextPage())
{ {
switch (mGameState)
{
case FSTATE_InLevel:
primaryLevel->SetMusic();
gamestate = GS_LEVEL;
wipegamestate = GS_LEVEL;
gameaction = ga_resumeconversation;
viewactive = true;
Destroy();
break;
case FSTATE_ChangingLevel:
gameaction = ga_worlddone;
Destroy();
break;
default:
break;
}
} }
} }
} }
@ -1001,16 +981,14 @@ void DIntermissionController::OnDestroy ()
// //
//========================================================================== //==========================================================================
DIntermissionController* F_StartIntermission(FIntermissionDescriptor *desc, bool deleteme, uint8_t state) DIntermissionController* F_StartIntermission(FIntermissionDescriptor *desc, bool deleteme)
{ {
ScaleOverrider s(twod); ScaleOverrider s(twod);
S_StopAllChannels (); S_StopAllChannels ();
gameaction = ga_nothing; gameaction = ga_nothing;
gamestate = GS_FINALE; gamestate = GS_FINALE;
if (state == FSTATE_InLevel) wipegamestate = GS_FINALE; // don't wipe when within a level. //if (state == FSTATE_InLevel) wipegamestate = GS_FINALE; // don't wipe when within a level.
viewactive = false; auto CurrentIntermission = Create<DIntermissionController>(desc, deleteme);
automapactive = false;
auto CurrentIntermission = Create<DIntermissionController>(desc, deleteme, state);
// If the intermission finishes straight away then cancel the wipe. // If the intermission finishes straight away then cancel the wipe.
if (!CurrentIntermission->NextPage()) if (!CurrentIntermission->NextPage())
@ -1029,7 +1007,7 @@ DIntermissionController* F_StartIntermission(FIntermissionDescriptor *desc, bool
// //
//========================================================================== //==========================================================================
DIntermissionController* F_StartIntermission(FName seq, uint8_t state) DIntermissionController* F_StartIntermission(FName seq)
{ {
FIntermissionDescriptor **pdesc = IntermissionDescriptors.CheckKey(seq); FIntermissionDescriptor **pdesc = IntermissionDescriptors.CheckKey(seq);
if (pdesc == nullptr) if (pdesc == nullptr)
@ -1038,10 +1016,38 @@ DIntermissionController* F_StartIntermission(FName seq, uint8_t state)
} }
else else
{ {
F_StartIntermission(*pdesc, false, state); return F_StartIntermission(*pdesc, false);
} }
} }
DEFINE_ACTION_FUNCTION(DIntermissionController, Responder)
{
PARAM_SELF_PROLOGUE(DIntermissionController);
PARAM_POINTER(evt, FInputEvent);
ACTION_RETURN_BOOL(self->Responder(evt));
}
DEFINE_ACTION_FUNCTION(DIntermissionController, Ticker)
{
PARAM_SELF_PROLOGUE(DIntermissionController);
self->Ticker();
ACTION_RETURN_BOOL(true);
}
DEFINE_ACTION_FUNCTION(DIntermissionController, Drawer)
{
PARAM_SELF_PROLOGUE(DIntermissionController);
self->Ticker();
return 0;
}
DEFINE_ACTION_FUNCTION(DIntermissionController, NextPage)
{
PARAM_SELF_PROLOGUE(DIntermissionController);
ACTION_RETURN_BOOL(self->NextPage());
}
#include "c_dispatch.h" #include "c_dispatch.h"
CCMD(measureintermissions) CCMD(measureintermissions)

View file

@ -10,7 +10,7 @@
#include "g_game.h" #include "g_game.h"
#include "v_text.h" #include "v_text.h"
struct event_t; struct FInputEvent;
struct FState; struct FState;
#define DECLARE_SUPER_CLASS(cls,parent) \ #define DECLARE_SUPER_CLASS(cls,parent) \
@ -176,7 +176,7 @@ public:
DIntermissionScreen() {} DIntermissionScreen() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev); virtual int Responder (FInputEvent *ev);
virtual int Ticker (); virtual int Ticker ();
virtual void Drawer (); virtual void Drawer ();
void OnDestroy() override; void OnDestroy() override;
@ -202,7 +202,7 @@ public:
DIntermissionScreenFader() {} DIntermissionScreenFader() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev); virtual int Responder (FInputEvent *ev);
virtual int Ticker (); virtual int Ticker ();
virtual void Drawer (); virtual void Drawer ();
}; };
@ -227,7 +227,7 @@ public:
DIntermissionScreenText() {} DIntermissionScreenText() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev); virtual int Responder (FInputEvent *ev);
virtual void Drawer (); virtual void Drawer ();
}; };
@ -256,7 +256,7 @@ public:
DIntermissionScreenCast() {} DIntermissionScreenCast() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev); virtual int Responder (FInputEvent *ev);
virtual int Ticker (); virtual int Ticker ();
virtual void Drawer (); virtual void Drawer ();
}; };
@ -275,7 +275,7 @@ public:
DIntermissionScreenScroller() {} DIntermissionScreenScroller() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev); virtual int Responder (FInputEvent *ev);
virtual void Drawer (); virtual void Drawer ();
}; };
@ -296,14 +296,13 @@ class DIntermissionController : public DObject
bool mDeleteDesc; bool mDeleteDesc;
bool mFirst; bool mFirst;
bool mAdvance, mSentAdvance; bool mAdvance, mSentAdvance;
uint8_t mGameState;
int mIndex; int mIndex;
public: public:
static DIntermissionController *CurrentIntermission; bool mEndGame;
DIntermissionController(FIntermissionDescriptor *mDesc = NULL, bool mDeleteDesc = false, uint8_t state = FSTATE_ChangingLevel); DIntermissionController(FIntermissionDescriptor *mDesc = NULL, bool mDeleteDesc = false);
bool Responder (event_t *ev); bool Responder (FInputEvent *ev);
void Ticker (); void Ticker ();
void Drawer (); void Drawer ();
void OnDestroy() override; void OnDestroy() override;
@ -314,8 +313,8 @@ public:
// Interface for main loop // Interface for main loop
DIntermissionController* F_StartIntermission(FIntermissionDescriptor *desc, bool deleteme, uint8_t state); DIntermissionController* F_StartIntermission(FIntermissionDescriptor *desc, bool deleteme);
DIntermissionController* F_StartIntermission(FName desc, uint8_t state); DIntermissionController* F_StartIntermission(FName desc);
// Create an intermission from old cluster data // Create an intermission from old cluster data
DIntermissionController* F_StartFinale (const char *music, int musicorder, int cdtrack, unsigned int cdid, const char *flat, DIntermissionController* F_StartFinale (const char *music, int musicorder, int cdtrack, unsigned int cdid, const char *flat,

View file

@ -41,6 +41,7 @@
#include "c_dispatch.h" #include "c_dispatch.h"
#include "gstrings.h" #include "gstrings.h"
#include "gi.h" #include "gi.h"
#include "screenjob.h"
static void ReplaceIntermission(FName intname,FIntermissionDescriptor *desc) static void ReplaceIntermission(FName intname,FIntermissionDescriptor *desc)
@ -922,7 +923,6 @@ DIntermissionController* F_StartFinale (const char *music, int musicorder, int c
return nullptr; return nullptr;
} }
CCMD(testfinale) CCMD(testfinale)
{ {
if (argv.argc() < 2) if (argv.argc() < 2)
@ -954,5 +954,6 @@ CCMD(testfinale)
} }
auto controller = F_StartFinale(gameinfo.finaleMusic, gameinfo.finaleOrder, -1, 0, gameinfo.FinaleFlat, text, false, false, true, true); auto controller = F_StartFinale(gameinfo.finaleMusic, gameinfo.finaleOrder, -1, 0, gameinfo.FinaleFlat, text, false, false, true, true);
// todo: play it RunIntermission(controller, nullptr, [=](bool) { gameaction = ga_nothing; });
} }

View file

@ -33,6 +33,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <stdint.h>
#include "actor.h" #include "actor.h"
#include "p_conversation.h" #include "p_conversation.h"
@ -489,7 +490,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
if (!(npc->flags8 & MF8_DONTFACETALKER)) if (!(npc->flags8 & MF8_DONTFACETALKER))
npc->Angles.Yaw = player->ConversationNPCAngle; npc->Angles.Yaw = player->ConversationNPCAngle;
npc->flags5 &= ~MF5_INCONVERSATION; npc->flags5 &= ~MF5_INCONVERSATION;
if (gameaction != ga_slideshow) ClearConversationStuff(player); if (gameaction != ga_intermission) ClearConversationStuff(player);
return; return;
} }
@ -507,7 +508,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
if (!(npc->flags8 & MF8_DONTFACETALKER)) if (!(npc->flags8 & MF8_DONTFACETALKER))
npc->Angles.Yaw = player->ConversationNPCAngle; npc->Angles.Yaw = player->ConversationNPCAngle;
npc->flags5 &= ~MF5_INCONVERSATION; npc->flags5 &= ~MF5_INCONVERSATION;
if (gameaction != ga_slideshow) ClearConversationStuff(player); if (gameaction != ga_intermission) ClearConversationStuff(player);
return; return;
} }
} }
@ -548,7 +549,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
} }
if (reply->GiveType->IsDescendantOf("SlideshowStarter")) if (reply->GiveType->IsDescendantOf("SlideshowStarter"))
gameaction = ga_slideshow; G_StartSlideshow(primaryLevel, NAME_None);
} }
else else
{ {
@ -617,7 +618,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
if (!(reply->CloseDialog)) if (!(reply->CloseDialog))
{ {
if (gameaction != ga_slideshow) if (gameaction != ga_intermission)
{ {
P_StartConversation (npc, player->mo, player->ConversationFaceTalker, false); P_StartConversation (npc, player->mo, player->ConversationFaceTalker, false);
return; return;
@ -643,7 +644,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
// [CW] Set these to NULL because we're not using to them // [CW] Set these to NULL because we're not using to them
// anymore. However, this can interfere with slideshows // anymore. However, this can interfere with slideshows
// so we don't set them to NULL in that case. // so we don't set them to NULL in that case.
if (gameaction != ga_slideshow) if (gameaction != ga_intermission)
{ {
npc->flags5 &= ~MF5_INCONVERSATION; npc->flags5 &= ~MF5_INCONVERSATION;
ClearConversationStuff(player); ClearConversationStuff(player);

View file

@ -291,6 +291,8 @@ version "4.6"
#include "zscript/ui/statusbar/statusbar.zs" #include "zscript/ui/statusbar/statusbar.zs"
#include "zscript/ui/statusbar/strife_sbar.zs" #include "zscript/ui/statusbar/strife_sbar.zs"
#include "zscript/ui/intermission.zs"
#include "zscript/compatibility.zs" #include "zscript/compatibility.zs"
#include "zscript/scriptutil/scriptutil.zs" #include "zscript/scriptutil/scriptutil.zs"
#include "zscript/actors/mbf21.zs" #include "zscript/actors/mbf21.zs"

View file

@ -1,5 +1,5 @@
class ScreenJob : Object class ScreenJob : Object UI
{ {
int flags; int flags;
float fadetime; // in milliseconds float fadetime; // in milliseconds
@ -299,7 +299,7 @@ class MoviePlayerJob : SkippableScreenJob
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
class ScreenJobRunner : Object class ScreenJobRunner : Object UI
{ {
enum ERunState enum ERunState
{ {

View file

@ -1,11 +1,13 @@
class IntermissionController native class IntermissionController native ui
{ {
// This is mostly a black box to the native intermission code. // This is mostly a black box to the native intermission code.
// May be scriptified later, but right now we do not need it. // May be scriptified later, but right now we do not need it.
static native IntermissionController Creeate(String music, int musicorder, String flat, String text, int textInLump, int finalePic, int lookupText, bool ending, Name endsequence); /*
static native IntermissionController Create(String music, int musicorder, String flat, String text, int textInLump, int finalePic, int lookupText, bool ending, Name endsequence);
static native IntermissionController CreateNamed(Name nm); static native IntermissionController CreateNamed(Name nm);
*/
native bool Responder(InputEvent ev); native bool Responder(InputEvent ev);
native bool Ticker(); native bool Ticker();
native void Drawer(); native void Drawer();
@ -16,21 +18,12 @@ class IntermissionController native
class IntermissionScreenJob : ScreenJob class IntermissionScreenJob : ScreenJob
{ {
IntermissionController controller; IntermissionController controller;
void Init(String music, int musicorder, String flat, String text, int textInLump, int finalePic, int lookupText, bool ending, Name endsequence) void Init(IntermissionController ctrl) { controller = ctrl; }
{
controller = IntermissionController.Create(music, musicorder, flat, text, textInLump, finalePic, lookupText, ending, endsequence);
}
void InitNamed(Name nm)
{
controller = IntermissionController.CreateNamed(nm);
}
override bool OnEvent(InputEvent evt) { return controller.Responder(evt); } override bool OnEvent(InputEvent evt) { return controller.Responder(evt); }
virtual void OnTick() { if (!controller.Ticker()) jobstate = finished; } override void OnTick() { if (!controller.Ticker()) jobstate = finished; }
virtual void Draw(double smoothratio) { controller.Drawer(); } override void Draw(double smoothratio) { controller.Drawer(); }
virtual void OnSkip() { if (!controller.NextPage()) jobstate = finished; }
override void OnDestroy() override void OnDestroy()
{ {
@ -40,7 +33,7 @@ class IntermissionScreenJob : ScreenJob
} }
class StatusScreenJob : ScreenJob class StatusScreenJob : SkippableScreenJob
{ {
StatusScreen controller; StatusScreen controller;
@ -49,14 +42,35 @@ class StatusScreenJob : ScreenJob
controller = scr; controller = scr;
} }
override bool OnEvent(InputEvent evt) { return controller.Responder(evt); } override void OnTick() { controller.Ticker(); if (controller.CurState == StatusScreen.LeavingIntermission) jobstate = finished; }
virtual void OnTick() { controller.Ticker(); if (controller.CurState == StatusScreen.LeavingIntermission) jobstate = finished; } override void Draw(double smoothratio) { controller.Drawer(); }
virtual void Draw(double smoothratio) { controller.Drawer(); } override void OnSkip() { controller.NextStage(); } // skipping status screens is asynchronous, so yields no result
virtual void OnSkip() { if (!controller.NextStage()) jobstate = finished; }
override void OnDestroy() override void OnDestroy()
{ {
controller.Destroy(); controller.Destroy();
Super.OnDestroy(); Super.OnDestroy();
} }
} }
class DoomCutscenes
{
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void BuildMapTransition(ScreenJobRunner runner, IntermissionController inter, StatusScreen status)
{
if (status)
{
runner.Append(new("StatusScreenJob").Init(status));
}
if (inter)
{
runner.Append(new("IntermissionScreenJob").Init(inter));
}
}
}

View file

@ -796,25 +796,9 @@ class StatusScreen abstract play version("2.5")
// //
// ==================================================================== // ====================================================================
protected void checkForAccelerate(void) void nextStage(void)
{ {
int i; accelerateStage = 1;
// check for button presses to skip delays
for (i = 0; i < MAXPLAYERS; i++)
{
PlayerInfo player = players[i];
if (playeringame[i])
{
if ((player.cmd.buttons ^ player.oldbuttons) &&
((player.cmd.buttons & player.oldbuttons) == player.oldbuttons) && player.Bot == NULL)
{
acceleratestage = 1;
playerready[i] = true;
}
player.oldbuttons = player.buttons;
}
}
} }
// ==================================================================== // ====================================================================

View file

@ -216,16 +216,8 @@ class CoopStatusScreen : StatusScreen
} }
else if (ng_state == 12) else if (ng_state == 12)
{ {
int i;
for (i = 0; i < MAXPLAYERS; i++)
{
// If the player is in the game and not ready, stop checking
if (playeringame[i] && players[i].Bot == NULL && !playerready[i])
break;
}
// All players are ready; proceed. // All players are ready; proceed.
if ((i == MAXPLAYERS && acceleratestage) || autoskip) if ((acceleratestage) || autoskip)
{ {
PlaySound("intermission/pastcoopstats"); PlaySound("intermission/pastcoopstats");
initShowNextLoc(); initShowNextLoc();
@ -311,7 +303,7 @@ class CoopStatusScreen : StatusScreen
screen.Dim(player.GetDisplayColor(), 0.8f, x, y - ypadding, (secret_x - x) + (8 * CleanXfac), lineheight); screen.Dim(player.GetDisplayColor(), 0.8f, x, y - ypadding, (secret_x - x) + (8 * CleanXfac), lineheight);
if (playerready[i] || player.Bot != NULL) // Bots are automatically assumed ready, to prevent confusion //if (playerready[i] || player.Bot != NULL) // Bots are automatically assumed ready, to prevent confusion
screen.DrawTexture(readyico, true, x - (readysize.Y * CleanXfac), y, DTA_CleanNoMove, true); screen.DrawTexture(readyico, true, x - (readysize.Y * CleanXfac), y, DTA_CleanNoMove, true);
Color thiscolor = GetRowColor(player, i == consoleplayer); Color thiscolor = GetRowColor(player, i == consoleplayer);

View file

@ -124,16 +124,8 @@ class DeathmatchStatusScreen : StatusScreen
} }
else if (ng_state == 6) else if (ng_state == 6)
{ {
int i;
for (i = 0; i < MAXPLAYERS; i++)
{
// If the player is in the game and not ready, stop checking
if (playeringame[i] && players[i].Bot == NULL && !playerready[i])
break;
}
// All players are ready; proceed. // All players are ready; proceed.
if ((i == MAXPLAYERS && acceleratestage) || doautoskip) if ((acceleratestage) || doautoskip)
{ {
PlaySound("intermission/pastdmstats"); PlaySound("intermission/pastdmstats");
initShowNextLoc(); initShowNextLoc();
@ -207,7 +199,7 @@ class DeathmatchStatusScreen : StatusScreen
screen.Dim(player.GetDisplayColor(), 0.8, x, y - ypadding, (deaths_x - x) + (8 * CleanXfac), lineheight); screen.Dim(player.GetDisplayColor(), 0.8, x, y - ypadding, (deaths_x - x) + (8 * CleanXfac), lineheight);
if (playerready[pnum] || player.Bot != NULL) // Bots are automatically assumed ready, to prevent confusion //if (playerready[pnum] || player.Bot != NULL) // Bots are automatically assumed ready, to prevent confusion
screen.DrawTexture(readyico, true, x - (readysize.X * CleanXfac), y, DTA_CleanNoMove, true); screen.DrawTexture(readyico, true, x - (readysize.X * CleanXfac), y, DTA_CleanNoMove, true);
let thiscolor = GetRowColor(player, pnum == consoleplayer); let thiscolor = GetRowColor(player, pnum == consoleplayer);
@ -247,4 +239,4 @@ class DeathmatchStatusScreen : StatusScreen
String leveltime = Stringtable.Localize("$SCORE_LVLTIME") .. ": " .. String.Format("%02i:%02i:%02i", hours, minutes, seconds); String leveltime = Stringtable.Localize("$SCORE_LVLTIME") .. ": " .. String.Format("%02i:%02i:%02i", hours, minutes, seconds);
drawTextScaled(displayFont, x, y, leveltime, FontScale, textcolor); drawTextScaled(displayFont, x, y, leveltime, FontScale, textcolor);
} }
} }