diff --git a/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp b/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp index 697ee47a0a4..8c19865b9c6 100644 --- a/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp +++ b/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp @@ -425,8 +425,7 @@ void ControlBar::populatePurchaseScience( Player* player ) win = TheWindowManager->winGetWindowFromId( m_contextParent[ CP_PURCHASE_SCIENCE ], TheNameKeyGenerator->nameToKey( "GeneralsExpPoints.wnd:ProgressBarExperience" ) ); if(win) { - Int progress; - progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) /(player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); + const Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); GadgetProgressBarSetProgress(win, progress); } @@ -484,8 +483,7 @@ void ControlBar::updateContextPurchaseScience() win = TheWindowManager->winGetWindowFromId( m_contextParent[ CP_PURCHASE_SCIENCE ], TheNameKeyGenerator->nameToKey( "GeneralsExpPoints.wnd:ProgressBarExperience" ) ); if(win) { - Int progress; - progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) /(player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); + const Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); GadgetProgressBarSetProgress(win, progress); } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp index 3310b688c5c..6f12ef22326 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp @@ -477,14 +477,8 @@ void W3DCommandBarGenExpDraw( GameWindow *window, WinInstanceData *instData ) static const Image *endBar = TheMappedImageCollection->findImageByName("GenExpBarTop1"); static const Image *beginBar = TheMappedImageCollection->findImageByName("GenExpBarBottom1"); static const Image *centerBar = TheMappedImageCollection->findImageByName("GenExpBar1"); - Int progress = 0; - Int skillPointsRequired = player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown(); - // TheSuperHackers @bugfix Mauller 04/05/2025 Prevent possible division by zero - if ( skillPointsRequired > 0) - { - progress = ( ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / skillPointsRequired ); - } + Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); if(progress <= 0) return; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/Player.h b/GeneralsMD/Code/GameEngine/Include/Common/Player.h index d8c7940bb66..913c92e2f32 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/Player.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/Player.h @@ -682,6 +682,8 @@ class Player : public Snapshot */ Bool addScience(ScienceType science); + void setSafeLevels(Int levelUp, Int levelDown); + public: Int getSkillPoints() const { return m_skillPoints; } Int getSciencePurchasePoints() const { return m_sciencePurchasePoints; } diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp index 02cfac1be99..b3ed3429980 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2702,8 +2702,7 @@ void Player::resetRank() m_rankLevel = 1; m_skillPoints = 0; const RankInfo* nextRank = TheRankInfoStore->getRankInfo(m_rankLevel+1); - m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; - m_levelDown = 0; + setSafeLevels(nextRank ? nextRank->m_skillPointsNeeded : INT_MAX, 0); m_sciences.clear(); m_sciencePurchasePoints = getPlayerTemplate() ? getPlayerTemplate()->getIntrinsicSciencePurchasePoints() : 0; const RankInfo* curRank = TheRankInfoStore->getRankInfo(m_rankLevel); @@ -2762,7 +2761,8 @@ Bool Player::setRankLevel(Int newLevel) } const RankInfo* nextRank = TheRankInfoStore->getRankInfo(newLevel + 1); - m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; + setSafeLevels(nextRank ? nextRank->m_skillPointsNeeded : INT_MAX, m_levelDown); + m_rankLevel = newLevel; DEBUG_ASSERTCRASH(m_skillPoints >= m_levelDown && m_skillPoints < m_levelUp, ("hmm, wrong")); @@ -2788,6 +2788,22 @@ Bool Player::setRankLevel(Int newLevel) return true; } +//============================================================================= +void Player::setSafeLevels(Int levelUp, Int levelDown) +{ + if (levelUp == levelDown) + { + // TheSuperHackers @bugfix Prevent possible division by zero in the control bar code. + m_levelUp = INT_MAX; + m_levelDown = 0; + } + else + { + m_levelUp = levelUp; + m_levelDown = levelDown; + } +} + //============================================================================= Bool Player::hasScience(ScienceType t) const { @@ -4588,6 +4604,5 @@ void Player::xfer( Xfer *xfer ) // ------------------------------------------------------------------------------------------------ void Player::loadPostProcess() { - + setSafeLevels(m_levelUp, m_levelDown); } -