mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-29 21:56:54 +02:00
Attempt to track crashes with unclear cause
This commit is contained in:
parent
c786354af3
commit
c92a5bbbab
@ -334,8 +334,12 @@ CShowableAnim::CShowableAnim(int x, int y, const AnimationPath & name, ui8 Flags
|
|||||||
anim->loadGroup(group);
|
anim->loadGroup(group);
|
||||||
last = anim->size(group);
|
last = anim->size(group);
|
||||||
|
|
||||||
pos.w = anim->getImage(0, group)->width();
|
auto image = anim->getImage(0, group);
|
||||||
pos.h = anim->getImage(0, group)->height();
|
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.x+= x;
|
||||||
pos.y+= y;
|
pos.y+= y;
|
||||||
|
|
||||||
|
@ -144,33 +144,33 @@ DLL_LINKAGE std::string MetaString::toString() const
|
|||||||
switch(elem)
|
switch(elem)
|
||||||
{
|
{
|
||||||
case EMessage::APPEND_RAW_STRING:
|
case EMessage::APPEND_RAW_STRING:
|
||||||
dst += exactStrings[exSt++];
|
dst += exactStrings.at(exSt++);
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_LOCAL_STRING:
|
case EMessage::APPEND_LOCAL_STRING:
|
||||||
dst += getLocalString(localStrings[loSt++]);
|
dst += getLocalString(localStrings.at(loSt++));
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_TEXTID_STRING:
|
case EMessage::APPEND_TEXTID_STRING:
|
||||||
dst += VLC->generaltexth->translate(stringsTextID[textID++]);
|
dst += VLC->generaltexth->translate(stringsTextID.at(textID++));
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_NUMBER:
|
case EMessage::APPEND_NUMBER:
|
||||||
dst += std::to_string(numbers[nums++]);
|
dst += std::to_string(numbers.at(nums++));
|
||||||
break;
|
break;
|
||||||
case EMessage::REPLACE_RAW_STRING:
|
case EMessage::REPLACE_RAW_STRING:
|
||||||
boost::replace_first(dst, "%s", exactStrings[exSt++]);
|
boost::replace_first(dst, "%s", exactStrings.at(exSt++));
|
||||||
break;
|
break;
|
||||||
case EMessage::REPLACE_LOCAL_STRING:
|
case EMessage::REPLACE_LOCAL_STRING:
|
||||||
boost::replace_first(dst, "%s", getLocalString(localStrings[loSt++]));
|
boost::replace_first(dst, "%s", getLocalString(localStrings.at(loSt++)));
|
||||||
break;
|
break;
|
||||||
case EMessage::REPLACE_TEXTID_STRING:
|
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;
|
break;
|
||||||
case EMessage::REPLACE_NUMBER:
|
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;
|
break;
|
||||||
case EMessage::REPLACE_POSITIVE_NUMBER:
|
case EMessage::REPLACE_POSITIVE_NUMBER:
|
||||||
if (dst.find("%+d") != std::string::npos)
|
if (dst.find("%+d") != std::string::npos)
|
||||||
{
|
{
|
||||||
int64_t value = numbers[nums];
|
int64_t value = numbers.at(nums);
|
||||||
if (value > 0)
|
if (value > 0)
|
||||||
boost::replace_first(dst, "%+d", '+' + std::to_string(value));
|
boost::replace_first(dst, "%+d", '+' + std::to_string(value));
|
||||||
else
|
else
|
||||||
@ -179,7 +179,7 @@ DLL_LINKAGE std::string MetaString::toString() const
|
|||||||
nums++;
|
nums++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
boost::replace_first(dst, "%d", std::to_string(numbers[nums++]));
|
boost::replace_first(dst, "%d", std::to_string(numbers.at(nums++)));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
logGlobal->error("MetaString processing error! Received message of type %d", static_cast<int>(elem));
|
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;
|
std::string lista;
|
||||||
for(int i = 0; i < message.size(); ++i)
|
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)
|
if(exSt == exactStrings.size() - 1)
|
||||||
lista += VLC->generaltexth->allTexts[141]; //" and "
|
lista += VLC->generaltexth->allTexts[141]; //" and "
|
||||||
else
|
else
|
||||||
lista += ", ";
|
lista += ", ";
|
||||||
}
|
}
|
||||||
switch(message[i])
|
switch(message.at(i))
|
||||||
{
|
{
|
||||||
case EMessage::APPEND_RAW_STRING:
|
case EMessage::APPEND_RAW_STRING:
|
||||||
lista += exactStrings[exSt++];
|
lista += exactStrings.at(exSt++);
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_LOCAL_STRING:
|
case EMessage::APPEND_LOCAL_STRING:
|
||||||
lista += getLocalString(localStrings[loSt++]);
|
lista += getLocalString(localStrings.at(loSt++));
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_TEXTID_STRING:
|
case EMessage::APPEND_TEXTID_STRING:
|
||||||
lista += VLC->generaltexth->translate(stringsTextID[textID++]);
|
lista += VLC->generaltexth->translate(stringsTextID.at(textID++));
|
||||||
break;
|
break;
|
||||||
case EMessage::APPEND_NUMBER:
|
case EMessage::APPEND_NUMBER:
|
||||||
lista += std::to_string(numbers[nums++]);
|
lista += std::to_string(numbers.at(nums++));
|
||||||
break;
|
break;
|
||||||
case EMessage::REPLACE_RAW_STRING:
|
case EMessage::REPLACE_RAW_STRING:
|
||||||
lista.replace(lista.find("%s"), 2, exactStrings[exSt++]);
|
lista.replace(lista.find("%s"), 2, exactStrings.at(exSt++));
|
||||||
break;
|
break;
|
||||||
case EMessage::REPLACE_LOCAL_STRING:
|
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;
|
break;
|
||||||
case EMessage::REPLACE_TEXTID_STRING:
|
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;
|
break;
|
||||||
case EMessage::REPLACE_NUMBER:
|
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;
|
break;
|
||||||
default:
|
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;
|
return lista;
|
||||||
|
@ -1579,7 +1579,7 @@ void ChangeStackCount::applyGs(CGameState * gs)
|
|||||||
{
|
{
|
||||||
auto * srcObj = gs->getArmyInstance(army);
|
auto * srcObj = gs->getArmyInstance(army);
|
||||||
if(!srcObj)
|
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)
|
if(absoluteValue)
|
||||||
srcObj->setStackCount(slot, count);
|
srcObj->setStackCount(slot, count);
|
||||||
@ -1591,7 +1591,7 @@ void SetStackType::applyGs(CGameState * gs)
|
|||||||
{
|
{
|
||||||
auto * srcObj = gs->getArmyInstance(army);
|
auto * srcObj = gs->getArmyInstance(army);
|
||||||
if(!srcObj)
|
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);
|
srcObj->setStackType(slot, type);
|
||||||
}
|
}
|
||||||
@ -1600,7 +1600,7 @@ void EraseStack::applyGs(CGameState * gs)
|
|||||||
{
|
{
|
||||||
auto * srcObj = gs->getArmyInstance(army);
|
auto * srcObj = gs->getArmyInstance(army);
|
||||||
if(!srcObj)
|
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);
|
srcObj->eraseStack(slot);
|
||||||
}
|
}
|
||||||
@ -1609,11 +1609,11 @@ void SwapStacks::applyGs(CGameState * gs)
|
|||||||
{
|
{
|
||||||
auto * srcObj = gs->getArmyInstance(srcArmy);
|
auto * srcObj = gs->getArmyInstance(srcArmy);
|
||||||
if(!srcObj)
|
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);
|
auto * dstObj = gs->getArmyInstance(dstArmy);
|
||||||
if(!dstObj)
|
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 * s1 = srcObj->detachStack(srcSlot);
|
||||||
CStackInstance * s2 = dstObj->detachStack(dstSlot);
|
CStackInstance * s2 = dstObj->detachStack(dstSlot);
|
||||||
@ -1627,18 +1627,18 @@ void InsertNewStack::applyGs(CGameState *gs)
|
|||||||
if(auto * obj = gs->getArmyInstance(army))
|
if(auto * obj = gs->getArmyInstance(army))
|
||||||
obj->putStack(slot, new CStackInstance(type, count));
|
obj->putStack(slot, new CStackInstance(type, count));
|
||||||
else
|
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)
|
void RebalanceStacks::applyGs(CGameState * gs)
|
||||||
{
|
{
|
||||||
auto * srcObj = gs->getArmyInstance(srcArmy);
|
auto * srcObj = gs->getArmyInstance(srcArmy);
|
||||||
if(!srcObj)
|
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);
|
auto * dstObj = gs->getArmyInstance(dstArmy);
|
||||||
if(!dstObj)
|
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 src(srcObj, srcSlot);
|
||||||
StackLocation dst(dstObj, dstSlot);
|
StackLocation dst(dstObj, dstSlot);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user