Anonymous

Module:Navboxes: Difference between revisions

From Melvor Idle
Cleaned up Single Navbox functions; Added Expansion Icons; Separated Prayers and Unholy Prayers
(Exclude navbox contents from search index)
(Cleaned up Single Navbox functions; Added Expansion Icons; Separated Prayers and Unholy Prayers)
 
(13 intermediate revisions by one other user not shown)
Line 2: Line 2:


local p = {}
local p = {}
local SkillData = mw.loadData('Module:Skills/data')
local MagicData = mw.loadData('Module:Magic/data')
local ItemData = mw.loadData('Module:Items/data')


local Shared = require('Module:Shared')
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local SkillData = GameData.skillData
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Items = require('Module:Items')
local Magic = require('Module:Magic')
local Shop = require('Module:Shop')
local Shop = require('Module:Shop')
local Pets = require('Module:Pets')
local Prayer = require('Module:Prayer')
-- Generates a table with a single category which has an Item and it's Icon
-- array is the list of items that will be added to the table
-- iconType is the item's icon type
-- headerData is the text displayed at the top of the generated table
-- productID is the proper capitalization of the productID property -_-
function p.buildSingleNavboxTable(array, iconType, headerData, productID)
-- Generate Table contents
table.sort(array, function(a, b) return a.level < b.level end)
local iconArray = {}
for i, item in ipairs(array) do
if productID ~= nil then
item = Items.getItemByID(item[productID])
end
table.insert(iconArray, Icons.Icon({item.name, type=iconType, expicon=Icons.getExpansionIcon(item.id)}))
end
-- Generate navbox table
local resultTable = mw.html.create('table')
-- Table classes & styles
resultTable
:addClass('wikitable')
:addClass('navigation-not-searchable')
:css('text-align', 'center')
:css('clear', 'both')
:css('width', '100%')
-- Header row
:tag('tr')
:tag('th')
:css('background-color', '#275C87')
:css('color', '#FFFFFF')
:wikitext(Icons.Icon(headerData))
:done()
:done()
-- Content, list of logs
:tag('tr')
:tag('td')
:wikitext(table.concat(iconArray, ' • '))
:done()
:done()
:done()
return tostring(resultTable)
end
function p.getLogNavbox(frame)
local trees = Shared.shallowClone(SkillData.Woodcutting.trees)
return p.buildSingleNavboxTable(trees, 'item', {'Woodcutting', 'Logs', type='skill', section='Logs'}, 'productId')
end
function p.getFamiliarNavbox(frame)
local familiars = Shared.shallowClone(SkillData.Summoning.recipes)
return p.buildSingleNavboxTable(familiars, 'item', {'Summoning', 'Summoning Familiars', type='skill', section='Summoning_Tablets'}, 'productID')
end
function p.getThievingNavbox(frame)
local npcs = Shared.shallowClone(SkillData.Thieving.npcs)
return p.buildSingleNavboxTable(npcs, 'thieving', {'Thieving', 'Thieving Targets', type='skill', section='Thieving_Targets'})
end


function p.getFarmingNavbox(frame)
function p.getFarmingNavbox(frame)
Line 17: Line 76:
local produceTable = {}
local produceTable = {}


for i, item in ipairs(ItemData.Items) do
for i, recipe in ipairs(SkillData.Farming.recipes) do
if item.farmingLevel ~= nil then
local seed = Items.getItemByID(recipe.seedCost.id)
local tier = item.tier
local product = Items.getItemByID(recipe.productId)
if seedsTable[tier] == nil then
local tier = recipe.categoryID
-- Initialize tier tables
if seedsTable[tier] == nil then
seedsTable[tier] = {}
-- Initialize tier tables
produceTable[tier] = {}
seedsTable[tier] = {}
end
produceTable[tier] = {}
end


if item.grownItemID ~= nil then
table.insert(seedsTable[tier], { ["name"] = seed.name, ["level"] = recipe.level })
local grownItem = Items.getItemByID(item.grownItemID)
table.insert(produceTable[tier], { ["name"] = product.name, ["level"] = recipe.level })
if grownItem ~= nil then
table.insert(produceTable[tier], { ["name"] = grownItem.name, ["level"] = item.farmingLevel })
end
end
table.insert(seedsTable[tier], { ["name"] = item.name, ["level"] = item.farmingLevel })
end
end
end


