Skip to content

Commit 244e436

Browse files
committed
use custom std::minstd_rand based RNG for AI
1 parent 7f20e8d commit 244e436

File tree

4 files changed

+49
-16
lines changed

4 files changed

+49
-16
lines changed

libs/s25main/ai/aijh/AIConstruction.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
#include "addons/const_addons.h"
1111
#include "ai/AIInterface.h"
1212
#include "ai/aijh/AIPlayerJH.h"
13+
#include "ai/random.h"
1314
#include "buildings/noBuildingSite.h"
1415
#include "buildings/nobBaseMilitary.h"
1516
#include "buildings/nobBaseWarehouse.h"
1617
#include "buildings/nobMilitary.h"
1718
#include "buildings/nobUsual.h"
1819
#include "helpers/containerUtils.h"
19-
#include "random/Random.h"
2020
#include "nodeObjs/noFlag.h"
2121
#include "nodeObjs/noRoadNode.h"
2222
#include "gameTypes/BuildingQuality.h"
@@ -467,10 +467,10 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
467467

468468
const Inventory& inventory = aii.GetInventory();
469469
uint8_t playerId = aii.GetPlayerId();
470-
if((RANDOM.Rand(RANDOM_CONTEXT2(playerId), 3) == 0 || inventory.people[Job::Private] < 15)
470+
if((AI::randomValue<int>(0, 3) == 0 || inventory.people[Job::Private] < 15)
471471
&& (inventory.goods[GoodType::Stones] > 6 || bldPlanner.GetNumBuildings(BuildingType::Quarry) > 0))
472472
bld = BuildingType::Guardhouse;
473-
if(aijh.getAIInterface().isHarborPosClose(pt, 19) && RANDOM.Rand(RANDOM_CONTEXT2(playerId), 10) != 0
473+
if(aijh.getAIInterface().isHarborPosClose(pt, 19) && AI::randomValue<int>(0, 10) != 0
474474
&& aijh.ggs.isEnabled(AddonId::SEA_ATTACK))
475475
{
476476
if(aii.CanBuildBuildingtype(BuildingType::Watchtower))
@@ -481,7 +481,7 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
481481
{
482482
if(aijh.UpdateUpgradeBuilding() < 0 && bldPlanner.GetNumBuildingSites(biggestBld) < 1
483483
&& (inventory.goods[GoodType::Stones] > 20 || bldPlanner.GetNumBuildings(BuildingType::Quarry) > 0)
484-
&& RANDOM.Rand(RANDOM_CONTEXT2(playerId), 10) != 0)
484+
&& AI::randomValue<int>(0, 10) != 0)
485485
{
486486
return biggestBld;
487487
}
@@ -495,7 +495,7 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
495495
// Prüfen ob Feind in der Nähe
496496
if(milBld->GetPlayer() != playerId && distance < 35)
497497
{
498-
int randmil = RANDOM.Rand(RANDOM_CONTEXT2(playerId), std::numeric_limits<int>::max());
498+
int randmil = AI::randomValue<int>(0, std::numeric_limits<int>::max());
499499
bool buildCatapult = randmil % 8 == 0 && aii.CanBuildCatapult()
500500
&& bldPlanner.GetNumAdditionalBuildingsWanted(BuildingType::Catapult) > 0;
501501
// another catapult within "min" radius? ->dont build here!

libs/s25main/ai/aijh/AIPlayerJH.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "RttrForeachPt.h"
1212
#include "addons/const_addons.h"
1313
#include "ai/AIEvents.h"
14+
#include "ai/random.h"
1415
#include "boost/filesystem/fstream.hpp"
1516
#include "buildings/noBuildingSite.h"
1617
#include "buildings/nobHarborBuilding.h"
@@ -26,7 +27,6 @@
2627
#include "notifications/RoadNote.h"
2728
#include "notifications/ShipNote.h"
2829
#include "pathfinding/PathConditionRoad.h"
29-
#include "random/Random.h"
3030
#include "nodeObjs/noAnimal.h"
3131
#include "nodeObjs/noFlag.h"
3232
#include "nodeObjs/noShip.h"
@@ -40,7 +40,6 @@
4040
#include <algorithm>
4141
#include <array>
4242
#include <memory>
43-
#include <random>
4443
#include <stdexcept>
4544
#include <type_traits>
4645

@@ -345,7 +344,7 @@ void AIPlayerJH::PlanNewBuildings(const unsigned gf)
345344
DistributeGoodsByBlocking(GoodType::Boards, 30);
346345
DistributeGoodsByBlocking(GoodType::Stones, 50);
347346
// go to the picked random warehouse and try to build around it
348-
int randomStore = RANDOM.Rand(RANDOM_CONTEXT2(playerId), storehouses.size());
347+
int randomStore = AI::randomValue<int>(0, storehouses.size());
349348
auto it = storehouses.begin();
350349
std::advance(it, randomStore);
351350
const MapPoint whPos = (*it)->GetPos();
@@ -366,7 +365,7 @@ void AIPlayerJH::PlanNewBuildings(const unsigned gf)
366365
const std::list<nobMilitary*>& militaryBuildings = aii.GetMilitaryBuildings();
367366
if(militaryBuildings.empty())
368367
return;
369-
int randomMiliBld = RANDOM.Rand(RANDOM_CONTEXT2(playerId), militaryBuildings.size());
368+
int randomMiliBld = AI::randomValue<int>(0, militaryBuildings.size());
370369
auto it2 = militaryBuildings.begin();
371370
std::advance(it2, randomMiliBld);
372371
MapPoint bldPos = (*it2)->GetPos();
@@ -1210,7 +1209,7 @@ void AIPlayerJH::HandleExpedition(const noShip* ship)
12101209
aii.FoundColony(ship);
12111210
else
12121211
{
1213-
const unsigned offset = RANDOM.Rand(RANDOM_CONTEXT2(playerId), helpers::MaxEnumValue_v<ShipDirection>);
1212+
const unsigned offset = AI::randomValue<unsigned>(0, helpers::MaxEnumValue_v<ShipDirection>);
12141213
for(auto dir : helpers::EnumRange<ShipDirection>{})
12151214
{
12161215
dir = ShipDirection((rttr::enum_cast(dir) + offset) % helpers::MaxEnumValue_v<ShipDirection>);
@@ -1255,7 +1254,7 @@ void AIPlayerJH::HandleTreeChopped(const MapPoint pt)
12551254

12561255
UpdateNodesAround(pt, 3);
12571256

1258-
if(RANDOM.Rand(RANDOM_CONTEXT2(playerId), 2) == 0)
1257+
if(AI::randomValue<int>(0, 2) == 0)
12591258
AddMilitaryBuildJob(pt);
12601259
else // if (random % 12 == 0)
12611260
AddBuildJob(BuildingType::Woodcutter, pt);
@@ -1537,7 +1536,7 @@ void AIPlayerJH::TryToAttack()
15371536
// We skip the current building with a probability of limit/numMilBlds
15381537
// -> For twice the number of blds as the limit we will most likely skip every 2nd building
15391538
// This way we check roughly (at most) limit buildings but avoid any preference for one building over an other
1540-
if(static_cast<unsigned>(RANDOM.Rand(RANDOM_CONTEXT2(playerId), static_cast<int>(numMilBlds))) > limit)
1539+
if(AI::randomValue<unsigned>(0, numMilBlds) > limit)
15411540
continue;
15421541

15431542
if(milBld->GetFrontierDistance() == FrontierDistance::Far) // inland building? -> skip it
@@ -1570,7 +1569,7 @@ void AIPlayerJH::TryToAttack()
15701569

15711570
// shuffle everything but headquarters and harbors without any troops in them
15721571
std::shuffle(potentialTargets.begin() + hq_or_harbor_without_soldiers, potentialTargets.end(),
1573-
std::mt19937(RANDOM.Rand(RANDOM_CONTEXT2(playerId), 2048)));
1572+
std::mt19937(AI::randomValue<unsigned>(0, 2048)));
15741573

15751574
// check for each potential attacking target the number of available attacking soldiers
15761575
for(const nobBaseMilitary* target : potentialTargets)
@@ -1704,9 +1703,7 @@ void AIPlayerJH::TrySeaAttack()
17041703
unsigned skip = 0;
17051704
if(searcharoundharborspots.size() > 15)
17061705
skip =
1707-
std::max<int>(
1708-
RANDOM.Rand(RANDOM_CONTEXT2(playerId), static_cast<int>(searcharoundharborspots.size() / 15 + 1) * 15), 1)
1709-
- 1;
1706+
std::max<int>(AI::randomValue<int>(0, static_cast<int>(searcharoundharborspots.size() / 15 + 1) * 15), 1) - 1;
17101707
for(unsigned i = skip; i < searcharoundharborspots.size() && limit > 0; i++)
17111708
{
17121709
limit--;

libs/s25main/ai/random.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org)
2+
//
3+
// SPDX-License-Identifier: GPL-2.0-or-later
4+
5+
#include "ai/random.h"
6+
7+
namespace AI {
8+
9+
std::minstd_rand& getRandomGenerator()
10+
{
11+
std::random_device rnd_dev;
12+
static std::minstd_rand rng(rnd_dev());
13+
return rng;
14+
}
15+
16+
} // namespace AI

libs/s25main/ai/random.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org)
2+
//
3+
// SPDX-License-Identifier: GPL-2.0-or-later
4+
5+
#pragma once
6+
7+
#include "helpers/random.h"
8+
#include <random>
9+
10+
namespace AI {
11+
12+
std::minstd_rand& getRandomGenerator();
13+
14+
template<typename T>
15+
T randomValue(T min = std::numeric_limits<T>::min(), T max = std::numeric_limits<T>::max())
16+
{
17+
return helpers::randomValue(getRandomGenerator(), min, max);
18+
}
19+
20+
} // namespace AI

0 commit comments

Comments
 (0)