1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

GameRandomizer is now in lib, add implementation

This commit is contained in:
Ivan Savenko
2025-05-18 10:52:48 +03:00
parent 54a46b77a9
commit cc274c4d34
31 changed files with 455 additions and 463 deletions

View File

@@ -18,7 +18,6 @@
#include "processors/HeroPoolProcessor.h"
#include "processors/NewTurnProcessor.h"
#include "processors/PlayerMessageProcessor.h"
#include "processors/RandomizationProcessor.h"
#include "processors/TurnOrderProcessor.h"
#include "queries/QueriesProcessor.h"
#include "queries/MapQueries.h"
@@ -31,6 +30,7 @@
#include "../lib/CPlayerState.h"
#include "../lib/CRandomGenerator.h"
#include "../lib/CSoundBase.h"
#include "../lib/CSkillHandler.h"
#include "../lib/CThreadHelper.h"
#include "../lib/GameConstants.h"
#include "../lib/UnlockGuard.h"
@@ -43,6 +43,7 @@
#include "../lib/int3.h"
#include "../lib/battle/BattleInfo.h"
#include "../lib/callback/GameRandomizer.h"
#include "../lib/entities/artifact/ArtifactUtils.h"
#include "../lib/entities/artifact/CArtifact.h"
@@ -157,7 +158,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
// give primary skill
logGlobal->trace("%s got level %d", hero->getNameTranslated(), hero->level);
auto primarySkill = hero->nextPrimarySkill(getRandomGenerator());
auto primarySkill = randomizer->rollPrimarySkillForLevelup(hero);
SetPrimSkill sps;
sps.id = hero->id;
@@ -170,7 +171,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
hlu.player = hero->tempOwner;
hlu.heroId = hero->id;
hlu.primskill = primarySkill;
hlu.skills = hero->getLevelUpProposedSecondarySkills(heroPool->getHeroSkillsRandomGenerator(hero->getHeroTypeID()));
hlu.skills = hero->getLevelupSkillCandidates(*randomizer);
if (hlu.skills.size() == 0)
{
@@ -511,7 +512,7 @@ CGameHandler::CGameHandler(CVCMIServer * lobby)
, turnOrder(std::make_unique<TurnOrderProcessor>(this))
, queries(std::make_unique<QueriesProcessor>())
, playerMessages(std::make_unique<PlayerMessageProcessor>(this))
, randomizationProcessor(std::make_unique<RandomizationProcessor>())
, randomizer(std::make_unique<GameRandomizer>(*this))
, complainNoCreatures("No creatures to split")
, complainNotEnoughCreatures("Cannot split that stack, not enough creatures!")
, complainInvalidSlot("Invalid slot accessed!")
@@ -540,25 +541,19 @@ void CGameHandler::init(StartInfo *si, Load::ProgressAccumulator & progressTrack
{
int requestedSeed = settings["server"]["seed"].Integer();
if (requestedSeed != 0)
randomizationProcessor->setSeed(requestedSeed);
logGlobal->info("Using random seed: %d", randomizationProcessor->getDefault().nextInt());
randomizer->setSeed(requestedSeed);
logGlobal->info("Using random seed: %d", randomizer->getDefault().nextInt());
CMapService mapService;
gs = std::make_shared<CGameState>(this);
gs->preInit(LIBRARY);
logGlobal->info("Gamestate created!");
gs->init(&mapService, si, *randomizationProcessor, progressTracking);
gs->init(&mapService, si, *randomizer, progressTracking);
logGlobal->info("Gamestate initialized!");
for (const auto & elem : gameState().players)
turnOrder->addPlayer(elem.first);
for (const auto & elem : gameState().getMap().getObjects<CGHeroInstance>())
heroPool->getHeroSkillsRandomGenerator(elem->getHeroTypeID()); // init RMG seed
for (const auto & elem : gameState().getMap().getHeroesInPool())
heroPool->getHeroSkillsRandomGenerator(elem); // init RMG seed
reinitScripting();
}
@@ -688,7 +683,7 @@ void CGameHandler::onNewTurn()
{
SetAvailableArtifacts saa;
saa.id = ObjectInstanceID::NONE;
saa.arts = randomizationProcessor->rollMarketArtifactSet();
saa.arts = randomizer->rollMarketArtifactSet();
sendAndApply(saa);
}
@@ -701,10 +696,8 @@ void CGameHandler::onNewTurn()
for (auto & elem : gameState().getMap().getObjects())
{
if (elem)
elem->newTurn(*this, *randomizationProcessor);
elem->newTurn(*this, *randomizer);
}
synchronizeArtifactHandlerLists(); //new day events may have changed them. TODO better of managing that
}
void CGameHandler::start(bool resume)
@@ -4061,13 +4054,6 @@ void CGameHandler::spawnWanderingMonsters(CreatureID creatureID)
}
}
void CGameHandler::synchronizeArtifactHandlerLists()
{
UpdateArtHandlerLists uahl;
uahl.allocatedArtifacts = gameState().allocatedArtifacts;
sendAndApply(uahl);
}
bool CGameHandler::isBlockedByQueries(const CPackForServer *pack, PlayerColor player)
{
if (dynamic_cast<const PlayerMessage *>(pack) != nullptr)
@@ -4235,7 +4221,7 @@ void CGameHandler::showInfoDialog(InfoWindow * iw)
vstd::RNG & CGameHandler::getRandomGenerator()
{
return randomizationProcessor->getDefault();
return randomizer->getDefault();
}
#if SCRIPTING_ENABLED
@@ -4264,7 +4250,7 @@ std::shared_ptr<CGObjectInstance> CGameHandler::createNewObject(const int3 & vis
auto handler = LIBRARY->objtypeh->getHandlerFor(objectID, subID);
auto o = handler->create(gameState().cb, nullptr);
handler->configureObject(o.get(), *randomizationProcessor);
handler->configureObject(o.get(), *randomizer);
assert(o->ID == objectID);
gameState().getMap().generateUniqueInstanceName(o.get());
@@ -4315,7 +4301,7 @@ void CGameHandler::createHole(const int3 & visitablePosition, PlayerColor initia
void CGameHandler::newObject(std::shared_ptr<CGObjectInstance> object, PlayerColor initiator)
{
object->initObj(*randomizationProcessor);
object->initObj(*randomizer);
NewObject no;
no.newObject = object;