diff --git a/client/widgets/Images.cpp b/client/widgets/Images.cpp index f4ce12ce3..6699476da 100644 --- a/client/widgets/Images.cpp +++ b/client/widgets/Images.cpp @@ -334,8 +334,12 @@ CShowableAnim::CShowableAnim(int x, int y, const AnimationPath & name, ui8 Flags anim->loadGroup(group); last = anim->size(group); - pos.w = anim->getImage(0, group)->width(); - pos.h = anim->getImage(0, group)->height(); + auto image = anim->getImage(0, group); + if (!image) + throw std::runtime_error("Failed to load group " + std::to_string(group) + " of animation file " + name.getOriginalName()); + + pos.w = image->width(); + pos.h = image->height(); pos.x+= x; pos.y+= y; diff --git a/lib/MetaString.cpp b/lib/MetaString.cpp index 92d84e851..db2e015dd 100644 --- a/lib/MetaString.cpp +++ b/lib/MetaString.cpp @@ -144,33 +144,33 @@ DLL_LINKAGE std::string MetaString::toString() const switch(elem) { case EMessage::APPEND_RAW_STRING: - dst += exactStrings[exSt++]; + dst += exactStrings.at(exSt++); break; case EMessage::APPEND_LOCAL_STRING: - dst += getLocalString(localStrings[loSt++]); + dst += getLocalString(localStrings.at(loSt++)); break; case EMessage::APPEND_TEXTID_STRING: - dst += VLC->generaltexth->translate(stringsTextID[textID++]); + dst += VLC->generaltexth->translate(stringsTextID.at(textID++)); break; case EMessage::APPEND_NUMBER: - dst += std::to_string(numbers[nums++]); + dst += std::to_string(numbers.at(nums++)); break; case EMessage::REPLACE_RAW_STRING: - boost::replace_first(dst, "%s", exactStrings[exSt++]); + boost::replace_first(dst, "%s", exactStrings.at(exSt++)); break; case EMessage::REPLACE_LOCAL_STRING: - boost::replace_first(dst, "%s", getLocalString(localStrings[loSt++])); + boost::replace_first(dst, "%s", getLocalString(localStrings.at(loSt++))); break; case EMessage::REPLACE_TEXTID_STRING: - boost::replace_first(dst, "%s", VLC->generaltexth->translate(stringsTextID[textID++])); + boost::replace_first(dst, "%s", VLC->generaltexth->translate(stringsTextID.at(textID++))); break; case EMessage::REPLACE_NUMBER: - boost::replace_first(dst, "%d", std::to_string(numbers[nums++])); + boost::replace_first(dst, "%d", std::to_string(numbers.at(nums++))); break; case EMessage::REPLACE_POSITIVE_NUMBER: if (dst.find("%+d") != std::string::npos) { - int64_t value = numbers[nums]; + int64_t value = numbers.at(nums); if (value > 0) boost::replace_first(dst, "%+d", '+' + std::to_string(value)); else @@ -179,7 +179,7 @@ DLL_LINKAGE std::string MetaString::toString() const nums++; } else - boost::replace_first(dst, "%d", std::to_string(numbers[nums++])); + boost::replace_first(dst, "%d", std::to_string(numbers.at(nums++))); break; default: logGlobal->error("MetaString processing error! Received message of type %d", static_cast(elem)); @@ -199,41 +199,41 @@ DLL_LINKAGE std::string MetaString::buildList() const std::string lista; for(int i = 0; i < message.size(); ++i) { - if(i > 0 && (message[i] == EMessage::APPEND_RAW_STRING || message[i] == EMessage::APPEND_LOCAL_STRING)) + if(i > 0 && (message.at(i) == EMessage::APPEND_RAW_STRING || message.at(i) == EMessage::APPEND_LOCAL_STRING)) { if(exSt == exactStrings.size() - 1) lista += VLC->generaltexth->allTexts[141]; //" and " else lista += ", "; } - switch(message[i]) + switch(message.at(i)) { case EMessage::APPEND_RAW_STRING: - lista += exactStrings[exSt++]; + lista += exactStrings.at(exSt++); break; case EMessage::APPEND_LOCAL_STRING: - lista += getLocalString(localStrings[loSt++]); + lista += getLocalString(localStrings.at(loSt++)); break; case EMessage::APPEND_TEXTID_STRING: - lista += VLC->generaltexth->translate(stringsTextID[textID++]); + lista += VLC->generaltexth->translate(stringsTextID.at(textID++)); break; case EMessage::APPEND_NUMBER: - lista += std::to_string(numbers[nums++]); + lista += std::to_string(numbers.at(nums++)); break; case EMessage::REPLACE_RAW_STRING: - lista.replace(lista.find("%s"), 2, exactStrings[exSt++]); + lista.replace(lista.find("%s"), 2, exactStrings.at(exSt++)); break; case EMessage::REPLACE_LOCAL_STRING: - lista.replace(lista.find("%s"), 2, getLocalString(localStrings[loSt++])); + lista.replace(lista.find("%s"), 2, getLocalString(localStrings.at(loSt++))); break; case EMessage::REPLACE_TEXTID_STRING: - lista.replace(lista.find("%s"), 2, VLC->generaltexth->translate(stringsTextID[textID++])); + lista.replace(lista.find("%s"), 2, VLC->generaltexth->translate(stringsTextID.at(textID++))); break; case EMessage::REPLACE_NUMBER: - lista.replace(lista.find("%d"), 2, std::to_string(numbers[nums++])); + lista.replace(lista.find("%d"), 2, std::to_string(numbers.at(nums++))); break; default: - logGlobal->error("MetaString processing error! Received message of type %d", int(message[i])); + logGlobal->error("MetaString processing error! Received message of type %d", int(message.at(i))); } } return lista; diff --git a/lib/networkPacks/NetPacksLib.cpp b/lib/networkPacks/NetPacksLib.cpp index 28d8779d7..ead5778d2 100644 --- a/lib/networkPacks/NetPacksLib.cpp +++ b/lib/networkPacks/NetPacksLib.cpp @@ -1579,7 +1579,7 @@ void ChangeStackCount::applyGs(CGameState * gs) { auto * srcObj = gs->getArmyInstance(army); if(!srcObj) - logNetwork->error("[CRITICAL] ChangeStackCount: invalid army object %d, possible game state corruption.", army.getNum()); + throw std::runtime_error("ChangeStackCount: invalid army object " + std::to_string(army.getNum()) + ", possible game state corruption."); if(absoluteValue) srcObj->setStackCount(slot, count); @@ -1591,7 +1591,7 @@ void SetStackType::applyGs(CGameState * gs) { auto * srcObj = gs->getArmyInstance(army); if(!srcObj) - logNetwork->error("[CRITICAL] SetStackType: invalid army object %d, possible game state corruption.", army.getNum()); + throw std::runtime_error("SetStackType: invalid army object " + std::to_string(army.getNum()) + ", possible game state corruption."); srcObj->setStackType(slot, type); } @@ -1600,7 +1600,7 @@ void EraseStack::applyGs(CGameState * gs) { auto * srcObj = gs->getArmyInstance(army); if(!srcObj) - logNetwork->error("[CRITICAL] EraseStack: invalid army object %d, possible game state corruption.", army.getNum()); + throw std::runtime_error("EraseStack: invalid army object " + std::to_string(army.getNum()) + ", possible game state corruption."); srcObj->eraseStack(slot); } @@ -1609,11 +1609,11 @@ void SwapStacks::applyGs(CGameState * gs) { auto * srcObj = gs->getArmyInstance(srcArmy); if(!srcObj) - logNetwork->error("[CRITICAL] SwapStacks: invalid army object %d, possible game state corruption.", srcArmy.getNum()); + throw std::runtime_error("SwapStacks: invalid army object " + std::to_string(srcArmy.getNum()) + ", possible game state corruption."); auto * dstObj = gs->getArmyInstance(dstArmy); if(!dstObj) - logNetwork->error("[CRITICAL] SwapStacks: invalid army object %d, possible game state corruption.", dstArmy.getNum()); + throw std::runtime_error("SwapStacks: invalid army object " + std::to_string(dstArmy.getNum()) + ", possible game state corruption."); CStackInstance * s1 = srcObj->detachStack(srcSlot); CStackInstance * s2 = dstObj->detachStack(dstSlot); @@ -1627,18 +1627,18 @@ void InsertNewStack::applyGs(CGameState *gs) if(auto * obj = gs->getArmyInstance(army)) obj->putStack(slot, new CStackInstance(type, count)); else - logNetwork->error("[CRITICAL] InsertNewStack: invalid army object %d, possible game state corruption.", army.getNum()); + throw std::runtime_error("InsertNewStack: invalid army object " + std::to_string(army.getNum()) + ", possible game state corruption."); } void RebalanceStacks::applyGs(CGameState * gs) { auto * srcObj = gs->getArmyInstance(srcArmy); if(!srcObj) - logNetwork->error("[CRITICAL] RebalanceStacks: invalid army object %d, possible game state corruption.", srcArmy.getNum()); + throw std::runtime_error("RebalanceStacks: invalid army object " + std::to_string(srcArmy.getNum()) + ", possible game state corruption."); auto * dstObj = gs->getArmyInstance(dstArmy); if(!dstObj) - logNetwork->error("[CRITICAL] RebalanceStacks: invalid army object %d, possible game state corruption.", dstArmy.getNum()); + throw std::runtime_error("RebalanceStacks: invalid army object " + std::to_string(dstArmy.getNum()) + ", possible game state corruption."); StackLocation src(srcObj, srcSlot); StackLocation dst(dstObj, dstSlot);