allow cutscenes in intermissions

This commit is contained in:
Ricardo Luís Vaz Silva 2025-01-25 19:44:54 -03:00
commit 206c2291d9
6 changed files with 143 additions and 16 deletions

View file

@ -58,6 +58,7 @@
#include "sbar.h"
#include "screenjob.h"
#include "vm.h"
#include "i_time.h"
FIntermissionDescriptorList IntermissionDescriptors;
@ -66,12 +67,17 @@ IMPLEMENT_CLASS(DIntermissionScreenFader, false, false)
IMPLEMENT_CLASS(DIntermissionScreenText, false, false)
IMPLEMENT_CLASS(DIntermissionScreenCast, false, false)
IMPLEMENT_CLASS(DIntermissionScreenScroller, false, false)
IMPLEMENT_CLASS(DIntermissionScreenCutscene, false, true)
IMPLEMENT_CLASS(DIntermissionController, false, true)
IMPLEMENT_POINTERS_START(DIntermissionController)
IMPLEMENT_POINTER(mScreen)
IMPLEMENT_POINTERS_END
IMPLEMENT_POINTERS_START(DIntermissionScreenCutscene)
IMPLEMENT_POINTER(mScreenJobRunner)
IMPLEMENT_POINTERS_END
extern int NoWipe;
CVAR(Bool, nointerscrollabort, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
@ -276,6 +282,66 @@ void DIntermissionScreen::OnDestroy()
//
//==========================================================================
void DIntermissionScreenCutscene::Init(FIntermissionAction *desc, bool first)
{
Super::Init(desc, first);
mScreenJobRunner = CreateRunner(false);
if(first) NoWipe++;
CreateCutscene(&static_cast<FIntermissionActionCutscene*>(desc)->scn, mScreenJobRunner, nullptr);
}
int DIntermissionScreenCutscene::Responder (FInputEvent *ev)
{
ScaleOverrider ovr(twod);
IFVIRTUALPTRNAME(mScreenJobRunner, NAME_ScreenJobRunner, OnEvent)
{
FInputEvent evt = *ev;
int result = 0;
VMValue parm[] = { mScreenJobRunner, &evt };
VMReturn ret(&result);
VMCall(func, parm, 2, &ret, 1);
return result ? -1 : 0;
}
return Super::Responder(ev);
}
int DIntermissionScreenCutscene::Ticker()
{
++mTicker;
ScaleOverrider ovr(twod);
IFVIRTUALPTRNAME(mScreenJobRunner, NAME_ScreenJobRunner, OnTick)
{
int result = 0;
VMValue parm[] = { mScreenJobRunner };
VMReturn ret(&result);
VMCall(func, parm, 1, &ret, 1);
return result ? -1 : 0;
}
return -1;
}
void DIntermissionScreenCutscene::Drawer ()
{
ScaleOverrider ovr(twod);
IFVIRTUALPTRNAME(mScreenJobRunner, NAME_ScreenJobRunner, RunFrame)
{
VMValue parm[] = { mScreenJobRunner, I_GetTimeFrac() };
VMCall(func, parm, 2, nullptr, 0);
}
}
void DIntermissionScreenCutscene::OnDestroy()
{
mScreenJobRunner->Destroy();
Super::OnDestroy();
}
//==========================================================================
//
//
//
//==========================================================================
void DIntermissionScreenFader::Init(FIntermissionAction *desc, bool first)
{
Super::Init(desc, first);