-- Generate output table
-- Generate output table
table.insert(resultPart, '{| class="wikitable mw-collapsible navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '{| class="wikitable mw-collapsible navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!colspan="2" style="padding-left:64px;"|' .. Icons.Icon({'Farming', type='skill'}))
table.insert(resultPart, '\r\n!style="background-color:#275C87;color:#FFFFFF;padding-left:64px;" colspan="2"|' .. Icons.Icon({'Farming', type='skill'}))


local getItemList = function(itemTable)
local getItemList = function(itemTable)
Line 48: Line 102:
end
end
local sortFunc = function(a, b) return (a.level == b.level and a.name < b.name) or a.level < b.level end
local sortFunc = function(a, b) return (a.level == b.level and a.name < b.name) or a.level < b.level end
-- Determine tier list & order in which tiers will be listed in output
local tierList = {}
for tier, seeds in pairs(seedsTable) do
table.insert(tierList, tier)
end
table.sort(tierList, function(a, b) return a < b end)


-- Generate table section for each tier
-- Generate table section for each tier
for i, tier in pairs(tierList) do
for i, category in ipairs(SkillData.Farming.categories) do
local tier = category.id
-- Sort tables by Farming level order
-- Sort tables by Farming level order
table.sort(seedsTable[tier], sortFunc)
table.sort(seedsTable[tier], sortFunc)
table.sort(produceTable[tier], sortFunc)
table.sort(produceTable[tier], sortFunc)


table.insert(resultPart, '\r\n|-\r\n!colspan="2"| ' .. tier .. 's')
table.insert(resultPart, '\r\n|-\r\n!colspan="2"| ' .. category.name)
table.insert(resultPart, '\r\n|-\r\n!scope="row"| Seeds')
table.insert(resultPart, '\r\n|-\r\n!scope="row"| Seeds')
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. getItemList(seedsTable[tier]))
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. getItemList(seedsTable[tier]))
Line 75: Line 123:
function p.getFoodNavbox(frame)
function p.getFoodNavbox(frame)
local foundIDs, cookedFood, harvestedFood, otherFood = {}, {}, {}, {}
local foundIDs, cookedFood, harvestedFood, otherFood = {}, {}, {}, {}
 
-- Hide Lemon cake
-- Exclude unobtainable lemonade
foundIDs[1029] = true
foundIDs['melvorTotH:Lemonade_Full'] = true
foundIDs[1061] = true
 
-- Cooked food
-- Cooked food
for i, recipe in ipairs(SkillData.Cooking.Recipes) do
for i, recipe in ipairs(SkillData.Cooking.recipes) do
if not foundIDs[recipe.itemID] then
if not foundIDs[recipe.productID] then
foundIDs[recipe.itemID] = true
foundIDs[recipe.productID] = true
local cookedItem = Items.getItemByID(recipe.itemID)
if recipe.perfectCookID ~= nil then
if cookedItem ~= nil then
foundIDs[recipe.perfectCookID] = true
local catIdx = recipe.category + 1
end
-- Initialize category if it doesn't already exist
if recipe.noMastery == nil then
if cookedFood[catIdx] == nil then
local cookedItem = Items.getItemByID(recipe.productID)
cookedFood[catIdx] = {}
if cookedItem ~= nil then
end
local catIdx = recipe.categoryID
-- Initialize category if it doesn't already exist
local perfectName = nil
if cookedFood[catIdx] == nil then
if recipe.perfectCookID ~= nil then
cookedFood[catIdx] = {}
local perfectItem = Items.getItemByID(recipe.perfectCookID)
end
if perfectItem ~= nil then
perfectName = perfectItem.name
local perfectName = nil
foundIDs[recipe.perfectCookID] = true
if recipe.perfectCookID ~= nil then
local perfectItem = Items.getItemByID(recipe.perfectCookID)
if perfectItem ~= nil then
perfectName = perfectItem.name
end
end
end
table.insert(cookedFood[catIdx], { ["name"] = cookedItem.name, ["order"] = recipe.level, ["perfectName"] = perfectName })
end
end
table.insert(cookedFood[catIdx], { ["name"] = cookedItem.name, ["order"] = recipe.level, ["perfectName"] = perfectName })
end
end
end
end
Line 106: Line 157:


