Przeglądaj źródła

Attempt to track crashes with unclear cause

Ivan Savenko 1 rok temu
rodzic
commit
c92a5bbbab
3 zmienionych plików z 35 dodań i 31 usunięć
  1. 6 2
      client/widgets/Images.cpp
  2. 21 21
      lib/MetaString.cpp
  3. 8 8
      lib/networkPacks/NetPacksLib.cpp

+ 6 - 2
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;
 

+ 21 - 21
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<int>(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;

+ 8 - 8
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);