浏览代码

Merge pull request #3303 from IvanSavenko/artifact_randomization_fix

Remove allowed artifacts list from arthandler
Ivan Savenko 1 年之前
父节点
当前提交
afff10aab0
共有 4 个文件被更改,包括 11 次插入22 次删除
  1. 1 13
      lib/CArtHandler.cpp
  2. 1 5
      lib/CArtHandler.h
  3. 3 2
      lib/JsonRandom.cpp
  4. 6 2
      lib/gameState/CGameState.cpp

+ 1 - 13
lib/CArtHandler.cpp

@@ -625,7 +625,7 @@ void CArtHandler::makeItCommanderArt(CArtifact * a, bool onlyCommander)
 		a->possibleSlots[ArtBearer::COMMANDER].push_back(ArtifactPosition(slot));
 }
 
-bool CArtHandler::legalArtifact(const ArtifactID & id)
+bool CArtHandler::legalArtifact(const ArtifactID & id) const
 {
 	auto art = id.toArtifact();
 	//assert ( (!art->constituents) || art->constituents->size() ); //artifacts is not combined or has some components
@@ -648,18 +648,6 @@ bool CArtHandler::legalArtifact(const ArtifactID & id)
 	return false;
 }
 
-void CArtHandler::initAllowedArtifactsList(const std::set<ArtifactID> & allowed)
-{
-	allowedArtifacts.clear();
-
-	for (ArtifactID i : allowed)
-	{
-		if (legalArtifact(ArtifactID(i)))
-			allowedArtifacts.push_back(i.toArtifact());
-			//keep im mind that artifact can be worn by more than one type of bearer
-	}
-}
-
 std::set<ArtifactID> CArtHandler::getDefaultAllowed() const
 {
 	std::set<ArtifactID> allowedArtifacts;

+ 1 - 5
lib/CArtHandler.h

@@ -141,15 +141,11 @@ public:
 class DLL_LINKAGE CArtHandler : public CHandlerBase<ArtifactID, Artifact, CArtifact, ArtifactService>
 {
 public:
-	/// List of artifacts allowed on the map
-	std::vector<const CArtifact *> allowedArtifacts;
-
 	void addBonuses(CArtifact *art, const JsonNode &bonusList);
 
 	static CArtifact::EartClass stringToClass(const std::string & className); //TODO: rework EartClass to make this a constructor
 
-	bool legalArtifact(const ArtifactID & id);
-	void initAllowedArtifactsList(const std::set<ArtifactID> & allowed);
+	bool legalArtifact(const ArtifactID & id) const;
 	static void makeItCreatureArt(CArtifact * a, bool onlyCreature = true);
 	static void makeItCommanderArt(CArtifact * a, bool onlyCommander = true);
 

+ 3 - 2
lib/JsonRandom.cpp

@@ -384,8 +384,9 @@ namespace JsonRandom
 	ArtifactID loadArtifact(const JsonNode & value, CRandomGenerator & rng, const Variables & variables)
 	{
 		std::set<ArtifactID> allowedArts;
-		for (auto const * artifact : VLC->arth->allowedArtifacts)
-			allowedArts.insert(artifact->getId());
+		for(const auto & artifact : VLC->arth->objects)
+			if (IObjectInterface::cb->isAllowed(artifact->getId()) && VLC->arth->legalArtifact(artifact->getId()))
+				allowedArts.insert(artifact->getId());
 
 		std::set<ArtifactID> potentialPicks = filterKeys(value, allowedArts, variables);
 

+ 6 - 2
lib/gameState/CGameState.cpp

@@ -195,7 +195,6 @@ void CGameState::init(const IMapService * mapService, StartInfo * si, Load::Prog
 		logGlobal->error("Wrong mode: %d", static_cast<int>(scenarioOps->mode));
 		return;
 	}
-	VLC->arth->initAllowedArtifactsList(map->allowedArtifact);
 	logGlobal->info("Map loaded!");
 
 	checkMapChecksum();
@@ -1947,8 +1946,13 @@ ArtifactID CGameState::pickRandomArtifact(CRandomGenerator & rand, int flags, st
 	std::set<ArtifactID> potentialPicks;
 
 	// Select artifacts that satisfy provided criterias
-	for (auto const * artifact : VLC->arth->allowedArtifacts)
+	for (auto const & artifactID : map->allowedArtifact)
 	{
+		if (!VLC->arth->legalArtifact(artifactID))
+			continue;
+
+		auto const * artifact = artifactID.toArtifact();
+
 		assert(artifact->aClass != CArtifact::ART_SPECIAL); // should be filtered out when allowedArtifacts is initialized
 
 		if ((flags & CArtifact::ART_TREASURE) == 0 && artifact->aClass == CArtifact::ART_TREASURE)