-- Harvested foods
-- Harvested foods
for i, item in ipairs(ItemData.Items) do
for i, recipe in ipairs(SkillData.Farming.recipes) do
if item.grownItemID ~= nil and not foundIDs[item.grownItemID] then
if not foundIDs[recipe.productID] then
-- Item is grown from farming and can be eaten
local product = Items.getItemByID(recipe.productId)
local grownItem = Items.getItemByID(item.grownItemID)
if product.healsFor ~= nil then
if grownItem ~= nil and grownItem.canEat then
table.insert(harvestedFood, { ["name"] = product.name, ["order"] = recipe.level })
table.insert(harvestedFood, { ["name"] = grownItem.name, ["order"] = item.farmingLevel })
foundIDs[product.id] = true
foundIDs[grownItem.id] = true
end
end
end
end
Line 118: Line 168:


-- Other foods, must be checked after cooked & harvested foods have been identified
-- Other foods, must be checked after cooked & harvested foods have been identified
for i, item in ipairs(ItemData.Items) do
for i, item in ipairs(GameData.rawData.items) do
if item.canEat and not foundIDs[item.id] then
if item.healsFor ~= nil and not foundIDs[item.id] then
-- Item can be eaten but isn't cooked nor harvested
-- Item can be eaten but isn't cooked nor harvested
table.insert(otherFood, { ["name"] = item.name, ["order"] = item.id })
table.insert(otherFood, { ["name"] = item.name, ["order"] = item.id })
Line 136: Line 186:
-- Generate food lists for final output
-- Generate food lists for final output
local cookingCatHeader = {
local cookingCatHeader = {
Icons.Icon({'Normal Cooking Fire', 'Cooking Fire', type='upgrade', nolink=true}),
{ id = 'melvorD:Fire', header = Icons.Icon({'Normal Cooking Fire', 'Cooking Fire', type='upgrade', nolink=true}) },
Icons.Icon({'Basic Furnace', 'Furnace', type='upgrade', nolink=true}),
{ id = 'melvorD:Furnace', header = Icons.Icon({'Basic Furnace', 'Furnace', type='upgrade', nolink=true}) },
Icons.Icon({'Basic Pot', 'Pot', type='upgrade', nolink=true})
{ id = 'melvorD:Pot', header = Icons.Icon({'Basic Pot', 'Pot', type='upgrade', nolink=true}) }
}
}
local getFoodList = function(foodTable)
local getFoodList = function(foodTable)
local listPart = {}
local listPart = {}
for i, food in ipairs(foodTable) do
if type(foodTable) == 'table' then
local foodText = Icons.Icon({food.name, type='item'})
for i, food in ipairs(foodTable) do
if food.perfectName ~= nil then
local foodText = Icons.Icon({food.name, type='item'})
foodText = Icons.Icon({food.perfectName, type='item', notext=true}) .. ' ' .. foodText
if food.perfectName ~= nil then
foodText = Icons.Icon({food.perfectName, type='item', notext=true}) .. ' ' .. foodText
end
table.insert(listPart, foodText)
end
end
table.insert(listPart, foodText)
end
end
return table.concat(listPart, ' • ')
return table.concat(listPart, ' • ')
Line 157: Line 209:
table.insert(resultPart, Icons.Icon({'Food', type='item', img='Crab'}))
table.insert(resultPart, Icons.Icon({'Food', type='item', img='Crab'}))
table.insert(resultPart, '\r\n|-\r\n!colspan="2"| Cooked')
table.insert(resultPart, '\r\n|-\r\n!colspan="2"| Cooked')
for catID, foodTable in ipairs(cookedFood) do
for i, cat in ipairs(cookingCatHeader) do
table.insert(resultPart, '\r\n|-\r\n!scope="row"| ' .. cookingCatHeader[catID])
table.insert(resultPart, '\r\n|-\r\n!scope="row"| ' .. cat.header)
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. getFoodList(foodTable))
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. getFoodList(cookedFood[cat.id]))
end
end
table.insert(resultPart, '\r\n|-\r\n!colspan="2"| Harvested')
table.insert(resultPart, '\r\n|-\r\n!colspan="2"| Harvested')
Line 179: Line 231:
-- Compile list of potions to be included
-- Compile list of potions to be included
local potList = {}
local potList = {}
for i, potData in ipairs(SkillData.Herblore.Potions) do
for i, potData in ipairs(SkillData.Herblore.recipes) do
if potList[potData.category] == nil then
if potList[potData.categoryID] == nil then
potList[potData.category] = {}
potList[potData.categoryID] = {}
end
end
local potFirstItem = Items.getItemByID(potData.potionIDs[1])
local potFirstItem = Items.getItemByID(potData.potionIDs[1])
local potName = string.gsub(potFirstItem.name, ' Potion [IV]+$', '')
local potName = string.gsub(potFirstItem.name, ' Potion [IV]+$', '')
table.insert(potList[potData.category], { ["name"] = potName, ["order"] = potData.level, ["img"] = potFirstItem.name })
table.insert(potList[potData.categoryID], { ["name"] = potName, ["order"] = potData.level, ["img"] = potFirstItem.name })
end
end


