Quantcast

Added triggers to the default weights and an upgrade function for existing weights

Kevin Lyles [05-19-10 - 06:29]
Added triggers to the default weights and an upgrade function for existing weights
Also added triggers to the score calculations
Filename
Upgrade.lua
WeightsWatcher.lua
defaults.lua
weights.lua
weights.xml
diff --git a/Upgrade.lua b/Upgrade.lua
index 057e209..aeb4967 100644
--- a/Upgrade.lua
+++ b/Upgrade.lua
@@ -135,6 +135,59 @@ function noop_major_up(vars)
 	return vars
 end

+function upgradeAccountToTriggers(vars)
+	if vars.savedTriggers then
+		for _, class in ipairs(vars.savedTriggers) do
+			for _, weight in ipairs(vars.savedTriggers[class]) do
+				if vars.weightsList[class] and vars.weightsList[class][weight] then
+					vars.weightsList[class][weight].triggers = vars.savedTriggers[class][weight]
+				end
+			end
+		end
+	end
+	vars.savedTriggers = nil
+	for _, class in ipairs(vars.weightsList) do
+		for _, weight in ipairs(vars.weightsList[class]) do
+			if not vars.weightsList[class][weight].triggers then
+				vars.weightsList[class][weight].triggers = {}
+				if vars.weightsList[class][weight]["dps"] or (vars.weightsList[class][weight]["attack power"] and not vars.weightsList[class][weight]["ranged attack power"]) then
+					vars.weightsList[class][weight].triggers.meleeDamage = true
+				end
+				if vars.weightsList[class][weight]["ranged dps"] or vars.weightsList[class][weight]["ranged attack power"] then
+					vars.weightsList[class][weight].triggers.rangedDamage = true
+				end
+				if vars.weightsList[class][weight]["spell power"] and vars.weightsList[class][weight]["hit rating"] then
+					vars.weightsList[class][weight].triggers.harmfulSpell = true
+				end
+				if vars.weightsList[class][weight]["spell power"] and not vars.weightsList[class][weight]["hit rating"] then
+					vars.weightsList[class][weight].triggers.helpfulSpell = true
+				end
+			end
+		end
+	end
+
+	vars.dataMinorVersion = 12
+	return vars
+end
+
+downgradeAccountFromTriggers = [[
+	return function(vars)
+		vars.savedTriggers = {}
+		for i, class in ipairs(vars.weightsList) do
+			vars.savedTriggers[i] = class
+			vars.savedTriggers[class] = {}
+			for j, weight in ipairs(vars.weightsList[class]) do
+				vars.savedTriggers[class][j] = weight
+				vars.savedTriggers[class][weight] = vars.weightsList[class][weight].triggers
+				vars.weightsList[class][weight].triggers = nil
+			end
+		end
+
+		vars.dataMinorVersion = 11
+		return vars
+	end
+]]
+
 function upgradeAccountToUseEffectRatio(vars)
 	if not vars.options.useEffects then
 		vars.options.useEffects = {}
@@ -805,6 +858,7 @@ upgradeAccountFunctions = {
 		[8] = upgradeAccountToWorkingResistances,
 		[9] = upgradeAccountToWorkingMeleeDamage,
 		[10] = upgradeAccountToUseEffectRatio,
+		[11] = upgradeAccountToTriggers,
 	},
 }

@@ -833,6 +887,7 @@ downgradeAccountFunctions = {
 		[9] = noop_down,
 		[10] = noop_down,
 		[11] = noop_down,
+		[12] = downgradeAccountFromTriggers,
 	},
 }

diff --git a/WeightsWatcher.lua b/WeightsWatcher.lua
index 261906b..2cbe294 100644
--- a/WeightsWatcher.lua
+++ b/WeightsWatcher.lua
@@ -887,11 +887,23 @@ function WeightsWatcher.calculateWeight(bareItemStats, itemStats, weightsScale)
 			weight = weight + WeightsWatcher.getWeight(useEffect.stat, useEffect.value * useEffect.duration / useEffect.cooldown * ww_vars.options.useEffects.uptimeRatio, weightsScale)
 		end
 	end
+	if bareItemStats.stackingEquipEffects then
+		for _, effect in ipairs(bareItemStats.stackingEquipEffects) do
+			for trigger in pairs(effect.triggers) do
+				if weightsScale.triggers[trigger] then
+					weight = weight + WeightsWatcher.getWeight(effect.stat, effect.value * effect.numStacks, weightsScale)
+					break
+				end
+			end
+		end
+	end
 	if ww_vars.options.tooltip.normalizeWeights == true then
 		local total = 0

 		for _, value in pairs(weightsScale) do
