mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'staffsync' into 'master'
"Staffsync" command to test staff ghost playback See merge request kart-krew-dev/ring-racers-internal!2744
This commit is contained in:
commit
2111e104ef
11 changed files with 255 additions and 5 deletions
|
|
@ -1114,15 +1114,28 @@ void D_SRB2Loop(void)
|
||||||
//
|
//
|
||||||
// Wipes run an inner loop and artificially increase
|
// Wipes run an inner loop and artificially increase
|
||||||
// the measured time.
|
// the measured time.
|
||||||
if (!ranwipe && frameskip < 3 && deltatics > 1.0)
|
if (staffsync)
|
||||||
{
|
{
|
||||||
frameskip++;
|
// SPECIAL: When checking staff demos for sync,
|
||||||
|
// draw as little as possible for speeeeeeed
|
||||||
|
if (frameskip < TICRATE*10)
|
||||||
|
frameskip++;
|
||||||
|
else
|
||||||
|
frameskip = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
frameskip = 0;
|
if (!ranwipe && frameskip < 3 && deltatics > 1.0)
|
||||||
|
{
|
||||||
|
frameskip++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
frameskip = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (world)
|
if (world)
|
||||||
{
|
{
|
||||||
sincelastworld = 0.0;
|
sincelastworld = 0.0;
|
||||||
|
|
|
||||||
139
src/d_netcmd.c
139
src/d_netcmd.c
|
|
@ -193,6 +193,7 @@ static void Command_Eval(void);
|
||||||
|
|
||||||
static void Command_WriteTextmap(void);
|
static void Command_WriteTextmap(void);
|
||||||
static void Command_SnapshotMaps(void);
|
static void Command_SnapshotMaps(void);
|
||||||
|
static void Command_Staffsync(void);
|
||||||
|
|
||||||
#ifdef DEVELOP
|
#ifdef DEVELOP
|
||||||
static void Command_FastForward(void);
|
static void Command_FastForward(void);
|
||||||
|
|
@ -256,6 +257,8 @@ boolean forceresetplayers = false;
|
||||||
boolean deferencoremode = false;
|
boolean deferencoremode = false;
|
||||||
boolean forcespecialstage = false;
|
boolean forcespecialstage = false;
|
||||||
|
|
||||||
|
boolean staffsync = false;
|
||||||
|
|
||||||
UINT8 splitscreen = 0;
|
UINT8 splitscreen = 0;
|
||||||
INT32 adminplayers[MAXPLAYERS];
|
INT32 adminplayers[MAXPLAYERS];
|
||||||
|
|
||||||
|
|
@ -451,6 +454,7 @@ void D_RegisterServerCommands(void)
|
||||||
|
|
||||||
COM_AddCommand("snapshotmap", Command_SnapshotMaps);
|
COM_AddCommand("snapshotmap", Command_SnapshotMaps);
|
||||||
COM_AddCommand("snapshotmaps", Command_SnapshotMaps); // alias
|
COM_AddCommand("snapshotmaps", Command_SnapshotMaps); // alias
|
||||||
|
COM_AddCommand("staffsync", Command_Staffsync);
|
||||||
|
|
||||||
// for master server connection
|
// for master server connection
|
||||||
AddMServCommands();
|
AddMServCommands();
|
||||||
|
|
@ -6776,6 +6780,141 @@ static void Command_SnapshotMaps(void)
|
||||||
CON_ToggleOff();
|
CON_ToggleOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT32 staffsync_map = 0;
|
||||||
|
UINT32 staffsync_ghost = 0;
|
||||||
|
UINT32 staffsync_done = 0;
|
||||||
|
UINT32 staffsync_total = 0;
|
||||||
|
UINT32 staffsync_failed = 0;
|
||||||
|
staffsync_t staffsync_results[1024];
|
||||||
|
|
||||||
|
static void Command_Staffsync(void)
|
||||||
|
{
|
||||||
|
if (Playing())
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "This command cannot be used in-game. Return to the titlescreen first!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
staffsync = true;
|
||||||
|
|
||||||
|
if (demo.playback)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mapheader_t *mapheader;
|
||||||
|
staffbrief_t *staffbrief;
|
||||||
|
|
||||||
|
demo.loadfiles = false;
|
||||||
|
demo.ignorefiles = true;
|
||||||
|
|
||||||
|
mapheader = mapheaderinfo[staffsync_map];
|
||||||
|
|
||||||
|
// Test exit
|
||||||
|
if (false && staffsync_done == 9)
|
||||||
|
mapheader = NULL;
|
||||||
|
|
||||||
|
// Start of the run, init progress and report vars
|
||||||
|
if (staffsync_map == 0 && staffsync_ghost == 0)
|
||||||
|
{
|
||||||
|
staffsync_done = 0;
|
||||||
|
staffsync_total = 0;
|
||||||
|
staffsync_failed = 0;
|
||||||
|
memset(staffsync_results, 0, sizeof(staffsync_results));
|
||||||
|
for (INT32 i = 0; i < nummapheaders; i++)
|
||||||
|
{
|
||||||
|
if (mapheaderinfo[i] != NULL)
|
||||||
|
staffsync_total += mapheaderinfo[i]->ghostCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
soundtest.shuffle = true;
|
||||||
|
S_UpdateSoundTestDef(false, false, true);
|
||||||
|
S_SoundTestPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The current configuration corresponds to a valid staff ghost, play it
|
||||||
|
if (mapheader != NULL && mapheader->ghostCount > 0 && staffsync_ghost < mapheader->ghostCount)
|
||||||
|
{
|
||||||
|
demo.timing = true;
|
||||||
|
g_singletics = true;
|
||||||
|
framecount = 0;
|
||||||
|
demostarttime = I_GetTime();
|
||||||
|
|
||||||
|
staffbrief = mapheader->ghostBrief[staffsync_ghost];
|
||||||
|
G_DoPlayDemoEx("", (staffbrief->wad << 16) | staffbrief->lump);
|
||||||
|
|
||||||
|
staffsync_ghost++;
|
||||||
|
staffsync_done++;
|
||||||
|
|
||||||
|
if (staffsync_done % 50 == 0)
|
||||||
|
{
|
||||||
|
S_UpdateSoundTestDef(false, true, true);
|
||||||
|
S_SoundTestPlay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We've exhausted map headers, report
|
||||||
|
if (mapheader == NULL)
|
||||||
|
{
|
||||||
|
|
||||||
|
CONS_Printf("========================================\n");
|
||||||
|
CONS_Printf("DESYNCING STAFF GHOSTS:\n");
|
||||||
|
|
||||||
|
UINT32 i = 0;
|
||||||
|
while (staffsync_results[i].reason != SYNC_NONE)
|
||||||
|
{
|
||||||
|
staffsync_t *result = &staffsync_results[i];
|
||||||
|
|
||||||
|
CONS_Printf("%s [%s] ", G_BuildMapName(result->map), result->name);
|
||||||
|
|
||||||
|
switch (result->reason)
|
||||||
|
{
|
||||||
|
case SYNC_CHARACTER:
|
||||||
|
CONS_Printf("(character/stats)");
|
||||||
|
break;
|
||||||
|
case SYNC_HEALTH:
|
||||||
|
CONS_Printf("(health)");
|
||||||
|
break;
|
||||||
|
case SYNC_ITEM:
|
||||||
|
CONS_Printf("(item/bumpers)");
|
||||||
|
break;
|
||||||
|
case SYNC_POSITION:
|
||||||
|
CONS_Printf("(position)");
|
||||||
|
break;
|
||||||
|
case SYNC_RNG:
|
||||||
|
CONS_Printf("(RNG class %d)", result->extra);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf("\n");
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf("========================================\n");
|
||||||
|
|
||||||
|
staffsync_ghost = 0;
|
||||||
|
staffsync_map = 0;
|
||||||
|
staffsync = false;
|
||||||
|
|
||||||
|
S_SoundTestTogglePause();
|
||||||
|
S_StartSound(NULL, sfx_tmxsuc);
|
||||||
|
S_StartSound(NULL, sfx_cftbl2);
|
||||||
|
|
||||||
|
CONS_Printf("%d / %d ghosts desync.\n", staffsync_failed, staffsync_done);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Out of ghosts for the current map, switch to the next map and re-exec
|
||||||
|
if (staffsync_ghost >= mapheader->ghostCount)
|
||||||
|
{
|
||||||
|
staffsync_ghost = 0;
|
||||||
|
staffsync_map++;
|
||||||
|
|
||||||
|
Command_Staffsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEVELOP
|
#ifdef DEVELOP
|
||||||
static void Command_FastForward(void)
|
static void Command_FastForward(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,17 @@ void Automate_Clear(void);
|
||||||
extern UINT32 livestudioaudience_timer;
|
extern UINT32 livestudioaudience_timer;
|
||||||
void LiveStudioAudience(void);
|
void LiveStudioAudience(void);
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SYNC_NONE,
|
||||||
|
SYNC_RNG,
|
||||||
|
SYNC_HEALTH,
|
||||||
|
SYNC_POSITION,
|
||||||
|
SYNC_ITEM,
|
||||||
|
SYNC_CHARACTER,
|
||||||
|
SYNC__MAX
|
||||||
|
} staffsync_reason_t;
|
||||||
|
|
||||||
void D_Cheat(INT32 playernum, INT32 cheat, ...);
|
void D_Cheat(INT32 playernum, INT32 cheat, ...);
|
||||||
|
|
||||||
// used for the player setup menu
|
// used for the player setup menu
|
||||||
|
|
|
||||||
|
|
@ -238,6 +238,17 @@ extern UINT8 splitscreen;
|
||||||
extern int r_splitscreen;
|
extern int r_splitscreen;
|
||||||
|
|
||||||
extern boolean forceresetplayers, deferencoremode, forcespecialstage;
|
extern boolean forceresetplayers, deferencoremode, forcespecialstage;
|
||||||
|
extern boolean staffsync;
|
||||||
|
extern UINT32 staffsync_map, staffsync_ghost, staffsync_done, staffsync_total, staffsync_failed;
|
||||||
|
|
||||||
|
struct staffsync_t
|
||||||
|
{
|
||||||
|
UINT32 map;
|
||||||
|
char name[MAXPLAYERNAME+1];
|
||||||
|
UINT32 reason;
|
||||||
|
UINT32 extra;
|
||||||
|
};
|
||||||
|
extern staffsync_t staffsync_results[1024];
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
// Internal parameters for sound rendering.
|
// Internal parameters for sound rendering.
|
||||||
|
|
|
||||||
|
|
@ -460,6 +460,9 @@ void F_RunWipe(UINT8 wipemode, UINT8 wipetype, boolean drawMenu, const char *col
|
||||||
lumpnum_t clump = LUMPERROR;
|
lumpnum_t clump = LUMPERROR;
|
||||||
lighttable_t *fcolor = NULL;
|
lighttable_t *fcolor = NULL;
|
||||||
|
|
||||||
|
if (staffsync)
|
||||||
|
return;
|
||||||
|
|
||||||
if (colormap != NULL)
|
if (colormap != NULL)
|
||||||
clump = W_GetNumForName(colormap);
|
clump = W_GetNumForName(colormap);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -287,6 +287,21 @@ boolean G_ConsiderEndingDemoRead(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Demo failed sync during a sync test! Log the failure to be reported later.
|
||||||
|
static void G_FailStaffSync(staffsync_reason_t reason, UINT32 extra)
|
||||||
|
{
|
||||||
|
if (!staffsync)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (staffsync_results[staffsync_failed].reason != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
staffsync_results[staffsync_failed].map = gamemap;
|
||||||
|
memcpy(&staffsync_results[staffsync_failed].name, player_names[consoleplayer], sizeof(player_names[consoleplayer]));
|
||||||
|
staffsync_results[staffsync_failed].reason = reason;
|
||||||
|
staffsync_results[staffsync_failed].extra = extra;
|
||||||
|
}
|
||||||
|
|
||||||
void G_ReadDemoExtraData(void)
|
void G_ReadDemoExtraData(void)
|
||||||
{
|
{
|
||||||
INT32 p, extradata, i;
|
INT32 p, extradata, i;
|
||||||
|
|
@ -449,7 +464,11 @@ void G_ReadDemoExtraData(void)
|
||||||
P_SetRandSeed(static_cast<pr_class_t>(i), rng);
|
P_SetRandSeed(static_cast<pr_class_t>(i), rng);
|
||||||
|
|
||||||
if (demosynced)
|
if (demosynced)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_WARNING, "Demo playback has desynced (RNG class %d)!\n", i);
|
CONS_Alert(CONS_WARNING, "Demo playback has desynced (RNG class %d)!\n", i);
|
||||||
|
G_FailStaffSync(SYNC_RNG, i);
|
||||||
|
}
|
||||||
|
|
||||||
storesynced = false;
|
storesynced = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1118,7 +1137,10 @@ void G_ConsGhostTic(INT32 playernum)
|
||||||
if (th != &thlist[THINK_MOBJ] && mobj->health != health) // Wasn't damaged?! This is desync! Fix it!
|
if (th != &thlist[THINK_MOBJ] && mobj->health != health) // Wasn't damaged?! This is desync! Fix it!
|
||||||
{
|
{
|
||||||
if (demosynced)
|
if (demosynced)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (health)!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (health)!\n"));
|
||||||
|
G_FailStaffSync(SYNC_HEALTH, 0);
|
||||||
|
}
|
||||||
demosynced = false;
|
demosynced = false;
|
||||||
P_DamageMobj(mobj, players[0].mo, players[0].mo, 1, DMG_NORMAL);
|
P_DamageMobj(mobj, players[0].mo, players[0].mo, 1, DMG_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
@ -1180,7 +1202,10 @@ void G_ConsGhostTic(INT32 playernum)
|
||||||
if (ghostext[playernum].desyncframes >= 2)
|
if (ghostext[playernum].desyncframes >= 2)
|
||||||
{
|
{
|
||||||
if (demosynced)
|
if (demosynced)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_WARNING, "Demo playback has desynced (player %s)!\n", player_names[playernum]);
|
CONS_Alert(CONS_WARNING, "Demo playback has desynced (player %s)!\n", player_names[playernum]);
|
||||||
|
G_FailStaffSync(SYNC_POSITION, 0);
|
||||||
|
}
|
||||||
demosynced = false;
|
demosynced = false;
|
||||||
|
|
||||||
P_UnsetThingPosition(testmo);
|
P_UnsetThingPosition(testmo);
|
||||||
|
|
@ -1203,7 +1228,11 @@ void G_ConsGhostTic(INT32 playernum)
|
||||||
|| testmo->health != ghostext[playernum].health)
|
|| testmo->health != ghostext[playernum].health)
|
||||||
{
|
{
|
||||||
if (demosynced)
|
if (demosynced)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (item/bumpers)!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (item/bumpers)!\n"));
|
||||||
|
G_FailStaffSync(SYNC_HEALTH, 0);
|
||||||
|
}
|
||||||
|
|
||||||
demosynced = false;
|
demosynced = false;
|
||||||
|
|
||||||
players[playernum].itemtype = ghostext[playernum].itemtype;
|
players[playernum].itemtype = ghostext[playernum].itemtype;
|
||||||
|
|
@ -1217,7 +1246,11 @@ void G_ConsGhostTic(INT32 playernum)
|
||||||
demo.skinlist[ghostext[playernum].skinid].mapping != (UINT8)(((skin_t *)testmo->skin)->skinnum))
|
demo.skinlist[ghostext[playernum].skinid].mapping != (UINT8)(((skin_t *)testmo->skin)->skinnum))
|
||||||
{
|
{
|
||||||
if (demosynced)
|
if (demosynced)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (Character/stats)!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (Character/stats)!\n"));
|
||||||
|
G_FailStaffSync(SYNC_CHARACTER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
demosynced = false;
|
demosynced = false;
|
||||||
|
|
||||||
testmo->skin = skins[demo.skinlist[ghostext[playernum].skinid].mapping];
|
testmo->skin = skins[demo.skinlist[ghostext[playernum].skinid].mapping];
|
||||||
|
|
@ -3904,6 +3937,12 @@ void G_StopDemo(void)
|
||||||
demo.waitingfortally = false;
|
demo.waitingfortally = false;
|
||||||
g_singletics = false;
|
g_singletics = false;
|
||||||
|
|
||||||
|
if (!demosynced && staffsync)
|
||||||
|
{
|
||||||
|
staffsync_failed++;
|
||||||
|
CONS_Printf("STAFF GHOST DESYNC on %s (%s)\n", G_BuildMapName(gamemap), player_names[consoleplayer]);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
||||||
|
|
|
||||||
14
src/g_game.c
14
src/g_game.c
|
|
@ -1882,7 +1882,14 @@ void G_Ticker(boolean run)
|
||||||
|
|
||||||
P_MapStart();
|
P_MapStart();
|
||||||
|
|
||||||
if (gamestate == GS_LEVEL && G_GetRetryFlag())
|
extern boolean demosynced;
|
||||||
|
if (demo.playback && staffsync && !demosynced)
|
||||||
|
{
|
||||||
|
G_ClearRetryFlag();
|
||||||
|
G_StopDemo();
|
||||||
|
Command_ExitGame_f();
|
||||||
|
}
|
||||||
|
else if (gamestate == GS_LEVEL && G_GetRetryFlag())
|
||||||
{
|
{
|
||||||
if (demo.playback == true)
|
if (demo.playback == true)
|
||||||
{
|
{
|
||||||
|
|
@ -2042,6 +2049,8 @@ void G_Ticker(boolean run)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_MENU:
|
case GS_MENU:
|
||||||
|
if (staffsync)
|
||||||
|
COM_BufInsertText("staffsync");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_INTRO:
|
case GS_INTRO:
|
||||||
|
|
@ -2075,6 +2084,9 @@ void G_Ticker(boolean run)
|
||||||
P_Ticker(run);
|
P_Ticker(run);
|
||||||
|
|
||||||
F_TitleScreenTicker(run);
|
F_TitleScreenTicker(run);
|
||||||
|
|
||||||
|
if (staffsync)
|
||||||
|
COM_BufInsertText("staffsync");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_CEREMONY:
|
case GS_CEREMONY:
|
||||||
|
|
|
||||||
|
|
@ -7670,6 +7670,20 @@ void K_drawKartHUD(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (staffsync)
|
||||||
|
{
|
||||||
|
V_DrawFadeScreen(31, 8);
|
||||||
|
V_DrawCenteredGamemodeString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 - 30, 0, 0, "Staff Ghost Sync Test");
|
||||||
|
UINT16 barw = BASEVIDWIDTH/2;
|
||||||
|
UINT16 barh = 8;
|
||||||
|
UINT16 bary = 10;
|
||||||
|
V_DrawFill(BASEVIDWIDTH/2 - barw/2, BASEVIDHEIGHT/2 - barh/2 + bary, barw, barh, 199);
|
||||||
|
V_DrawFill(BASEVIDWIDTH/2 - barw/2 + 1, BASEVIDHEIGHT/2 - barh/2 + 1 + bary, barw * staffsync_done / staffsync_total - 2, barh - 2, 176);
|
||||||
|
V_DrawCenteredThinString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 20, 0, va("Testing ghost %d of %d (%d failed). Choppy visuals are normal!\n", staffsync_done, staffsync_total, staffsync_failed));
|
||||||
|
V_DrawCenteredThinString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 30, 0, "See \"latest-log.txt\" for information on failing ghosts.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Draw full screen stuff that turns off the rest of the HUD
|
// Draw full screen stuff that turns off the rest of the HUD
|
||||||
if (R_GetViewNumber() == 0)
|
if (R_GetViewNumber() == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -262,7 +262,8 @@ boolean S_SoundDisabled(void)
|
||||||
return (
|
return (
|
||||||
sound_disabled ||
|
sound_disabled ||
|
||||||
( window_notinfocus && ! (cv_bgaudio.value & 2) ) ||
|
( window_notinfocus && ! (cv_bgaudio.value & 2) ) ||
|
||||||
(g_fast_forward > 0)
|
(g_fast_forward > 0) ||
|
||||||
|
staffsync
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ TYPEDEF (xcommand_t);
|
||||||
TYPEDEF (changeteam_packet_t);
|
TYPEDEF (changeteam_packet_t);
|
||||||
TYPEDEF (changeteam_value_t);
|
TYPEDEF (changeteam_value_t);
|
||||||
TYPEDEF (scheduleTask_t);
|
TYPEDEF (scheduleTask_t);
|
||||||
|
TYPEDEF (staffsync_t);
|
||||||
|
|
||||||
// discord.h
|
// discord.h
|
||||||
TYPEDEF (discordRequest_t);
|
TYPEDEF (discordRequest_t);
|
||||||
|
|
|
||||||
|
|
@ -2656,6 +2656,12 @@ void Y_StartIntermission(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (staffsync)
|
||||||
|
{
|
||||||
|
Y_EndIntermission();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
G_SetGamestate(GS_INTERMISSION);
|
G_SetGamestate(GS_INTERMISSION);
|
||||||
|
|
||||||
if (demo.playback)
|
if (demo.playback)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue