Bläddra i källkod

Moved rumors generation to NewTurnProcessor

Ivan Savenko 1 år sedan
förälder
incheckning
020f1d1f46

+ 0 - 76
lib/gameState/CGameState.cpp

@@ -1200,82 +1200,6 @@ int3 CGameState::guardingCreaturePosition (int3 pos) const
 	return gs->map->guardingCreaturePositions[pos.z][pos.x][pos.y];
 }
 
-RumorState CGameState::pickNewRumor()
-{
-	RumorState newRumor;
-
-	static const std::vector<RumorState::ERumorType> rumorTypes = {RumorState::TYPE_MAP, RumorState::TYPE_SPECIAL, RumorState::TYPE_RAND, RumorState::TYPE_RAND};
-	std::vector<RumorState::ERumorTypeSpecial> sRumorTypes = {
-		RumorState::RUMOR_OBELISKS, RumorState::RUMOR_ARTIFACTS, RumorState::RUMOR_ARMY, RumorState::RUMOR_INCOME};
-	if(map->grailPos.valid()) // Grail should always be on map, but I had related crash I didn't manage to reproduce
-		sRumorTypes.push_back(RumorState::RUMOR_GRAIL);
-
-	int rumorId = -1;
-	int rumorExtra = -1;
-	auto & rand = getRandomGenerator();
-	newRumor.type = *RandomGeneratorUtil::nextItem(rumorTypes, rand);
-
-	do
-	{
-		switch(newRumor.type)
-		{
-		case RumorState::TYPE_SPECIAL:
-		{
-			SThievesGuildInfo tgi;
-			obtainPlayersStats(tgi, 20);
-			rumorId = *RandomGeneratorUtil::nextItem(sRumorTypes, rand);
-			if(rumorId == RumorState::RUMOR_GRAIL)
-			{
-				rumorExtra = getTile(map->grailPos)->terType->getIndex();
-				break;
-			}
-
-			std::vector<PlayerColor> players = {};
-			switch(rumorId)
-			{
-			case RumorState::RUMOR_OBELISKS:
-				players = tgi.obelisks[0];
-				break;
-
-			case RumorState::RUMOR_ARTIFACTS:
-				players = tgi.artifacts[0];
-				break;
-
-			case RumorState::RUMOR_ARMY:
-				players = tgi.army[0];
-				break;
-
-			case RumorState::RUMOR_INCOME:
-				players = tgi.income[0];
-				break;
-			}
-			rumorExtra = RandomGeneratorUtil::nextItem(players, rand)->getNum();
-
-			break;
-		}
-		case RumorState::TYPE_MAP:
-			// Makes sure that map rumors only used if there enough rumors too choose from
-			if(!map->rumors.empty() && (map->rumors.size() > 1 || !currentRumor.last.count(RumorState::TYPE_MAP)))
-			{
-				rumorId = rand.nextInt((int)map->rumors.size() - 1);
-				break;
-			}
-			else
-				newRumor.type = RumorState::TYPE_RAND;
-			[[fallthrough]];
-
-		case RumorState::TYPE_RAND:
-			auto vector = VLC->generaltexth->findStringsWithPrefix("core.randtvrn");
-			rumorId = rand.nextInt((int)vector.size() - 1);
-
-			break;
-		}
-	}
-	while(!newRumor.update(rumorId, rumorExtra));
-
-	return newRumor;
-}
-
 bool CGameState::isVisible(int3 pos, const std::optional<PlayerColor> & player) const
 {
 	if (!map->isInTheMap(pos))

+ 0 - 1
lib/gameState/CGameState.h

@@ -108,7 +108,6 @@ public:
 	void calculatePaths(const std::shared_ptr<PathfinderConfig> & config) override;
 	int3 guardingCreaturePosition (int3 pos) const override;
 	std::vector<CGObjectInstance*> guardingCreatures (int3 pos) const;
-	RumorState pickNewRumor();
 
 	/// Gets a artifact ID randomly and removes the selected artifact from this handler.
 	ArtifactID pickRandomArtifact(vstd::RNG & rand, int flags);

+ 1 - 1
server/CGameHandler.cpp

@@ -789,7 +789,7 @@ void CGameHandler::onNewTurn()
 	}
 
 	if (newWeek)
