17,097
edits
(_getItemUseTable: Support GP & SC in various artisan skills) |
(Update for v1.1) |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local Constants = require('Module:Constants') | local Constants = require('Module:Constants') | ||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local GameData = require('Module:GameData') | |||
local SkillData = GameData.skillData | |||
local Magic = require('Module:Magic') | local Magic = require('Module:Magic') | ||
local Areas = require('Module:CombatAreas') | local Areas = require('Module:CombatAreas') | ||
Line 12: | Line 11: | ||
local Agility = require('Module:Skills/Agility') | local Agility = require('Module:Skills/Agility') | ||
local Shop = require('Module:Shop') | local Shop = require('Module:Shop') | ||
--Brute forcing some item uses to make things easier | --Brute forcing some item uses to make things easier | ||
local itemUseArray = { | local itemUseArray = { | ||
Agility = {}, | Agility = {}, | ||
Astrology = {'Stardust', ' | Astrology = {'melvorF:Stardust', 'melvorF:Golden_Stardust'}, | ||
Attack = {}, | Attack = {}, | ||
Combat = {' | Combat = {'melvorF:Gold_Emerald_Ring', 'melvorD:Obsidian_Cape', 'melvorF:Throwing_Power_Gloves'}, | ||
Cooking = {' | Cooking = {'melvorD:Cooking_Gloves', 'melvorD:Crown_of_Rhaelyx'}, | ||
Crafting = {' | Crafting = {'melvorD:Crown_of_Rhaelyx'}, | ||
Defence = {}, | Defence = {}, | ||
Farming = {'Compost', ' | Farming = {'melvorD:Compost', 'melvorD:Weird_Gloop', 'melvorD:Bobs_Rake'}, | ||
Firemaking = {' | Firemaking = {'melvorD:Crown_of_Rhaelyx'}, | ||
Fishing = {' | Fishing = {'melvorD:Amulet_of_Fishing', 'melvorD:Message_In_A_Bottle', 'melvorD:Barbarian_Gloves'}, | ||
Fletching = {' | Fletching = {'melvorD:Crown_of_Rhaelyx'}, | ||
Herblore = {' | Herblore = {'melvorD:Crown_of_Rhaelyx'}, | ||
Hitpoints = {}, | Hitpoints = {}, | ||
Magic = {}, | Magic = {}, | ||
Mining = {' | Mining = {'melvorD:Mining_Gloves', 'melvorD:Gem_Gloves'}, | ||
Prayer = {}, | Prayer = {}, | ||
Ranged = {}, | Ranged = {}, | ||
Runecrafting = {' | Runecrafting = {'melvorD:Crown_of_Rhaelyx'}, | ||
Slayer = {}, | Slayer = {}, | ||
Smithing = {' | Smithing = {'melvorD:Smithing_Gloves', 'melvorD:Crown_of_Rhaelyx'}, | ||
Strength = {}, | Strength = {}, | ||
Summoning = {' | Summoning = {'melvorD:Crown_of_Rhaelyx'}, | ||
Thieving = {' | Thieving = {'melvorF:Chapeau_Noir', 'melvorF:Thieving_Gloves', 'melvorF:Gloves_of_Silence'}, | ||
Woodcutting = {}, | Woodcutting = {}, | ||
} | } | ||
function p._getItemUses(item, asList, addCategories) | function p._getItemUses(item, asList, addCategories) | ||
Line 93: | Line 58: | ||
local addUse = function(useName) | local addUse = function(useName) | ||
local skillID = ( | local skillID = Constants.getSkillID(useName) | ||
if | if skillID == nil then | ||
if | -- May have been passed a skill ID instead | ||
skillUses[skillID] = | local skillName = Constants.getSkillName(useName) | ||
if skillName ~= nil then | |||
skillID = useName | |||
skillUses[skillID] = skillName | |||
end | end | ||
else | |||
skillUses[skillID] = useName | |||
end | |||
if skillID == nil and not otherUses[useName] then | |||
otherUses[useName] = true | otherUses[useName] = true | ||
end | end | ||
end | end | ||
local hasUse = function(useName) | local hasUse = function(useName) | ||
local skillID = ( | local skillID = Constants.getSkillID(useName) or (Constants.getSkillName(useName) ~= nil and useName) | ||
if | if skillID ~= nil then | ||
return (skillUses[skillID] ~= nil) or false | return (skillUses[skillID] ~= nil) or false | ||
else | else | ||
Line 113: | Line 85: | ||
-- Check for any overrides within itemUseArray | -- Check for any overrides within itemUseArray | ||
for useName, itemList in pairs(itemUseArray) do | for useName, itemList in pairs(itemUseArray) do | ||
if Shared.contains(itemList, item. | if Shared.contains(itemList, item.id) then | ||
addUse(useName) | addUse(useName) | ||
end | end | ||
end | end | ||
-- If the item has any modifiers that affect a given skill, add it to those tables | -- If the item has any modifiers that affect a given skill, add it to those tables | ||
-- Added | -- Added special handling for Mastery Tokens since they were being incorrectly flagged as usable for all skills | ||
if item.modifiers ~= nil | if item.modifiers ~= nil then | ||
if item.modifiers.masteryToken ~= nil then | |||
-- Mastery tokens | |||
addUse('Mastery') | |||
else | |||
local globalMods = { | |||
'increasedChanceToDoubleItemsGlobal', | |||
'decreasedChanceToDoubleItemsGlobal', | |||
'increasedGlobalSkillIntervalPercent', | |||
'decreasedGlobalSkillIntervalPercent', | |||
'increasedGlobalSkillXP', | |||
'decreasedGlobalSkillXP' | |||
} | |||
for i, globalMod in ipairs(globalMods) do | |||
if item.modifiers[globalMod] ~= nil then | |||
addUse('AllSkills') | |||
break | |||
end | |||
end | |||
if not hasUse('AllSkills') then | |||
local skillArray = Constants.getModifierSkills(item.modifiers) | |||
for i, skillName in ipairs(skillArray) do | |||
addUse(skillName) | |||
end | |||
end | |||
end | end | ||
end | end | ||
Line 140: | Line 126: | ||
-- Check if the item is an entry requirement for any Slayer area | -- Check if the item is an entry requirement for any Slayer area | ||
if not hasUse( | if not hasUse('Slayer') and (item.validSlots ~= nil or item.occupiesSlots ~= nil or item.equipmentStats ~= nil) then | ||
local slayerAreas = Areas.getAreas(function(area) return area.type == ' | local slayerAreas = Areas.getAreas(function(area) return area.type == 'slayerArea' and type(area.entryRequirements) == 'table' end) | ||
for i, area in | for i, area in ipairs(slayerAreas) do | ||
for j, req in | for j, req in ipairs(area.entryRequirements) do | ||
if req.type == "SlayerItem" and req.itemID == item.id then | if req.type == "SlayerItem" and req.itemID == item.id then | ||
addUse( | addUse('Slayer') | ||
break | break | ||
end | end | ||
end | end | ||
if hasUse( | if hasUse('Slayer') then | ||
break | break | ||
end | end | ||
Line 156: | Line 142: | ||
-- Can the item be upgraded, or is it part of an upgrade recipe? | -- Can the item be upgraded, or is it part of an upgrade recipe? | ||
if item. | for i, upgrade in ipairs(GameData.rawData.itemUpgrades) do | ||
if upgrade.upgradedItemID == item.id then | |||
addUse('Upgrade') | |||
else | |||
for j, itemCost in ipairs(upgrade.itemCosts) do | |||
if itemCost.id == item.id then | |||
addUse('Upgrade') | |||
break | break | ||
end | end | ||
end | end | ||
end | |||
if hasUse('Upgrade') then | |||
break | |||
end | end | ||
end | end | ||
Line 182: | Line 166: | ||
end | end | ||
if item. | if item.dropTable ~= nil then | ||
table.insert(categoryArray, '[[Category:Openable Items]]') | table.insert(categoryArray, '[[Category:Openable Items]]') | ||
addUse('Chest') | addUse('Chest') | ||
Line 190: | Line 174: | ||
-- All have somewhat consistent recipe data structures | -- All have somewhat consistent recipe data structures | ||
local recipeSkillIDs = { | local recipeSkillIDs = { | ||
'melvorD:Cooking', | |||
'melvorD:Smithing', | |||
'melvorD:Fletching', | |||
'melvorD:Crafting', | |||
'melvorD:Runecrafting', | |||
'melvorD:Herblore' | |||
} | } | ||
for i, recipeSkillID in ipairs(recipeSkillIDs) do | for i, recipeSkillID in ipairs(recipeSkillIDs) do | ||
if not hasUse(recipeSkillID) then | if not hasUse(recipeSkillID) then | ||
local | local localSkillID = GameData.getLocalID(recipeSkillID) | ||
-- Iterate over all recipes for the current skill | -- Iterate over all recipes for the current skill | ||
for j, recipe in ipairs(SkillData[ | for j, recipe in ipairs(SkillData[localSkillID].recipes) do | ||
for k, itemCost in ipairs(recipe.itemCosts) do | for k, itemCost in ipairs(recipe.itemCosts) do | ||
if itemCost.id == item.id then | if itemCost.id == item.id then | ||
Line 231: | Line 214: | ||
-- Firemaking | -- Firemaking | ||
if not hasUse( | if not hasUse('melvorD:Firemaking') then | ||
for i, recipe in ipairs(SkillData.Firemaking.logs) do | |||
if recipe.logID == item.id then | |||
addUse('melvorD:Firemaking') | |||
break | |||
end | |||
end | |||
end | end | ||
-- Farming | -- Farming | ||
if not hasUse( | if not hasUse('melvorD:Farming') then | ||
for i, recipe in ipairs(SkillData.Farming.recipes) do | |||
if recipe.seedCost.id == item.id then | |||
addUse('melvorD:Farming') | |||
break | |||
end | |||
end | |||
end | end | ||
-- Agility | -- Agility | ||
if not hasUse( | if not hasUse('melvorD:Agility') and not Shared.tableIsEmpty(Agility.getObstaclesForItem(item.id)) then | ||
addUse( | addUse('melvorD:Agility') | ||
end | end | ||
-- Summoning | -- Summoning | ||
if not hasUse( | if not hasUse('melvorD:Summoning') then | ||
for i, recipe in ipairs(SkillData.Summoning. | for i, recipe in ipairs(SkillData.Summoning.recipes) do | ||
-- Tablets & Non-shard items | -- Tablets & Non-shard items | ||
if recipe. | if recipe.productID == item.id or Shared.contains(recipe.nonShardItemCosts, item.id) then | ||
addUse( | addUse('melvorD:Summoning') | ||
break | break | ||
else | else | ||
Line 256: | Line 249: | ||
for j, itemCost in ipairs(recipe.itemCosts) do | for j, itemCost in ipairs(recipe.itemCosts) do | ||
if itemCost.id == item.id then | if itemCost.id == item.id then | ||
addUse( | addUse('melvorD:Summoning') | ||
break | break | ||
end | end | ||
end | end | ||
end | end | ||
Line 270: | Line 260: | ||
if item.prayerPoints ~= nil then | if item.prayerPoints ~= nil then | ||
table.insert(categoryArray, '[[Category:Buriable Items]]') | table.insert(categoryArray, '[[Category:Buriable Items]]') | ||
if not hasUse( | if not hasUse('melvorD:Prayer') then | ||
addUse( | addUse('melvorD:Prayer') | ||
end | end | ||
end | end | ||
Line 278: | Line 268: | ||
if not (hasUse('Magic') and hasUse('AltMagic')) then | if not (hasUse('Magic') and hasUse('AltMagic')) then | ||
-- First check if the item its self is used in any spells | -- First check if the item its self is used in any spells | ||
local spellList = Magic. | local spellList = Magic.getSpellsUsingItem(item.id, true) | ||
for i, spell in ipairs(spellList) do | for i, spell in ipairs(spellList) do | ||
local useKey = (spell.type == ' | local useKey = (spell.type == 'altMagic' and 'AltMagic' or 'Magic') | ||
if not hasUse(useKey) then | if not hasUse(useKey) then | ||
addUse(useKey) | addUse(useKey) | ||
Line 286: | Line 276: | ||
end | end | ||
-- Check if the item provides runes, if it does check where they are used also | -- Check if the item provides runes, if it does check where they are used also | ||
if item. | if item.providedRunes ~= nil then | ||
for i, | for i, rune in ipairs(item.providedRunes) do | ||
if hasUse('Magic') and hasUse('AltMagic') then | if hasUse('Magic') and hasUse('AltMagic') then | ||
break | break | ||
else | else | ||
local spellList = Magic. | local spellList = Magic.getSpellsUsingItem(rune.id, false) | ||
for j, spell in ipairs(spellList) do | for j, spell in ipairs(spellList) do | ||
local useKey = (spell.type == ' | local useKey = (spell.type == 'altMagic' and 'AltMagic' or 'Magic') | ||
if not hasUse(useKey) then | if not hasUse(useKey) then | ||
addUse(useKey) | addUse(useKey) | ||
Line 304: | Line 294: | ||
-- Other odds and ends: | -- Other odds and ends: | ||
-- Skillcapes are tied to the appropriate skill | -- Skillcapes are tied to the appropriate skill | ||
-- Except Maximum Skillcape, which is tied to all skills. (And so is the Signet Ring) | -- Except Maximum Skillcape, which is tied to all skills. (And so is the Signet Ring) | ||
-- And combat skillcapes, since combat skills don't get special treatment | -- And combat skillcapes, since combat skills don't get special treatment | ||
local ignoreCapes = {' | if item.tier == 'Skillcape' then | ||
local ignoreCapes = { | |||
'melvorD:Attack_Skillcape', | |||
'melvorD:Strength_Skillcape', | |||
'melvorD:Defence_Skillcape', | |||
'melvorD:Hitpoints_Skillcape', | |||
'melvorF:Ranged_Skillcape', | |||
'melvorTotH:Superior_Attack_Skillcape', | |||
'melvorTotH:Superior_Strength_Skillcape', | |||
'melvorTotH:Superior_Defence_Skillcape', | |||
'melvorTotH:Superior_Hitpoints_Skillcape', | |||
'melvorTotH:Superior_Ranged_Skillcape', | |||
} | |||
local allCapes = { | |||
'melvorF:Max_Skillcape', | |||
'melvorF:Cape_of_Completion', | |||
'melvorTotH:Superior_Max_Skillcape', | |||
'melvorTotH:Superior_Cape_Of_Completion' | |||
} | |||
if Shared.contains(allCapes, item.id) then | |||
addUse('AllSkills') | |||
elseif Shared.contains({'melvorF:Magic_Skillcape', 'melvorTotH:Superior_Magic_Skillcape'}, item.id) then | |||
addUse('melvorD:Magic') | |||
addUse('AltMagic') | |||
elseif not Shared.contains(ignoreCapes, item.id) then | |||
local splitName = Shared.splitString(item.name, ' ') | |||
local skillName = (splitName[1] == 'Superior' and splitName[2]) or splitName[1] | |||
addUse(skillName) | |||
end | |||
table.insert(categoryArray, '[[Category:Skillcapes]]') | table.insert(categoryArray, '[[Category:Skillcapes]]') | ||
end | end | ||
--Special note for Charge Stone of Rhaelyx | --Special note for Charge Stone of Rhaelyx | ||
if item. | if item.id == 'melvorD:Charge_Stone_of_Rhaelyx' then | ||
addUse('ChargeStone') | addUse('ChargeStone') | ||
end | end | ||
Line 335: | Line 337: | ||
--Some items are needed to make shop purchases | --Some items are needed to make shop purchases | ||
local shopArray = Shop.getItemCostArray(item.id) | local shopArray = Shop.getItemCostArray(item.id) | ||
if Shared. | if not Shared.tableIsEmpty(shopArray) then | ||
addUse('Shop') | addUse('Shop') | ||
end | end | ||
Line 371: | Line 373: | ||
local useArray = {} | local useArray = {} | ||
-- Loop through all | -- Loop through all upgrades to find anything that can be upgraded using our source | ||
for i, | for i, upgrade in ipairs(GameData.rawData.itemUpgrades) do | ||
for j, itemCost in ipairs(upgrade.itemCosts) do | |||
if itemCost.id == item.id then | |||
local rowReq = nil | |||
-- Potions do have upgrade requirements though | |||
local upgradeItem = Items.GetItemByID(upgrade.upgradedItemID) | |||
if upgradeItem ~= nil and upgradeItem.charges ~= nil and upgradeItem.tier ~= nil then | |||
local levelUnlock = GameData.getEntityByProperty(SkillData.Herblore.masteryLevelUnlocks, 'descriptionID', upgradeItem.tier + 1) | |||
if | if levelUnlock ~= nil then | ||
rowReq = Icons._MasteryReq( | rowReq = Icons._MasteryReq(upgradeItem.name, levelUnlock.level) | ||
end | end | ||
end | end | ||
table.insert(useArray, {item = {id = upgradeItem.id, name = upgradeItem.name}, qty = 1, mats = upgrade.itemCosts, skill = 'Upgrade', req = rowReq, xp = 'N/A', gp = upgrade.gpCost, sc = upgrade.scCost}) | |||
end | end | ||
end | end | ||
Line 393: | Line 394: | ||
-- All have somewhat consistent recipe data structures | -- All have somewhat consistent recipe data structures | ||
local recipeSkillIDs = { | local recipeSkillIDs = { | ||
'melvorD:Cooking', | |||
'melvorD:Smithing', | |||
'melvorD:Fletching', | |||
'melvorD:Crafting', | |||
'melvorD:Runecrafting', | |||
'melvorD:Herblore' | |||
} | } | ||
for i, recipeSkillID in ipairs(recipeSkillIDs) do | for i, recipeSkillID in ipairs(recipeSkillIDs) do | ||
local skillName = Constants.getSkillName(recipeSkillID) | local skillName = Constants.getSkillName(recipeSkillID) | ||
local | local localSkillID = GameData.getLocalID(recipeSkillID) | ||
-- Iterate over all recipes for the current skill | -- Iterate over all recipes for the current skill | ||
for j, recipe in ipairs(SkillData[ | for j, recipe in ipairs(SkillData[localSkillID].recipes) do | ||
local costLists = {recipe.alternativeCosts or {}, {{["itemCosts"] = recipe.itemCosts}}} | local costLists = {recipe.alternativeCosts or {}, {{["itemCosts"] = recipe.itemCosts}}} | ||
for k, costList in pairs(costLists) do | for k, costList in pairs(costLists) do | ||
Line 411: | Line 412: | ||
if itemCost.id == item.id then | if itemCost.id == item.id then | ||
local recipeItemIDs = nil | local recipeItemIDs = nil | ||
if recipeSkillID == | if recipeSkillID == 'melvorD:Herblore' then | ||
recipeItemIDs = recipe.potionIDs | recipeItemIDs = recipe.potionIDs | ||
elseif recipeSkillID == | elseif recipeSkillID == 'melvorD:Cooking' then | ||
recipeItemIDs = {recipe. | recipeItemIDs = {recipe.productID, recipe.perfectCookID} | ||
else | else | ||
recipeItemIDs = {recipe. | recipeItemIDs = {recipe.productID} | ||
end | end | ||
for o, recipeItemID in ipairs(recipeItemIDs) do | for o, recipeItemID in ipairs(recipeItemIDs) do | ||
Line 425: | Line 426: | ||
local rowReq = recipe.level | local rowReq = recipe.level | ||
local reqVal = nil | local reqVal = nil | ||
if recipeSkillID == | if recipeSkillID == 'melvorD:Herblore' then | ||
-- Herblore may also have a mastery requirement | -- Herblore may also have a mastery requirement | ||
local | local levelUnlock = GameData.getEntityByProperty(SkillData.Herblore.masteryLevelUnlocks, 'descriptionID', recipeItem.tier + 1) | ||
if | if levelUnlock ~= nil and levelUnlock.level > 1 then | ||
local masteryReq = Icons._MasteryReq(recipeItem.name, | local masteryReq = Icons._MasteryReq(recipeItem.name, levelUnlock.level) | ||
reqVal = rowReq + | reqVal = rowReq + levelUnlock.level * 0.01 | ||
rowReq = Icons._SkillReq(skillName, rowReq) .. '<br/>' .. masteryReq | rowReq = Icons._SkillReq(skillName, rowReq) .. '<br/>' .. masteryReq | ||
end | end | ||
end | end | ||
table.insert(useArray, {item = itemDef, qty = qty, mats = costDef.itemCosts, gp = recipe.gpCost, sc = recipe.scCost, skill = skillName, reqVal = reqVal, req = rowReq, xp = recipe. | table.insert(useArray, {item = itemDef, qty = qty, mats = costDef.itemCosts, gp = recipe.gpCost, sc = recipe.scCost, skill = skillName, reqVal = reqVal, req = rowReq, xp = recipe.baseExperience}) | ||
end | end | ||
end | end | ||
Line 446: | Line 447: | ||
-- Farming | -- Farming | ||
if item. | for i, recipe in ipairs(SkillData.Farming.recipes) do | ||
if recipe.seedCost.id == item.id then | |||
local product = Items.getItemByID(recipe.productID) | |||
local mat = {{id = recipe.seedCost.id, qty = recipe.seedCost.quantity}} | |||
local xp = recipe.baseExperience | |||
local rowReq = recipe.level | |||
local category = GameData.getEntityByID(SkillData.Farming.categories, recipe.categoryID) | |||
local qty = 5 * category.harvestMultiplier | |||
table.insert(useArray, {item = {id = product.id, name = product.name}, qty = qty, mats = mat, skill = 'Farming', req = rowReq, xp = xp}) | |||
end | |||
end | end | ||
Line 459: | Line 463: | ||
for i, obstacle in ipairs(obstacles) do | for i, obstacle in ipairs(obstacles) do | ||
local itemCosts = {} | local itemCosts = {} | ||
for j, itemDef in ipairs(obstacle. | for j, itemDef in ipairs(obstacle.itemCosts) do | ||
table.insert(itemCosts, {id = itemDef | table.insert(itemCosts, {id = itemDef.id, qty = itemDef.quantity}) | ||
end | end | ||
local req = Agility._getObstacleRequirements(obstacle) | local req = Agility._getObstacleRequirements(obstacle) | ||
--local objType = (obstacle.category == nil and 'Pillar') or 'Obstacle' | --local objType = (obstacle.category == nil and 'Pillar') or 'Obstacle' | ||
table.insert(useArray, {item = {id = obstacle.id, name = obstacle.name}, qty = 1, mats = itemCosts, gp = obstacle. | table.insert(useArray, {item = {id = obstacle.id, name = obstacle.name}, qty = 1, mats = itemCosts, gp = obstacle.gpCost, sc = obstacle.scCost, skill = 'Agility', req = req, type = 'skill'}) | ||
end | end | ||
-- Summoning | -- Summoning | ||
for i, recipe in ipairs(SkillData.Summoning. | for i, recipe in ipairs(SkillData.Summoning.recipes) do | ||
local recipeGPCost = SkillData.Summoning. | local recipeGPCost = SkillData.Summoning.recipeGPCost | ||
local useShards = false | local useShards = false | ||
local recipeItem = nil | local recipeItem = nil | ||
Line 483: | Line 487: | ||
-- Item is used in this particular synergy recipe | -- Item is used in this particular synergy recipe | ||
if recipeItem == nil then | if recipeItem == nil then | ||
recipeItem = Items.getItemByID(recipe. | recipeItem = Items.getItemByID(recipe.productID) | ||
end | end | ||
local nonShardItem = Items.getItemByID(nonShardItemID) | local nonShardItem = Items.getItemByID(nonShardItemID) | ||
Line 489: | Line 493: | ||
local nonShardQty = math.max(1, math.floor(recipeGPCost / itemValue)) | local nonShardQty = math.max(1, math.floor(recipeGPCost / itemValue)) | ||
local recipeCosts = Shared.clone(recipe.itemCosts) | local recipeCosts = Shared.clone(recipe.itemCosts) | ||
local recipeCosts = {} | |||
for k, itemCost in ipairs(recipe.itemCosts) do | |||
table.insert(recipeCosts, {id = itemCost.id, qty = itemCost.quantity}) | |||
end | |||
table.insert(recipeCosts, {id = nonShardItemID, qty = nonShardQty}) | table.insert(recipeCosts, {id = nonShardItemID, qty = nonShardQty}) | ||
table.insert(useArray, {item = {id = | table.insert(useArray, {item = {id = recipeItem.id, name = recipeItem.name}, qty = recipe.baseQuantity, mats = recipeCosts, gp = recipe.gpCost, sc = recipe.scCost, skill = 'Summoning', req = recipe.level, xp = recipe.baseExperience}) | ||
end | end | ||
end | end | ||
Line 499: | Line 507: | ||
for i, purchase in ipairs(shopUses) do | for i, purchase in ipairs(shopUses) do | ||
local rowReq = Shop.getRequirementString(purchase.unlockRequirements) | local rowReq = Shop.getRequirementString(purchase.unlockRequirements) | ||
local iconType = (purchase.contains.items ~= nil and Shared. | local iconType = (purchase.contains.items ~= nil and not Shared.tableIsEmpty(purchase.contains.items) and 'item') or 'upgrade' | ||
table.insert(useArray, {item = {name = purchase | local gpCost = Shop.getCurrencyCostString(purchase.cost, 'gp') | ||
local scCost = Shop.getCurrencyCostString(purchase.cost, 'slayerCoins') | |||
local rcCost = Shop.getCurrencyCostString(purchase.cost, 'raidCoins') | |||
table.insert(useArray, {item = {name = Shop._getPurchaseName(purchase)}, qty = 1, mats = purchase.cost.items, skill = 'Shop', req = rowReq, xp = 'N/A', gp = gpCost, sc = scCost, rc = rcCost, type = iconType}) | |||
end | end | ||
Line 520: | Line 531: | ||
local resultPart = {} | local resultPart = {} | ||
if Shared. | if not Shared.tableIsEmpty(useArray) then | ||
local typeTextList = { | local typeTextList = { | ||
["Shop"] = Icons.Icon({'Shop'}), | ["Shop"] = Icons.Icon({'Shop'}), | ||
Line 570: | Line 581: | ||
end | end | ||
end | end | ||
if row.gp ~= nil and row.gp > 0 then | if row.gp ~= nil then | ||
local gpText = nil | |||
if type(row.gp) == 'number' and row.gp > 0 then | |||
gpText = Icons.GP(row.gp) | |||
elseif type(row.gp) == 'string' then | |||
gpText = row.gp | |||
end | |||
table.insert(matRow, gpText) | |||
end | end | ||
if row.sc ~= nil and row.sc > 0 then | if row.sc ~= nil then | ||
table.insert(matRow, Icons. | local scText = nil | ||
if type(row.sc) == 'number' and row.sc > 0 then | |||
scText = Icons.GP(row.sc) | |||
elseif type(row.sc) == 'string' then | |||
scText = row.sc | |||
end | |||
table.insert(matRow, scText) | |||
end | |||
if row.rc ~= nil then | |||
local rcText = nil | |||
if type(row.rc) == 'number' and row.rc > 0 then | |||
rcText = Icons.GP(row.rc) | |||
elseif type(row.rc) == 'string' then | |||
rcText = row.rc | |||
end | |||
table.insert(matRow, rcText) | |||
end | end | ||
-- Item created | -- Item created | ||
Line 603: | Line 635: | ||
table.insert(resultPart, '\r\n===' .. Icons.Icon({'Magic', type='skill', size=30}) .. '===\r\n' .. spellUseTable) | table.insert(resultPart, '\r\n===' .. Icons.Icon({'Magic', type='skill', size=30}) .. '===\r\n' .. spellUseTable) | ||
end | end | ||
if Shared. | if Shared.tableIsEmpty(resultPart) then | ||
return '' | return '' | ||
else | else | ||
Line 621: | Line 653: | ||
function p._getSpellUseTable(item) | function p._getSpellUseTable(item) | ||
local spellList = Magic. | local spellList = Magic.getSpellsUsingItem(item.id, true) | ||
--Bail immediately if no spells are found | --Bail immediately if no spells are found | ||
if Shared. | if Shared.tableIsEmpty(spellList) then | ||
return '' | return '' | ||
end | end | ||
Line 635: | Line 667: | ||
local rowPart = {} | local rowPart = {} | ||
table.insert(rowPart, '\r\n|-\r\n|data-sort-value="'..spell.name..'"|') | table.insert(rowPart, '\r\n|-\r\n|data-sort-value="'..spell.name..'"|') | ||
local iconType = | local iconType = Magic._getSpellIconType(spell) | ||
table.insert(rowPart, Icons.Icon({spell.name, type=iconType, notext=true, size=50})) | table.insert(rowPart, Icons.Icon({spell.name, type=iconType, notext=true, size=50})) | ||
table.insert(rowPart, '||'..Icons.Icon({spell.name, type=iconType, noicon=true})) | table.insert(rowPart, '||'..Icons.Icon({spell.name, type=iconType, noicon=true})) | ||
table.insert(rowPart, '||data-sort-value="'..spell.level..'"|'.. | table.insert(rowPart, '||data-sort-value="'..spell.level..'"|'..Magic._getSpellRequirements(spell)) | ||
table.insert(rowPart, '||data-sort-value="'..spell.spellbook..'"|') | |||
table.insert(rowPart, Magic.getSpellTypeLink(spell.spellbook)) | |||
table.insert(rowPart, '||data-sort-value="'.. | |||
table.insert(rowPart, Magic.getSpellTypeLink(spell. | |||
table.insert(rowPart, '||'..Magic._getSpellStat(spell, 'description')) | table.insert(rowPart, '||'..Magic._getSpellStat(spell, 'description')) | ||
table.insert(rowPart, '||style="text-align:center"|') | table.insert(rowPart, '||style="text-align:center"|') |