Quantcast

reworked the ideal gem calculations

Kevin Lyles [11-22-09 - 16:48]
reworked the ideal gem calculations
Filename
WeightsWatcher.lua
diff --git a/WeightsWatcher.lua b/WeightsWatcher.lua
index 3e12c46..214110d 100644
--- a/WeightsWatcher.lua
+++ b/WeightsWatcher.lua
@@ -81,7 +81,7 @@ end

 function WeightsWatcher:cacheItemStats(link)
 	-- Stats: normal stats, sockets, socket bonus, gem-given stats, whether the socket bonus is active, ideal gems, ideal gems ignoring socket bonuses
-	local normalStats, sockets, socketBonusStat, socketBonusActive, gemStats, bestGems, bestGemsIgnoreSocket
+	local normalStats, sockets, socketBonusStat, socketBonusActive, gemStats

 	_, itemId, _, gemId1, gemId2, gemId3, gemId4, suffixId, uniqueId, linkLevel = strsplit(":", link)
 	-- Strip color codes
@@ -153,26 +153,46 @@ function WeightsWatcher:cacheItemStats(link)
 							ww_weightIdealCache[class][weight] = {}
 						end

+						if not ww_weightIdealCache[class][weight].bestGems then
+							local redScore, yellowScore, blueScore, overallScore
+							local bestGems = {}
+
+							bestGems.Red, redScore = WeightsWatcher:bestGemForSocket("Red", ww_vars.weightsList[class][weight], ww_vars.options.gemQualityLimit)
+							bestGems.Yellow, yellowScore = WeightsWatcher:bestGemForSocket("Yellow", ww_vars.weightsList[class][weight], ww_vars.options.gemQualityLimit)
+							bestGems.Blue, blueScore = WeightsWatcher:bestGemForSocket("Blue", ww_vars.weightsList[class][weight], ww_vars.options.gemQualityLimit)
+							bestGems.Meta = WeightsWatcher:bestGemForSocket("Meta", ww_vars.weightsList[class][weight], ww_vars.options.gemQualityLimit)
+							bestGems.overall = bestGems.Red
+							overallScore = redScore
+							if blueScore > overallScore then
+								bestGems.overall = bestGems.Blue
+								overallScore = blueScore
+							end
+							if yellowScore > overallScore then
+								bestGems.overall = bestGems.Yellow
+							end
+							ww_weightIdealCache[class][weight].bestGems = bestGems
+						end
+
 						if not ww_weightIdealCache[class][weight][bareLink] then
+							local gemId, gemIdIgnoreSocket, weightVal, weightValIgnoreSockets, bestGems, bestGemsIgnoreSocket
+
 							ww_weightIdealCache[class][weight][bareLink] = {}

 							bestGems = {}
 							bestGemsIgnoreSocket = {}
 							for _, color in pairs(sockets) do
-								gemId, _, gemIdIgnoreSocket = WeightsWatcher:bestGemsForSocket(color, socketBonusStat, ww_vars.weightsList[class][weight], ww_vars.options.gemQualityLimit)
-
+								gemId = ww_weightIdealCache[class][weight].bestGems[color]
 								if gemId ~= 0 then
 									table.insert(bestGems, gemId)
 								end
 								if breakSocketColors then
+									gemIdIgnoreSocket = ww_weightIdealCache[class][weight].bestGems.overall
 									if gemIdIgnoreSocket ~= 0 then
 										table.insert(bestGemsIgnoreSocket, gemIdIgnoreSocket)
 									end
 								end
 							end
 							gemStats = WeightsWatcher:getGemStats(bestGems)
-							gemStatsIgnoreSockets = WeightsWatcher:getGemStats(bestGemsIgnoreSocket)
-							local weightVal, weightValIgnoreSockets
 							weightVal = WeightsWatcher:calculateWeight(normalStats, true, socketBonusStat, gemStats, ww_vars.weightsList[class][weight])
 							if breakSocketColors then
 								gemStatsIgnoreSockets = WeightsWatcher:getGemStats(bestGemsIgnoreSocket)
@@ -275,29 +295,22 @@ function WeightsWatcher:displayItemStats(tooltip, ttname)
 	end
 end

-function WeightsWatcher:bestGemsForSocket(socketColor, socketBonusStat, weightScale, qualityLimit)
-	local bestGem, bestWeight, bestGemIgnoreSocket, bestWeightIgnoreSocket, gemId, gemStats, socketBonusActive, weight = 0, 0, 0, 0
+function WeightsWatcher:bestGemForSocket(socketColor, weightScale, qualityLimit)
+	local bestGem, bestWeight, weight = 0, 0

 	for gemId, gemStats in pairs(GemIds) do
 		if not qualityLimit or gemStats[3] <= qualityLimit then
-			socketBonusActive = WeightsWatcher:matchesSocket(gemStats[1], socketColor)
 			-- Meta sockets don't ever hold anything but meta gems
-			if socketBonusActive or (gemStats[1] ~= "Meta" and socketColor ~= "Meta") then
-				weight = WeightsWatcher:calculateWeight({}, socketBonusActive, nil, {gemStats}, weightScale)
-				if socketBonusActive then
-					if bestGem == 0 or weight > bestWeight then
-						bestGem = gemId
-						bestWeight = weight
-					end
-				end
-				if bestGemIgnoreSocket == 0 or weight > bestWeightIgnoreSocket then
-					bestGemIgnoreSocket = gemId
-					bestWeightIgnoreSocket = weight
+			if  WeightsWatcher:matchesSocket(gemStats[1], socketColor) then
+				weight = WeightsWatcher:calculateWeight({}, true, nil, {gemStats}, weightScale)
+				if bestGem == 0 or weight > bestWeight then
+					bestGem = gemId
+					bestWeight = weight
 				end
 			end
 		end
 	end
-	return bestGem, bestWeight, bestGemIgnoreSocket, bestWeightIgnoreSocket
+	return bestGem, bestWeight
 end

 function WeightsWatcher:matchesSocket(gemColor, socketColor)