Module:CombatAreas
From Melvor Idle
Data is pulled from Module:GameData/data
NOTE: Some tables are in Module:CombatAreas/AreaTables to prevent loop from referencing Monsters
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 Monsters = require('Module:Monsters')
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
result = Shared.clone(area)
result.id = i - 1
return result
end
end
for i, area in pairs(AreaData.slayerAreas) do
if area.areaName == name then
result = Shared.clone(area)
result.id = i - 1
return result
end
end
for i, area in pairs(AreaData.dungeons) do
if area.name == name then
result = Shared.clone(area)
result.type = 'dungeon'
result.id = i - 1
return result
end
end
return nil
end
function p.getAreaMonsterTable(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame
local area = p.getArea(frame)
if area == nil then
return "ERROR: Could not find an area named "..areaName
end
if area.type == 'dungeon' then
return p.getDungeonMonsterTable(frame)
end
local tableTxt = '{| class="wikitable sortable"'
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
function p.getDungeonMonsterTable(frame)
local areaName = frame.args ~= nil and frame.args[1] or frame
local area = p.getArea(frame)
if area == nil then
return "ERROR: Could not find an area named "..areaName
end
--For Dungeons, go through and count how many of each monster are in the dungeon first
local monsterCounts = {}
for i, monsterID in pairs(area.monsters) do
if monsterCounts[monsterID] == nil then
monsterCounts[monsterID] = 1
else
monsterCounts[monsterID] = monsterCounts[monsterID] + 1
end
end
local usedMonsters = {}
local tableTxt = '{| class="wikitable sortable"'
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
tableTxt = tableTxt..'\r\n|}'
return tableTxt
end
return p