From 5da2ecda66a2f36adce39ff683f7db7d01bb278a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Mar 2019 15:28:10 +0100 Subject: [PATCH] - fix the compat_pointonline flag. --- src/d_main.cpp | 21 ++------------------- src/g_level.cpp | 31 +++++++++++++++++++++++++++++-- src/g_levellocals.h | 5 +++++ src/maploader/compatibility.cpp | 4 ++-- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index dc79c485867..835b570e4d2 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -534,28 +534,11 @@ CVAR (Flag, sv_respawnsuper, dmflags2, DF2_RESPAWN_SUPER); EXTERN_CVAR(Int, compatmode) -static int GetCompatibility(FLevelLocals *Level, int mask) -{ - if (Level->info == nullptr) return mask; - else return (mask & ~Level->info->compatmask) | (Level->info->compatflags & Level->info->compatmask); -} - -static int GetCompatibility2(FLevelLocals *Level, int mask) -{ - return (Level->info == nullptr) ? mask - : (mask & ~Level->info->compatmask2) | (Level->info->compatflags2 & Level->info->compatmask2); -} - CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO | CVAR_NOINITCALL) { for (auto Level : AllLevels()) { - int old = Level->i_compatflags; - Level->i_compatflags = GetCompatibility(Level, self) | Level->ii_compatflags; - if ((old ^ Level->i_compatflags) & COMPATF_POLYOBJ) - { - Level->ClearAllSubsectorLinks(); - } + Level->ApplyCompatibility(); } } @@ -563,7 +546,7 @@ CUSTOM_CVAR (Int, compatflags2, 0, CVAR_ARCHIVE|CVAR_SERVERINFO | CVAR_NOINITCAL { for (auto Level : AllLevels()) { - Level->i_compatflags2 = GetCompatibility2(Level, self) | Level->ii_compatflags2; + Level->ApplyCompatibility2(); Level->SetCompatLineOnSide(true); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index 6f90326b316..380e21ab9a3 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -2119,8 +2119,35 @@ int FLevelLocals::GetInfighting() void FLevelLocals::SetCompatLineOnSide(bool state) { int on = (state && (i_compatflags2 & COMPATF2_POINTONLINE)); - if (on) for (auto l : lines) l.flags |= ML_COMPATSIDE; - else for (auto l : lines) l.flags &= ML_COMPATSIDE; + if (on) for (auto &l : lines) l.flags |= ML_COMPATSIDE; + else for (auto &l : lines) l.flags &= ~ML_COMPATSIDE; +} + +int FLevelLocals::GetCompatibility(int mask) +{ + if (info == nullptr) return mask; + else return (mask & ~info->compatmask) | (info->compatflags & info->compatmask); +} + +int FLevelLocals::GetCompatibility2(int mask) +{ + return (info == nullptr) ? mask + : (mask & ~info->compatmask2) | (info->compatflags2 & info->compatmask2); +} + +void FLevelLocals::ApplyCompatibility() +{ + int old = i_compatflags; + i_compatflags = GetCompatibility(compatflags) | ii_compatflags; + if ((old ^ i_compatflags) & COMPATF_POLYOBJ) + { + ClearAllSubsectorLinks(); + } +} + +void FLevelLocals::ApplyCompatibility2() +{ + i_compatflags2 = GetCompatibility2(compatflags2) | ii_compatflags2; } //========================================================================== diff --git a/src/g_levellocals.h b/src/g_levellocals.h index fac345de0e0..4068b56ee4a 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -141,6 +141,11 @@ struct FLevelLocals int FindNode (const FStrifeDialogueNode *node); int GetInfighting(); void SetCompatLineOnSide(bool state); + int GetCompatibility(int mask); + int GetCompatibility2(int mask); + void ApplyCompatibility(); + void ApplyCompatibility2(); + void Init(); private: diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index 61c3106c40f..a978ec47e06 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -326,8 +326,8 @@ FName MapLoader::CheckCompatibility(MapData *map) } // Reset i_compatflags - compatflags.Callback(); - compatflags2.Callback(); + Level->ApplyCompatibility(); + Level->ApplyCompatibility2(); // Set floatbob compatibility for all maps with an original Hexen MAPINFO. if (Level->flags2 & LEVEL2_HEXENHACK) {