فهرست منبع

Moved roll for week type to NewTurnProcessor

Ivan Savenko 1 سال پیش
والد
کامیت
c09c414f5a
3فایلهای تغییر یافته به همراه59 افزوده شده و 56 حذف شده
  1. 3 56
      server/CGameHandler.cpp
  2. 55 0
      server/processors/NewTurnProcessor.cpp
  3. 1 0
      server/processors/NewTurnProcessor.h

+ 3 - 56
server/CGameHandler.cpp

@@ -651,62 +651,9 @@ void CGameHandler::onNewTurn()
 
 	if (newWeek && !firstTurn)
 	{
-		n.specialWeek = EWeekType::NORMAL;
-		bool deityOfFireBuilt = false;
-		for (const CGTownInstance *t : gs->map->towns)
-		{
-			if (t->hasBuilt(BuildingID::GRAIL, ETownType::INFERNO))
-			{
-				deityOfFireBuilt = true;
-				break;
-			}
-		}
-
-		if (deityOfFireBuilt)
-		{
-			n.specialWeek = EWeekType::DEITYOFFIRE;
-			n.creatureid = CreatureID::IMP;
-		}
-		else if(VLC->settings()->getBoolean(EGameSettings::CREATURES_ALLOW_RANDOM_SPECIAL_WEEKS))
-		{
-			int monthType = getRandomGenerator().nextInt(99);
-			if (newMonth) //new month
-			{
-				if (monthType < 40) //double growth
-				{
-					n.specialWeek = EWeekType::DOUBLE_GROWTH;
-					if (VLC->settings()->getBoolean(EGameSettings::CREATURES_ALLOW_ALL_FOR_DOUBLE_MONTH))
-					{
-						n.creatureid = VLC->creh->pickRandomMonster(getRandomGenerator());
-					}
-					else if (VLC->creh->doubledCreatures.size())
-					{
-						n.creatureid = *RandomGeneratorUtil::nextItem(VLC->creh->doubledCreatures, getRandomGenerator());
-					}
-					else
-					{
-						complain("Cannot find creature that can be spawned!");
-						n.specialWeek = EWeekType::NORMAL;
-					}
-				}
-				else if (monthType < 50)
-					n.specialWeek = EWeekType::PLAGUE;
-			}
-			else //it's a week, but not full month
-			{
-				if (monthType < 25)
-				{
-					n.specialWeek = EWeekType::BONUS_GROWTH; //+5
-					std::pair<int, CreatureID> newMonster(54, CreatureID());
-					do
-					{
-						newMonster.second = VLC->creh->pickRandomMonster(getRandomGenerator());
-					} while (VLC->creh->objects[newMonster.second] &&
-						(*VLC->townh)[VLC->creatures()->getById(newMonster.second)->getFaction()]->town == nullptr); // find first non neutral creature
-					n.creatureid = newMonster.second;
-				}
-			}
-		}
+		auto [specialWeek, creatureID] = newTurnProcessor->pickWeekType(newMonth);
+		n.specialWeek = specialWeek;
+		n.creatureid = creatureID;
 	}
 
 	for (auto & elem : gs->players)

+ 55 - 0
server/processors/NewTurnProcessor.cpp

@@ -282,3 +282,58 @@ RumorState NewTurnProcessor::pickNewRumor()
 
 	return newRumor;
 }
+
+std::tuple<EWeekType, CreatureID> NewTurnProcessor::pickWeekType(bool newMonth)
+{
+	for (const CGTownInstance *t : gameHandler->gameState()->map->towns)
+	{
+		if (t->hasBuilt(BuildingID::GRAIL, ETownType::INFERNO))
+			return { EWeekType::DEITYOFFIRE, CreatureID::IMP };
+	}
+
+	if(!VLC->settings()->getBoolean(EGameSettings::CREATURES_ALLOW_RANDOM_SPECIAL_WEEKS))
+		return { EWeekType::NORMAL, CreatureID::NONE};
+
+	int monthType = gameHandler->getRandomGenerator().nextInt(99);
+	if (newMonth) //new month
+	{
+		if (monthType < 40) //double growth
+		{
+			if (VLC->settings()->getBoolean(EGameSettings::CREATURES_ALLOW_ALL_FOR_DOUBLE_MONTH))
+			{
+				CreatureID creatureID = VLC->creh->pickRandomMonster(gameHandler->getRandomGenerator());
+				return { EWeekType::DOUBLE_GROWTH, creatureID};
+			}
+			else if (VLC->creh->doubledCreatures.size())
+			{
+				CreatureID creatureID = *RandomGeneratorUtil::nextItem(VLC->creh->doubledCreatures, gameHandler->getRandomGenerator());
+				return { EWeekType::DOUBLE_GROWTH, creatureID};
+			}
+			else
+			{
+				gameHandler->complain("Cannot find creature that can be spawned!");
+				return { EWeekType::NORMAL, CreatureID::NONE};
+			}
+		}
+
+		if (monthType < 50)
+			return { EWeekType::PLAGUE, CreatureID::NONE};
+
+		return { EWeekType::NORMAL, CreatureID::NONE};
+	}
+	else //it's a week, but not full month
+	{
+		if (monthType < 25)
+		{
+			std::pair<int, CreatureID> newMonster(54, CreatureID());
+			do
+			{
+				newMonster.second = VLC->creh->pickRandomMonster(gameHandler->getRandomGenerator());
+			} while (VLC->creh->objects[newMonster.second] &&
+					(*VLC->townh)[VLC->creatures()->getById(newMonster.second)->getFaction()]->town == nullptr); // find first non neutral creature
+
+			return { EWeekType::BONUS_GROWTH, newMonster.second};
+		}
+		return { EWeekType::NORMAL, CreatureID::NONE};
+	}
+}

+ 1 - 0
server/processors/NewTurnProcessor.h

@@ -30,6 +30,7 @@ public:
 	ResourceSet generatePlayerIncome(PlayerColor playerID, bool newWeek);
 	SetAvailableCreatures generateTownGrowth(const CGTownInstance * town, EWeekType weekType, CreatureID creatureWeek, bool firstDay);
 	RumorState pickNewRumor();
+	std::tuple<EWeekType, CreatureID> pickWeekType(bool newMonth);
 
 	void onPlayerTurnStarted(PlayerColor color);
 	void onPlayerTurnEnded(PlayerColor color);