Line 193: Line 245:
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({ 'Herblore', 'Potions', type='skill' }))
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({ 'Herblore', 'Potions', type='skill' }))
-- Generate section for each category of potions
-- Generate section for each category of potions
for i, catData in ipairs(catList) do
for i, catData in ipairs(SkillData.Herblore.categories) do
-- Compile list of potions
-- Compile list of potions
local potListText = {}
local potListText = {}
table.sort(potList[catData.categoryID], function(a, b) return (a.order == b.order and a.name < b.name) or a.order < b.order end)
table.sort(potList[catData.id], function(a, b) return (a.order == b.order and a.name < b.name) or a.order < b.order end)
for j, potData in ipairs(potList[catData.categoryID]) do
for j, potData in ipairs(potList[catData.id]) do
table.insert(potListText, Icons.Icon({ potData.name .. ' Potion', potData.name, img=potData.img, type='item' }))
table.insert(potListText, Icons.Icon({ potData.name .. ' Potion', potData.name, img=potData.img, type='item' }))
end
end
table.insert(resultPart, '\r\n|-\r\n! ' .. catData.name .. ' Potions')
table.insert(resultPart, '\r\n|-\r\n! ' .. catData.name)
table.insert(resultPart, '\r\n|class="center" style="vertical-align:middle;"| ' .. table.concat(potListText, ' • '))
table.insert(resultPart, '\r\n|class="center" style="vertical-align:middle;"| ' .. table.concat(potListText, ' • '))
end
end
Line 209: Line 261:


function p.getPrayerNavbox(frame)
function p.getPrayerNavbox(frame)
local prayerList = {}
local prayerList = {
for i, prayer in Shared.skpairs(SkillData.Prayer) do
["Prayers"] = Prayer.getPrayers(function(prayer) return prayer.isUnholy == nil end),
table.insert(prayerList, { ["name"] = prayer.name, ["order"] = prayer.prayerLevel })
["Unholy Prayers"] = Prayer.getPrayers(function(prayer) return prayer.isUnholy end)
end
}
table.sort(prayerList, function(a, b)
if a.order == b.order then
return a.name < b.name
else
return a.order < b.order
end
end)
 
local prayerListText = {}
for i, prayer in ipairs(prayerList) do
table.insert(prayerListText, Icons.Icon({ prayer.name, type='prayer' }))
end


