diff --git a/lib/gameState/CGameState.cpp b/lib/gameState/CGameState.cpp index 318135637..c9db2f0b7 100644 --- a/lib/gameState/CGameState.cpp +++ b/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 rumorTypes = {RumorState::TYPE_MAP, RumorState::TYPE_SPECIAL, RumorState::TYPE_RAND, RumorState::TYPE_RAND}; - std::vector 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 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 & player) const { if (!map->isInTheMap(pos)) diff --git a/lib/gameState/CGameState.h b/lib/gameState/CGameState.h index 15020b261..669fc8726 100644 --- a/lib/gameState/CGameState.h +++ b/lib/gameState/CGameState.h @@ -108,7 +108,6 @@ public: void calculatePaths(const std::shared_ptr & config) override; int3 guardingCreaturePosition (int3 pos) const override; std::vector 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); diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 09f3fd383..2e4b26e57 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -789,7 +789,7 @@ void CGameHandler::onNewTurn() } if (newWeek) - n.newRumor = gameState()->pickNewRumor(); + n.newRumor = newTurnProcessor->pickNewRumor(); if (newMonth) { diff --git a/server/processors/NewTurnProcessor.cpp b/server/processors/NewTurnProcessor.cpp index 17f187a15..2660483ed 100644 --- a/server/processors/NewTurnProcessor.cpp +++ b/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 @@ -204,3 +206,79 @@ SetAvailableCreatures NewTurnProcessor::generateTownGrowth(const CGTownInstance return sac; } + +RumorState NewTurnProcessor::pickNewRumor() +{ + RumorState newRumor; + + static const std::vector rumorTypes = {RumorState::TYPE_MAP, RumorState::TYPE_SPECIAL, RumorState::TYPE_RAND, RumorState::TYPE_RAND}; + std::vector 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 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; +} diff --git a/server/processors/NewTurnProcessor.h b/server/processors/NewTurnProcessor.h index 63ce782ea..8e0e8eb77 100644 --- a/server/processors/NewTurnProcessor.h +++ b/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);