-		n.newRumor = gameState()->pickNewRumor();
+		n.newRumor = newTurnProcessor->pickNewRumor();
 
 	if (newMonth)
 	{

+ 78 - 0
server/processors/NewTurnProcessor.cpp

@@ -21,12 +21,14 @@
 #include "../../lib/entities/building/CBuilding.h"
 #include "../../lib/entities/faction/CTownHandler.h"
 #include "../../lib/gameState/CGameState.h"
+#include "../../lib/gameState/SThievesGuildInfo.h"
 #include "../../lib/mapObjects/CGHeroInstance.h"
 #include "../../lib/mapObjects/CGTownInstance.h"
 #include "../../lib/mapObjects/IOwnableObject.h"
 #include "../../lib/mapping/CMap.h"
 #include "../../lib/networkPacks/PacksForClient.h"
 #include "../../lib/pathfinder/TurnInfo.h"
+#include "../../lib/texts/CGeneralTextHandler.h"
 
 #include <vstd/RNG.h>
 
@@ -204,3 +206,79 @@ SetAvailableCreatures NewTurnProcessor::generateTownGrowth(const CGTownInstance
 
 	return sac;
 }
+
+RumorState NewTurnProcessor::pickNewRumor()
+{
+	RumorState newRumor;
+
+	static const std::vector<RumorState::ERumorType> rumorTypes = {RumorState::TYPE_MAP, RumorState::TYPE_SPECIAL, RumorState::TYPE_RAND, RumorState::TYPE_RAND};
+	std::vector<RumorState::ERumorTypeSpecial> sRumorTypes = {
+															  RumorState::RUMOR_OBELISKS, RumorState::RUMOR_ARTIFACTS, RumorState::RUMOR_ARMY, RumorState::RUMOR_INCOME};
+	if(gameHandler->gameState()->map->grailPos.valid()) // Grail should always be on map, but I had related crash I didn't manage to reproduce
+		sRumorTypes.push_back(RumorState::RUMOR_GRAIL);
+
+	int rumorId = -1;
+	int rumorExtra = -1;
+	auto & rand = gameHandler->getRandomGenerator();
+	newRumor.type = *RandomGeneratorUtil::nextItem(rumorTypes, rand);
+
+	do
+	{
+		switch(newRumor.type)
+		{
+			case RumorState::TYPE_SPECIAL:
+			{
+				SThievesGuildInfo tgi;
+				gameHandler->gameState()->obtainPlayersStats(tgi, 20);
+				rumorId = *RandomGeneratorUtil::nextItem(sRumorTypes, rand);
+				if(rumorId == RumorState::RUMOR_GRAIL)
+				{
+					rumorExtra = gameHandler->gameState()->getTile(gameHandler->gameState()->map->grailPos)->terType->getIndex();
+					break;
+				}
+
+				std::vector<PlayerColor> players = {};
+				switch(rumorId)
+				{
+					case RumorState::RUMOR_OBELISKS:
+						players = tgi.obelisks[0];
+						break;
+
+					case RumorState::RUMOR_ARTIFACTS:
+						players = tgi.artifacts[0];
+						break;
+
+					case RumorState::RUMOR_ARMY:
+						players = tgi.army[0];
+						break;
+
+					case RumorState::RUMOR_INCOME:
+						players = tgi.income[0];
+						break;
+				}
+				rumorExtra = RandomGeneratorUtil::nextItem(players, rand)->getNum();
+
+				break;
+			}
+			case RumorState::TYPE_MAP:
+				// Makes sure that map rumors only used if there enough rumors too choose from
+				if(!gameHandler->gameState()->map->rumors.empty() && (gameHandler->gameState()->map->rumors.size() > 1 || !gameHandler->gameState()->currentRumor.last.count(RumorState::TYPE_MAP)))
+				{
+					rumorId = rand.nextInt(gameHandler->gameState()->map->rumors.size() - 1);
+					break;
+				}
+				else
+					newRumor.type = RumorState::TYPE_RAND;
+				[[fallthrough]];
+
+			case RumorState::TYPE_RAND:
+				auto vector = VLC->generaltexth->findStringsWithPrefix("core.randtvrn");
+				rumorId = rand.nextInt((int)vector.size() - 1);
+
+				break;
+		}
+	}
+	while(!newRumor.update(rumorId, rumorExtra));
+
+	return newRumor;
+}

+ 2 - 0
server/processors/NewTurnProcessor.h

@@ -11,6 +11,7 @@
 
 #include "../../lib/constants/EntityIdentifiers.h"
 #include "../../lib/constants/Enumerations.h"
+#include "../../lib/gameState/RumorState.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 class CGTownInstance;
@@ -28,6 +29,7 @@ public:
 
 	ResourceSet generatePlayerIncome(PlayerColor playerID, bool newWeek);
 	SetAvailableCreatures generateTownGrowth(const CGTownInstance * town, EWeekType weekType, CreatureID creatureWeek, bool firstDay);
+	RumorState pickNewRumor();
 
 	void onPlayerTurnStarted(PlayerColor color);
 	void onPlayerTurnEnded(PlayerColor color);