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') local Pets = require('Module:Pets') 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' for i, areaIdx in ipairs(AreaData.displayOrder.combatAreas) do local area = CombatAreas.getAreaByID('combat', areaIdx) result = result..'\r\n|-' result = result..'\r\n|'..Icons.Icon({area.name, type='combat', size='50', notext=true}) result = result..'||'..Icons.Icon({area.name, type='combat', noicon=true}) 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' for i, areaIdx in ipairs(AreaData.displayOrder.slayerAreas) do local area = CombatAreas.getAreaByID('slayer', areaIdx) result = result..'\r\n|-' result = result..'\r\n|'..Icons.Icon({area.name, type='slayer', size='50', notext=true}) result = result..'||'..Icons.Icon({area.name, type='slayer', noicon=true}) 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 result = result..'||'..CombatAreas._getAreaRequirements(area) result = result..'|| '..CombatAreas._getAreaStat(area, 'areaEffectDesc') end result = result..'\r\n|}' return result end function p._getDungeonRewards(area, asList) if asList == nil then asList = true elseif type(asList) == 'string' then asList = asList.upper ~= 'FALSE' end local chr = asList and '* ' or '' local rewardList = {} -- GP reward if area.isEvent == nil or not area.isEvent then local bossMonster = Monsters.getMonsterByID(area.monsters[Shared.tableCount(area.monsters)]) local gpMin = bossMonster.dropCoins[1] local gpMax = bossMonster.dropCoins[2] if gpMin > 0 and gpMax > 0 then if gpMin == gpMax then table.insert(rewardList, chr .. Icons.GP(gpMin)) else table.insert(rewardList, chr .. Icons.GP(gpMin, gpMax)) end end end -- Item rewards if type(area.rewards) == 'table' then for i, rewardID in ipairs(area.rewards) do local rewardItem = Items.getItemByID(rewardID) if rewardItem == nil then table.insert(rewardList, chr .. 'Unknown item (ID ' .. tostring(rewardID) .. ')[[Category:Pages with script errors]]') else table.insert(rewardList, chr .. Icons.Icon({rewardItem.name, type='item', qty=1})) end end end -- Event (Impending Darkness) rewards if area.isEvent ~= nil and area.isEvent then for i, rewardID in ipairs(AreaData.event.rewards) do local rewardItem = Items.getItemByID(rewardID) table.insert(rewardList, chr .. Icons.Icon({rewardItem.name, type='item', qty=1})) end end if asList then return table.concat(rewardList, '\r\n') else return table.concat(rewardList, '<br/>') end end function p.getDungeonRewards(frame) local areaName = frame.args ~= nil and frame.args[1] or frame local asList = frame.args ~= nil and frame.args[2] or true local area = CombatAreas.getArea(areaName) if area == nil then return "ERROR: Could not find an area named "..areaName..'[[Category:Pages with script errors]]' end if area.type == 'dungeon' then return p._getDungeonRewards(area, asList) else return "ERROR: "..areaName.." is not a dungeon[[Category:Pages with script errors]]" end end function p.getDungeonTable(frame) local result = '{| class="wikitable sortable stickyHeader"' result = result..'\r\n|-class="headerRow-0"' result = result..'\r\n!colspan="2"|Dungeon!!Difficulty!!Monsters!!Boss Level!!Reward(s)!!Boss Pet' for i, dungIdx in ipairs(AreaData.displayOrder.dungeons) do local dung = CombatAreas.getAreaByID('dungeon', dungIdx) result = result..'\r\n|-' result = result..'\r\n|data-sort-value="'..dung.name..'"|'..Icons.Icon({dung.name, type='dungeon', size='50', notext=true}) result = result..'||'..Icons.Icon({dung.name, type='dungeon', noicon=true}) result = result..'||data-sort-value="'..dung.difficulty[1]..'"|'..CombatAreas._getAreaStat(dung, 'difficulty') result = result..'||'..Shared.tableCount(dung.monsters) local boss = Monsters.getMonsterByID(dung.monsters[Shared.tableCount(dung.monsters)]) result = result..'||'..Shared.formatnum(Monsters._getMonsterCombatLevel(boss)) result = result..'||'..p._getDungeonRewards(dung, false) if dung.petID ~= nil then local pet = Pets.getPetByID(dung.petID) result = result..'||data-sort-value="'..pet.name..'"|'..Icons.Icon({pet.name, type='pet'}) else result = result..'|| ' end end result = result..'\r\n|}' return result end return p