diff --git a/CCallback.cpp b/CCallback.cpp index 7b87bc913..85cf0471b 100644 --- a/CCallback.cpp +++ b/CCallback.cpp @@ -405,7 +405,10 @@ std::optional CBattleCallback::makeSurrenderRetreatDecision(const std::shared_ptr CBattleCallback::getBattle(const BattleID & battleID) { - return activeBattles.at(battleID); + if (activeBattles.count(battleID)) + return activeBattles.at(battleID); + + throw std::runtime_error("Failed to find battle " + std::to_string(battleID.getNum()) + " of player " + player->toString() + ". Number of ongoing battles: " + std::to_string(activeBattles.size())); } std::optional CBattleCallback::getPlayerID() const @@ -415,10 +418,18 @@ std::optional CBattleCallback::getPlayerID() const void CBattleCallback::onBattleStarted(const IBattleInfo * info) { + if (activeBattles.count(info->getBattleID()) > 0) + throw std::runtime_error("Player " + player->toString() + " is already engaged in battle " + std::to_string(info->getBattleID().getNum())); + + logGlobal->debug("Battle %d started for player %s", info->getBattleID(), player->toString()); activeBattles[info->getBattleID()] = std::make_shared(info, *getPlayerID()); } void CBattleCallback::onBattleEnded(const BattleID & battleID) { + if (activeBattles.count(battleID) == 0) + throw std::runtime_error("Player " + player->toString() + " is not engaged in battle " + std::to_string(battleID.getNum())); + + logGlobal->debug("Battle %d ended for player %s", battleID, player->toString()); activeBattles.erase(battleID); } diff --git a/client/Client.cpp b/client/Client.cpp index f41ba25d4..3ddfc03e8 100644 --- a/client/Client.cpp +++ b/client/Client.cpp @@ -560,18 +560,16 @@ int CClient::sendRequest(const CPackForServer * request, PlayerColor player) void CClient::battleStarted(const BattleInfo * info) { + std::shared_ptr att, def; + auto & leftSide = info->sides[0]; + auto & rightSide = info->sides[1]; + for(auto & battleCb : battleCallbacks) { - if(vstd::contains_if(info->sides, [&](const SideInBattle& side) {return side.color == battleCb.first; }) - || !battleCb.first.isValidPlayer()) - { + if(!battleCb.first.isValidPlayer() || battleCb.first == leftSide.color || battleCb.first == rightSide.color) battleCb.second->onBattleStarted(info); - } } - std::shared_ptr att, def; - auto & leftSide = info->sides[0], & rightSide = info->sides[1]; - //If quick combat is not, do not prepare interfaces for battleint auto callBattleStart = [&](PlayerColor color, ui8 side) {