Quantcast

Support more power reduction buffs.

Johnny C. Lam [05-03-14 - 00:25]
Support more power reduction buffs.

Instead of just "_half" and "_none" for 50% and 100% reduction, also
support "_less15" and "_less75" for 15% and 75% reduction as well.

git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@1355 d5049fe3-3747-40f7-a4b5-f36d6801af5f
Filename
OvalePower.lua
diff --git a/OvalePower.lua b/OvalePower.lua
index 5deefa9..2545b79 100644
--- a/OvalePower.lua
+++ b/OvalePower.lua
@@ -350,85 +350,95 @@ statePrototype.TimeToPower = function(state, spellId, powerType)
 end

 -- Return the amount of the given resource needed to cast the given spell.
-statePrototype.PowerCost = function(state, spellId, powerType)
-	local buffParam = "buff_" .. powerType
-	local spellCost = 0
-	local si = OvaleData.spellInfo[spellId]
-	if si and si[powerType] then
-		--[[
-			cost == 0 means the that spell uses no resources.
-			cost > 0 means that the spell costs resources.
-			cost < 0 means that the spell generates resources.
-			cost == "finisher" means that the spell uses all of the resources (zeroes it out).
-		--]]
-		local cost = si[powerType]
-		if cost == "finisher" then
-			-- This spell is a finisher so compute the cost based on the amount of resources consumed.
-			cost = state[powerType]
-			-- Clamp cost between values defined by min_<powerType> and max_<powerType>.
-			local minCostParam = "min_" .. powerType
-			local maxCostParam = "max_" .. powerType
-			local minCost = si[minCostParam] or 1
-			local maxCost = si[maxCostParam]
-			if cost < minCost then
-				cost = minCost
-			end
-			if maxCost and cost > maxCost then
-				cost = maxCost
-			end
-		else
+do
+	local BUFF_PERCENT_REDUCTION = {
+		["_less15"] = 0.85,
+		["_less50"] = 0.50,
+		["_less75"] = 0.25,
+		["_half"] = 0.5,
+	}
+
+	statePrototype.PowerCost = function(state, spellId, powerType)
+		local buffParam = "buff_" .. powerType
+		local spellCost = 0
+		local si = OvaleData.spellInfo[spellId]
+		if si and si[powerType] then
 			--[[
-				Add extra resource generated by presence of a buff.
-				"buff_<powerType>" is the spell ID of the buff that causes extra resources to be generated or used.
-				"buff_<powerType>_amount" is the amount of extra resources generated or used, defaulting to -1
-					(one extra resource generated).
+				cost == 0 means the that spell uses no resources.
+				cost > 0 means that the spell costs resources.
+				cost < 0 means that the spell generates resources.
+				cost == "finisher" means that the spell uses all of the resources (zeroes it out).
 			--]]
-			local buffExtraParam = buffParam
-			local buffAmountParam = buffParam .. "_amount"
-			local buffExtra = si[buffExtraParam]
-			if buffExtra then
-				local aura = state:GetAura("player", buffExtra, nil, true)
-				if state:IsActiveAura(aura) then
-					local buffAmount = si[buffAmountParam] or -1
-					cost = cost + buffAmount
+			local cost = si[powerType]
+			if cost == "finisher" then
+				-- This spell is a finisher so compute the cost based on the amount of resources consumed.
+				cost = state[powerType]
+				-- Clamp cost between values defined by min_<powerType> and max_<powerType>.
+				local minCostParam = "min_" .. powerType
+				local maxCostParam = "max_" .. powerType
+				local minCost = si[minCostParam] or 1
+				local maxCost = si[maxCostParam]
+				if cost < minCost then
+					cost = minCost
 				end
-			end
-			if cost > 0 then
+				if maxCost and cost > maxCost then
+					cost = maxCost
+				end
+			else
 				--[[
-					Apply any percent reductions to cost after fixed reductions are applied.
-					This seems to be a consistent Blizzard rule for spell costs so that you
-					never end up with a negative spell cost.
+					Add extra resource generated by presence of a buff.
+					"buff_<powerType>" is the spell ID of the buff that causes extra resources to be generated or used.
+					"buff_<powerType>_amount" is the amount of extra resources generated or used, defaulting to -1
+						(one extra resource generated).
 				--]]
-				-- "buff_<powerType>_half" is the spell ID of the buff that makes casting the spell cost half the resources.
-				local buffHalfCostParam = buffParam .. "_half"
-				local buffHalfCost = si[buffHalfCostParam]
-				if buffHalfCost then
-					local aura = state:GetAura("player", buffHalfCost)
+				local buffExtraParam = buffParam
+				local buffAmountParam = buffParam .. "_amount"
+				local buffExtra = si[buffExtraParam]
+				if buffExtra then
+					local aura = state:GetAura("player", buffExtra, nil, true)
 					if state:IsActiveAura(aura) then
-						cost = ceil(cost / 2)
+						local buffAmount = si[buffAmountParam] or -1
+						cost = cost + buffAmount
+					end
+				end
+				if cost > 0 then
+					--[[
+						Apply any percent reductions to cost after fixed reductions are applied.
+						This seems to be a consistent Blizzard rule for spell costs so that you
+						never end up with a negative spell cost.
+					--]]
+					for suffix, multiplier in pairs(BUFF_PERCENT_REDUCTION) do
+						local buffPercentReduction = si[buffParam .. suffix]
+						if buffPercentReduction then
+							local aura = state:GetAura("player", buffPercentReduction)
+							if state:IsActiveAura(aura) then
+								cost = cost * multiplier
+							end
+						end
 					end
+					cost = ceil(cost)
 				end
 			end
-		end

-		local buffNoCostParam = buffParam .. "_none"
-		local buffNoCost = si[buffNoCostParam]
-		if buffNoCost then
-			-- "buff_<powerType>_none" is the spell ID of the buff that makes casting the spell resource-free.
-			local aura = state:GetAura("player", buffNoCost)
-			if state:IsActiveAura(aura) then
-				cost = 0
+			local buffNoCostParam = buffParam .. "_none"
+			local buffNoCost = si[buffNoCostParam]
+			if buffNoCost then
+				-- "buff_<powerType>_none" is the spell ID of the buff that makes casting the spell resource-free.
+				local aura = state:GetAura("player", buffNoCost)
+				if state:IsActiveAura(aura) then
+					cost = 0
+				end
 			end
-		end
-		spellCost = cost
-	else
-		-- Determine cost using information from GetSpellInfo() if there is no SpellInfo() for the spell's cost.
-		local _, _, _, cost, _, powerTypeId = API_GetSpellInfo(spellId)
-		if cost and powerTypeId and powerType == OvalePower.POWER_TYPE[powerTypeId] then
 			spellCost = cost
+		else
+			-- Determine cost using information from GetSpellInfo() if there is no SpellInfo() for the spell's cost.
+			local _, _, _, cost, _, powerTypeId = API_GetSpellInfo(spellId)
+			if cost and powerTypeId and powerType == OvalePower.POWER_TYPE[powerTypeId] then
+				spellCost = cost
+			end
 		end
+		return spellCost
 	end
-	return spellCost
 end

 -- Print out the levels of each power type in the current state.