local resultPart = {}
local resultPart = {}
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!'..Icons.Icon({'Prayer', 'Prayers', type='skill'}))
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({'Prayer', 'Prayers', type='skill'}))
table.insert(resultPart, '\r\n|-\r\n|style="text-align:center;"| ' .. table.concat(prayerListText, ' • '))
for catName, subList in pairs(prayerList) do
table.sort(subList, function(a, b)
if a.level == b.level then
return a.name < b.name
else
return a.level < b.level
end
end)
local prayerText = {}
table.insert(resultPart, '\r\n|-\r\n!style="text-align:center;"| ' .. catName)
for i, prayer in ipairs(subList) do
table.insert(prayerText, Icons.Icon({prayer.name, type='prayer', expicon = Icons.getExpansionIcon(prayer.id)}))
end
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. table.concat(prayerText, ' • '))
end
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')
return table.concat(resultPart)
return table.concat(resultPart)
end
end
Line 236: Line 291:
function p.getRuneNavbox(frame)
function p.getRuneNavbox(frame)
-- Assumes all runes are from Runecrafting, which may need revising in future updates
-- Assumes all runes are from Runecrafting, which may need revising in future updates
local catNames = { 'Standard', 'Combination' }
local categoryIDs = { 'melvorF:StandardRunes', 'melvorF:CombinationRunes' }
local runeList = { {}, {} }
local runeList = {}
for i, recipe in ipairs(SkillData.Runecrafting.Recipes) do
for i, recipe in ipairs(SkillData.Runecrafting.recipes) do
local catIdx = recipe.category + 1
local catID = recipe.categoryID
if catNames[catIdx] ~= nil then
if Shared.contains(categoryIDs, catID) then
local item = Items.getItemByID(recipe.itemID)
if runeList[catID] == nil then
if item ~= nil then
runeList[catID] = {}
table.insert(runeList[catIdx], { ["name"] = item.name, ["order"] = recipe.level })
end
local product = Items.getItemByID(recipe.productID)
if product ~= nil then
table.insert(runeList[catID], { ["name"] = product.name, ["order"] = recipe.level })
end
end
end
end
Line 251: Line 309:
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!colspan="2"|' .. Icons.Icon({'Runes', type='item', img='Air Rune'}))
table.insert(resultPart, '\r\n!colspan="2"|' .. Icons.Icon({'Runes', type='item', img='Air Rune'}))
for catIdx, catName in ipairs(catNames) do
for i, catID in ipairs(categoryIDs) do
table.sort(runeList[catIdx], function(a, b) return (a.order == b.order and a.name < b.name) or a.order < b.order end)
local category = GameData.getEntityByID(SkillData.Runecrafting.categories, catID)
table.insert(resultPart, '\r\n|-\r\n!scope="row"|' .. catName .. ' Runes')
if category ~= nil then
table.sort(runeList[catID], function(a, b) return (a.order == b.order and a.name < b.name) or a.order < b.order end)
table.insert(resultPart, '\r\n|-\r\n!scope="row"|' .. category.name)


local listPart = {}
local listPart = {}
for j, rune in ipairs(runeList[catIdx]) do
for j, rune in ipairs(runeList[catID]) do
table.insert(listPart, Icons.Icon({rune.name, type='item'}))
table.insert(listPart, Icons.Icon({rune.name, type='item'}))
end
table.insert(resultPart, '\r\n|style="text-align:center;"|'..table.concat(listPart, ' • '))
end
end
table.insert(resultPart, '\r\n|style="text-align:center;"|'..table.concat(listPart, ' • '))
end
end
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')
Line 267: Line 328:


function p.getSkillcapeNavbox(frame)
function p.getSkillcapeNavbox(frame)
local capeList = Shop.getPurchases(function(cat, purch) return cat == 'Skillcapes' end)
local capeList = {
table.sort(capeList, function(a, b)
["Normal"] = Shop.getPurchases(function(purch) return purch.category == 'melvorD:Skillcapes' end),
if a.cost.gp == b.cost.gp then
["Superior"] = Shop.getPurchases(function(purch) return purch.category == 'melvorTotH:SuperiorSkillcapes' end)
return a.name < b.name
}
else
 
return a.cost.gp < b.cost.gp
local capeNames = {}
for catName, subList in pairs(capeList) do
for i, cape in ipairs(subList) do
capeNames[cape.id] = Shop._getPurchaseName(cape)
end
end
end)
table.sort(capeList[catName], function(a, b)
local costA, costB = Shop._getPurchaseSortValue(a), Shop._getPurchaseSortValue(b)
if costA == costB then
return capeNames[a.id] < capeNames[b.id]
else
return costA < costB
end
end)
end


