From 091e6efa4dbd09cb1d182c2c978015439d3dffc4 Mon Sep 17 00:00:00 2001 From: Meridian Date: Sat, 10 Feb 2024 09:03:19 +0100 Subject: [PATCH] Fix CTD https://openxcom.org/forum/index.php/topic,11807.0.html --- src/Basescape/CraftSoldiersState.cpp | 2 +- src/Basescape/SoldierInfoState.cpp | 8 ++++++-- src/Basescape/SoldierInfoState.h | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Basescape/CraftSoldiersState.cpp b/src/Basescape/CraftSoldiersState.cpp index 210d266374..ba0d172a80 100644 --- a/src/Basescape/CraftSoldiersState.cpp +++ b/src/Basescape/CraftSoldiersState.cpp @@ -545,7 +545,7 @@ void CraftSoldiersState::lstSoldiersClick(Action *action) } else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { - _game->pushState(new SoldierInfoState(_base, row)); + _game->pushState(new SoldierInfoState(_base, row, false)); } } diff --git a/src/Basescape/SoldierInfoState.cpp b/src/Basescape/SoldierInfoState.cpp index 152706a21b..fba3bfbc81 100644 --- a/src/Basescape/SoldierInfoState.cpp +++ b/src/Basescape/SoldierInfoState.cpp @@ -56,7 +56,7 @@ namespace OpenXcom * @param base Pointer to the base to get info from. NULL to use the dead soldiers list. * @param soldierId ID of the selected soldier. */ -SoldierInfoState::SoldierInfoState(Base *base, size_t soldierId) : _base(base), _soldierId(soldierId), _soldier(0) +SoldierInfoState::SoldierInfoState(Base *base, size_t soldierId, bool forceLimits) : _base(base), _soldierId(soldierId), _forceLimits(forceLimits), _soldier(0) { if (_base == 0) { @@ -661,7 +661,11 @@ void SoldierInfoState::btnOkClick(Action *) _game->popState(); if (_game->getSavedGame()->getMonthsPassed() > -1 && Options::storageLimitsEnforced && _base != 0 && _base->storesOverfull()) { - _game->pushState(new SellState(_base, 0)); + if (_forceLimits) + { + // Note: we could sell a currently opened craft here and crash the game + _game->pushState(new SellState(_base, 0)); + } _game->pushState(new ErrorMessageState(tr("STR_STORAGE_EXCEEDED").arg(_base->getName()), _palette, _game->getMod()->getInterface("soldierInfo")->getElement("errorMessage")->color, "BACK01.SCR", _game->getMod()->getInterface("soldierInfo")->getElement("errorPalette")->color)); } } diff --git a/src/Basescape/SoldierInfoState.h b/src/Basescape/SoldierInfoState.h index f4e9f3c128..96352eb2bd 100644 --- a/src/Basescape/SoldierInfoState.h +++ b/src/Basescape/SoldierInfoState.h @@ -40,6 +40,7 @@ class SoldierInfoState : public State private: Base *_base; size_t _soldierId; + bool _forceLimits; Soldier *_soldier; std::vector *_list; @@ -57,7 +58,7 @@ class SoldierInfoState : public State public: /// Creates the Soldier Info state. - SoldierInfoState(Base *base, size_t soldierId); + SoldierInfoState(Base *base, size_t soldierId, bool forceLimits = true); /// Cleans up the Soldier Info state. ~SoldierInfoState(); /// Updates the soldier info.