1- // Copyright (C) 2005 - 2024 Settlers Freaks (sf-team at siedler25.org)
1+ // Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
22//
33// SPDX-License-Identifier: GPL-2.0-or-later
44
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"
@@ -465,20 +466,21 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
465466 const BuildingType biggestBld = GetBiggestAllowedMilBuilding ().value ();
466467
467468 const Inventory& inventory = aii.GetInventory ();
468- if ((( rand () % 3 ) == 0 || inventory.people [Job::Private] < 15 )
469+ if ((inventory.people [Job::Private] < 15 || AI::randomChance ( 3 ) )
469470 && (inventory.goods [GoodType::Stones] > 6 || bldPlanner.GetNumBuildings (BuildingType::Quarry) > 0 ))
470471 bld = BuildingType::Guardhouse;
471- if (aijh.getAIInterface ().isHarborPosClose (pt, 19 ) && rand () % 10 != 0 && aijh.ggs .isEnabled (AddonId::SEA_ATTACK))
472+ if (aijh.getAIInterface ().isHarborPosClose (pt, 19 ) && !AI::randomChance (10 )
473+ && aijh.ggs .isEnabled (AddonId::SEA_ATTACK))
472474 {
473475 if (aii.CanBuildBuildingtype (BuildingType::Watchtower))
474476 return BuildingType::Watchtower;
475477 return GetBiggestAllowedMilBuilding ();
476478 }
477479 if (biggestBld == BuildingType::Watchtower || biggestBld == BuildingType::Fortress)
478480 {
479- if (aijh.UpdateUpgradeBuilding () < 0 && bldPlanner.GetNumBuildingSites (biggestBld) < 1
481+ if (! aijh.UpdateUpgradeBuilding () && bldPlanner.GetNumBuildingSites (biggestBld) < 1
480482 && (inventory.goods [GoodType::Stones] > 20 || bldPlanner.GetNumBuildings (BuildingType::Quarry) > 0 )
481- && rand () % 10 != 0 )
483+ && ! AI::randomChance ( 10 ) )
482484 {
483485 return biggestBld;
484486 }
@@ -488,23 +490,22 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
488490 sortedMilitaryBlds military = aii.gwb .LookForMilitaryBuildings (pt, 3 );
489491 for (const nobBaseMilitary* milBld : military)
490492 {
491- unsigned distance = aii.gwb .CalcDistance (milBld->GetPos (), pt);
493+ const unsigned distance = aii.gwb .CalcDistance (milBld->GetPos (), pt);
492494
493- // Prüfen ob Feind in der Nähe
495+ // Check for close enemy
494496 if (milBld->GetPlayer () != playerId && distance < 35 )
495497 {
496- int randmil = rand ();
497- bool buildCatapult = randmil % 8 == 0 && aii.CanBuildCatapult ()
498+ bool buildCatapult = AI::randomChance (8 ) && aii.CanBuildCatapult ()
498499 && bldPlanner.GetNumAdditionalBuildingsWanted (BuildingType::Catapult) > 0 ;
499- // another catapult within "min" radius? ->dont build here!
500- const unsigned min = 16 ;
501- if (buildCatapult && aii.gwb .CalcDistance (pt, aii.GetStorehouses ().front ()->GetPos ()) < min )
500+ // another catapult within this radius? ->dont build here!
501+ constexpr unsigned minCatapultDist = 16 ;
502+ if (buildCatapult && aii.gwb .CalcDistance (pt, aii.GetStorehouses ().front ()->GetPos ()) < minCatapultDist )
502503 buildCatapult = false ;
503504 if (buildCatapult)
504505 {
505506 for (const nobUsual* catapult : aii.GetBuildings (BuildingType::Catapult))
506507 {
507- if (aii.gwb .CalcDistance (pt, catapult->GetPos ()) < min )
508+ if (aii.gwb .CalcDistance (pt, catapult->GetPos ()) < minCatapultDist )
508509 {
509510 buildCatapult = false ;
510511 break ;
@@ -515,7 +516,8 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
515516 {
516517 for (const noBuildingSite* bldSite : aii.GetBuildingSites ())
517518 {
518- if (bldSite->GetBuildingType () == bld && aii.gwb .CalcDistance (pt, bldSite->GetPos ()) < min)
519+ if (bldSite->GetBuildingType () == bld
520+ && aii.gwb .CalcDistance (pt, bldSite->GetPos ()) < minCatapultDist)
519521 {
520522 buildCatapult = false ;
521523 break ;
@@ -526,19 +528,21 @@ helpers::OptionalEnum<BuildingType> AIConstruction::ChooseMilitaryBuilding(const
526528 bld = BuildingType::Catapult;
527529 else
528530 {
529- if (randmil % 2 == 0 && aii.CanBuildBuildingtype (BuildingType::Watchtower))
530- bld = BuildingType::Watchtower;
531- else
532- bld = biggestBld;
533- }
534- // slim chance for a guardhouse instead of tower or fortress so we can expand towards an enemy even if there
535- // are no big building spots in that direction
536- if (randmil % 10 == 0 )
537- {
538- if (aii.CanBuildBuildingtype (BuildingType::Guardhouse))
539- bld = BuildingType::Guardhouse;
540- else
541- bld = GetSmallestAllowedMilBuilding ();
531+ // slim chance for a guardhouse instead of tower or fortress so we can expand towards an enemy even if
532+ // there are no big building spots in that direction
533+ if (AI::randomChance (10 ))
534+ {
535+ if (aii.CanBuildBuildingtype (BuildingType::Guardhouse))
536+ bld = BuildingType::Guardhouse;
537+ else
538+ bld = GetSmallestAllowedMilBuilding ();
539+ } else
540+ {
541+ if (aii.CanBuildBuildingtype (BuildingType::Watchtower) && AI::randomChance ())
542+ bld = BuildingType::Watchtower;
543+ else
544+ bld = biggestBld;
545+ }
542546 }
543547 break ;
544548 }
0 commit comments