local capeText = {}
local capeText = {}
for i, purch in ipairs(capeList) do
for i, purch in ipairs(capeList) do
if purch.contains ~= nil and purch.contains.items ~= nil then
table.insert(capeText, Icons.Icon({capeNames[purch.id], type='item'}))
local item = Items.getItemByID(purch.contains.items[1][1])
if item ~= nil then
table.insert(capeText, Icons.Icon({item.name, type='item'}))
end
end
end
end


local resultPart = {}
local resultPart = {}
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!' .. Icons.Icon({'Skillcapes', type='item', img='Cape of Completion'}))
table.insert(resultPart, '\r\n!colspan="2"| ' .. Icons.Icon({'Skillcapes', type='item', img='Cape of Completion'}))
table.insert(resultPart, '\r\n|-\r\n|style="text-align:center;"|'..table.concat(capeText, ' • '))
for catName, subList in pairs(capeList) do
local capeText = {}
table.insert(resultPart, '\r\n|-\r\n!style="text-align:center;"| ' .. catName)
for i, cape in ipairs(subList) do
table.insert(capeText, Icons.Icon({capeNames[cape.id], type='item'}))
end
table.insert(resultPart, '\r\n|style="text-align:center;"| ' .. table.concat(capeText, ' • '))
end
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')


Line 296: Line 371:


function p.getSpellNavbox(frame)
function p.getSpellNavbox(frame)
local spellTable = { ["standard"] = {}, ["curse"] = {}, ["aurora"] = {}, ["ancient"] = {}, ["alt"] = {} }
local spellTable = {}
local catData = {
for i, spellBook in ipairs(Magic.spellBooks) do
{ ["name"] = 'standard', ["header"] = '[[Magic#Standard_Magic|Standard Spells]]', ["imgType"] = 'spell' },
spellTable[spellBook.id] = {}
{ ["name"] = 'curse', ["header"] = '[[Magic#Curses|Curses]]', ["imgType"] = 'curse' },
local spells = Magic.getSpellsBySpellBook(spellBook.id)
{ ["name"] = 'aurora', ["header"] = '[[Magic#Auroras|Auroras]]', ["imgType"] = 'aurora' },
for j, spell in ipairs(spells) do
{ ["name"] = 'ancient', ["header"] = '[[Magic#Ancient_Magicks|Ancient Magicks]]', ["imgType"] = 'spell' },
table.insert(spellTable[spellBook.id], { ["name"] = spell.name, ["order"] = spell.level })
{ ["name"] = 'alt', ["header"] = '[[Alternative_Magic|Alt Magic]]', ["imgType"] = 'spell' },
end
}
 
for i, spell in ipairs(MagicData.Spells) do
table.insert(spellTable['standard'], { ["name"] = spell.name, ["order"] = spell.level })
end
for i, spell in ipairs(MagicData.Curses) do
table.insert(spellTable['curse'], { ["name"] = spell.name, ["order"] = spell.level })
end
for i, spell in ipairs(MagicData.Auroras) do
table.insert(spellTable['aurora'], { ["name"] = spell.name, ["order"] = spell.level })
end
for i, spell in ipairs(MagicData.Ancient) do
table.insert(spellTable['ancient'], { ["name"] = spell.name, ["order"] = spell.level })
end
for i, spell in ipairs(MagicData.AltMagic) do
table.insert(spellTable['alt'], { ["name"] = spell.name, ["order"] = spell.level })
end
end


Line 332: Line 391:
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({'Spells', type='skill', img='Magic'}))
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({'Spells', type='skill', img='Magic'}))
for i, catDefn in ipairs(catData) do
for i, spellBook in ipairs(Magic.spellBooks) do
table.sort(spellTable[catDefn.name], function(a, b)
table.sort(spellTable[spellBook.id], function(a, b)
if a.order == b.order then
if a.order == b.order then
return a.name < b.name
return a.name < b.name
Line 340: Line 399:
end
end
end)
end)
table.insert(resultPart, '\r\n|-\r\n!scope="row"| ' .. catDefn.header)
table.insert(resultPart, '\r\n|-\r\n!scope="row"| ' .. Magic.getSpellTypeLink(spellBook.id))
table.insert(resultPart, '\r\n|style="text-align:center;| ' .. getSpellList(spellTable[catDefn.name], catDefn.imgType))
table.insert(resultPart, '\r\n|style="text-align:center;| ' .. getSpellList(spellTable[spellBook.id], spellBook.imgType))
end
end
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')
Line 348: Line 407:
end
end


