mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Attempt to track crashes with unclear cause
This commit is contained in:
		| @@ -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; | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user