73
edits
No edit summary |
No edit summary |
||
Line 7: | Line 7: | ||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local Constants = require('Module:Constants') | |||
local Icons = require('Module:Icons') | local Icons = require('Module:Icons') | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
local CombatAreas = require('Module:CombatAreas') | |||
local | local CHECK_ITEMS = {'Attack', 'Strength', 'Defence', 'Ranged', 'Magic', | ||
local | 'Slayer'} | ||
local CHECK_AREAS = {'Slayer'} | |||
local TYPE_SORT_ORDER = { | |||
['item'] = 1, | |||
['combatArea'] = 2, | |||
['slayerArea'] = 3, | |||
['dungeon'] = 4 | |||
} | |||
local VERBS_PER_SUBTYPE = { | |||
['Weapon'] = 'Wield', | |||
['Armour'] = 'Wear', | |||
['Ring'] = 'Wear', | |||
['Amulet'] = 'Wear', | |||
['combatArea'] = 'Access', | |||
['slayerArea'] = 'Access', | |||
['dungeon'] = 'Access' | |||
} | |||
function p. | function p._addItemsWithSkillRequirement(entityList, skillName) | ||
local skillReqLabel = skillName:lower() .. 'LevelRequired' | |||
local itemList = Items.getItems(function(item) | local itemList = Items.getItems(function(item) | ||
-- Exclude Golbin Raid exclusives | -- Exclude Golbin Raid exclusives | ||
Line 23: | Line 42: | ||
end) | end) | ||
-- TODO: This can probably be made into a generic function for each entity | |||
for i, item in ipairs(itemList) do | for i, item in ipairs(itemList) do | ||
local | local processed = {} | ||
processed.entity = item | |||
processed.entityType = 'item' | |||
table.insert( | processed.subType = item.type | ||
processed.entityName = item.name | |||
processed.skillLevel = Items._getItemStat(item, skillReqLabel) | |||
table.insert(entityList, processed) | |||
end | |||
return entityList | |||
end | |||
-- This covers combat areas, Slayer areas, and dungeons | |||
function p._addAreasWithSkillRequirement(entityList, skillName) | |||
local areaList = CombatAreas.getAreas(function(area) | |||
local hasSkillReq = false | |||
for i, req in ipairs(area.entryRequirements) do | |||
if req.type == 'SkillLevel' and req.skillID == Constants.getSkillID(skillName) then | |||
hasSkillReq = true | |||
end | |||
end | |||
return hasSkillReq | |||
end) | |||
for i, area in ipairs(areaList) do | |||
local processed = {} | |||
processed.entity = area | |||
processed.entityType = area.type | |||
processed.subType = area.type | |||
processed.entityName = area.name | |||
for a, req in ipairs(area.entryRequirements) do | |||
if req.type == 'SkillLevel' and req.skillID == Constants.getSkillID(skillName) then | |||
processed.skillLevel = req.level | |||
end | |||
end | |||
table.insert(entityList, processed) | |||
end | end | ||
return | return entityList | ||
end | end | ||
function p._getSkillUnlockTable(skillName) | function p._getSkillUnlockTable(skillName) | ||
local skillReqLabel = skillName:lower() .. 'LevelRequired' | -- local skillReqLabel = skillName:lower() .. 'LevelRequired' | ||
-- What do we need to check for this skill? ( | -- What do we need to check for this skill? (avoid checking everything for | ||
-- | -- every skill to save time) | ||
local | local entityList = {} | ||
if Shared.contains(CHECK_ITEMS, skillName) then | if Shared.contains(CHECK_ITEMS, skillName) then | ||
entityList = p._addItemsWithSkillRequirement(entityList, skillName) | |||
end | |||
if Shared.contains(CHECK_AREAS, skillName) then | |||
entityList = p._addAreasWithSkillRequirement(entityList, skillName) | |||
end | end | ||
if Shared.tableIsEmpty( | if Shared.tableIsEmpty(entityList) then | ||
-- TODO: | -- TODO: More specific empty handling | ||
return nil | return nil | ||
end | end | ||
-- Sort the list of | -- Sort the big list of everything | ||
table.sort( | table.sort(entityList, function(a, b) | ||
return a.skillLevel < b.skillLevel | -- Sort by level first | ||
if a.skillLevel ~= b.skillLevel then | |||
return a.skillLevel < b.skillLevel | |||
-- Then by type | |||
elseif TYPE_SORT_ORDER[a.entityType] ~= TYPE_SORT_ORDER[b.entityType] then | |||
return TYPE_SORT_ORDER[a.entityType] < TYPE_SORT_ORDER[b.entityType] | |||
-- And finally by entity name | |||
else | |||
return a.entityName < b.entityName | |||
end | |||
end) | end) | ||
Line 60: | Line 123: | ||
table.insert(resultPart, '\r\n!Unlocks') | table.insert(resultPart, '\r\n!Unlocks') | ||
-- Time to iterate | -- Time to iterate! | ||
local currentLevel = 0 | local currentLevel = 0 | ||
for i, | for i, entity in ipairs(entityList) do | ||
local | local foundLevel = entity.skillLevel | ||
-- Start a new row if the current | -- Start a new row if the current entity's level is higher than the | ||
-- row | -- current row | ||
if | if foundLevel ~= currentLevel then | ||
currentLevel = | currentLevel = foundLevel | ||
table.insert(resultPart, '\r\n|-') | table.insert(resultPart, '\r\n|-') | ||
table.insert(resultPart, '\r\n|' .. | table.insert(resultPart, '\r\n|' .. foundLevel) | ||
table.insert(resultPart, '\r\n|') | table.insert(resultPart, '\r\n|') | ||
else | else | ||
Line 76: | Line 139: | ||
end | end | ||
-- Append | -- Append entity to the column | ||
local verb = '' | local verb = '' | ||
if | if Shared.contains(VERBS_PER_SUBTYPE, entity.subType) then | ||
verb = VERBS_PER_SUBTYPE[entity.subType] .. ' ' | |||
verb = ' | |||
end | end | ||
table.insert(resultPart, verb .. Icons.Icon({ | table.insert(resultPart, verb .. Icons.Icon({entity.entityName, type=entity.entityType})) | ||
end | end | ||
edits