Module:CombatAreas: Difference between revisions

Update for v1.3
(_getAreaRequirements: Avoid repeating the same requirement twice)
(Update for v1.3)
(6 intermediate revisions by 2 users not shown)
Line 5: Line 5:
local Shared = require('Module:Shared')
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local GameData = require('Module:GameData')
local Common = require('Module:Common')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Shop = require('Module:Shop')


local areaMap = {
local areaMap = {
    ["combat"] = 'combatAreas',
["combat"] = 'combatAreas',
    ["dungeon"] = 'dungeons',
["dungeon"] = 'dungeons',
    ["slayer"] = 'slayerAreas'
["slayer"] = 'slayerAreas',
["depth"] = 'abyssDepths'
}
}


function p.getArea(name)
function p.getArea(name)
--There are three types of areas but the lists are pretty short so looping all of them isn't a real issue
--There are three types of areas but the lists are pretty short so looping all of them isn't a real issue
    for k, areaType in pairs(areaMap) do
for k, areaType in pairs(areaMap) do
        local area = GameData.getEntityByName(areaType, name)
local area = GameData.getEntityByName(areaType, name)
        if area ~= nil then
if area ~= nil then
            return area
return area
        end
end
    end
end
end
end


function p.getAreaByID(id, type)
function p.getAreaByID(id, areaType)
    local areaType = areaMap[type]
for aType, areaKey in pairs(areaMap) do
    if areaType ~= nil then
if areaType == nil or areaType == aType then
        return GameData.getEntityByID(areaType, id)
local area = GameData.getEntityByID(areaKey, id)
    end
if area ~= nil then
return area
end
end
end
end
end


function p.getAreaFilterType(name, type)
function p.getAreaFilterType(name, type)
    local areaType = areaMap[type]
local areaType = areaMap[type]
    if areaType ~= nil then
if areaType ~= nil then
        return GameData.getEntityByName(areaType, name)
return GameData.getEntityByName(areaType, name)
    end
end
end
end


Line 42: Line 46:
local resultArray = nil
local resultArray = nil


    for i, areaType in pairs(areaMap) do
for i, areaType in pairs(areaMap) do
        local areas = GameData.getEntities(areaType, checkFunc)
local areas = GameData.getEntities(areaType, checkFunc)
        if resultArray == nil then
if resultArray == nil then
            resultArray = areas
resultArray = areas
        else
else
            for k, area in ipairs(areas) do
for k, area in ipairs(areas) do
                table.insert(resultArray, area)
table.insert(resultArray, area)
            end
end
        end
end
    end
end
    if resultArray == nil then
if resultArray == nil then
        resultArray = {}
resultArray = {}
    end
end
 
return resultArray
end


    return resultArray
