- properly route gameexitfrommenu through the callbacks.

This commit is contained in:
Christoph Oelckers 2020-07-18 21:28:57 +02:00
parent ded0edae0c
commit c767ead84f
8 changed files with 36 additions and 14 deletions

View file

@ -4,6 +4,7 @@ bool System_WantGuiCapture(); // During playing this tells us whether the game m
#include <stdint.h>
#include "vectors.h"
#include "engineerrors.h"
struct GameStats
{
@ -84,6 +85,7 @@ struct GameInterface
virtual void SetAmbience(bool on) {}
virtual FString GetCoordString() { return "'stat coord' not implemented"; }
virtual bool CheatAllowed(bool printmsg) { return true; }
virtual void ExitFromMenu() { throw CExitEvent(0); }
};

View file

@ -454,7 +454,7 @@ CCMD (menu_quit)
DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, EndString, 0, 500, false, NAME_None, [](bool res)
{
if (res) throw CExitEvent(0);
if (res) gi->ExitFromMenu();
});
M_ActivateMenu(newmenu);

View file

@ -578,7 +578,7 @@ void dobonus_r(bool bonusonly, CompletionFunc completion)
int levnum = clamp((currentLevel->levelNumber / 100) * 7 + (currentLevel->levelNumber % 100), 0, 13);
char fn[20];
mysnprintf(fn, 20, "lvl%d.anm", levnum + 1);
static const int framespeed[] = { 20, 20, 7200 }; // wait for one minute on the final frame so that the video doesn't appear before the user notices.
static const int framespeed[] = { 20, 20, 7200 }; // wait for one minute on the final frame so that the video doesn't stop before the user notices.
jobs[job++] = { PlayVideo(fn, nullptr, framespeed) };
if (ud.eog && currentLevel->levelNumber > 100)
{

View file

@ -63,6 +63,7 @@ struct GameInterface : ::GameInterface
void QuitToTitle() override;
FString GetCoordString() override;
bool CheatAllowed(bool printmsg) override;
void ExitFromMenu() override;
};
struct Dispatcher

View file

@ -208,7 +208,7 @@ void drawstatusbar_d(int snum);
void drawstatusbar_r(int snum);
void drawoverheadmap(int cposx, int cposy, int czoom, int cang);
void cameratext(int i);
void dobonus(int bonusonly);
void dobonus(int bonusonly, CompletionFunc completion);
void dobonus_d(bool bonusonly, CompletionFunc completion);
void dobonus_r(bool bonusonly, CompletionFunc completion);

View file

@ -109,22 +109,41 @@ void setmapfog(int fogtype)
//
//---------------------------------------------------------------------------
void gameexitfrommenu()
static void runbonus(CompletionFunc completion)
{
// MP scoreboard
if (playerswhenstarted > 1 && ps[myconnectindex].gm & MODE_GAME && !ud.coop)
{
dobonus(1);
dobonus(1, completion);
}
else if (completion) completion(false);
}
static void runtwoscreens(CompletionFunc completion)
{
// shareware and TEN screens
if (!VOLUMEALL && !isRR())
showtwoscreens([](bool) {});
showtwoscreens(completion);
else if (completion) completion(false);
}
static void endthegame(bool)
{
endoomName = isRR() ? "redneck.bin" : VOLUMEALL ? "duke3d.bin" : "dukesw.bin";
ST_Endoom();
}
void gameexitfrommenu()
{
runbonus([](bool aborted) { runtwoscreens(endthegame); });
}
void GameInterface::ExitFromMenu()
{
gameexitfrommenu();
}
//---------------------------------------------------------------------------
//
// This now redirects the messagew to the console's notification display
@ -704,11 +723,11 @@ void cameratext(int i)
//
//---------------------------------------------------------------------------
void dobonus(int bonusonly)
void dobonus(int bonusonly, CompletionFunc completion)
{
if (isRRRA());
else if (isRR()) dobonus_r(bonusonly, nullptr);
else dobonus_d(bonusonly, nullptr);
if (isRRRA()) { if (completion) completion(false); }
else if (isRR()) dobonus_r(bonusonly, completion);
else dobonus_d(bonusonly, completion);
}
//---------------------------------------------------------------------------

View file

@ -893,12 +893,12 @@ static void processMovement(player_struct *p, input_t &input, ControlInfo &info,
if (buttonMap.ButtonDown(gamefunc_Turn_Left))
{
turnheldtime += tics;
input.q16avel -= fix16_from_dbl(2 * scaleFactor * (turnheldtime >= TURBOTURNTIME) ? turnamount : PREAMBLETURN);
input.q16avel -= fix16_from_dbl(2 * scaleFactor * (turnheldtime >= TURBOTURNTIME ? turnamount : PREAMBLETURN));
}
else if (buttonMap.ButtonDown(gamefunc_Turn_Right))
{
turnheldtime += tics;
input.q16avel += fix16_from_dbl(2 * scaleFactor * (turnheldtime >= TURBOTURNTIME) ? turnamount : PREAMBLETURN);
input.q16avel += fix16_from_dbl(2 * scaleFactor * (turnheldtime >= TURBOTURNTIME ? turnamount : PREAMBLETURN));
}
else
{
@ -1202,7 +1202,7 @@ static void FinalizeInput(int playerNum, input_t& input, bool vehicle)
loc.q16avel += input.q16avel;
if (!synchronized_input)
{
p->q16ang = (p->q16ang + input.q16avel) & 0x7FFFFFF;
p->q16ang = (p->q16ang + input.q16avel * 2) & 0x7FFFFFF; // Why * 2 now?
if (input.q16avel)
p->one_eighty_count = 0;

View file

@ -1093,7 +1093,7 @@ int exitlevel(void)
if (ps[myconnectindex].gm & MODE_EOL)
{
ready2send = 0;
dobonus(0);
dobonus(0, nullptr);
// Clear potentially loaded per-map ART only after the bonus screens.
artClearMapArt();