瀏覽代碼

Add workaround for visiting Altar of Sacrifice on 1.4 saves

Ivan Savenko 1 年之前
父節點
當前提交
1bc7c29111
共有 2 個文件被更改,包括 12 次插入0 次删除
  1. 10 0
      client/CPlayerInterface.cpp
  2. 2 0
      lib/serializer/ESerializationVersion.h

+ 10 - 0
client/CPlayerInterface.cpp

@@ -87,6 +87,7 @@
 
 #include "../lib/gameState/CGameState.h"
 
+#include "../lib/mapObjects/CGMarket.h"
 #include "../lib/mapObjects/CGTownInstance.h"
 #include "../lib/mapObjects/MiscObjects.h"
 #include "../lib/mapObjects/ObjectTemplate.h"
@@ -1659,6 +1660,15 @@ void CPlayerInterface::showMarketWindow(const IMarket *market, const CGHeroInsta
 		cb->selectionMade(0, queryID);
 	};
 
+	if (market->allowsTrade(EMarketMode::ARTIFACT_EXP) && dynamic_cast<const CGArtifactsAltar*>(market) == nullptr)
+	{
+		// compatibility check, safe to remove for 1.6
+		// 1.4 saves loaded in 1.5 will not be able to visit Altar of Sacrifice due to Altar now requiring different map object class
+		static_assert(ESerializationVersion::RELEASE_143 < ESerializationVersion::CURRENT, "Please remove this compatibility check once it no longer needed");
+		onWindowClosed();
+		return;
+	}
+
 	if(market->allowsTrade(EMarketMode::ARTIFACT_EXP) && visitor->getAlignment() != EAlignment::EVIL)
 		GH.windows().createAndPushWindow<CMarketWindow>(market, visitor, onWindowClosed, EMarketMode::ARTIFACT_EXP);
 	else if(market->allowsTrade(EMarketMode::CREATURE_EXP) && visitor->getAlignment() != EAlignment::GOOD)

+ 2 - 0
lib/serializer/ESerializationVersion.h

@@ -42,5 +42,7 @@ enum class ESerializationVersion : int32_t
 	TURN_TIMERS_STATE, // 839 current state of turn timers is serialized
 	ARTIFACT_COSTUMES, // 840 swappable artifacts set added
 
+	RELEASE_150 = ARTIFACT_COSTUMES, // for convenience
+
 	CURRENT = ARTIFACT_COSTUMES
 };