diff --git a/lib/gameState/CGameStateCampaign.cpp b/lib/gameState/CGameStateCampaign.cpp index 939a8d4d5..a164c488a 100644 --- a/lib/gameState/CGameStateCampaign.cpp +++ b/lib/gameState/CGameStateCampaign.cpp @@ -394,6 +394,9 @@ void CGameStateCampaign::transferMissingArtifacts(const CampaignTravel & travelO for(auto hero : gameState->map->getObjects()) { + if (!hero->getOwner().isValidPlayer()) + continue; // prisons + if (gameState->getPlayerState(hero->getOwner())->isHuman()) { receiver = hero; diff --git a/lib/gameState/CGameStateCampaign.h b/lib/gameState/CGameStateCampaign.h index 568ffb0db..2b53df6e2 100644 --- a/lib/gameState/CGameStateCampaign.h +++ b/lib/gameState/CGameStateCampaign.h @@ -68,7 +68,20 @@ public: template void serialize(Handler &h) { - // no-op, but needed to auto-create this class if gamestate had it during serialization + if (h.saving || h.hasFeature(Handler::Version::NO_RAW_POINTERS_IN_SERIALIZER)) + { + // no-op, but needed to auto-create this class if gamestate had it during serialization + } + else + { + bool dummyA = false; + uint32_t dummyB = 0; + uint16_t dummyC = 0; + + h & dummyA; + h & dummyB; + h & dummyC; + } } }; diff --git a/lib/mapping/MapFormatH3M.cpp b/lib/mapping/MapFormatH3M.cpp index 79379db6a..d497665b8 100644 --- a/lib/mapping/MapFormatH3M.cpp +++ b/lib/mapping/MapFormatH3M.cpp @@ -2040,7 +2040,11 @@ std::shared_ptr CMapLoaderH3M::readHero(const int3 & mapPositi //If hero of this type has been predefined, use that as a base. //Instance data will overwrite the predefined values where appropriate. - auto object = map->tryTakeFromHeroPool(heroType); + std::shared_ptr object; + + if (heroType.hasValue()) + object = map->tryTakeFromHeroPool(heroType); + if (!object) { object = std::make_shared(map->cb);