From 053b342721c97faf2c2bea148d373fc5431bae0e Mon Sep 17 00:00:00 2001 From: DjWarmonger Date: Sun, 5 Jun 2016 10:18:10 +0200 Subject: [PATCH] Minor optimization for object selection. --- lib/rmg/CRmgTemplateZone.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/rmg/CRmgTemplateZone.cpp b/lib/rmg/CRmgTemplateZone.cpp index 061db8569..031f480b3 100644 --- a/lib/rmg/CRmgTemplateZone.cpp +++ b/lib/rmg/CRmgTemplateZone.cpp @@ -1658,6 +1658,12 @@ void CRmgTemplateZone::createTreasures(CMapGenerator* gen) //place biggest treasures first at large distance, place smaller ones inbetween boost::sort(treasureInfo, valueComparator); + //sort treasures by ascending value so we can stop checking treasures with too high value + boost::sort(possibleObjects, [](const ObjectInfo& oi1, const ObjectInfo& oi2) -> bool + { + return oi1.value < oi2.value; + }); + int totalDensity = 0; for (auto t : treasureInfo) { @@ -2199,7 +2205,9 @@ ObjectInfo CRmgTemplateZone::getRandomObject(CMapGenerator* gen, CTreasurePileIn //roulette wheel for (ObjectInfo &oi : possibleObjects) //copy constructor turned out to be costly { - if (oi.value >= minValue && oi.value <= maxVal && oi.maxPerZone > 0) + if (oi.value > maxVal) + break; //this assumes values are sorted in ascending order + if (oi.value >= minValue && oi.maxPerZone > 0) { int3 newVisitableOffset = oi.templ.getVisitableOffset(); //visitablePos assumes object will be shifter by visitableOffset int3 newVisitablePos = info.nextTreasurePos;