Module:CombatAreas
Data is pulled from Module:GameData/data
NOTE: Some tables are in Module:CombatAreas/AreaTables to prevent loop from referencing Monsters
--NOTE: Some tables are in Module:CombatAreas/AreaTables to prevent loop from referencing Monsters
local p = {}
local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Shop = require('Module:Shop')
local areaMap = {
["combat"] = 'combatAreas',
["dungeon"] = 'dungeons',
["slayer"] = 'slayerAreas'
}
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
for k, areaType in pairs(areaMap) do
local area = GameData.getEntityByName(areaType, name)
if area ~= nil then
return area
end
end
end
function p.getAreaByID(id, type)
local areaType = areaMap[type]
if areaType ~= nil then
return GameData.getEntityByID(areaType, id)
end
end
function p.getAreaFilterType(name, type)
local areaType = areaMap[type]
if areaType ~= nil then
return GameData.getEntityByName(areaType, name)
end
end
function p.getAreas(checkFunc)
local resultArray = nil
for i, areaType in pairs(areaMap) do
local areas = GameData.getEntities(areaType, checkFunc)
if resultArray == nil then
resultArray = areas
else
for k, area in ipairs(areas) do
table.insert(resultArray, area)
end
end
end
if resultArray == nil then
resultArray = {}
end
return resultArray
end
function p._getAreaRequirements(area)
local resultArray = {}
local addReqsToArray = function(reqArray, requirements)
for i, reqDetails in ipairs(requirements) do
if reqDetails.type == 'SkillLevel' then
local skillName = Constants.getSkillName(reqDetails.skillID)
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
if area.entryRequirements ~= nil then
addReqsToArray(resultArray, area.entryRequirements)
end
if area.unlockRequirement ~= nil then
addReqsToArray(resultArray, area.unlockRequirement)
end
return table.concat(resultArray, '<br/>')
end
function p._getAreaStat(area, statName)
if statName == 'requirements' then
return p._getAreaRequirements(area)
elseif statName == 'areaEffectDesc' then
if area.areaEffect ~= nil then
local descText, subIdx = string.gsub(area.areaEffectDescription, '${effectValue}', area.areaEffect.magnitude or 0)
return descText
else
return 'None'
end
elseif statName == 'difficulty' then
local result = Constants.getDifficultyString(area.difficulty[1])
if area.difficulty[2] ~= nil then
result = result..' - '..Constants.getDifficultyString(area.difficulty[2])
end
return result
end
return area[statName]
end
function p.getAreaStat(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame[1]
local statName = frame.args ~= nil and frame.args[2] or frame[2]
local area = p.getArea(areaName)
if area == nil then
return "ERROR: Could not find an area named "..areaName
end
return p._getAreaStat(area, statName)
end
function p.getMonsterAreas(monsterID)
-- Special handling for Lair of the Spider Queen, which has a random list of enemies
local randomSpiderCheck = Shared.contains(GameData.rawData.spiderLairMonsters, monsterID)
return p.getAreas(
function(area)
return Shared.contains(area.monsterIDs, monsterID) or
(randomSpiderCheck and Shared.contains(area.monsterIDs, 'melvorTotH:RandomSpiderLair'))
end)
end
function p.getDungeonRequirements(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame
local area = p.getArea(areaName)
if area == nil then
return "ERROR: Could not find an area named "..areaName
end
local result = p._getAreaStat(area, 'requirements')
if result ~= '' then
result = "\r\n|-\r\n|'''Requirements:'''<br/>"..result
end
return result
end
return p