Anonymous

Module:CombatAreas: Difference between revisions

From Melvor Idle
Tweaked processArea code to make sure a type is always added properly
(fixed a typo)
(Tweaked processArea code to make sure a type is always added properly)
(6 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)
   local result = nil
   local result = nil
  mw.log(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 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 22: 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 30: 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 40: 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'
  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)
   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(areaName)
  --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 a dungeon 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