Module:CombatAreas: Difference between revisions

From Melvor Idle
(Added new function for auto-building dungeon monster tables)
 
(Tweaked processArea code to make sure a type is always added properly)
(7 intermediate revisions by the same user not shown)
Line 6: Line 6:
local Shared = require('Module:Shared')
local Shared = require('Module:Shared')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Monsters = require('Module:Monsters')
local Items = require('Module:Items')
 
function processArea(area, index, type)
  local result = Shared.clone(area)
  result.id = index - 1
  if result.name == nil then
    result.name = result.areaName
  end
  result.type = type
  return result
end


function p.getArea(name)
function p.getArea(name)
Line 13: Line 23:
   for i, area in pairs(AreaData.combatAreas) do
   for i, area in pairs(AreaData.combatAreas) do
     if area.areaName == name then
     if area.areaName == name then
       result = Shared.clone(area)
       return processArea(area, i, 'combat')
      result.id = i - 1
      return result
     end
     end
   end
   end
Line 21: Line 29:
   for i, area in pairs(AreaData.slayerAreas) do
   for i, area in pairs(AreaData.slayerAreas) do
     if area.areaName == name then
     if area.areaName == name then
       result = Shared.clone(area)
       return processArea(area, i, 'slayer')
      result.id = i - 1
      return result
     end
     end
   end
   end
Line 29: Line 35:
   for i, area in pairs(AreaData.dungeons) do
   for i, area in pairs(AreaData.dungeons) do
     if area.name == name then
     if area.name == name then
       result = Shared.clone(area)
       return processArea(area, i, 'dungeon')
      result.type = 'dungeon'
      result.id = i - 1
      return result
     end
     end
   end
   end
Line 39: Line 42:
end
end


function p.getAreaMonsterTable(frame)
function p.getAreaByID(type, id)
   local areaName = frame.args ~= nil and frame.args[1] or frame
  if type == 'dungeon' then type = 'dungeons'
   local area = p.getArea(frame)
  elseif type == 'combat' then type = 'combatAreas'
  elseif type == 'slayer' then type = 'slayerAreas' end
  return processArea(AreaData[type][id + 1], id + 1)
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
   if area == nil then
     return "ERROR: Could not find an area named "..areaName
     return "ERROR: Could not find an area named "..areaName
   end
   end
 
   if statName == 'slayerLevel' then
   if area.type == 'dungeon' then
    return Icons._SkillReq('Slayer', area.slayerLevel)
     return p.getDungeonMonsterTable(frame)
  end
  if statName == 'slayerItem' then
     if area.slayerItem ~= nil and area.slayerItem > 0 then
      local slayItem = Items.getItemByID(area.slayerItem)
      return Icons.Icon({slayItem.name, type='item'})
    else
      return 'None'
    end
   end
   end


   local tableTxt = '{| class="wikitable sortable"'
   return area[statName]
  tableTxt = tableTxt..'\r\n! Name !! Combat Level !! Hitpoints !! Max Hit !! [[Combat Triangle|Combat Style]]'
  for i, monsterID in pairs(area.monsters) do
    local monster = Monsters.getMonsterByID(monsterID)
    tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({monster.name, type='monster'})
    tableTxt = tableTxt..'||'..Monsters.getMonsterCombatLevel(monster.name)
    tableTxt = tableTxt..'||'..Shared.formatnum(Monsters.getMonsterHP(monster.name))
    tableTxt = tableTxt..'||'..Shared.formatnum(Monsters.getMonsterMaxHit(monster.name))
    tableTxt = tableTxt..'||'..Monsters.getMonsterStyleIcon({monster.name, nolink='true'})
  end
  tableTxt = tableTxt..'\r\n|}'
  return tableTxt
end
end


