Преглед изворни кода

Merge pull request #5808 from IvanSavenko/bugfixing

Another batch of fixes for recent bugs & regressions
Ivan Savenko пре 4 месеци
родитељ
комит
d447ef146d

+ 1 - 0
client/NetPacksClient.cpp

@@ -517,6 +517,7 @@ void ApplyFirstClientNetPackVisitor::visitTryMoveHero(TryMoveHero & pack)
 	{
 	{
 		case TryMoveHero::EMBARK:
 		case TryMoveHero::EMBARK:
 			GAME->map().onBeforeHeroEmbark(h, pack.start, pack.end);
 			GAME->map().onBeforeHeroEmbark(h, pack.start, pack.end);
+			GAME->map().waitForOngoingAnimations(); // required - hero must play fade-out animation on his pre-embark position
 			break;
 			break;
 		case TryMoveHero::TELEPORTATION:
 		case TryMoveHero::TELEPORTATION:
 			GAME->map().onBeforeHeroTeleported(h, pack.start, pack.end);
 			GAME->map().onBeforeHeroTeleported(h, pack.start, pack.end);

+ 5 - 2
client/adventureMap/CMinimap.cpp

@@ -49,6 +49,9 @@ ColorRGBA CMinimapInstance::getTileColor(const int3 & pos) const
 		if(player == PlayerColor::NEUTRAL)
 		if(player == PlayerColor::NEUTRAL)
 			return graphics->neutralColor;
 			return graphics->neutralColor;
 
 
+		if (settings["adventure"]["minimapShowHeroes"].Bool() && obj->ID == MapObjectID::HERO)
+			continue;
+
 		if (player.isValidPlayer())
 		if (player.isValidPlayer())
 			return graphics->playerColors[player.getNum()];
 			return graphics->playerColors[player.getNum()];
 	}
 	}
@@ -134,8 +137,8 @@ Point CMinimap::tileToPixels(const int3 &tile) const
 	double stepX = static_cast<double>(pos.w) / mapSizes.x;
 	double stepX = static_cast<double>(pos.w) / mapSizes.x;
 	double stepY = static_cast<double>(pos.h) / mapSizes.y;
 	double stepY = static_cast<double>(pos.h) / mapSizes.y;
 
 
-	int x = static_cast<int>(stepX * tile.x);
-	int y = static_cast<int>(stepY * tile.y);
+	int x = static_cast<int>(stepX * (tile.x + 0.5));
+	int y = static_cast<int>(stepY * (tile.y + 0.5));
 
 
 	return Point(x,y);
 	return Point(x,y);
 }
 }

+ 16 - 4
lib/campaign/CampaignHandler.cpp

@@ -295,7 +295,16 @@ CampaignTravel CampaignHandler::readScenarioTravelFromJson(JsonNode & reader)
 		ret.playerColor = PlayerColor(PlayerColor::decode(reader["playerColor"].String()));
 		ret.playerColor = PlayerColor(PlayerColor::decode(reader["playerColor"].String()));
 
 
 	for(auto & bjson : reader["bonuses"].Vector())
 	for(auto & bjson : reader["bonuses"].Vector())
-		ret.bonusesToChoose.emplace_back(bjson, ret.startOptions);
+	{
+		try {
+			ret.bonusesToChoose.emplace_back(bjson, ret.startOptions);
+		}
+		catch (const std::exception &)
+		{
+			logGlobal->error("Failed to parse campaign bonus: %s", bjson.toCompactString());
+			throw;
+		}
+	}
 
 
 	return ret;
 	return ret;
 }
 }
@@ -356,9 +365,12 @@ void CampaignHandler::readHeaderFromMemory( CampaignHeader & ret, CBinaryReader
 	const auto & mapping = LIBRARY->mapFormat->getMapping(ret.version);
 	const auto & mapping = LIBRARY->mapFormat->getMapping(ret.version);
 
 
 	CampaignRegionID campaignMapId(reader.readUInt8());
 	CampaignRegionID campaignMapId(reader.readUInt8());
-	ret.campaignRegions = *LIBRARY->campaignRegions->getByIndex(mapping.remap(campaignMapId));
-	if(ret.version != CampaignVersion::HotA)
-		ret.numberOfScenarios = ret.campaignRegions.regionsCount();
+	if(ret.version != CampaignVersion::Chr)
+	{
+		ret.campaignRegions = *LIBRARY->campaignRegions->getByIndex(mapping.remap(campaignMapId));
+		if(ret.version != CampaignVersion::HotA)
+			ret.numberOfScenarios = ret.campaignRegions.regionsCount();
+	}
 	ret.name.appendTextID(readLocalizedString(ret, reader, filename, modName, encoding, "name"));
 	ret.name.appendTextID(readLocalizedString(ret, reader, filename, modName, encoding, "name"));
 	ret.description.appendTextID(readLocalizedString(ret, reader, filename, modName, encoding, "description"));
 	ret.description.appendTextID(readLocalizedString(ret, reader, filename, modName, encoding, "description"));
 	ret.author.appendRawString("");
 	ret.author.appendRawString("");

+ 3 - 1
mapeditor/helper.cpp

@@ -85,7 +85,9 @@ void Helper::saveCampaign(std::shared_ptr<CampaignState> campaignState, const QS
 	auto saver = std::make_shared<CZipSaver>(io, filename.toStdString());
 	auto saver = std::make_shared<CZipSaver>(io, filename.toStdString());
 	for(auto & scenario : campaignState->allScenarios())
 	for(auto & scenario : campaignState->allScenarios())
 	{
 	{
-		auto map = campaignState->getMap(scenario, nullptr);
+		EditorCallback cb(nullptr);
+		auto map = campaignState->getMap(scenario, &cb);
+		cb.setMap(map.get());
 		MapController::repairMap(map.get());
 		MapController::repairMap(map.get());
 		CMemoryBuffer serializeBuffer;
 		CMemoryBuffer serializeBuffer;
 		{
 		{

+ 3 - 0
mapeditor/mapcontroller.cpp

@@ -139,6 +139,9 @@ void MapController::repairMap(CMap * map)
 
 
 	for(auto obj : allImpactedObjects)
 	for(auto obj : allImpactedObjects)
 	{
 	{
+		if(obj == nullptr)
+			continue;
+
 		//fix flags
 		//fix flags
 		if(obj->asOwnable() != nullptr && obj->getOwner() == PlayerColor::UNFLAGGABLE)
 		if(obj->asOwnable() != nullptr && obj->getOwner() == PlayerColor::UNFLAGGABLE)
 		{
 		{