function p.getFamiliarNavbox(frame)
function p.getFishingNavbox(frame)
local familiarList = {}
for i, recipe in ipairs(SkillData.Summoning.Marks) do
local item = Items.getItemByID(recipe.itemID)
if item ~= nil then
table.insert(familiarList, { ["name"] = item.name, ["order"] = recipe.level })
end
end
table.sort(familiarList, function(a, b) return a.order < b.order end)
 
local resultPart = {}
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n!colspan=2|' .. Icons.Icon({'Summoning', 'Summoning Familiars', type='skill'}))
local iconArray = {}
for i, fam in ipairs(familiarList) do
table.insert(iconArray, Icons.Icon({fam.name, type='item'}))
end
table.insert(resultPart, '\r\n|-\r\n|style="text-align:center;"|'..table.concat(iconArray, ' • '))
table.insert(resultPart, '\r\n|}')
return table.concat(resultPart)
end
 
function p.getThievingNavbox()
local returnPart = {}
 
-- Create table header
table.insert(returnPart, '{| class="wikitable navigation-not-searchable" style="text-align:center; clear:both; margin:auto; margin-bottom:1em;"')
table.insert(returnPart, '|-\r\n!' .. Icons.Icon({'Thieving', 'Thieving Targets', type='skill'}))
table.insert(returnPart, '|-\r\n|')
 
local npcData = {}
for i, npc in ipairs(SkillData.Thieving.NPCs) do
table.insert(npcData, {["level"] = npc.level, ["name"] = npc.name})
end
table.sort(npcData, function(a, b) return a.level < b.level end)
 
local npcList = {}
-- Create row for each NPC
for i, npc in ipairs(npcData) do
table.insert(npcList, Icons.Icon({npc.name, type='thieving'}))
end
table.insert(returnPart, table.concat(npcList, ' • '))
table.insert(returnPart, '|}')
 
return table.concat(returnPart, '\r\n')
end
 
function p.getFishingNavbox()
local categoryHeader = {}
local categoryHeader = {}
local categoryItems = {}
local categoryItems = {}
Line 409: Line 421:
-- Fishing areas
-- Fishing areas
-- Iterate through all fishing areas, identifying fish within each
-- Iterate through all fishing areas, identifying fish within each
for i, area in ipairs(SkillData.Fishing.Areas) do
for i, area in ipairs(SkillData.Fishing.areas) do
for j, recipe in ipairs(area.fish) do
for j, fishID in ipairs(area.fishIDs) do
local fishItem = Items.getItemByID(recipe.itemID)
local fishItem = Items.getItemByID(fishID)
if fishItem ~= nil then
local recipe = GameData.getEntityByID(SkillData.Fishing.fish, fishID)
if fishItem ~= nil and recipe ~= nil then
addCatData(area.name, 'Fishing#Fishing Areas', fishItem.name, recipe.level)
addCatData(area.name, 'Fishing#Fishing Areas', fishItem.name, recipe.level)
end
end
Line 418: Line 431:
end
end
-- Junk items
-- Junk items
for i, itemID in ipairs(SkillData.Fishing.JunkItems) do
for i, itemID in ipairs(SkillData.Fishing.junkItemIDs) do
local item = Items.getItemByID(itemID)
local item = Items.getItemByID(itemID)
if item ~= nil then
if item ~= nil then
Line 425: Line 438:
end
end
-- Special items
-- Special items
for i, itemDef in ipairs(SkillData.Fishing.SpecialItems) do
for i, itemDef in ipairs(SkillData.Fishing.specialItems) do
local item = Items.getItemByID(itemDef[1])
local item = Items.getItemByID(itemDef.itemID)
if item ~= nil then
if item ~= nil then
local weight = itemDef[2] or 1
local weight = itemDef.weight or 1
addCatData('Special Items', 'Fishing#Special', item.name, 1 / weight)
addCatData('Special Items', 'Fishing#Special', item.name, 1 / weight)
end
end
Line 452: Line 465:
table.insert(resultPart, '\r\n|}')
table.insert(resultPart, '\r\n|}')


