From eb82b4f64dfe9f0b65ed733acc1535cb959abe6b Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Mon, 11 Apr 2022 00:21:54 +0700 Subject: [PATCH] another attempt to fix netgame reload (#490) * another attempt to fix netgame reload * remove unused variable * change rngseed calculation * fix complevel boom desync * fix complevel mbf netgame desync --- Source/g_game.c | 15 +++------------ Source/p_enemy.c | 16 ++++++++++++++++ Source/p_inter.c | 24 ++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/Source/g_game.c b/Source/g_game.c index afcb3c1a..a9af6b1e 100644 --- a/Source/g_game.c +++ b/Source/g_game.c @@ -692,8 +692,6 @@ extern int ddt_cheating; static void G_ReloadLevel(void) { - int i; - if (demorecording || netgame) { gamemap = startmap; @@ -701,10 +699,7 @@ static void G_ReloadLevel(void) } basetic = gametic; - rngseed = time(NULL); - M_ClearRandom(); - AM_clearMarks(); - totalleveltimes = 0; + rngseed += gametic; if (demorecording) { @@ -714,12 +709,8 @@ static void G_ReloadLevel(void) G_BeginRecording(); } - // force players to be initialized upon first level load - for (i = 0; ilastlook == stop) // done looking + { + // Andrey Budko + // Fixed Boom incompatibilities. The following code was missed. + // There are no more desyncs on Donce's demos on horror.wad + + // Use last known enemy if no players sighted -- killough 2/15/98: + if (demo_version < 203 && !demo_compatibility && monsters_remember) + { + if (actor->lastenemy && actor->lastenemy->health > 0) + { + actor->target = actor->lastenemy; + actor->lastenemy = NULL; + return true; + } + } return false; + } player = &players[actor->lastlook]; diff --git a/Source/p_inter.c b/Source/p_inter.c index cbfd3c22..aadfc6a8 100644 --- a/Source/p_inter.c +++ b/Source/p_inter.c @@ -692,6 +692,30 @@ static void P_KillMobj(mobj_t *source, mobj_t *target) if (!(target->flags & MF_FRIEND)) players->killcount++; } +#ifndef MBF_STRICT + // For compatibility with PrBoom+ complevel 11 netgame + else + if ( + (target->flags & MF_COUNTKILL) && + (demo_version >= 203) && netgame && !deathmatch && + !( + target->lastenemy && + target->lastenemy->health > 0 && + target->lastenemy->player + ) + ) + { + int i; + for (i = 0; i < MAXPLAYERS; ++i) + { + if (playeringame[i]) + { + P_Random(pr_friends); + break; + } + } + } +#endif if (target->player) {