mirror of
https://github.com/fabiangreffrath/woof.git
synced 2025-09-23 03:52:12 -04:00
implement netgame reload level (#428)
* implement netgame reload level * remove redundant declaration * remove restart from start level when recording demo In a netgame, the desync occurs if one of the players records a demo and the other does not. * force players reborn, reset rng and automap marks * set BTS_RELOAD = 32 * always restart from startmap in netgame
This commit is contained in:
parent
043868015c
commit
2fa435d46e
@ -73,7 +73,8 @@ typedef enum
|
|||||||
ga_completed,
|
ga_completed,
|
||||||
ga_victory,
|
ga_victory,
|
||||||
ga_worlddone,
|
ga_worlddone,
|
||||||
ga_screenshot
|
ga_screenshot,
|
||||||
|
ga_reloadlevel,
|
||||||
} gameaction_t;
|
} gameaction_t;
|
||||||
|
|
||||||
|
|
||||||
@ -111,6 +112,9 @@ typedef enum
|
|||||||
// Savegame slot numbers occupy the second byte of buttons.
|
// Savegame slot numbers occupy the second byte of buttons.
|
||||||
BTS_SAVEMASK = (4+8+16),
|
BTS_SAVEMASK = (4+8+16),
|
||||||
BTS_SAVESHIFT = 2,
|
BTS_SAVESHIFT = 2,
|
||||||
|
|
||||||
|
// Reload level.
|
||||||
|
BTS_RELOAD = 32,
|
||||||
|
|
||||||
} buttoncode_t;
|
} buttoncode_t;
|
||||||
|
|
||||||
|
@ -93,6 +93,7 @@ int timelimit;
|
|||||||
boolean paused;
|
boolean paused;
|
||||||
boolean sendpause; // send a pause event next tic
|
boolean sendpause; // send a pause event next tic
|
||||||
boolean sendsave; // send a save event next tic
|
boolean sendsave; // send a save event next tic
|
||||||
|
boolean sendreload; // send a reload level event next tic
|
||||||
boolean usergame; // ok to save / end game
|
boolean usergame; // ok to save / end game
|
||||||
boolean timingdemo; // if true, exit with report on completion
|
boolean timingdemo; // if true, exit with report on completion
|
||||||
boolean fastdemo; // if true, run at full speed -- killough
|
boolean fastdemo; // if true, run at full speed -- killough
|
||||||
@ -508,6 +509,12 @@ void G_BuildTiccmd(ticcmd_t* cmd)
|
|||||||
cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot<<BTS_SAVESHIFT);
|
cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot<<BTS_SAVESHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sendreload)
|
||||||
|
{
|
||||||
|
sendreload = false;
|
||||||
|
cmd->buttons = BT_SPECIAL | BTS_RELOAD;
|
||||||
|
}
|
||||||
|
|
||||||
// low-res turning
|
// low-res turning
|
||||||
|
|
||||||
if (lowres_turn)
|
if (lowres_turn)
|
||||||
@ -664,6 +671,37 @@ static void G_DoLoadLevel(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int ddt_cheating;
|
||||||
|
|
||||||
|
static void G_ReloadLevel(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (demorecording || netgame)
|
||||||
|
{
|
||||||
|
gamemap = startmap;
|
||||||
|
gameepisode = startepisode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (demorecording)
|
||||||
|
{
|
||||||
|
ddt_cheating = 0;
|
||||||
|
G_CheckDemoStatus();
|
||||||
|
G_RecordDemo(orig_demoname);
|
||||||
|
G_BeginRecording();
|
||||||
|
}
|
||||||
|
|
||||||
|
// force players to be initialized upon first level load
|
||||||
|
for (i = 0; i<MAXPLAYERS; i++)
|
||||||
|
players[i].playerstate = PST_REBORN;
|
||||||
|
|
||||||
|
M_ClearRandom();
|
||||||
|
AM_clearMarks();
|
||||||
|
totalleveltimes = 0;
|
||||||
|
|
||||||
|
G_DoLoadLevel();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_Responder
|
// G_Responder
|
||||||
// Get info needed to make ticcmd_ts for the players.
|
// Get info needed to make ticcmd_ts for the players.
|
||||||
@ -690,6 +728,16 @@ boolean G_Responder(event_t* ev)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (M_InputActivated(input_menu_reloadlevel) &&
|
||||||
|
gamestate == GS_LEVEL &&
|
||||||
|
!demoplayback &&
|
||||||
|
!deathmatch &&
|
||||||
|
!menuactive)
|
||||||
|
{
|
||||||
|
sendreload = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// killough 9/29/98: reformatted
|
// killough 9/29/98: reformatted
|
||||||
if (gamestate == GS_LEVEL && (HU_Responder(ev) || // chat ate the event
|
if (gamestate == GS_LEVEL && (HU_Responder(ev) || // chat ate the event
|
||||||
ST_Responder(ev) || // status window ate it
|
ST_Responder(ev) || // status window ate it
|
||||||
@ -1915,6 +1963,9 @@ void G_Ticker(void)
|
|||||||
M_ScreenShot();
|
M_ScreenShot();
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
break;
|
break;
|
||||||
|
case ga_reloadlevel:
|
||||||
|
G_ReloadLevel();
|
||||||
|
break;
|
||||||
default: // killough 9/29/98
|
default: // killough 9/29/98
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
break;
|
break;
|
||||||
@ -1990,6 +2041,11 @@ void G_Ticker(void)
|
|||||||
if (playeringame[i] && players[i].cmd.buttons & BT_SPECIAL)
|
if (playeringame[i] && players[i].cmd.buttons & BT_SPECIAL)
|
||||||
{
|
{
|
||||||
// killough 9/29/98: allow multiple special buttons
|
// killough 9/29/98: allow multiple special buttons
|
||||||
|
if (players[i].cmd.buttons & BTS_RELOAD)
|
||||||
|
{
|
||||||
|
gameaction = ga_reloadlevel;
|
||||||
|
}
|
||||||
|
|
||||||
if (players[i].cmd.buttons & BTS_PAUSE)
|
if (players[i].cmd.buttons & BTS_PAUSE)
|
||||||
{
|
{
|
||||||
if ((paused ^= 1))
|
if ((paused ^= 1))
|
||||||
@ -2373,8 +2429,6 @@ void G_DeferedInitNew(skill_t skill, int episode, int map)
|
|||||||
|
|
||||||
if (demorecording)
|
if (demorecording)
|
||||||
{
|
{
|
||||||
extern int ddt_cheating;
|
|
||||||
|
|
||||||
ddt_cheating = 0;
|
ddt_cheating = 0;
|
||||||
G_CheckDemoStatus();
|
G_CheckDemoStatus();
|
||||||
G_RecordDemo(orig_demoname);
|
G_RecordDemo(orig_demoname);
|
||||||
@ -3344,7 +3398,7 @@ boolean G_CheckDemoStatus(void)
|
|||||||
demobuffer = NULL; // killough
|
demobuffer = NULL; // killough
|
||||||
fprintf(stderr, "Demo %s recorded\n", demoname);
|
fprintf(stderr, "Demo %s recorded\n", demoname);
|
||||||
// [crispy] if a new game is started during demo recording, start a new demo
|
// [crispy] if a new game is started during demo recording, start a new demo
|
||||||
if (gameaction != ga_newgame)
|
if (gameaction != ga_newgame && gameaction != ga_reloadlevel)
|
||||||
{
|
{
|
||||||
I_SafeExit(0);
|
I_SafeExit(0);
|
||||||
}
|
}
|
||||||
|
@ -2509,27 +2509,6 @@ void M_DrawInstructions()
|
|||||||
|
|
||||||
// [FG] reload current level / go to next level
|
// [FG] reload current level / go to next level
|
||||||
// adapted from prboom-plus/src/e6y.c:369-449
|
// adapted from prboom-plus/src/e6y.c:369-449
|
||||||
static int G_ReloadLevel(void)
|
|
||||||
{
|
|
||||||
int result = false;
|
|
||||||
|
|
||||||
if (gamestate == GS_LEVEL &&
|
|
||||||
!deathmatch && !netgame &&
|
|
||||||
!demoplayback &&
|
|
||||||
!menuactive)
|
|
||||||
{
|
|
||||||
// [crispy] restart demos from the map they were started
|
|
||||||
if (demorecording)
|
|
||||||
{
|
|
||||||
gamemap = startmap;
|
|
||||||
}
|
|
||||||
G_DeferedInitNew(gameskill, gameepisode, gamemap);
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int G_GotoNextLevel(int *e, int *m)
|
int G_GotoNextLevel(int *e, int *m)
|
||||||
{
|
{
|
||||||
int changed = false;
|
int changed = false;
|
||||||
@ -4974,11 +4953,6 @@ boolean M_Responder (event_t* ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// [FG] reload current level / go to next level
|
// [FG] reload current level / go to next level
|
||||||
if (M_InputActivated(input_menu_reloadlevel))
|
|
||||||
{
|
|
||||||
if (G_ReloadLevel())
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (M_InputActivated(input_menu_nextlevel))
|
if (M_InputActivated(input_menu_nextlevel))
|
||||||
{
|
{
|
||||||
if (demoplayback && singledemo && !demoskip)
|
if (demoplayback && singledemo && !demoskip)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user