return table.concat(resultPart)
end
function p.getOreBarNavbox(frame)
local categoryList = { 'Ores', 'Bars' }
local categoryItems = { ["Ores"] = {}, ["Bars"] = {} }
local barOreIDs = {}
-- Compile list of bars
-- Also compile a list of ores used to create these bars, used to filter out non-bar ores later
for i, recipe in ipairs(SkillData.Smithing.recipes) do
if recipe.categoryID == 'melvorD:Bars' then
local item = Items.getItemByID(recipe.productID)
if item ~= nil then
local displayName = string.gsub(item.name, ' Bar$', '')
table.insert(categoryItems['Bars'], { ["name"] = item.name, ["display"] = displayName, ["order"] = recipe.level })
end
-- Add to barOreIDs list
for j, costDef in ipairs(recipe.itemCosts) do
if barOreIDs[costDef.id] == nil then
barOreIDs[costDef.id] = true
end
end
end
end
-- Compile list of ores
for i, recipe in ipairs(SkillData.Mining.rockData) do
if barOreIDs[recipe.productId] then
local item = Items.getItemByID(recipe.productId)
if item ~= nil then
table.insert(categoryItems['Ores'], { ["name"] = item.name, ["display"] = recipe.name, ["order"] = recipe.level })
end
end
end
local resultPart = {}
-- Generate navbox header
table.insert(resultPart, '{| class="wikitable mw-collapsible navigation-not-searchable" style="margin:auto; clear:both; width: 100%"')
table.insert(resultPart, '\r\n|-\r\n!style="background-color:#275C87;color:#FFFFFF;padding-left:64px;" colspan="2" | ' .. '<b>Ores & Bars</b>')
-- Generate navbox content
for i, cat in ipairs(categoryList) do
table.sort(categoryItems[cat], function(a, b) return (a.order == b.order and a.display < b.display) or a.order < b.order end)
local listPart = {}
for j, listItem in ipairs(categoryItems[cat]) do
table.insert(listPart, Icons.Icon({ listItem.name, listItem.display, type = 'item' }))
end
table.insert(resultPart, '\r\n|-\r\n! ' .. cat .. '\r\n|style="text-align:center;"| ' .. table.concat(listPart, ' • '))
end
table.insert(resultPart, '\r\n|}')
return table.concat(resultPart)
end
function p.getPetNavbox(frame)
local resultPart = {}
table.insert(resultPart, '{| class="wikitable navigation-not-searchable" style="margin:auto; text-align:center; clear:both; width: 100%"')
table.insert(resultPart, '\r\n|-\r\n!colspan="2"|[[Pets]]')
local petListOrder = { 'skill', 'boss', 'other' }
local petList = {
["skill"] = {},
["boss"] = {},
["other"] = {}
}
for i, petData in ipairs(GameData.rawData.pets) do
local source = Pets._getPetSource(petData)
local listCat = 'other'
if type(source) == 'table' and source.type ~= nil then
if source.type == 'skill' then
listCat = 'skill'
elseif source.type == 'dungeon' then
listCat = 'boss'
else
listCat = 'other'
end
end
table.insert(petList[listCat], petData.name)
end
local getIconList =
function(pets)
local result = {}
for i, pet in ipairs(pets) do
table.insert(result, Icons.Icon({pet, type='pet'}))
end
return table.concat(result, ' • ')
end
for i, catName in ipairs(petListOrder) do
local catData = petList[catName]
table.sort(catData, function(a, b) return a < b end)
table.insert(resultPart, '\r\n|-\r\n!' .. Shared.titleCase(catName) .. ' Pets\r\n|' .. getIconList(catData))
end
table.insert(resultPart, '\r\n|}')
return table.concat(resultPart)
return table.concat(resultPart)
end
end


return p
return p
463

edits