Module:CombatAreas/AreaTables

From Melvor Idle

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 AreaData = mw.loadData('Module:CombatAreas/data')

local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Monsters = require('Module:Monsters')
local CombatAreas = require('Module:CombatAreas')

function p.getLowHighLevels(idList)
  local lowLevel = 1000000
  local highLevel = 0
  for i, monID in Shared.skpairs(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.getCombatAreaTable()
  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'

  local combatAreas = Shared.clone(AreaData.combatAreas)
  table.sort(combatAreas, function(a, b) 
               if a.difficulty[1] ~= b.difficulty[1] then
                 return a.difficulty[1] < b.difficulty[1]
               elseif a.difficulty[2] == nil then
                 return true
               elseif b.difficulty[2] == nil then
                 return false
               elseif a.difficulty[2] ~= b.difficulty[2] then
                 return a.difficulty[2] < b.difficulty[2]
               else
                 return a.areaName < b.areaName
               end
             end)

  for i, area in Shared.skpairs(combatAreas) do
    result = result..'\r\n|-'
    result = result..'\r\n|'..Icons.Icon({area.areaName, type='combat', size='50', notext=true})..'||[['..area.areaName..']]'
    local diff1 = Constants.getDifficultyString(area.difficulty[1])
    local diff2 = Constants.getDifficultyString(area.difficulty[2])
    result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..diff1
    if diff1 ~= diff2 and diff2 ~= nil then result = result..' - '..diff2 end
    local lowLvl, highLvl = p.getLowHighLevels(area.monsters)
    result = result..'||'..lowLvl..'||'..highLvl
  end

  result = result..'\r\n|}'

  return result
end

function p.getSlayerAreaTable()
  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'

  local slayerAreas = Shared.clone(AreaData.slayerAreas)
  table.sort(slayerAreas, function(a, b) 
               if a.slayerLevel ~= b.slayerLevel then
                 return a.slayerLevel < b.slayerLevel
               elseif a.difficulty[1] ~= b.difficulty[1] then
                 return a.difficulty[1] < b.difficulty[1]
               elseif a.difficulty[2] == nil then
                 return true
               elseif b.difficulty[2] == nil then
                 return false
               elseif a.difficulty[2] ~= b.difficulty[2] then
                 return a.difficulty[2] < b.difficulty[2]
               else
                 return a.areaName < b.areaName
               end
             end)

  for i, area in Shared.skpairs(slayerAreas) do
    result = result..'\r\n|-'
    result = result..'\r\n|'..Icons.Icon({area.areaName, type='slayer', size='50', notext=true})..'||[['..area.areaName..']]'
    local diff1 = Constants.getDifficultyString(area.difficulty[1])
    local diff2 = Constants.getDifficultyString(area.difficulty[2])
    result = result..'||data-sort-value="'..area.difficulty[1]..'"|'..diff1
    if diff1 ~= diff2 and diff2 ~= nil then result = result..' - '..diff2 end
    local lowLvl, highLvl = p.getLowHighLevels(area.monsters)
    result = result..'||'..highLvl

    local reqArray = {}
    if area.slayerLevel ~= nil and area.slayerLevel > 1 then
      table.insert(reqArray, Icons._SkillReq('Slayer', area.slayerLevel))
    end
    if area.slayerItem ~= nil and area.slayerItem > 0 then
      local item = Items.getItemByID(area.slayerItem)
      table.insert(reqArray, Icons.Icon({item.name, type='item'})..' Equipped')
    end
    if area.dungeonCompleted ~= nil and area.dungeonCompleted > 0 then
      local dung = CombatAreas.getAreaByID('dungeon', area.dungeonCompleted)
      table.insert(reqArray, Icons.Icon({dung.name, type='dungeon'})..' Completed')
    end
    result = result..'||data-sort-value="'..area.slayerLevel..'"| '..table.concat(reqArray, '<br/>')
    result = result..'||'
    if area.areaEffectDescription ~= nil then
       result = result..area.areaEffectDescription
    end
  end

  result = result..'\r\n|}'

  return result
end

return p