diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index b1f2cc034..54779b2ab 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -476,13 +476,13 @@ int CGameState::pickUnusedHeroTypeRandomly(PlayerColor owner) // select random hero native to "our" faction if(!factionHeroes.empty()) { - return RandomGeneratorUtil::nextItem(factionHeroes, rand)->getNum(); + return RandomGeneratorUtil::nextItem(factionHeroes, getRandomGenerator())->getNum(); } logGlobal->warnStream() << "Cannot find free hero of appropriate faction for player " << owner << " - trying to get first available..."; if(!otherHeroes.empty()) { - return RandomGeneratorUtil::nextItem(otherHeroes, rand)->getNum(); + return RandomGeneratorUtil::nextItem(otherHeroes, getRandomGenerator())->getNum(); } logGlobal->error("No free allowed heroes!"); @@ -500,29 +500,29 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) switch(obj->ID) { case Obj::RANDOM_ART: - return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(rand, CArtifact::ART_TREASURE | CArtifact::ART_MINOR | CArtifact::ART_MAJOR | CArtifact::ART_RELIC)); + return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_TREASURE | CArtifact::ART_MINOR | CArtifact::ART_MAJOR | CArtifact::ART_RELIC)); case Obj::RANDOM_TREASURE_ART: - return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(rand, CArtifact::ART_TREASURE)); + return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_TREASURE)); case Obj::RANDOM_MINOR_ART: - return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(rand, CArtifact::ART_MINOR)); + return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_MINOR)); case Obj::RANDOM_MAJOR_ART: - return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(rand, CArtifact::ART_MAJOR)); + return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_MAJOR)); case Obj::RANDOM_RELIC_ART: - return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(rand, CArtifact::ART_RELIC)); + return std::make_pair(Obj::ARTIFACT, VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_RELIC)); case Obj::RANDOM_HERO: return std::make_pair(Obj::HERO, pickNextHeroType(obj->tempOwner)); case Obj::RANDOM_MONSTER: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator())); case Obj::RANDOM_MONSTER_L1: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 1)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 1)); case Obj::RANDOM_MONSTER_L2: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 2)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 2)); case Obj::RANDOM_MONSTER_L3: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 3)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 3)); case Obj::RANDOM_MONSTER_L4: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 4)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 4)); case Obj::RANDOM_RESOURCE: - return std::make_pair(Obj::RESOURCE,rand.nextInt(6)); //now it's OH3 style, use %8 for mithril + return std::make_pair(Obj::RESOURCE,getRandomGenerator().nextInt(6)); //now it's OH3 style, use %8 for mithril case Obj::RANDOM_TOWN: { PlayerColor align = PlayerColor((static_cast(obj))->alignment); @@ -542,18 +542,18 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) { do { - f = rand.nextInt(VLC->townh->factions.size() - 1); + f = getRandomGenerator().nextInt(VLC->townh->factions.size() - 1); } while (VLC->townh->factions[f]->town == nullptr); // find playable faction } return std::make_pair(Obj::TOWN,f); } case Obj::RANDOM_MONSTER_L5: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 5)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 5)); case Obj::RANDOM_MONSTER_L6: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 6)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 6)); case Obj::RANDOM_MONSTER_L7: - return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(rand, 7)); + return std::make_pair(Obj::MONSTER, VLC->creh->pickRandomMonster(getRandomGenerator(), 7)); case Obj::RANDOM_DWELLING: case Obj::RANDOM_DWELLING_LVL: case Obj::RANDOM_DWELLING_FACTION: @@ -564,7 +564,7 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) //if castle alignment available if (auto info = dynamic_cast(dwl->info)) { - faction = rand.nextInt(VLC->townh->factions.size() - 1); + faction = getRandomGenerator().nextInt(VLC->townh->factions.size() - 1); if (info->asCastle) { for(auto & elem : map->objects) @@ -593,7 +593,7 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) { if((faction>7) && (info->castles[1]&(1<<(faction-8)))) break; - faction = rand.nextInt(GameConstants::F_NUMBER - 1); + faction = getRandomGenerator().nextInt(GameConstants::F_NUMBER - 1); } } } @@ -605,7 +605,7 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) //if level set to range if (auto info = dynamic_cast(dwl->info)) { - level = rand.nextInt(info->minLevel, info->maxLevel); + level = getRandomGenerator().nextInt(info->minLevel, info->maxLevel); } else // fixed level { @@ -639,7 +639,7 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) if (result.first == Obj::NO_OBJ) { logGlobal->errorStream() << "Error: failed to find dwelling for "<< VLC->townh->factions[faction]->name << " of level " << int(level); - result = std::make_pair(Obj::CREATURE_GENERATOR1, *RandomGeneratorUtil::nextItem(VLC->objtypeh->knownSubObjects(Obj::CREATURE_GENERATOR1), rand)); + result = std::make_pair(Obj::CREATURE_GENERATOR1, *RandomGeneratorUtil::nextItem(VLC->objtypeh->knownSubObjects(Obj::CREATURE_GENERATOR1), getRandomGenerator())); } return result; @@ -743,7 +743,7 @@ BattleInfo * CGameState::setupBattle(int3 tile, const CArmedInstance *armies[2], void CGameState::init(StartInfo * si) { logGlobal->infoStream() << "\tUsing random seed: "<< si->seedToBeUsed; - rand.setSeed(si->seedToBeUsed); + getRandomGenerator().setSeed(si->seedToBeUsed); scenarioOps = CMemorySerializer::deepCopy(*si).release(); initialOpts = CMemorySerializer::deepCopy(*si).release(); si = nullptr; @@ -800,7 +800,7 @@ void CGameState::init(StartInfo * si) logGlobal->debug("\tChecking objectives"); map->checkForObjectives(); //needs to be run when all objects are properly placed - auto seedAfterInit = rand.nextInt(); + auto seedAfterInit = getRandomGenerator().nextInt(); logGlobal->infoStream() << "Seed after init is " << seedAfterInit << " (before was " << scenarioOps->seedToBeUsed << ")"; if(scenarioOps->seedPostInit > 0) { @@ -1026,7 +1026,7 @@ void CGameState::initGrailPosition() if(!allowedPos.empty()) { - map->grailPos = *RandomGeneratorUtil::nextItem(allowedPos, rand); + map->grailPos = *RandomGeneratorUtil::nextItem(allowedPos, getRandomGenerator()); } else { @@ -1042,7 +1042,7 @@ void CGameState::initRandomFactionsForPlayers() { if(elem.second.castle==-1) { - auto randomID = rand.nextInt(map->players[elem.first.getNum()].allowedFactions.size() - 1); + auto randomID = getRandomGenerator().nextInt(map->players[elem.first.getNum()].allowedFactions.size() - 1); auto iter = map->players[elem.first.getNum()].allowedFactions.begin(); std::advance(iter, randomID); @@ -1171,7 +1171,7 @@ void CGameState::placeCampaignHeroes() auto unusedHeroTypeIds = getUnusedAllowedHeroes(); if(!unusedHeroTypeIds.empty()) { - heroTypeId = (*RandomGeneratorUtil::nextItem(unusedHeroTypeIds, rand)).getNum(); + heroTypeId = (*RandomGeneratorUtil::nextItem(unusedHeroTypeIds, getRandomGenerator())).getNum(); } else { @@ -1660,24 +1660,24 @@ void CGameState::initStartingBonus() { //starting bonus if(scenarioOps->playerInfos[elem.first].bonus==PlayerSettings::RANDOM) - scenarioOps->playerInfos[elem.first].bonus = static_cast(rand.nextInt(2)); + scenarioOps->playerInfos[elem.first].bonus = static_cast(getRandomGenerator().nextInt(2)); switch(scenarioOps->playerInfos[elem.first].bonus) { case PlayerSettings::GOLD: - elem.second.resources[Res::GOLD] += rand.nextInt(5, 10) * 100; + elem.second.resources[Res::GOLD] += getRandomGenerator().nextInt(5, 10) * 100; break; case PlayerSettings::RESOURCE: { int res = VLC->townh->factions[scenarioOps->playerInfos[elem.first].castle]->town->primaryRes; if(res == Res::WOOD_AND_ORE) { - int amount = rand.nextInt(5, 10); + int amount = getRandomGenerator().nextInt(5, 10); elem.second.resources[Res::WOOD] += amount; elem.second.resources[Res::ORE] += amount; } else { - elem.second.resources[res] += rand.nextInt(3, 6); + elem.second.resources[res] += getRandomGenerator().nextInt(3, 6); } break; } @@ -1689,7 +1689,7 @@ void CGameState::initStartingBonus() break; } CArtifact *toGive; - toGive = VLC->arth->artifacts[VLC->arth->pickRandomArtifact(rand, CArtifact::ART_TREASURE)]; + toGive = VLC->arth->artifacts[VLC->arth->pickRandomArtifact(getRandomGenerator(), CArtifact::ART_TREASURE)]; CGHeroInstance *hero = elem.second.heroes[0]; giveHeroArtifact(hero, toGive->id); @@ -1742,7 +1742,7 @@ void CGameState::initTowns() } if(vti->name.empty()) { - vti->name = *RandomGeneratorUtil::nextItem(vti->town->names, rand); + vti->name = *RandomGeneratorUtil::nextItem(vti->town->names, getRandomGenerator()); } //init buildings @@ -1754,7 +1754,7 @@ void CGameState::initTowns() vti->builtBuildings.insert(BuildingID::TAVERN); vti->builtBuildings.insert(BuildingID::DWELL_FIRST); - if(rand.nextInt(1) == 1) + if(getRandomGenerator().nextInt(1) == 1) { vti->builtBuildings.insert(BuildingID::DWELL_LVL_2); } @@ -1826,7 +1826,7 @@ void CGameState::initTowns() if (total == 0) // remaining spells have 0 probability break; - auto r = rand.nextInt(total - 1); + auto r = getRandomGenerator().nextInt(total - 1); for(ui32 ps=0; pspossibleSpells.size();ps++) { r -= vti->possibleSpells[ps].toSpell()->getProbability(vti->subID); @@ -3266,6 +3266,10 @@ TeamState::TeamState(TeamState && other): CRandomGenerator & CGameState::getRandomGenerator() { + //if(scenarioOps && scenarioOps->seedPostInit) + //{ + // logGlobal->trace("CGameState::getRandomGenerator used after initialization!"); + //} //logGlobal->traceStream() << "Fetching CGameState::rand with seed " << rand.nextInt(); return rand; }