Merge branch 'replayfixes' into 'master'

Replay fixes mark whatever

See merge request KartKrew/Kart!463
This commit is contained in:
Sal 2021-11-30 02:28:57 +00:00
commit a326e180ca
8 changed files with 54 additions and 27 deletions

View file

@ -2390,6 +2390,7 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
// remove avatar of player // remove avatar of player
playeringame[playernum] = false; playeringame[playernum] = false;
demo_extradata[playernum] |= DXD_PLAYSTATE;
playernode[playernum] = UINT8_MAX; playernode[playernum] = UINT8_MAX;
while (!playeringame[doomcom->numslots-1] && doomcom->numslots > 1) while (!playeringame[doomcom->numslots-1] && doomcom->numslots > 1)
doomcom->numslots--; doomcom->numslots--;

View file

@ -112,6 +112,10 @@ demoghost *ghosts = NULL;
#define DF_BREAKTHECAPSULES 0x04 // This demo is from Break the Capsules and contains its final completion time! #define DF_BREAKTHECAPSULES 0x04 // This demo is from Break the Capsules and contains its final completion time!
#define DF_ATTACKMASK 0x06 // This demo is from ??? attack and contains ??? #define DF_ATTACKMASK 0x06 // This demo is from ??? attack and contains ???
// 0x08 free
#define DF_NONETMP 0x10 // multiplayer but not netgame
#define DF_LUAVARS 0x20 // this demo contains extra lua vars #define DF_LUAVARS 0x20 // this demo contains extra lua vars
#define DF_ATTACKSHIFT 1 #define DF_ATTACKSHIFT 1
@ -304,11 +308,12 @@ void G_ReadDemoExtraData(void)
} }
if (extradata & DXD_PLAYSTATE) if (extradata & DXD_PLAYSTATE)
{ {
extradata = READUINT8(demo_p); i = READUINT8(demo_p);
switch (extradata) { switch (i) {
case DXD_PST_PLAYING: case DXD_PST_PLAYING:
players[p].pflags |= PF_WANTSTOJOIN; // fuck you players[p].pflags |= PF_WANTSTOJOIN; // fuck you
//CONS_Printf("player %s is despectating on tic %d\n", player_names[p], leveltime);
break; break;
case DXD_PST_SPECTATING: case DXD_PST_SPECTATING:
@ -319,9 +324,11 @@ void G_ReadDemoExtraData(void)
playeringame[p] = true; playeringame[p] = true;
G_AddPlayer(p); G_AddPlayer(p);
players[p].spectator = true; players[p].spectator = true;
//CONS_Printf("player %s is joining server on tic %d\n", player_names[p], leveltime);
} }
else else
{ {
//CONS_Printf("player %s is spectating on tic %d\n", player_names[p], leveltime);
players[p].spectator = true; players[p].spectator = true;
if (players[p].mo) if (players[p].mo)
P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_INSTAKILL); P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_INSTAKILL);
@ -343,11 +350,11 @@ void G_ReadDemoExtraData(void)
} }
if (extradata & DXD_WEAPONPREF) if (extradata & DXD_WEAPONPREF)
{ {
extradata = READUINT8(demo_p); i = READUINT8(demo_p);
players[p].pflags &= ~(PF_KICKSTARTACCEL); players[p].pflags &= ~(PF_KICKSTARTACCEL);
if (extradata & 1) if (i & 1)
players[p].pflags |= PF_KICKSTARTACCEL; players[p].pflags |= PF_KICKSTARTACCEL;
//CONS_Printf("weaponpref is %d for player %d\n", extradata, p); //CONS_Printf("weaponpref is %d for player %d\n", i, p);
} }
p = READUINT8(demo_p); p = READUINT8(demo_p);
@ -366,7 +373,7 @@ void G_ReadDemoExtraData(void)
P_SetRandSeed(rng); P_SetRandSeed(rng);
if (demosynced) if (demosynced)
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (RNG)!\n"));
demosynced = false; demosynced = false;
} }
} }
@ -493,6 +500,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
if (!demo_p || !demo.deferstart) if (!demo_p || !demo.deferstart)
return; return;
ziptic = READUINT8(demo_p); ziptic = READUINT8(demo_p);
if (ziptic & ZT_FWD) if (ziptic & ZT_FWD)
@ -530,7 +538,7 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
if (cmd->forwardmove != oldcmd[playernum].forwardmove) if (cmd->forwardmove != oldcmd[playernum].forwardmove)
{ {
WRITEUINT8(demo_p,cmd->forwardmove); WRITESINT8(demo_p,cmd->forwardmove);
oldcmd[playernum].forwardmove = cmd->forwardmove; oldcmd[playernum].forwardmove = cmd->forwardmove;
ziptic |= ZT_FWD; ziptic |= ZT_FWD;
} }
@ -863,7 +871,12 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
void G_ConsAllGhostTics(void) void G_ConsAllGhostTics(void)
{ {
UINT8 p = READUINT8(demo_p); UINT8 p;
if (!demo_p || !demo.deferstart)
return;
p = READUINT8(demo_p);
while (p != 0xFF) while (p != 0xFF)
{ {
@ -888,8 +901,6 @@ void G_ConsGhostTic(INT32 playernum)
mobj_t *testmo; mobj_t *testmo;
UINT32 syncleeway; UINT32 syncleeway;
if (!demo_p || !demo.deferstart)
return;
if (!(demoflags & DF_GHOST)) if (!(demoflags & DF_GHOST))
return; // No ghost data to use. return; // No ghost data to use.
@ -966,7 +977,7 @@ 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!\n")); CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (health)!\n"));
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);
} }
@ -1019,7 +1030,7 @@ void G_ConsGhostTic(INT32 playernum)
if (ghostext[playernum].desyncframes >= 2) if (ghostext[playernum].desyncframes >= 2)
{ {
if (demosynced) if (demosynced)
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); CONS_Alert(CONS_WARNING, "Demo playback has desynced (player %s)!\n", player_names[playernum]);
demosynced = false; demosynced = false;
P_UnsetThingPosition(testmo); P_UnsetThingPosition(testmo);
@ -1042,7 +1053,7 @@ void G_ConsGhostTic(INT32 playernum)
|| players[playernum].bumpers != ghostext[playernum].kartbumpers) || players[playernum].bumpers != ghostext[playernum].kartbumpers)
{ {
if (demosynced) if (demosynced)
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (item/bumpers)!\n"));
demosynced = false; demosynced = false;
players[playernum].itemtype = ghostext[playernum].kartitem; players[playernum].itemtype = ghostext[playernum].kartitem;
@ -1921,6 +1932,9 @@ void G_BeginRecording(void)
demo_p = demobuffer; demo_p = demobuffer;
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT)); demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
if (multiplayer && !netgame)
demoflags |= DF_NONETMP;
if (encoremode) if (encoremode)
demoflags |= DF_ENCORE; demoflags |= DF_ENCORE;
@ -2838,6 +2852,7 @@ void G_DoPlayDemo(char *defdemoname)
modeattacking = (demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT; modeattacking = (demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT;
multiplayer = !!(demoflags & DF_MULTIPLAYER); multiplayer = !!(demoflags & DF_MULTIPLAYER);
demo.netgame = (multiplayer && !(demoflags & DF_NONETMP));
CON_ToggleOff(); CON_ToggleOff();
hu_demotime = UINT32_MAX; hu_demotime = UINT32_MAX;
@ -2927,7 +2942,7 @@ void G_DoPlayDemo(char *defdemoname)
while (p != 0xFF) while (p != 0xFF)
{ {
if ((spectator = (p & DEMO_SPECTATOR))) if ((spectator = !!(p & DEMO_SPECTATOR)))
{ {
p &= ~DEMO_SPECTATOR; p &= ~DEMO_SPECTATOR;
@ -2975,6 +2990,11 @@ void G_DoPlayDemo(char *defdemoname)
M_Memcpy(player_names[p],demo_p,16); M_Memcpy(player_names[p],demo_p,16);
demo_p += 16; demo_p += 16;
/*if (players[p].spectator)
{
CONS_Printf("player %s is spectator at start\n", player_names[p]);
}*/
// Skin // Skin
M_Memcpy(skin,demo_p,16); M_Memcpy(skin,demo_p,16);
demo_p += 16; demo_p += 16;

View file

@ -41,6 +41,7 @@ struct demovars_s {
boolean inreplayhut; // Go back to replayhut after demos boolean inreplayhut; // Go back to replayhut after demos
boolean quitafterplaying; // quit after playing a demo from cmdline boolean quitafterplaying; // quit after playing a demo from cmdline
boolean deferstart; // don't start playing demo right away boolean deferstart; // don't start playing demo right away
boolean netgame; // multiplayer netgame
tic_t savebutton; // Used to determine when the local player can choose to save the replay while the race is still going tic_t savebutton; // Used to determine when the local player can choose to save the replay while the race is still going
enum { enum {

View file

@ -2560,7 +2560,7 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
if (j == i) if (j == i)
continue; continue;
if (netgame && cv_kartusepwrlv.value) if ((netgame || (demo.playback && demo.netgame)) && cv_kartusepwrlv.value)
{ {
if (clientpowerlevels[j][PWRLV_RACE] == clientpowerlevels[i][PWRLV_RACE]) if (clientpowerlevels[j][PWRLV_RACE] == clientpowerlevels[i][PWRLV_RACE])
num++; num++;
@ -2581,7 +2581,7 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
pos++; pos++;
else else
{ {
if (netgame && cv_kartusepwrlv.value) if ((netgame || (demo.playback && demo.netgame)) && cv_kartusepwrlv.value)
{ {
if (clientpowerlevels[i][PWRLV_RACE] > clientpowerlevels[playernum][PWRLV_RACE]) if (clientpowerlevels[i][PWRLV_RACE] > clientpowerlevels[playernum][PWRLV_RACE])
pos++; pos++;
@ -3121,7 +3121,7 @@ boolean G_GametypeHasTeams(void)
// //
boolean G_GametypeHasSpectators(void) boolean G_GametypeHasSpectators(void)
{ {
return (netgame || (multiplayer && demo.playback)); return (netgame || (multiplayer && demo.netgame));
} }
// //

View file

@ -52,7 +52,7 @@ void K_TimerReset(void)
void K_TimerInit(void) void K_TimerInit(void)
{ {
UINT8 i; UINT8 i;
UINT8 numPlayers = 0; UINT8 numPlayers = 0;//, numspec = 0;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
@ -63,6 +63,7 @@ void K_TimerInit(void)
if (players[i].spectator == true) if (players[i].spectator == true)
{ {
//numspec++;
continue; continue;
} }
@ -98,6 +99,7 @@ void K_TimerInit(void)
// NOW you can try to spawn in the Battle capsules, if there's not enough players for a match // NOW you can try to spawn in the Battle capsules, if there's not enough players for a match
K_SpawnBattleCapsules(); K_SpawnBattleCapsules();
//CONS_Printf("numbulbs set to %d (%d players, %d spectators) on tic %d\n", numbulbs, numPlayers, numspec, leveltime);
} }
UINT32 K_GetPlayerDontDrawFlag(player_t *player) UINT32 K_GetPlayerDontDrawFlag(player_t *player)
@ -9440,6 +9442,7 @@ void K_CheckSpectateStatus(void)
{ {
if (cv_ingamecap.value && numingame+i >= cv_ingamecap.value) // Hit the in-game player cap while adding people? if (cv_ingamecap.value && numingame+i >= cv_ingamecap.value) // Hit the in-game player cap while adding people?
break; break;
//CONS_Printf("player %s is joining on tic %d\n", player_names[respawnlist[i]], leveltime);
P_SpectatorJoinGame(&players[respawnlist[i]]); P_SpectatorJoinGame(&players[respawnlist[i]]);
} }

View file

@ -30,7 +30,7 @@ SINT8 K_UsingPowerLevels(void)
{ {
SINT8 pt = PWRLV_DISABLED; SINT8 pt = PWRLV_DISABLED;
if (!cv_kartusepwrlv.value || !netgame || grandprixinfo.gp == true) if (!cv_kartusepwrlv.value || !(netgame || (demo.playback && demo.netgame)) || grandprixinfo.gp == true)
{ {
return PWRLV_DISABLED; return PWRLV_DISABLED;
} }
@ -346,7 +346,7 @@ void K_PlayerForfeit(UINT8 playernum, boolean pointloss)
clientpowerlevels[playernum][powertype] += inc; clientpowerlevels[playernum][powertype] += inc;
if (playernum == consoleplayer) if (!demo.playback && playernum == consoleplayer)
{ {
vspowerlevel[powertype] = clientpowerlevels[playernum][powertype]; vspowerlevel[powertype] = clientpowerlevels[playernum][powertype];
if (M_UpdateUnlockablesAndExtraEmblems()) if (M_UpdateUnlockablesAndExtraEmblems())

View file

@ -1058,6 +1058,9 @@ boolean P_IsLocalPlayer(player_t *player)
{ {
UINT8 i; UINT8 i;
if (demo.playback)
return P_IsDisplayPlayer(player);
for (i = 0; i <= r_splitscreen; i++) // DON'T skip P1 for (i = 0; i <= r_splitscreen; i++) // DON'T skip P1
{ {
if (player == &players[g_localplayers[i]]) if (player == &players[g_localplayers[i]])
@ -4369,6 +4372,7 @@ void P_PlayerThink(player_t *player)
player->flashing = TICRATE/2 + 1; player->flashing = TICRATE/2 + 1;
/*if (P_SpectatorJoinGame(player)) /*if (P_SpectatorJoinGame(player))
return; // player->mo was removed.*/ return; // player->mo was removed.*/
//CONS_Printf("player %s wants to join on tic %d\n", player_names[player-players], leveltime);
} }
if (player->respawn.state != RESPAWNST_NONE) if (player->respawn.state != RESPAWNST_NONE)

View file

@ -481,7 +481,7 @@ void Y_IntermissionDrawer(void)
else else
hilicol = ((intertype == int_race) ? V_SKYMAP : V_REDMAP); hilicol = ((intertype == int_race) ? V_SKYMAP : V_REDMAP);
if (sorttic != -1 && intertic > sorttic && !demo.playback) if (sorttic != -1 && intertic > sorttic && multiplayer)
{ {
INT32 count = (intertic - sorttic); INT32 count = (intertic - sorttic);
@ -586,7 +586,7 @@ void Y_IntermissionDrawer(void)
y2 = y; y2 = y;
if (netgame && playerconsole[data.num[i]] == 0 && server_lagless && !players[data.num[i]].bot) if ((netgame || (demo.playback && demo.netgame)) && playerconsole[data.num[i]] == 0 && server_lagless && !players[data.num[i]].bot)
{ {
static int alagles_timer = 0; static int alagles_timer = 0;
patch_t *alagles; patch_t *alagles;
@ -799,7 +799,7 @@ void Y_Ticker(void)
if (intertype == int_race || intertype == int_battle) if (intertype == int_race || intertype == int_battle)
{ {
if (!(multiplayer && demo.playback)) // Don't advance to rankings in replays //if (!(multiplayer && demo.playback)) // Don't advance to rankings in replays
{ {
if (!data.rankingsmode && (intertic >= sorttic + 8)) if (!data.rankingsmode && (intertic >= sorttic + 8))
{ {
@ -868,8 +868,6 @@ void Y_Ticker(void)
endtic = intertic + 3*TICRATE; // 3 second pause after end of tally endtic = intertic + 3*TICRATE; // 3 second pause after end of tally
} }
} }
else if (!(intertic & 1))
S_StartSound(NULL, sfx_ptally); // tally sound effect
} }
} }
@ -1013,7 +1011,7 @@ static void K_UpdatePowerLevels(void)
data.increase[i] = increment[i]; data.increase[i] = increment[i];
clientpowerlevels[i][powertype] += data.increase[i]; clientpowerlevels[i][powertype] += data.increase[i];
if (i == consoleplayer) if (!demo.playback && i == consoleplayer)
{ {
CONS_Debug(DBG_GAMELOGIC, "Player %d is you! Saving...\n", i); CONS_Debug(DBG_GAMELOGIC, "Player %d is you! Saving...\n", i);
vspowerlevel[powertype] = clientpowerlevels[i][powertype]; vspowerlevel[powertype] = clientpowerlevels[i][powertype];
@ -1069,7 +1067,7 @@ void Y_StartIntermission(void)
{ {
if (cv_inttime.value == 0) if (cv_inttime.value == 0)
timer = 0; timer = 0;
else if (demo.playback) // Override inttime (which is pulled from the replay anyway else if (demo.playback && !multiplayer) // Override inttime (which is pulled from the replay anyway
timer = 10*TICRATE; timer = 10*TICRATE;
else else
{ {