diff --git a/lib/ResourceSet.cpp b/lib/ResourceSet.cpp index 4bdac6cb7..8233e777d 100644 --- a/lib/ResourceSet.cpp +++ b/lib/ResourceSet.cpp @@ -7,7 +7,7 @@ * Full text of license available in license.txt file, in main folder * */ - + #include "StdInc.h" #include "ResourceSet.h" #include "StringConstants.h" @@ -40,6 +40,12 @@ void Res::ResourceSet::amax(const TResourceCap &val) ::vstd::amax(elem, val); } +void Res::ResourceSet::amin(const TResourceCap &val) +{ + for(auto & elem : *this) + ::vstd::amin(elem, val); +} + void Res::ResourceSet::positive() { for(auto & elem : *this) diff --git a/lib/ResourceSet.h b/lib/ResourceSet.h index 059acabb5..deb0aadf5 100644 --- a/lib/ResourceSet.h +++ b/lib/ResourceSet.h @@ -7,7 +7,7 @@ * Full text of license available in license.txt file, in main folder * */ - + #pragma once typedef si32 TResource; @@ -125,6 +125,7 @@ namespace Res } DLL_LINKAGE void amax(const TResourceCap &val); //performs vstd::amax on each element + DLL_LINKAGE void amin(const TResourceCap &val); //performs vstd::amin on each element DLL_LINKAGE void positive(); //values below 0 are set to 0 - upgrade cost can't be negative, for example DLL_LINKAGE bool nonZero() const; //returns true if at least one value is non-zero; DLL_LINKAGE bool canAfford(const ResourceSet &price) const; diff --git a/lib/mapObjects/CRewardableObject.cpp b/lib/mapObjects/CRewardableObject.cpp index 64cbdbfaf..3065e38a8 100644 --- a/lib/mapObjects/CRewardableObject.cpp +++ b/lib/mapObjects/CRewardableObject.cpp @@ -1108,25 +1108,27 @@ void CGVisitableOPW::setRandomReward(CRandomGenerator &rand) { case Obj::MYSTICAL_GARDEN: info.resize(1); + info[0].limiter.numOfGrants = 1; + info[0].reward.resources.amin(0); if (rand.nextInt(1) == 0) { info[0].reward.resources[Res::GEMS] = 5; - info[0].limiter.numOfGrants = 1; } else { info[0].reward.resources[Res::GOLD] = 500; - info[0].limiter.numOfGrants = 1; } break; case Obj::WINDMILL: info.resize(1); + info[0].reward.resources.amin(0); // 3-6 of any resource but wood and gold info[0].reward.resources[rand.nextInt(Res::MERCURY, Res::GEMS)] = rand.nextInt(3, 6); info[0].limiter.numOfGrants = 1; break; case Obj::WATER_WHEEL: info.resize(1); + info[0].reward.resources.amin(0); info[0].reward.resources[Res::GOLD] = 500; info[0].limiter.numOfGrants = 1; break;