-			total = total + abs(value)
+			if type(value) == "number" then
+				total = total + abs(value)
+			end
 		end
 		if total == 0 then
 			-- Avoids a divide by zero
diff --git a/defaults.lua b/defaults.lua
index b576b9c..c1e0822 100644
--- a/defaults.lua
+++ b/defaults.lua
@@ -5,6 +5,7 @@ trackedStats = {
 	[4] = "Caster",
 	[5] = "Meta Gem Stats",
 	[6] = "Resistances",
+	[7] = "Triggers",
 	["General"] = {
 		"Stamina",
 		"Critical Strike Rating",
@@ -89,6 +90,7 @@ trackedStats = {
 		["Nature"] = "nature resistance",
 		["Shadow"] = "shadow resistance",
 	},
+	["Triggers"] = {}
 }

 triggerGroups = {
@@ -102,6 +104,17 @@ triggerGroups = {
 	["helpfulSpellCast"] = {"helpfulSpell"},
 }

+triggerNames = {
+	[1] = "meleeDamage",
+	[2] = "rangedDamage",
+	[3] = "harmfulSpell",
+	[4] = "helpfulSpell",
+	["meleeDamage"] = "Melee damage dealt",
+	["rangedDamage"] = "Ranged damage dealt",
+	["harmfulSpell"] = "Harmful spell cast",
+	["helpfulSpell"] = "Helpful spell cast",
+}
+
 classNames = {
 	["DEATHKNIGHT"] = "Death Knight",
 	["DRUID"] = "Druid",
@@ -219,7 +232,7 @@ classNameOptions = {

 defaultVars = {
 	dataMajorVersion = 1,
-	dataMinorVersion = 11,
+	dataMinorVersion = 12,
 	weightsList = {
 		[1] = "DEATHKNIGHT",
 		[2] = "DRUID",
@@ -246,6 +259,9 @@ defaultVars = {
 				["haste rating"] = 55,
 				["attack power"] = 36,
 				["armor"] = 1,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Frost DPS"] = {
 				["dps"] = 337,
@@ -257,6 +273,9 @@ defaultVars = {
 				["attack power"] = 35,
 				["haste rating"] = 28,
 				["armor"] = 1,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Unholy DPS"] = {
 				["dps"] = 209,
@@ -268,6 +287,9 @@ defaultVars = {
 				["attack power"] = 34,
 				["armor penetration rating"] = 32,
 				["armor"] = 1,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Tank"] = {
 				["dps"] = 419,
@@ -283,6 +305,9 @@ defaultVars = {
 				["attack power"] = 41,
 				["armor penetration rating"] = 31,
 				["armor"] = 5,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 		},
 		["DRUID"] = {
@@ -297,6 +322,9 @@ defaultVars = {
 				["critical strike rating"] = 43,
 				["spirit"] = 22,
 				["intellect"] = 22,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Feral DPS"] = {
 				["agility"] = 100,
@@ -308,6 +336,9 @@ defaultVars = {
 				["feral attack power"] = 40,
 				["attack power"] = 40,
 				["haste rating"] = 35,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Feral Tank"] = {
 				["agility"] = 100,
@@ -322,6 +353,9 @@ defaultVars = {
 				["feral attack power"] = 4,
 				["attack power"] = 4,
 				["critical strike rating"] = 3,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Restoration"] = {
 				["spell power"] = 100,
@@ -330,6 +364,9 @@ defaultVars = {
 				["intellect"] = 51,
 				["spirit"] = 32,
 				["critical strike rating"] = 11,
+				triggers = {
+					helpfulSpell = true,
+				}
 			},
 		},
 		["HUNTER"] = {
@@ -346,6 +383,9 @@ defaultVars = {
 				["ranged attack power"] = 30,
 				["armor penetration rating"] = 28,
 				["haste rating"] = 21,
+				triggers = {
+					rangedDamage = true,
+				}
 			},
 			["Marksmanship"] = {
 				["ranged dps"] = 379,
@@ -357,6 +397,9 @@ defaultVars = {
 				["attack power"] = 32,
 				["ranged attack power"] = 32,
 				["haste rating"] = 24,
+				triggers = {
+					rangedDamage = true,
+				}
 			},
 			["Survival"] = {
 				["ranged dps"] = 181,
@@ -368,6 +411,9 @@ defaultVars = {
 				["attack power"] = 29,
 				["ranged attack power"] = 29,
 				["armor penetration rating"] = 26,
+				triggers = {
+					rangedDamage = true,
+				}
 			},
 		},
 		["MAGE"] = {
@@ -384,6 +430,9 @@ defaultVars = {
 				["frost spell damage"] = 49,
 				["fire spell damage"] = 49,
 				["spirit"] = 14,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Fire"] = {
 				["hit rating"] = 100,
@@ -394,6 +443,9 @@ defaultVars = {
 				["frost spell damage"] = 23,
 				["arcane spell damage"] = 23,
 				["intellect"] = 13,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Frost"] = {
 				["hit rating"] = 100,
@@ -404,6 +456,9 @@ defaultVars = {
 				["fire spell damage"] = 19,
 				["critical strike rating"] = 19,
 				["intellect"] = 6,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 		},
 		["PALADIN"] = {
@@ -416,6 +471,9 @@ defaultVars = {
 				["spell power"] = 58,
 				["critical strike rating"] = 46,
 				["haste rating"] = 35,
+				triggers = {
+					helpfulSpell = true,
+				}
 			},
 			["Protection"] = {
 				["stamina"] = 100,
@@ -432,6 +490,10 @@ defaultVars = {
 				["attack power"] = 6,
 				["spell power"] = 4,
 				["critical strike rating"] = 3,
+				triggers = {
+					harmfulSpell = true,
+					meleeDamage = true,
+				}
 			},
 			["Retribution"] = {
 				["dps"] = 470,
@@ -444,6 +506,10 @@ defaultVars = {
 				["haste rating"] = 30,
 				["armor penetration rating"] = 22,
 				["spell power"] = 9,
+				triggers = {
+					harmfulSpell = true,
+					meleeDamage = true,
+				}
 			},
 		},
 		["PRIEST"] = {
@@ -457,6 +523,9 @@ defaultVars = {
 				["haste rating"] = 59,
 				["critical strike rating"] = 48,
 				["spirit"] = 22,
+				triggers = {
+					helpfulSpell = true,
+				}
 			},
 			["Holy"] = {
 				["mp5"] = 100,
@@ -465,6 +534,9 @@ defaultVars = {
 				["spirit"] = 52,
 				["critical strike rating"] = 38,
 				["haste rating"] = 31,
+				triggers = {
+					helpfulSpell = true,
+				}
 			},
 			["Shadow"] = {
 				["hit rating"] = 100,
@@ -474,6 +546,9 @@ defaultVars = {
 				["haste rating"] = 50,
 				["spirit"] = 16,
 				["intellect"] = 16,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 		},
 		["ROGUE"] = {
@@ -490,6 +565,9 @@ defaultVars = {
 				["armor penetration rating"] = 65,
 				["haste rating"] = 64,
 				["strength"] = 55,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Combat"] = {
 				["dps"] = 220,
@@ -501,6 +579,9 @@ defaultVars = {
 				["haste rating"] = 73,
 				["strength"] = 55,
 				["attack power"] = 50,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Subtlety"] = {
 				["dps"] = 228,
@@ -512,6 +593,9 @@ defaultVars = {
 				["haste rating"] = 75,
 				["strength"] = 55,
 				["attack power"] = 50,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 		},
 		["SHAMAN"] = {
@@ -524,6 +608,9 @@ defaultVars = {
 				["haste rating"] = 56,
 				["critical strike rating"] = 40,
 				["intellect"] = 11,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Enhancement"] = {
 				["dps"] = 135,
@@ -537,6 +624,10 @@ defaultVars = {
 				["attack power"] = 32,
 				["spell power"] = 29,
 				["armor penetration rating"] = 26,
+				triggers = {
+					harmfulSpell = true,
+					meleeDamage = true,
+				}
 			},
 			["Restoration"] = {
 				["mp5"] = 100,
@@ -544,6 +635,9 @@ defaultVars = {
 				["spell power"] = 77,
 				["critical strike rating"] = 62,
 				["haste rating"] = 35,
+				triggers = {
+					helpfulSpell = true,
+				}
 			},
 		},
 		["WARLOCK"] = {
@@ -559,6 +653,9 @@ defaultVars = {
 				["fire spell damage"] = 36,
 				["spirit"] = 34,
 				["intellect"] = 15,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Demonology"] = {
 				["hit rating"] = 100,
@@ -569,6 +666,9 @@ defaultVars = {
 				["critical strike rating"] = 31,
 				["spirit"] = 29,
 				["intellect"] = 13,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 			["Destruction"] = {
 				["hit rating"] = 100,
@@ -579,6 +679,9 @@ defaultVars = {
 				["shadow spell damage"] = 23,
 				["critical strike rating"] = 16,
 				["intellect"] = 13,
+				triggers = {
+					harmfulSpell = true,
+				}
 			},
 		},
 		["WARRIOR"] = {
@@ -594,6 +697,9 @@ defaultVars = {
 				["haste rating"] = 36,
 				["attack power"] = 31,
 				["armor"] = 5,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 			["Protection"] = {
 				["stamina"] = 100,
@@ -611,6 +717,9 @@ defaultVars = {
 				["armor"] = 6,
 				["haste rating"] = 1,
 				["attack power"] = 1,
+				triggers = {
+					meleeDamage = true,
+				}
 			},
 		},
 	},
diff --git a/weights.lua b/weights.lua
index 4055f99..1ba78e4 100644
--- a/weights.lua
+++ b/weights.lua
@@ -188,17 +188,29 @@ function configSelectWeight(weightFrame)
 	ww_weights.rightPanel.weightFrame = weightFrame
 	ww_weights.rightPanel.statList = ww_vars.weightsList[weightFrame.category.class][weightFrame.name]
 	ww_weights.rightPanel.changedStats = {}
+	ww_weights.rightPanel.changedTriggers = {}

 	-- Fills the right panel with the current weight's stats
 	configResetWeight()

 	for _, categoryFrame in ipairs(ww_weights.rightPanel.scrollFrame.categories) do
 		local empty = true
-		for _, statFrame in ipairs({categoryFrame:GetChildren()}) do
-			if statFrame.statName then
-				if statFrame.statValue:GetText() ~= "" then
-					empty = false
-					break
+		if categoryFrame.name == "Triggers" then
+			for _, triggerFrame in ipairs({categoryFrame:GetChildren()}) do
+				if triggerFrame.active then
+					if triggerFrame.active:GetChecked() then
+						empty = false
+						break
+					end
+				end
+			end
+		else
+			for _, statFrame in ipairs({categoryFrame:GetChildren()}) do
+				if statFrame.statName then
+					if statFrame.statValue:GetText() ~= "" then
+						empty = false
+						break
+					end
 				end
 			end
 		end
@@ -225,6 +237,12 @@ function configResetWeight()
 			statValue:SetText(value)
 		end
 	end
+	if ww_weights.rightPanel.changedTriggers then
+		for triggerCheckButton, trigger in pairs(ww_weights.rightPanel.changedTriggers) do
+			changed = true
+			triggerCheckButton:SetChecked(ww_weights.rightPanel.statList.triggers[trigger])
+		end
+	end
 	if not changed then
 		for _, frame in pairs(ww_weights.rightPanel.scrollFrame.stats) do
 			if frame.statName then
@@ -235,9 +253,19 @@ function configResetWeight()
 				frame.statValue:SetText(value)
 			end
 		end
+		for _, categoryFrame in pairs(ww_weights.rightPanel.scrollFrame.categories) do
+			if categoryFrame.name == "Triggers" then
+				for _, triggerFrame in ipairs({categoryFrame:GetChildren()}) do
+					if triggerFrame.active then
+						triggerFrame.active:SetChecked(ww_weights.rightPanel.statList.triggers[triggerFrame.active:GetText()])
+					end
+				end
+			end
+		end
 	end

 	ww_weights.rightPanel.changedStats = {}
+	ww_weights.rightPanel.changedTriggers = {}
 	ww_weights.rightPanel.saveButton:Disable()
 	ww_weights.rightPanel.resetButton:Disable()
 end
@@ -254,15 +282,27 @@ function configSaveWeight()
 	ww_weightCache[weightFrame.category.class][weightFrame.name] = nil
 	ww_weightIdealCache[weightFrame.category.class][weightFrame.name] = nil

-	for statValue, statName in pairs(ww_weights.rightPanel.changedStats) do
-		number = statValue:GetNumber()
-		if number == 0 then
-			number = nil
+	if ww_weights.rightPanel.changedStats then
+		for statValue, statName in pairs(ww_weights.rightPanel.changedStats) do
+			number = statValue:GetNumber()
+			if number == 0 then
+				number = nil
+			end
+			ww_weights.rightPanel.statList[statName] = number
+		end
+	end
+	if ww_weights.rightPanel.changedTriggers then
+		for triggerCheckButton, trigger in pairs(ww_weights.rightPanel.changedTriggers) do
+			if triggerCheckButton:GetChecked() then
+				ww_weights.rightPanel.statList.triggers[trigger] = true
+			else
+				ww_weights.rightPanel.statList.triggers[trigger] = nil
+			end
 		end
-		ww_weights.rightPanel.statList[statName] = number
 	end

 	ww_weights.rightPanel.changedStats = {}
+	ww_weights.rightPanel.changedTriggers = {}
 	ww_weights.rightPanel.saveButton:Disable()
 	ww_weights.rightPanel.resetButton:Disable()
 end
@@ -437,11 +477,27 @@ function loadStatButtons()
 	createScrollableTieredList(trackedStats, ww_weights.rightPanel.scrollFrame, ww_weights.rightPanel.scrollContainer, "ww_statFrame", 22)

 	for _, categoryFrame in ipairs(ww_weights.rightPanel.scrollFrame.categories) do
-		local children = {categoryFrame:GetChildren()}
-		for i, statFrame in ipairs(children) do
-			if statFrame.name then
-				table.insert(stats, statFrame)
-				statFrame.statName = string.lower(statFrame.name)
+		if categoryFrame.name == "Triggers" then
+			for i, trigger in ipairs(triggerNames) do
+				local triggerFrame = CreateFrame("Frame", "WW_" .. trigger, categoryFrame, "ww_triggerFrame")
+				triggerFrame.position = i
+				triggerFrame.category = categoryFrame
+				triggerFrame.text:SetText(triggerNames[trigger])
+				triggerFrame.active:SetText(trigger)
+				triggerFrame.name = trigger
+				triggerFrame:SetPoint("TOPLEFT", 0, -ww_weights.rightPanel.scrollFrame.elementHeight * i)
+				table.insert(ww_weights.rightPanel.scrollFrame.shown, triggerFrame)
+				categoryFrame.length = categoryFrame.length + 1
+			end
+			categoryFrame:SetHeight(ww_weights.rightPanel.scrollFrame.elementHeight * categoryFrame.length)
+			categoryFrame.collapsed = false
+		else
+			local children = {categoryFrame:GetChildren()}
+			for i, statFrame in ipairs(children) do
+				if statFrame.name then
+					table.insert(stats, statFrame)
+					statFrame.statName = string.lower(statFrame.name)
+				end
 			end
 		end
 	end
diff --git a/weights.xml b/weights.xml
index 725e243..8bd7f33 100644
--- a/weights.xml
+++ b/weights.xml
@@ -197,6 +197,10 @@
 								changed = true
 								break
 							end
+							for _ in pairs(ww_weights.rightPanel.changedTriggers) do
+								changed = true
+								break
+							end
 							if not changed then
 								ww_weights.rightPanel.saveButton:Disable()
 								ww_weights.rightPanel.resetButton:Disable()
@@ -234,6 +238,73 @@
 			</EditBox>
 		</Frames>
 	</Frame>
+	<!--virtual frame used to allow for script generated frames with trigger information-->
+	<Frame name="ww_triggerFrame" virtual="true">
+		<Size>
+			<AbsDimension y="22"/>
+		</Size>
+		<Anchors>
+			<Anchor point="RIGHT">
+				<Offset>
+					<AbsDimension x="-5"/>
+				</Offset>
+			</Anchor>
+		</Anchors>
+		<Layers>
+			<Layer level="OVERLAY">
+				<FontString name="$parentText" parentKey="text" inherits="GameFontNormal">
+					<Size>
+						<AbsDimension y="20"/>
+					</Size>
+					<Anchors>
+						<Anchor point="LEFT">
+							<Offset>
+								<AbsDimension x="40"/>
+							</Offset>
+						</Anchor>
+					</Anchors>
+				</FontString>
+			</Layer>
+		</Layers>
+		<Frames>
+			<CheckButton name="$parentActive" parentKey="active" inherits="UICheckButtonTemplate">
+				<Size>
+					<AbsDimension x="20" y="20"/>
+				</Size>
+				<Anchors>
+					<Anchor point="LEFT">
+						<Offset>
+							<AbsDimension x="20"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Scripts>
+					<OnClick>
+						if self:GetChecked() == ww_weights.rightPanel.statList.triggers[self:GetText()] then
+							ww_weights.rightPanel.changedTriggers[self] = nil
+							local changed = false
+							for _ in pairs(ww_weights.rightPanel.changedStats) do
+								changed = true
+								break
+							end
+							for _ in pairs(ww_weights.rightPanel.changedTriggers) do
+								changed = true
+								break
+							end
+							if not changed then
+								ww_weights.rightPanel.saveButton:Disable()
+								ww_weights.rightPanel.resetButton:Disable()
+							end
+						else
+							ww_weights.rightPanel.changedTriggers[self] = self:GetText()
+							ww_weights.rightPanel.saveButton:Enable()
+							ww_weights.rightPanel.resetButton:Enable()
+						end
+					</OnClick>
+				</Scripts>
+			</CheckButton>
+		</Frames>
+	</Frame>
 	<!--virtual frame used to allow for script generated frames with stat information-->
 	<Frame name="ww_weightFrame" virtual="true">
 		<Size>