James D. Callahan III [04-02-10 - 01:24]
diff --git a/ARL.lua b/ARL.lua
index f61de15..5f97662 100644
--- a/ARL.lua
+++ b/ARL.lua
@@ -517,10 +517,8 @@ function addon:OnInitialize()
if scanned then
local skill_level = Player.professions[recipe_prof]
local has_level = skill_level and (type(skill_level) == "boolean" and true or skill_level >= recipe.skill_level)
- local SF = private.recipe_state_flags
- local is_known = (bit.band(recipe.state, SF.KNOWN) == SF.KNOWN)
- if ((not is_known and has_level) or shifted) and Player:IsCorrectFaction(recipe) then
+ if ((not recipe:HasState("KNOWN") and has_level) or shifted) and Player:IsCorrectFaction(recipe) then
local _, _, _, hex = GetItemQualityColor(recipe.quality)
self:AddLine(string.format("%s: %s%s|r (%d)", recipe.profession, hex, recipe.name, recipe.skill_level))
@@ -826,59 +824,116 @@ end
-- Recipe DB Structures are defined in Documentation.lua
-------------------------------------------------------------------------------
---- Adds a tradeskill recipe into the specified recipe database
--- @name AckisRecipeList:AddRecipe
--- @usage AckisRecipeList:AddRecipe(28927, 305, 23109, Q.UNCOMMON, V.TBC, 305, 305, 325, 345)
--- @param spell_id The [[http://www.wowwiki.com/SpellLink|Spell ID]] of the recipe being added to the database
--- @param skill_level The skill level at which the recipe can be initially learned
--- @param item_id The [[http://www.wowwiki.com/ItemLink|Item ID]] that is created by the recipe, or nil
--- @param quality The quality/rarity of the recipe
--- @param profession The profession ID that uses the recipe. See [[API/database-documentation]] for a listing of profession IDs
--- @param specialty The specialty that uses the recipe (ie: goblin engineering) or nil or blank
--- @param genesis Game version that the recipe was first introduced in, for example, Original, BC, or WoTLK
--- @param optimal_level Level at which recipe is considered orange
--- @param medium_level Level at which recipe is considered yellow
--- @param easy_level Level at which recipe is considered green
--- @param trivial_level Level at which recipe is considered grey
--- @return None, array is passed as a reference
-function addon:AddRecipe(spell_id, skill_level, item_id, quality, profession, specialty, genesis, optimal_level, medium_level, easy_level, trivial_level)
- local recipe_list = private.recipe_list
+do
+ local SF = private.recipe_state_flags
+
+ -------------------------------------------------------------------------------
+ -- Recipe member functions for bit flags.
+ -------------------------------------------------------------------------------
+ local function Recipe_HasState(self, state_name)
+ return self.state and (bit.band(self.state, SF[state_name]) == SF[state_name]) or false
+ end
- if recipe_list[spell_id] then
- --@alpha@
- self:Print("Duplicate recipe: "..recipe_list[spell_id].profession.." "..tostring(spell_id).." "..recipe_list[spell_id].name)
- --@end-alpha@
- return
+ local function Recipe_AddState(self, state_name)
+ if not self.state then
+ self.state = 0
+ end
+
+ if bit.band(self.state, SF[state_name]) == SF[state_name] then
+ return
+ end
+ self.state = bit.bxor(self.state, SF[state_name])
end
- local recipe = {
- ["spell_id"] = spell_id,
- ["skill_level"] = skill_level,
- ["item_id"] = item_id,
- ["quality"] = quality,
- ["profession"] = GetSpellInfo(profession),
- ["spell_link"] = GetSpellLink(spell_id),
- ["name"] = GetSpellInfo(spell_id),
- ["flags"] = {},
- ["acquire_data"] = {},
- ["specialty"] = specialty, -- Assumption: there will only be 1 speciality for a trade skill
- ["genesis"] = genesis,
- ["optimal_level"] = optimal_level or skill_level,
- ["medium_level"] = medium_level or skill_level + 10,
- ["easy_level"] = easy_level or skill_level + 15,
- ["trivial_level"] = trivial_level or skill_level + 20,
- ["state"] = 0, -- State flags.
+ local function Recipe_RemoveState(self, state_name)
+ if not self.state then
+ return
+ end
+
+ if bit.band(self.state, SF[state_name]) ~= SF[state_name] then
+ return
+ end
+ self.state = bit.bxor(self.state, SF[state_name])
+
+ if self.state == 0 then
+ self.state = nil
+ end
+ end
+
+ local BITFIELD_MAP = {
+ ["common1"] = private.common_flags_word1,
+ ["class1"] = private.class_flags_word1,
+ ["reputation1"] = private.rep_flags_word1,
+ ["reputation2"] = private.rep_flags_word2,
+ ["item1"] = private.item_flags_word1,
}
- local SF = private.recipe_state_flags
- -- Set the "relevant" flag for searches, until I peer at the search logic to make this unnecessary.
- recipe.state = bit.bxor(recipe.state, SF.RELEVANT)
+ local function Recipe_IsFlagged(self, field_name, flag_name)
+ local bitfield = self[field_name]
+ local bitset = BITFIELD_MAP[field_name]
+ local value = bitset[flag_name]
- if not recipe.name then
- self:Print(strformat(L["SpellIDCache"], spell_id))
+ return bitfield and (bit.band(bitfield, value) == value) or false
end
- recipe_list[spell_id] = recipe
-end
+
+ --- Adds a tradeskill recipe into the specified recipe database
+ -- @name AckisRecipeList:AddRecipe
+ -- @usage AckisRecipeList:AddRecipe(28927, 305, 23109, Q.UNCOMMON, V.TBC, 305, 305, 325, 345)
+ -- @param spell_id The [[http://www.wowwiki.com/SpellLink|Spell ID]] of the recipe being added to the database
+ -- @param skill_level The skill level at which the recipe can be initially learned
+ -- @param item_id The [[http://www.wowwiki.com/ItemLink|Item ID]] that is created by the recipe, or nil
+ -- @param quality The quality/rarity of the recipe
+ -- @param profession The profession ID that uses the recipe. See [[API/database-documentation]] for a listing of profession IDs
+ -- @param specialty The specialty that uses the recipe (ie: goblin engineering) or nil or blank
+ -- @param genesis Game version that the recipe was first introduced in, for example, Original, BC, or WoTLK
+ -- @param optimal_level Level at which recipe is considered orange
+ -- @param medium_level Level at which recipe is considered yellow
+ -- @param easy_level Level at which recipe is considered green
+ -- @param trivial_level Level at which recipe is considered grey
+ -- @return None, array is passed as a reference
+ function addon:AddRecipe(spell_id, skill_level, item_id, quality, profession, specialty, genesis, optimal_level, medium_level, easy_level, trivial_level)
+ local recipe_list = private.recipe_list
+
+ if recipe_list[spell_id] then
+ --@alpha@
+ self:Print("Duplicate recipe: "..recipe_list[spell_id].profession.." "..tostring(spell_id).." "..recipe_list[spell_id].name)
+ --@end-alpha@
+ return
+ end
+
+ local recipe = {
+ ["spell_id"] = spell_id,
+ ["skill_level"] = skill_level,
+ ["item_id"] = item_id,
+ ["quality"] = quality,
+ ["profession"] = GetSpellInfo(profession),
+ ["spell_link"] = GetSpellLink(spell_id),
+ ["name"] = GetSpellInfo(spell_id),
+ ["flags"] = {},
+ ["acquire_data"] = {},
+ ["specialty"] = specialty, -- Assumption: there will only be 1 speciality for a trade skill
+ ["genesis"] = genesis,
+ ["optimal_level"] = optimal_level or skill_level,
+ ["medium_level"] = medium_level or skill_level + 10,
+ ["easy_level"] = easy_level or skill_level + 15,
+ ["trivial_level"] = trivial_level or skill_level + 20,
+
+ -- Function members
+ ["HasState"] = Recipe_HasState,
+ ["AddState"] = Recipe_AddState,
+ ["RemoveState"] = Recipe_RemoveState,
+ ["IsFlagged"] = Recipe_IsFlagged,
+ }
+
+ -- Set the "relevant" flag for searches, until I peer at the search logic to make this unnecessary.
+ recipe:AddState("RELEVANT")
+
+ if not recipe.name then
+ self:Print(strformat(L["SpellIDCache"], spell_id))
+ end
+ recipe_list[spell_id] = recipe
+ end
+end -- do
--- Adds filtering flags to a specific tradeskill.
-- @name AckisRecipeList:AddRecipeFlags
@@ -1583,7 +1638,7 @@ do
for recipe_id, recipe in pairs(recipe_list) do
if recipe.profession == current_profession then
- local is_known = (bit.band(recipe.state, SF.KNOWN) == SF.KNOWN)
+ local is_known = recipe:HasState("KNOWN")
can_display = CanDisplayRecipe(recipe)
recipes_total = recipes_total + 1
@@ -1604,7 +1659,7 @@ do
else
can_display = false
end
- local is_visible = (bit.band(recipe.state, SF.VISIBLE) == SF.VISIBLE)
+ local is_visible = recipe:HasState("VISIBLE")
if (can_display and not is_visible) or (not can_display and is_visible) then
recipe.state = bit.bxor(recipe.state, SF.VISIBLE)
@@ -1771,11 +1826,7 @@ do
local recipe = recipe_list[tonumber(SpellString)]
if recipe then
- local is_known = (bit.band(recipe.state, SF.KNOWN) == SF.KNOWN)
-
- if not is_known then
- recipe.state = bit.bxor(recipe.state, SF.KNOWN)
- end
+ recipe:AddState("KNOWN")
recipes_found = recipes_found + 1
else
self:Debug(tradeName .. " " .. SpellString .. L["MissingFromDB"])
@@ -1955,7 +2006,7 @@ do
for recipe_id in pairs(recipe_list) do
local recipe = recipe_list[recipe_id]
local recipe_prof = GetSpellInfo(recipe.profession)
- local is_known = (bit.band(recipe.state, SF.KNOWN) == SF.KNOWN)
+ local is_known = recipe:HasState("KNOWN")
if recipe_prof == profession then
-- CSV
diff --git a/Frame.lua b/Frame.lua
index 7a5118a..e0b50c1 100644
--- a/Frame.lua
+++ b/Frame.lua
@@ -1336,9 +1336,7 @@ do
pattern = pattern:lower()
for index, entry in pairs(private.recipe_list) do
- if bit.band(entry.state, SF.RELEVANT) == SF.RELEVANT then
- entry.state = bit.bxor(entry.state, SF.RELEVANT)
- end
+ entry:RemoveState("RELEVANT")
for location_name in pairs(location_list) do
local breakout = false
@@ -1416,11 +1414,7 @@ ARL_ClearButton:SetScript("OnClick",
-- Reset the search flags
for index in pairs(recipe_list) do
- local recipe = recipe_list[index]
-
- if bit.band(recipe.state, SF.RELEVANT) ~= SF.RELEVANT then
- recipe.state = bit.bxor(recipe.state, SF.RELEVANT)
- end
+ recipe_list[index]:AddState("RELEVANT")
end
MainPanel.search_editbox:SetText(_G.SEARCH)
@@ -1497,11 +1491,7 @@ MainPanel.search_editbox:SetScript("OnTextSet",
local recipe_list = private.recipe_list
for spell_id in pairs(recipe_list) do
- local recipe = recipe_list[spell_id]
-
- if bit.band(recipe.state, SF.RELEVANT) ~= SF.RELEVANT then
- recipe.state = bit.bxor(recipe.state, SF.RELEVANT)
- end
+ recipe_list[spell_id]:AddState("RELEVANT")
end
ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
ARL_SearchButton:Disable()
@@ -2892,10 +2882,8 @@ do
for spell_id, affiliation in pairs(private.acquire_list[acquire_type].recipes) do
local recipe = private.recipe_list[spell_id]
local can_display = HasCredentials(affiliation)
- local is_visible = (bit.band(recipe.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe.state, SF.RELEVANT) == SF.RELEVANT)
- if can_display and is_visible and is_relevant then
+ if can_display and recipe:HasState("VISIBLE") and recipe:HasState("RELEVANT") then
count = count + 1
if not recipe_registry[recipe] then
@@ -2931,10 +2919,8 @@ do
for spell_id, affiliation in pairs(private.location_list[loc_name].recipes) do
local recipe = private.recipe_list[spell_id]
local can_display = HasCredentials(affiliation)
- local is_visible = (bit.band(recipe.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe.state, SF.RELEVANT) == SF.RELEVANT)
- if can_display and is_visible and is_relevant then
+ if can_display and recipe:HasState("VISIBLE") and recipe:HasState("RELEVANT") then
count = count + 1
if not recipe_registry[recipe] then
@@ -2959,10 +2945,8 @@ do
for i = 1, #sorted_recipes do
local recipe_index = sorted_recipes[i]
local recipe = recipe_list[recipe_index]
- local is_visible = (bit.band(recipe.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe.state, SF.RELEVANT) == SF.RELEVANT)
- if is_visible and is_relevant then
+ if recipe:HasState("VISIBLE") and recipe:HasState("RELEVANT") then
local t = AcquireTable()
t.text = FormatRecipeText(recipe)
@@ -3455,10 +3439,8 @@ do
for spell_id, affiliation in pairs(private.acquire_list[acquire_id].recipes) do
local recipe_entry = private.recipe_list[spell_id]
local can_display = HasCredentials(affiliation)
- local is_visible = (bit.band(recipe_entry.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe_entry.state, SF.RELEVANT) == SF.RELEVANT)
- if can_display and is_visible and is_relevant then
+ if can_display and recipe_entry:HasState("VISIBLE") and recipe_entry:HasState("RELEVANT") then
local t = AcquireTable()
local expand = false
local type = "subheader"
@@ -3492,10 +3474,8 @@ do
for spell_id, affiliation in pairs(private.location_list[location_id].recipes) do
local recipe_entry = private.recipe_list[spell_id]
local can_display = HasCredentials(affiliation)
- local is_visible = (bit.band(recipe_entry.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe_entry.state, SF.RELEVANT) == SF.RELEVANT)
- if can_display and is_visible and is_relevant then
+ if can_display and recipe_entry:HasState("VISIBLE") and recipe_entry:HasState("RELEVANT") then
local expand = false
local type = "subheader"
local t = AcquireTable()
diff --git a/Waypoint.lua b/Waypoint.lua
index a57f8d0..80c2581 100644
--- a/Waypoint.lua
+++ b/Waypoint.lua
@@ -355,23 +355,17 @@ local function GetWaypoint(acquire_type, id_num, recipe)
waypoint = quest
end
elseif acquire_type == A.CUSTOM then
- local bitfield = recipe.flags.common1
- local COMMON1 = private.common_flags_word1
-
- if bit.band(bitfield, COMMON1.TRAINER) == COMMON1.TRAINER and maptrainer then
- waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.VENDOR) == COMMON1.VENDOR and mapvendor then
- waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.QUEST) == COMMON1.QUEST and mapquest then
- waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.INSTANCE) == COMMON1.INSTANCE then
- waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.RAID) == COMMON1.RAID then
+ if recipe:IsFlagged("common1", "TRAINER") and maptrainer then
waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.WORLD_DROP) == COMMON1.WORLD_DROP then
+ elseif recipe:IsFlagged("common1", "VENDOR") and mapvendor then
waypoint = private.custom_list[id_num]
- elseif bit.band(bitfield, COMMON1.MOB_DROP) == COMMON1.MOB_DROP then
+ elseif recipe:IsFlagged("common1", "QUEST") and mapquest then
waypoint = private.custom_list[id_num]
+ elseif recipe:IsFlagged("common1", "INSTANCE") or
+ recipe:IsFlagged("common1", "RAID") or
+ recipe:IsFlagged("common1", "WORLD_DROP") or
+ recipe:IsFlagged("common1", "MOB_DROP") then
+ waypoint = private.custom_list[id_num]
end
end
return waypoint
@@ -438,10 +432,8 @@ function addon:SetupMap(single_recipe)
-- Scan through all recipes to display, and add the vendors to a list to get their acquire info
for i = 1, #sorted_recipes do
local recipe = recipe_list[sorted_recipes[i]]
- local is_visible = (bit.band(recipe.state, SF.VISIBLE) == SF.VISIBLE)
- local is_relevant = (bit.band(recipe.state, SF.RELEVANT) == SF.RELEVANT)
- if is_visible and is_relevant then
+ if recipe:HasState("VISIBLE") and recipe:HasState("RELEVANT") then
for acquire_type, acquire_info in pairs(recipe.acquire_data) do
for id_num, id_info in pairs(acquire_info) do
if acquire_type == A.REPUTATION then