From ceb08d783f38a4773c3dbea3b39cfd0b6e236fee Mon Sep 17 00:00:00 2001 From: obligaron Date: Thu, 16 Jun 2022 09:15:19 +0200 Subject: [PATCH] Introduce Player::plrIsOnSetLevel --- Source/loadsave.cpp | 6 ++++++ Source/player.cpp | 1 + Source/player.h | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 03cc25d1e..4f29e477c 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -544,6 +544,12 @@ void LoadPlayer(LoadHelper &file, Player &player) // Omit pointer _pDData // Omit pointer _pBData // Omit pointer pReserved + + // Ensure plrIsOnSetLevel and plrlevel is correctly initialized, cause in vanilla sometimes plrlevel is not updated to setlvlnum + if (setlevel) + player.setLevel(setlvlnum); + else + player.setLevel(currlevel); } bool gbSkipSync = false; diff --git a/Source/player.cpp b/Source/player.cpp index 5353f889d..f77fa64ed 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -3267,6 +3267,7 @@ StartNewLvl(int pnum, interface_mode fom, int lvl) break; case WM_DIABSETLVL: setlvlnum = (_setlevels)lvl; + player.setLevel(setlvlnum); break; case WM_DIABTWARPUP: myPlayer.pTownWarps |= 1 << (leveltype - 2); diff --git a/Source/player.h b/Source/player.h index 85ac739c9..9425d7b40 100644 --- a/Source/player.h +++ b/Source/player.h @@ -223,6 +223,7 @@ struct Player { int destParam3; int destParam4; uint8_t plrlevel; + bool plrIsOnSetLevel; ActorPosition position; Direction _pdir; // Direction faced by player (direction enum) int _pgfxnum; // Bitmask indicating what variant of the sprite the player is using. Lower byte define weapon (PlayerWeaponGraphic) and higher values define armour (starting with PlayerArmorGraphic) @@ -710,21 +711,30 @@ struct Player { /** @brief Checks if the player is on the same level as the local player (MyPlayer). */ bool isOnActiveLevel() const { - return currlevel == this->plrlevel; + if (setlevel) + return isOnLevel(setlvlnum); + return isOnLevel(currlevel); } /** @brief Checks if the player is on the correspondig level. */ bool isOnLevel(uint8_t level) const { - return this->plrlevel == level; + return !this->plrIsOnSetLevel && this->plrlevel == level; + } + /** @brief Checks if the player is on the correspondig level. */ + bool isOnLevel(_setlevels level) const + { + return this->plrIsOnSetLevel && this->plrlevel == static_cast(level); } void setLevel(uint8_t level) { this->plrlevel = level; + this->plrIsOnSetLevel = false; } void setLevel(_setlevels level) { this->plrlevel = static_cast(level); + this->plrIsOnSetLevel = true; } };