Jelajahi Sumber

Minor optimization for object selection.

DjWarmonger 9 tahun lalu
induk
melakukan
053b342721
1 mengubah file dengan 9 tambahan dan 1 penghapusan
  1. 9 1
      lib/rmg/CRmgTemplateZone.cpp

+ 9 - 1
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;