Quantcast
-- SageItem.lua

----------------------------------------------------------------------------------------------------
local Class = (sage and sage.class and sage.class.Class) or error("Need access to sage.class.Class")

local Reforgings = sage.reforge and sage.reforge.Reforgings or error("Need Reforgings")
----------------------------------------------------------------------------------------------------

local Item do
	local class = Class:NewClass{name="Item"}

	function class:_Initialize(instance, ...)		-- self is class
		local nArgs = select("#", ...)
		if nArgs == 1 then
			local item = select(1, ...)
			local _, itemLink = GetItemInfo(item)
			return self:_Initialize(instance,
					itemLink:match("item:(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%-?%d+):(%-?%d+):(%d+):(%d+)"))
		elseif nArgs == 10 then
			local itemId, enchantId, jewelId1, jewelId2, jewelId3, jewelId4, suffixId,
					uniqueId, linkLevel, reforgeId = ...

			instance.itemId = itemId
			instance.enchantId = enchantId
			instance.jewelId1 = jewelId1
			instance.jewelId2 = jewelId2
			instance.jewelId3 = jewelId3
			instance.jewelId4 = jewelId4
			instance.suffixId = suffixId
			instance.uniqueId = uniqueId
			instance.linkLevel = linkLevel
			instance.reforgeId = reforgeId

			instance.reforgings = Reforgings:New()
		else
			error("Could not initialize Item: " .. nArgs .. " " .. tostring(select(1, ...)))
		end
	end

	-- Fetches item stats, acounting for any reforging that has taken place
	function class:GetItemStats(optTable)
		local reforging = self.reforgings:Find(self:ItemString())
		return reforging
				and self:GetReforgedItemStats(reforging, optTable)
				or GetItemStats(self:ItemString(), optTable)
	end

	-- Computes stats as if the item were forged with the specified reforging
	function class:GetReforgedItemStats(reforging, optTable)
		local stats = GetItemStats(self:ItemString(), optTable)
		reforging:AdjustStats(stats)
		return stats
	end

	function class:WithoutMods()
		return self.class:New(self.itemId,
				"0", 														-- enchantId
				"0", "0", "0", "0", 						-- jewelId1-4
				self.suffixId, self.uniqueId, self.linkLevel,
				"0")										-- reforgeId
	end

	function class:ItemLink()
		return select(2, GetItemInfo(self:ItemString()))
	end

	function class:ItemString()
		if not self.itemString then
			self.itemString = "item"
					.. ":" .. self.itemId
					.. ":" .. self.enchantId
					.. ":" .. self.jewelId1
					.. ":" .. self.jewelId2
					.. ":" .. self.jewelId3
					.. ":" .. self.jewelId4
					.. ":" .. self.suffixId
					.. ":" .. self.uniqueId
					.. ":" .. self.linkLevel
					.. ":" .. self.reforgeId
		end
		return self.itemString
	end

	Item = class
end

sage.item = sage.item or {}
sage.item.Item = Item