--Returns the expansion icon for the area if it has one
function p.getExpansionIcon(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame
local area = p.getArea(areaName)
if area == nil then
return Shared.printError('No area named "' .. areaName .. '" exists in the data module')
end
return Icons.getExpansionIcon(area.id)
end
end


function p._getAreaRequirements(area)
function p._getAreaRequirements(area)
local resultArray = {}
local resultArray = {}
local addReqsToArray = function(reqArray, requirements)
if area.entryRequirements ~= nil then
for i, reqDetails in ipairs(requirements) do
local reqText = Common.getRequirementString(area.entryRequirements)
if reqDetails.type == 'SkillLevel' then
if reqText ~= nil then
                local skillName = Constants.getSkillName(reqDetails.skillID)
table.insert(resultArray, reqText)
                if skillName ~= nil then
                    table.insert(reqArray, Icons._SkillReq(skillName, reqDetails.level))
                end
elseif reqDetails.type == 'SlayerItem' then
local item = Items.getItemByID(reqDetails.itemID)
table.insert(reqArray, Icons.Icon({item.name, type='item'}) .. ' Equipped')
elseif reqDetails.type == 'DungeonCompletion' then
                local dung = p.getAreaByID(reqDetails.dungeonID, 'dungeon')
                if dung ~= nil then
                    if reqDetails.count > 1 then
                        table.insert(reqArray, Shared.formatnum(reqDetails.count) .. 'x ' .. Icons.Icon({dung.name, type='dungeon'}) .. ' Completions')
                    else
                        table.insert(reqArray, Icons.Icon({dung.name, type='dungeon'}) .. ' Completed')
                    end
                end
elseif reqDetails.type == 'ShopPurchase' then
                local shopPurchase = GameData.getEntityByID('shopPurchases', reqDetails.purchaseID)
if shopPurchase ~= nil then
table.insert(reqArray, Shop._getPurchaseIcon({ shopPurchase }) .. ' Purchased')
end
else
table.insert(reqArray, 'ERROR: Unknown requirement type ' .. (reqDetails.type or 'nil') .. '[[Category:Pages with script errors]]')
end
end
end
end
if area.entryRequirements ~= nil then
addReqsToArray(resultArray, area.entryRequirements)
end
end


Line 98: Line 86:
-- Avoid repeating the same requirements twice, can happen for some dungeons e.g. Impending Darkness
-- Avoid repeating the same requirements twice, can happen for some dungeons e.g. Impending Darkness
if area.entryRequirements == nil or mw.dumpObject(area.unlockRequirement) ~= mw.dumpObject(area.entryRequirements) then
if area.entryRequirements == nil or mw.dumpObject(area.unlockRequirement) ~= mw.dumpObject(area.entryRequirements) then
        addReqsToArray(resultArray, area.unlockRequirement)
local reqText = Common.getRequirementString(area.unlockRequirement)
        end
if reqText ~= nil then
table.insert(resultArray, reqText)
end
end
end
end


return table.concat(resultArray, '<br/>')
return table.concat(resultArray, '<br/>')
end
function p.getAreaRequirementsForBox(frame)
--Returns infobox formatting for requirements, or returns nothing if there are none.
local areaName = frame.args ~= nil and frame.args[1] or frame
local area = p.getArea(areaName)
if area == nil then
return Shared.printError('No area named "' .. areaName .. '" exists in the data module')
end
local reqs = p._getAreaRequirements(area)
if reqs ~= '' then
reqs = "|-\r\n|'''Requirements:'''\r\n"..reqs
end
return reqs
end
end


Line 131: Line 137:
local area = p.getArea(areaName)
local area = p.getArea(areaName)
if area == nil then
if area == nil then
return "ERROR: Could not find an area named "..areaName
return Shared.printError('No area named "' .. areaName .. '" exists in the data module')
end
end


Line 137: Line 143:
end
end


function p.getMonsterAreas(monsterID)
function p._isMonsterInArea(monster, area)
return (
Shared.contains(area.monsterIDs, monster.id)
-- Check for Lair of the Spider Queen random spiders
or (
Shared.contains(area.monsterIDs, 'melvorTotH:RandomSpiderLair')
and Shared.contains(GameData.rawData.spiderLairMonsters, monster.id)
)
)
end
 
function p._getMonsterAreas(monster)
-- Special handling for Lair of the Spider Queen, which has a random list of enemies
-- Special handling for Lair of the Spider Queen, which has a random list of enemies
local randomSpiderCheck = Shared.contains(GameData.rawData.spiderLairMonsters, monsterID)
local randomSpiderCheck = Shared.contains(GameData.rawData.spiderLairMonsters, monster.id)
return p.getAreas(
return p.getAreas(
function(area)
function(area)
return Shared.contains(area.monsterIDs, monsterID) or
return p._isMonsterInArea(monster, area)
(randomSpiderCheck and Shared.contains(area.monsterIDs, 'melvorTotH:RandomSpiderLair'))
end)
end)
end
end
Line 151: Line 167:
local area = p.getArea(areaName)
local area = p.getArea(areaName)
if area == nil then
if area == nil then
return "ERROR: Could not find an area named "..areaName
return Shared.printError('No area named "' .. areaName .. '" exists in the data module')
end
end