Module:CombatAreas/AreaTables: Difference between revisions
From Melvor Idle
Falterfire (talk | contribs) (Added a function to allow me to quickly update CombatNav. Saving it in case it's useful later.) |
(Add one time rewards) |
||
(12 intermediate revisions by 4 users not shown) | |||
Line 4: | Line 4: | ||
local Constants = require('Module:Constants') | local Constants = require('Module:Constants') | ||
local Common = require('Module:Common') | |||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local GameData = require('Module:GameData') | local GameData = require('Module:GameData') | ||
Line 9: | Line 10: | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
local Monsters = require('Module:Monsters') | local Monsters = require('Module:Monsters') | ||
local Pets = require('Module:Pets') | |||
local Areas = require('Module:CombatAreas') | local Areas = require('Module:CombatAreas') | ||
local Num = require('Module:Number') | |||
function p.getLowHighLevels(idList) | function p.getLowHighLevels(idList) | ||
Line 23: | Line 27: | ||
end | end | ||
function p.getCombatAreaTable() | function p.getAreaCategory(area) | ||
for _, areaCat in ipairs(GameData.rawData.combatAreaCategories) do | |||
if areaCat.areas ~= nil and Shared.contains(areaCat.areas, area.id) then | |||
return areaCat | |||
end | |||
end | |||
end | |||
function p.getAreaCategoriesFromAreas(areas) | |||
local areaCatIDs = {} | |||
for i, area in ipairs(areas) do | |||
local areaCat = p.getAreaCategory(area) | |||
if areaCat ~= nil and areaCat.id ~= nil then | |||
areaCatIDs[areaCat.id] = true | |||
end | |||
end | |||
return GameData.getEntities('combatAreaCategories', | |||
function(obj) | |||
return obj.id ~= nil and areaCatIDs[obj.id] ~= nil | |||
end | |||
) | |||
end | |||
local function getAreasForTable(areaDataKey, categoryName, defaultCategoryID) | |||
local areaCategories = p.getAreaCategoriesFromAreas(GameData.rawData[areaDataKey]) | |||
local areaCategory = nil | |||
if categoryName == nil or categoryName == '' then | |||
-- Default area category | |||
areaCategory = GameData.getEntityByID(areaCategories, defaultCategoryID) | |||
else | |||
areaCategory = GameData.getEntityByName(areaCategories, categoryName) | |||
end | |||
if areaCategory == nil then | |||
local catNames = {} | |||
for _, areaCat in ipairs(areaCategories) do | |||
if areaCat.name ~= nil then | |||
table.insert(catNames, areaCat.name) | |||
end | |||
end | |||
return nil, Shared.printError('Invalid area category, choose any of: ' .. table.concat(catNames, ', ')) | |||
end | |||
local areas = GameData.getEntities(areaDataKey, | |||
function(obj) | |||
return obj.id ~= nil and Shared.contains(areaCategory.areas, obj.id) | |||
end | |||
) | |||
areas = GameData.sortByOrderTable(areas, areaCategory.areas) | |||
return areas, nil | |||
end | |||
function p.getCombatAreaTable(frame) | |||
local args = frame.args ~= nil and frame.args or frame | |||
local categoryName = args[1] | |||
local areas, errText = getAreasForTable('combatAreas', categoryName, 'melvorD:CombatAreas') | |||
if errText ~= nil then | |||
return errText | |||
elseif areas == nil then | |||
return '' | |||
end | |||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Lowest Monster Level!!Highest Monster Level' | result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Lowest Monster Level!!Highest Monster Level!!Requirements' | ||
for i, area in ipairs(areas) do | for i, area in ipairs(areas) do | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n|'..Icons.Icon({area.name, type=' | result = result..'\r\n|class="table-img" data-sort-value="' .. area.name .. '"| '..Icons.Icon({area.name, type='combatArea', size='50', notext=true}) | ||
result = result..'||'..Icons.Icon({area.name, type=' | result = result..'||' .. Icons.getExpansionIcon(area.id) .. Icons.Icon({area.name, type='combatArea', noicon=true}) | ||
result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty') | result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty') | ||
local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs) | local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs) | ||
result = result..'||'..lowLvl..'||'..highLvl | result = result .. '||data-sort-value="' .. lowLvl .. '"| ' .. Num.formatnum(lowLvl) | ||
result = result .. '||data-sort-value="' .. highLvl .. '"| ' .. Num.formatnum(highLvl) | |||
local reqText = Areas._getAreaRequirements(area) | |||
if reqText == nil or reqText == '' then | |||
result = result .. '||class="table-na"| None' | |||
else | |||
result = result .. '||' .. reqText | |||
end | |||
end | end | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
Line 42: | Line 114: | ||
end | end | ||
function p.getSlayerAreaTable() | function p.getSlayerAreaTable(frame) | ||
local args = frame.args ~= nil and frame.args or frame | |||
local categoryName = args[1] | |||
local areas, errText = getAreasForTable('slayerAreas', categoryName, 'melvorF:SlayerAreas') | |||
if errText ~= nil then | |||
return errText | |||
elseif areas == nil then | |||
return '' | |||
end | |||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Highest Monster Level!!Requirements!!Area Effect' | result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Highest Monster Level!!Requirements!!Area Effect' | ||
for i, area in ipairs(areas) do | for i, area in ipairs(areas) do | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n|'..Icons.Icon({area.name, type='slayer', size='50', notext=true}) | result = result..'\r\n|class="table-img" data-sort-value="' .. area.name .. '"| '..Icons.Icon({area.name, type='slayer', size='50', notext=true}) | ||
result = result..'||'..Icons.Icon({area.name, type='slayer', noicon=true}) | result = result..'||' .. Icons.getExpansionIcon(area.id) .. Icons.Icon({area.name, type='slayer', noicon=true}) | ||
result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty') | result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty') | ||
local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs) | local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs) | ||
result = result..'||'..highLvl | result = result..'||data-sort-value="' .. highLvl .. '"| ' .. Num.formatnum(highLvl) | ||
local reqText = Areas._getAreaRequirements(area) | |||
result = result..'|| '..Areas._getAreaStat(area, 'areaEffectDesc') | if reqText == nil or reqText == '' then | ||
result = result .. '||class="table-na"| None' | |||
else | |||
result = result .. '||' .. reqText | |||
end | |||
local effectText = Areas._getAreaStat(area, 'areaEffectDesc') | |||
local classText = ((effectText == nil or effectText == 'None') and 'class="table-na"|') or '' | |||
result = result..'||' .. classText .. ' ' .. effectText | |||
end | end | ||
Line 68: | Line 156: | ||
asList = true | asList = true | ||
elseif type(asList) == 'string' then | elseif type(asList) == 'string' then | ||
asList = | asList = string.upper(asList) ~= 'FALSE' | ||
end | end | ||
local | local lineSep = (asList and '\n' or '<br>') | ||
local | local formatLine = nil | ||
if asList then | |||
formatLine = function(text) return '* ' .. text end | |||
end | |||
-- | -- Currency rewards | ||
local rewardCurrency = {} | |||
if area.eventID == nil then | if area.eventID == nil then | ||
local bossMonster = Monsters.getMonsterByID(area.monsterIDs[Shared.tableCount(area.monsterIDs)]) | local bossMonster = Monsters.getMonsterByID(area.monsterIDs[Shared.tableCount(area.monsterIDs)]) | ||
rewardCurrency = bossMonster.currencyDrops | |||
end | end | ||
Line 91: | Line 176: | ||
if type(area.rewardItemIDs) == 'table' then | if type(area.rewardItemIDs) == 'table' then | ||
table.insert(itemLists, area.rewardItemIDs) | table.insert(itemLists, area.rewardItemIDs) | ||
elseif area.type == 'stronghold' then | |||
-- This won't show which tier each reward comes from | |||
-- but there doesn't seem to be an easy way to do that | |||
local enhancementList = {} | |||
for tier, tierData in pairs(area.tiers) do | |||
if type(tierData.rewards) == 'table' and type(tierData.rewards.items) == 'table' then | |||
for i, reward in ipairs(tierData.rewards.items) do | |||
table.insert(enhancementList, reward.id) | |||
end | |||
end | |||
end | |||
if not Shared.tableIsEmpty(enhancementList) then | |||
table.insert(itemLists, enhancementList) | |||
end | |||
end | end | ||
if area.eventID ~= nil then | if area.eventID ~= nil then | ||
Line 98: | Line 197: | ||
end | end | ||
end | end | ||
if area.oneTimeRewardID ~= nil then | |||
table.insert(itemLists, {area.oneTimeRewardID}) | |||
end | |||
local rewardItem = {} | |||
for i, itemList in ipairs(itemLists) do | for i, itemList in ipairs(itemLists) do | ||
for j, rewardID in ipairs(itemList) do | for j, rewardID in ipairs(itemList) do | ||
table.insert(rewardItem, { | |||
["id"] = rewardID, | |||
["quantity"] = 1 | |||
}) | |||
end | end | ||
end | end | ||
return Common.getCostString({ ["items"] = rewardItem, ["currencies"] = rewardCurrency}, '', formatLine, lineSep) | |||
end | end | ||
Line 121: | Line 219: | ||
local area = Areas.getArea(areaName) | local area = Areas.getArea(areaName) | ||
if area == nil then | if area == nil then | ||
return | return Shared.printError('Could not find an area named "' .. areaName .. '"') | ||
end | end | ||
if area.type == 'dungeon' then | if area.type == 'dungeon' or area.type == 'abyssDepth' or area.type == 'stronghold' then | ||
return p._getDungeonRewards(area, asList) | return p._getDungeonRewards(area, asList) | ||
else | else | ||
return " | return Shared.printError('"' .. areaName .. '" is not a dungeon') | ||
end | end | ||
end | end | ||
function p.getDungeonTable(frame) | function p.getDungeonTable(frame) | ||
local args = frame.args ~= nil and frame.args or frame | |||
local categoryName = args[1] | |||
local areas, errText = getAreasForTable('dungeons', categoryName, 'melvorD:Dungeons') | |||
if errText ~= nil then | |||
return errText | |||
elseif areas == nil then | |||
return '' | |||
end | |||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|-class="headerRow-0"' | result = result..'\r\n|-class="headerRow-0"' | ||
result = result..'\r\n!colspan="2"|Dungeon!!Difficulty!!Monsters!!Boss Level!! | result = result..'\r\n!colspan="2"|Dungeon!!Difficulty!!Monsters!!Boss Level!!Requirements!!Rewards!!Boss Pet' | ||
for i, dung in ipairs(areas) do | for i, dung in ipairs(areas) do | ||
local monsterCount = Shared.tableCount(dung.monsterIDs) | local monsterCount = Shared.tableCount(dung.monsterIDs) | ||
Line 142: | Line 249: | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n|data-sort-value="'..dung.name..'"|'..Icons.Icon({dung.name, type='dungeon', size='50', notext=true}) | result = result..'\r\n|class="table-img" data-sort-value="'..dung.name..'"|'..Icons.Icon({dung.name, type='dungeon', size='50', notext=true}) | ||
result = result..'||'..Icons.Icon({dung.name, type='dungeon', noicon=true}) | result = result..'||' .. Icons.getExpansionIcon(dung.id) .. Icons.Icon({dung.name, type='dungeon', noicon=true}) | ||
result = result..'||data-sort-value="'..dung.difficulty[1]..'"|'..Areas._getAreaStat(dung, 'difficulty') | result = result..'||data-sort-value="'..dung.difficulty[1]..'"|'..Areas._getAreaStat(dung, 'difficulty') | ||
result = result..'||'..monsterCount | result = result..'||'..monsterCount | ||
result = result..'||'.. | result = result..'||'..Num.formatnum(Monsters._getMonsterCombatLevel(boss)) | ||
local reqText = Areas._getAreaRequirements(dung) | |||
if reqText == nil or reqText == '' then | |||
result = result .. '||class="table-na"| None' | |||
else | |||
result = result .. '||' .. reqText | |||
end | |||
result = result..'||'..p._getDungeonRewards(dung, false) | result = result..'||'..p._getDungeonRewards(dung, false) | ||
local petAdded = false | |||
if dung.pet ~= nil then | if dung.pet ~= nil then | ||
local pet = GameData.getEntityByID('pets', dung.pet.petID) | local pet = GameData.getEntityByID('pets', dung.pet.petID) | ||
if pet ~= nil then | if pet ~= nil then | ||
result = result..'||data-sort-value="'..pet.name..'"|'..Icons.Icon({pet.name, type='pet'}) | result = result..'||data-sort-value="'..pet.name..'"|'..Icons.Icon({pet.name, type='pet'}) | ||
local petDrop = Pets._getPetChance(pet) | |||
if petDrop ~= nil then | |||
result = result..'<br/>'..petDrop | |||
end | |||
petAdded = true | |||
end | end | ||
end | |||
result = result..'|| ' | if not petAdded then | ||
result = result..'||class="table-na"| None' | |||
end | end | ||
end | end | ||
Line 162: | Line 282: | ||
end | end | ||
local function getAreaOrderTable(areaCategoryID) | |||
local areaCategory = GameData.getEntityByID('combatAreaCategories', areaCategoryID) | |||
if areaCategory == nil then | |||
return {} | |||
else | |||
return areaCategory.areas | |||
end | |||
end | |||
function p.buildCombatNavText(frame) | function p.buildCombatNavText(frame) | ||
--This isn't actually called on any pages but instead exists to save me time on updating Template:CombatNav for the new expansion | --This isn't actually called on any pages but instead exists to save me time on updating Template:CombatNav for the new expansion | ||
local areas = GameData.sortByOrderTable(GameData.rawData.slayerAreas, | local areas = GameData.sortByOrderTable(GameData.rawData.slayerAreas, getAreaOrderTable('melvorD:SlayerAreas')) | ||
local outArray = {} | local outArray = {} | ||
for i, area in ipairs(areas) do | for i, area in ipairs(areas) do | ||
Line 180: | Line 308: | ||
end | end | ||
areas = GameData.sortByOrderTable(GameData.rawData.dungeons, | areas = GameData.sortByOrderTable(GameData.rawData.dungeons, getAreaOrderTable('melvorD:Dungeons')) | ||
for i, area in ipairs(areas) do | for i, area in ipairs(areas) do | ||
local id = area.id | local id = area.id |
Latest revision as of 21:09, 5 November 2024
Documentation for this module may be created at Module:CombatAreas/AreaTables/doc
--Splitting this out so I can make Module:Monsters calls (Monsters calls CombatAreas, so this prevents a loop)
local p = {}
local Constants = require('Module:Constants')
local Common = require('Module:Common')
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Monsters = require('Module:Monsters')
local Pets = require('Module:Pets')
local Areas = require('Module:CombatAreas')
local Num = require('Module:Number')
function p.getLowHighLevels(idList)
local lowLevel = 1000000
local highLevel = 0
for i, monID in ipairs(idList) do
local monster = Monsters.getMonsterByID(monID)
local cmbLevel = Monsters._getMonsterCombatLevel(monster)
if cmbLevel < lowLevel then lowLevel = cmbLevel end
if cmbLevel > highLevel then highLevel = cmbLevel end
end
return lowLevel, highLevel
end
function p.getAreaCategory(area)
for _, areaCat in ipairs(GameData.rawData.combatAreaCategories) do
if areaCat.areas ~= nil and Shared.contains(areaCat.areas, area.id) then
return areaCat
end
end
end
function p.getAreaCategoriesFromAreas(areas)
local areaCatIDs = {}
for i, area in ipairs(areas) do
local areaCat = p.getAreaCategory(area)
if areaCat ~= nil and areaCat.id ~= nil then
areaCatIDs[areaCat.id] = true
end
end
return GameData.getEntities('combatAreaCategories',
function(obj)
return obj.id ~= nil and areaCatIDs[obj.id] ~= nil
end
)
end
local function getAreasForTable(areaDataKey, categoryName, defaultCategoryID)
local areaCategories = p.getAreaCategoriesFromAreas(GameData.rawData[areaDataKey])
local areaCategory = nil
if categoryName == nil or categoryName == '' then
-- Default area category
areaCategory = GameData.getEntityByID(areaCategories, defaultCategoryID)
else
areaCategory = GameData.getEntityByName(areaCategories, categoryName)
end
if areaCategory == nil then
local catNames = {}
for _, areaCat in ipairs(areaCategories) do
if areaCat.name ~= nil then
table.insert(catNames, areaCat.name)
end
end
return nil, Shared.printError('Invalid area category, choose any of: ' .. table.concat(catNames, ', '))
end
local areas = GameData.getEntities(areaDataKey,
function(obj)
return obj.id ~= nil and Shared.contains(areaCategory.areas, obj.id)
end
)
areas = GameData.sortByOrderTable(areas, areaCategory.areas)
return areas, nil
end
function p.getCombatAreaTable(frame)
local args = frame.args ~= nil and frame.args or frame
local categoryName = args[1]
local areas, errText = getAreasForTable('combatAreas', categoryName, 'melvorD:CombatAreas')
if errText ~= nil then
return errText
elseif areas == nil then
return ''
end
local result = '{| class="wikitable sortable stickyHeader"'
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Lowest Monster Level!!Highest Monster Level!!Requirements'
for i, area in ipairs(areas) do
result = result..'\r\n|-'
result = result..'\r\n|class="table-img" data-sort-value="' .. area.name .. '"| '..Icons.Icon({area.name, type='combatArea', size='50', notext=true})
result = result..'||' .. Icons.getExpansionIcon(area.id) .. Icons.Icon({area.name, type='combatArea', noicon=true})
result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty')
local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs)
result = result .. '||data-sort-value="' .. lowLvl .. '"| ' .. Num.formatnum(lowLvl)
result = result .. '||data-sort-value="' .. highLvl .. '"| ' .. Num.formatnum(highLvl)
local reqText = Areas._getAreaRequirements(area)
if reqText == nil or reqText == '' then
result = result .. '||class="table-na"| None'
else
result = result .. '||' .. reqText
end
end
result = result..'\r\n|}'
return result
end
function p.getSlayerAreaTable(frame)
local args = frame.args ~= nil and frame.args or frame
local categoryName = args[1]
local areas, errText = getAreasForTable('slayerAreas', categoryName, 'melvorF:SlayerAreas')
if errText ~= nil then
return errText
elseif areas == nil then
return ''
end
local result = '{| class="wikitable sortable stickyHeader"'
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n!colspan="2"|Zone!!Difficulty!!Highest Monster Level!!Requirements!!Area Effect'
for i, area in ipairs(areas) do
result = result..'\r\n|-'
result = result..'\r\n|class="table-img" data-sort-value="' .. area.name .. '"| '..Icons.Icon({area.name, type='slayer', size='50', notext=true})
result = result..'||' .. Icons.getExpansionIcon(area.id) .. Icons.Icon({area.name, type='slayer', noicon=true})
result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..Areas._getAreaStat(area, 'difficulty')
local lowLvl, highLvl = p.getLowHighLevels(area.monsterIDs)
result = result..'||data-sort-value="' .. highLvl .. '"| ' .. Num.formatnum(highLvl)
local reqText = Areas._getAreaRequirements(area)
if reqText == nil or reqText == '' then
result = result .. '||class="table-na"| None'
else
result = result .. '||' .. reqText
end
local effectText = Areas._getAreaStat(area, 'areaEffectDesc')
local classText = ((effectText == nil or effectText == 'None') and 'class="table-na"|') or ''
result = result..'||' .. classText .. ' ' .. effectText
end
result = result..'\r\n|}'
return result
end
function p._getDungeonRewards(area, asList)
if asList == nil then
asList = true
elseif type(asList) == 'string' then
asList = string.upper(asList) ~= 'FALSE'
end
local lineSep = (asList and '\n' or '<br>')
local formatLine = nil
if asList then
formatLine = function(text) return '* ' .. text end
end
-- Currency rewards
local rewardCurrency = {}
if area.eventID == nil then
local bossMonster = Monsters.getMonsterByID(area.monsterIDs[Shared.tableCount(area.monsterIDs)])
rewardCurrency = bossMonster.currencyDrops
end
-- Item rewards
local itemLists = {}
if type(area.rewardItemIDs) == 'table' then
table.insert(itemLists, area.rewardItemIDs)
elseif area.type == 'stronghold' then
-- This won't show which tier each reward comes from
-- but there doesn't seem to be an easy way to do that
local enhancementList = {}
for tier, tierData in pairs(area.tiers) do
if type(tierData.rewards) == 'table' and type(tierData.rewards.items) == 'table' then
for i, reward in ipairs(tierData.rewards.items) do
table.insert(enhancementList, reward.id)
end
end
end
if not Shared.tableIsEmpty(enhancementList) then
table.insert(itemLists, enhancementList)
end
end
if area.eventID ~= nil then
local event = GameData.getEntityByID('combatEvents', area.eventID)
if event ~= nil and type(event.itemRewardIDs) == 'table' then
table.insert(itemLists, event.itemRewardIDs)
end
end
if area.oneTimeRewardID ~= nil then
table.insert(itemLists, {area.oneTimeRewardID})
end
local rewardItem = {}
for i, itemList in ipairs(itemLists) do
for j, rewardID in ipairs(itemList) do
table.insert(rewardItem, {
["id"] = rewardID,
["quantity"] = 1
})
end
end
return Common.getCostString({ ["items"] = rewardItem, ["currencies"] = rewardCurrency}, '', formatLine, lineSep)
end
function p.getDungeonRewards(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame
local asList = frame.args ~= nil and frame.args[2] or true
local area = Areas.getArea(areaName)
if area == nil then
return Shared.printError('Could not find an area named "' .. areaName .. '"')
end
if area.type == 'dungeon' or area.type == 'abyssDepth' or area.type == 'stronghold' then
return p._getDungeonRewards(area, asList)
else
return Shared.printError('"' .. areaName .. '" is not a dungeon')
end
end
function p.getDungeonTable(frame)
local args = frame.args ~= nil and frame.args or frame
local categoryName = args[1]
local areas, errText = getAreasForTable('dungeons', categoryName, 'melvorD:Dungeons')
if errText ~= nil then
return errText
elseif areas == nil then
return ''
end
local result = '{| class="wikitable sortable stickyHeader"'
result = result..'\r\n|-class="headerRow-0"'
result = result..'\r\n!colspan="2"|Dungeon!!Difficulty!!Monsters!!Boss Level!!Requirements!!Rewards!!Boss Pet'
for i, dung in ipairs(areas) do
local monsterCount = Shared.tableCount(dung.monsterIDs)
local boss = Monsters.getMonsterByID(dung.monsterIDs[monsterCount])
result = result..'\r\n|-'
result = result..'\r\n|class="table-img" data-sort-value="'..dung.name..'"|'..Icons.Icon({dung.name, type='dungeon', size='50', notext=true})
result = result..'||' .. Icons.getExpansionIcon(dung.id) .. Icons.Icon({dung.name, type='dungeon', noicon=true})
result = result..'||data-sort-value="'..dung.difficulty[1]..'"|'..Areas._getAreaStat(dung, 'difficulty')
result = result..'||'..monsterCount
result = result..'||'..Num.formatnum(Monsters._getMonsterCombatLevel(boss))
local reqText = Areas._getAreaRequirements(dung)
if reqText == nil or reqText == '' then
result = result .. '||class="table-na"| None'
else
result = result .. '||' .. reqText
end
result = result..'||'..p._getDungeonRewards(dung, false)
local petAdded = false
if dung.pet ~= nil then
local pet = GameData.getEntityByID('pets', dung.pet.petID)
if pet ~= nil then
result = result..'||data-sort-value="'..pet.name..'"|'..Icons.Icon({pet.name, type='pet'})
local petDrop = Pets._getPetChance(pet)
if petDrop ~= nil then
result = result..'<br/>'..petDrop
end
petAdded = true
end
end
if not petAdded then
result = result..'||class="table-na"| None'
end
end
result = result..'\r\n|}'
return result
end
local function getAreaOrderTable(areaCategoryID)
local areaCategory = GameData.getEntityByID('combatAreaCategories', areaCategoryID)
if areaCategory == nil then
return {}
else
return areaCategory.areas
end
end
function p.buildCombatNavText(frame)
--This isn't actually called on any pages but instead exists to save me time on updating Template:CombatNav for the new expansion
local areas = GameData.sortByOrderTable(GameData.rawData.slayerAreas, getAreaOrderTable('melvorD:SlayerAreas'))
local outArray = {}
for i, area in ipairs(areas) do
local id = area.id
if Shared.startsWith(id, 'melvorTotH') then
table.insert(outArray, '|-')
table.insert(outArray, '| {{TotH}} {{ZoneIcon|'..area.name..'}}')
local monsterArray = {}
for j, monsterID in ipairs(area.monsterIDs) do
local monster = Monsters.getMonsterByID(monsterID)
table.insert(monsterArray, '{{MonsterIcon|'..monster.name..'}}')
end
table.insert(outArray, '| class="center" style="vertical-align:middle;" | '..table.concat(monsterArray, ' {{*}} '))
end
end
areas = GameData.sortByOrderTable(GameData.rawData.dungeons, getAreaOrderTable('melvorD:Dungeons'))
for i, area in ipairs(areas) do
local id = area.id
if Shared.startsWith(id, 'melvorTotH') then
table.insert(outArray, '|-')
table.insert(outArray, '| {{TotH}} {{ZoneIcon|'..area.name..'}}')
local monsterArray = {}
local mCheck = {}
for j, monsterID in ipairs(area.monsterIDs) do
local monster = Monsters.getMonsterByID(monsterID)
if mCheck[monster.name] == nil then
table.insert(monsterArray, '{{MonsterIcon|'..monster.name..'}}')
mCheck[monster.name] = 1
end
end
table.insert(outArray, '| class="center" style="vertical-align:middle;" | '..table.concat(monsterArray, ' {{*}} '))
end
end
return table.concat(outArray, '\r\n')
end
return p