function p.getDungeonMonsterTable(frame)
function p.getMonsterAreas(monsterID)
   local areaName = frame.args ~= nil and frame.args[1] or frame
   local areaArray = {}
   local area = p.getArea(frame)
  --There are three types of areas but the lists are pretty short so looping all of them isn't a real issue
  if area == nil then
   for i, area in pairs(AreaData.combatAreas) do
     return "ERROR: Could not find an area named "..areaName
    if Shared.contains(area.monsters, monsterID) then
      table.insert(areaArray, processArea(area, i, 'combat'))
     end
   end
   end


  --For Dungeons, go through and count how many of each monster are in the dungeon first
   for i, area in pairs(AreaData.slayerAreas) do
  local monsterCounts = {}
     if Shared.contains(area.monsters, monsterID) then
   for i, monsterID in pairs(area.monsters) do
       table.insert(areaArray, processArea(area, i, 'slayer'))
     if monsterCounts[monsterID] == nil then  
       monsterCounts[monsterID] = 1
    else
      monsterCounts[monsterID] = monsterCounts[monsterID] + 1
     end
     end
   end
   end


  local usedMonsters = {}
   for i, area in pairs(AreaData.dungeons) do
 
     if Shared.contains(area.monsters, monsterID) then
  local tableTxt = '{| class="wikitable sortable"'
       table.insert(areaArray, processArea(area, i, 'dungeon'))
  tableTxt = tableTxt..'\r\n! Name !! Combat Level !! Hitpoints !! Max Hit !! [[Combat Triangle|Combat Style]] !! Count'
   for i, monsterID in pairs(area.monsters) do
     if not Shared.contains(usedMonsters, monsterID) then
       local monster = Monsters.getMonsterByID(monsterID)
      local name = monster.name
      if monsterID == 51 then name = 'Spider2' end
      tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({name, type='monster'})
      tableTxt = tableTxt..'||'..Monsters.getMonsterCombatLevel(name)
      tableTxt = tableTxt..'||'..Shared.formatnum(Monsters.getMonsterHP(name))
      tableTxt = tableTxt..'||'..Shared.formatnum(Monsters.getMonsterMaxHit(name))
      tableTxt = tableTxt..'||'..Monsters.getMonsterStyleIcon({name, nolink='true'})
      tableTxt = tableTxt..'||'..monsterCounts[monsterID]
      table.insert(usedMonsters, monsterID)
     end
     end
   end
   end
  tableTxt = tableTxt..'\r\n|}'
   return areaArray
   return tableTxt
end
end


return p
return p

Revision as of 18:31, 15 December 2020

Data is pulled from Module:GameData/data


local p = {}

local Constants = mw.loadData('Module:Constants/data')
local AreaData = mw.loadData('Module:CombatAreas/data')

local Shared = require('Module:Shared')
local Icons = require('Module:Icons')
local Items = require('Module:Items')

function processArea(area, index, type)
  local result = Shared.clone(area)
  result.id = index - 1
  if result.name == nil then
    result.name = result.areaName
  end
  result.type = type
  return result
end

function p.getArea(name)
  local result = nil
  --There are three types of areas but the lists are pretty short so looping all of them isn't a real issue
  for i, area in pairs(AreaData.combatAreas) do
    if area.areaName == name then
      return processArea(area, i, 'combat')
    end
  end

  for i, area in pairs(AreaData.slayerAreas) do
    if area.areaName == name then
      return processArea(area, i, 'slayer')
    end
  end

  for i, area in pairs(AreaData.dungeons) do
    if area.name == name then
      return processArea(area, i, 'dungeon')
    end
  end

  return nil
end

function p.getAreaByID(type, id)
  if type == 'dungeon' then type = 'dungeons'
  elseif type == 'combat' then type = 'combatAreas'
  elseif type == 'slayer' then type = 'slayerAreas' end
  return processArea(AreaData[type][id + 1], id + 1)
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
  if statName == 'slayerLevel' then
    return Icons._SkillReq('Slayer', area.slayerLevel)
  end
  if statName == 'slayerItem' then
    if area.slayerItem ~= nil and area.slayerItem > 0 then
      local slayItem = Items.getItemByID(area.slayerItem)
      return Icons.Icon({slayItem.name, type='item'})
    else
      return 'None'
    end
  end

  return area[statName]
end

function p.getMonsterAreas(monsterID)
  local areaArray = {}
  --There are three types of areas but the lists are pretty short so looping all of them isn't a real issue
  for i, area in pairs(AreaData.combatAreas) do
    if Shared.contains(area.monsters, monsterID) then
      table.insert(areaArray, processArea(area, i, 'combat'))
    end
  end

  for i, area in pairs(AreaData.slayerAreas) do
    if Shared.contains(area.monsters, monsterID) then
      table.insert(areaArray, processArea(area, i, 'slayer'))
    end
  end

  for i, area in pairs(AreaData.dungeons) do
    if Shared.contains(area.monsters, monsterID) then
      table.insert(areaArray, processArea(area, i, 'dungeon'))
    end
  end
  return areaArray
end

return p