Module:Pets
From Melvor Idle
Data for this page is stored in Module:Pets/data
--This module contains all sorts of functions for getting data on pets local p = {} local PetData = mw.loadData('Module:Pets/data') local Shared = require( "Module:Shared" ) local Constants = require('Module:Constants') local Icons = require('Module:Icons') local CombatAreas = require('Module:CombatAreas') function p.getPetByID(ID) local result = Shared.clone(PetData.Pets[ID + 1]) if result ~= nil then result.id = ID end return result end function p.getPet(name) local result = nil name = string.gsub(name, "%%27", "'") name = string.gsub(name, "'", "'") name = string.gsub(name, "'", "'") for i, pet in pairs(PetData.Pets) do local PetName = string.gsub(pet.name, '#', '') if name == PetName then result = Shared.clone(pet) --Make sure every pet has an id, and account for Lua being 1-index result.id = i - 1 result.skill = p._getPetSkill(result) break end end return result end function p.getPets(checkFunc) local result = {} for i, pet in Shared.skpairs(PetData.Pets) do if checkFunc(pet) then local newPet = Shared.clone(pet) newPet.id = i - 1 newPet.skill = p._getPetSkill(newPet) table.insert(result, newPet) end end return result end function p._getPetSource(pet) local sourceOverrides = { -- Format: ['PetName'] = {'Source', UseIcon} -- UseIcon = true if Source has an associated icon, false otherwise ['Asura'] = {'Slayer', true}, ['Ripper the Reindeer'] = {'[[Events#Christmas_Event_2020|Christmas Event 2020]]', false}, ['Festive Chio'] = {'[[Holiday Event 2021]]'}, ['Festive Cool Rock'] = {'[[Holiday Event 2021]]'}, ['Jerry the Giraffe'] = {'[[Golbin Raid|Golbin Raid Shop]]', false}, ['Preston the Platypus'] = {'[[Golbin Raid|Golbin Raid Shop]]', false}, ['Mark'] = {'Summoning', true}, ['Bone'] = {'Impending Darkness Event', true} } local petSource = '' local useIcon = true local override = sourceOverrides[pet.name] if override ~= nil then petSource = override[1] ~= nil and override[1] or pet.acquiredBy useIcon = override[2] elseif pet.acquiredBy ~= nil then petSource = pet.acquiredBy end -- Determine icon type (if any) local iconType = nil if Constants.getSkillID(petSource) ~= nil then iconType = 'skill' else local combatArea = CombatAreas.getArea(petSource) if combatArea ~= nil then iconType = combatArea.type end end if useIcon then petSource = Icons.Icon({petSource, type=iconType}) end return petSource end function p._getPetEffect(pet) local effectOverrides = { ['Ripper the Reindeer'] = 'None', } if effectOverrides[pet.name] ~= nil then return effectOverrides[pet.name] else local modKeys = {'modifiers', 'enemyModifiers'} local effects = {} for i, key in ipairs(modKeys) do if pet[key] ~= nil and Shared.tableCount(pet[key]) > 0 then for effectName, effectValue in pairs(pet[key]) do local preText = (key == 'enemyModifiers' and 'All enemies have: ' or '') table.insert(effects, preText .. Constants._getModifierText(effectName, effectValue, false)) end end end if Shared.tableCount(effects) > 0 then return table.concat(effects, '<br/>') elseif pet.skill ~= nil and pet.skill >= 0 then -- Attempt to remove skill prefix from description local newDesc, subIdx = string.gsub(pet.description, '^' .. Constants.getSkillName(pet.skill) .. '<br>', '') return newDesc else return pet.description end end end function p._getPetChance(pet) if pet.obtained ~= nil and pet.obtained.dungeonCompletion ~= nil then local odds = pet.obtained.dungeonCompletion[1][2] if pet.name == 'Pablo' then -- Special handling for Into the Mist/Pablo return 'Guaranteed after ' .. odds .. ' clears' else -- Dungeon pet return '1 in ' .. odds .. ' (' .. Shared.round(100 / odds, 2, 2) .. '%)' end elseif pet.name == 'Bone' then -- Special handling for Impending Darkness/Bone return 'Guaranteed after 1 clear' elseif pet.name == 'Peri' or pet.name == 'Otto' then -- Slayer area pets local odds = 7500 return '1 in ' .. odds .. ' (' .. Shared.round(100 / odds, 2, 2) .. '%)' else -- Skill pet or other return 'See: [[Pets#Acquiring Pets|Acquiring Pets]]' end end function p._getPetSkill(pet) local skillOverrides = { ['Ty'] = -1, ['Mark'] = 21 } local skillID = pet.skill if skillOverrides[pet.name] ~= nil then skillID = skillOverrides[pet.name] end if skillID < 0 then return nil else return skillID end end function p._getPetTable(pets) if pets == nil or Shared.tableCount(pets) == 0 then return nil end local resultPart = {} table.insert(resultPart, '{| class="wikitable"\r\n!Pet!!Name!!Effect') for i, pet in pairs(pets) do table.insert(resultPart, '|-') table.insert(resultPart, '|style="text-align: center;"|' .. Icons.Icon({pet.name, type='pet', size=60, notext=true})) table.insert(resultPart, '|' .. Icons.Icon({pet.name, type='pet', noicon=true})) table.insert(resultPart, '| ' .. p._getPetEffect(pet)) end table.insert(resultPart, '|}') return table.concat(resultPart, '\r\n') end function p.getPetTableBySkill(frame) local skillName = frame.args ~= nil and frame.args[1] or frame local skillID = Constants.getSkillID(skillName) if skillID == nil then return '' else local pets = p.getPets(function(pet) return p._getPetSkill(pet) == skillID end) if pets == nil then return '' else return p._getPetTable(pets) end end end function p.getPetSidebar(frame) local args = frame.args ~= nil and frame.args or frame local result = nil local name = (args.name ~= nil and args.name ~= '') and args.name or args[1] local pet = p.getPet(name) local effect = (args.effect ~= nil and args.effect ~= '') and args.effect or p._getPetEffect(pet) local completionReq = (pet.ignoreCompletion ~= nil and pet.ignoreCompletion) and 'No' or 'Yes' local dropChance = p._getPetChance(pet) result = '{| class="wikitable" style="float:right; clear:right;"\r\n|-\r\n' result = result..'! '..name..'\r\n|-\r\n| ' result = result..'style="text-align: center;"|' .. Icons.Icon({name, type='pet', size='250', notext=true}) result = result.."\r\n|-\r\n|'''Pet ID:''' "..pet.id result = result.."\r\n|-\r\n|'''Source:''' "..p._getPetSource(pet) if dropChance ~= nil then result = result.."\r\n|-\r\n|'''Drop Chance:''' "..dropChance end result = result.."\r\n|-\r\n| style =\"width: 250px;\"|'''Effect:''' "..effect result = result .. "\r\n|-\r\n|'''Part of 100% Completion:''' " .. completionReq .. "\r\n|}" return result end function p.getPetPageTable() local result = '' local petList = Shared.clone(PetData.Pets) result = '{|class="wikitable sortable lighttable stickyHeader"' result = result..'\r\n|- class="headerRow-0"\r\n! Name !! Image !! Acquired From !! Effect' table.sort(petList, function(a, b) return p.getPet(a.name).id < p.getPet(b.name).id end) for i, thisPet in pairs(petList) do result = result..'\r\n|-\r\n|'..Icons.Icon({thisPet.name, type='pet', noicon=true}) result = result..'||style="text-align: center;"|'..Icons.Icon({thisPet.name, size='60', type='pet', notext=true}) result = result..'||'..p._getPetSource(thisPet) result = result..'||'..p._getPetEffect(thisPet) end result = result..'\r\n|}' return result end function p.getDungeonBoxPetText(frame) local dungeonName = frame.args ~= nil and frame.args[1] or frame local dung = CombatAreas.getArea(dungeonName) if dung == nil then return 'ERROR: Invalid dungeon name '..dungeonName..'[[Category:Pages with script errors]]' end local result = '' local pet = p.getPetByID(dung.petID) if pet ~= nil then result = "\r\n|-\r\n|'''[[Pets#Boss Pets|Pet]]:'''<br/>" result = result..Icons.Icon({pet.name, type='pet'}) result = result.."\r\n|-\r\n|'''Pet Drop Chance:'''<br/>"..p._getPetChance(pet) end return result end function p.getPetNavbox() --• local result = '{| class="wikitable" style="margin:auto; text-align:center; clear:both; width: 100%"' result = result..'\r\n|-\r\n!colspan="2"|[[Pets]]' local skillPetList = {} local bossPetList = {} local otherPetList = {} for i, petData in Shared.skpairs(PetData.Pets) do if p._getPetSkill(petData) ~= nil then table.insert(skillPetList, Icons.Icon({petData.name, type='pet'})) elseif petData.obtained ~= nil and petData.obtained.dungeonCompletion ~= nil then table.insert(bossPetList, Icons.Icon({petData.name, type='pet'})) else table.insert(otherPetList, Icons.Icon({petData.name, type='pet'})) end end table.sort(skillPetList, function(a, b) return a < b end) table.sort(bossPetList, function(a, b) return a < b end) table.sort(otherPetList, function(a, b) return a < b end) result = result..'\r\n|-\r\n!Skill Pets\r\n|'..table.concat(skillPetList, ' • ') result = result..'\r\n|-\r\n!Boss Pets\r\n|'..table.concat(bossPetList, ' • ') result = result..'\r\n|-\r\n!Other Pets\r\n|'..table.concat(otherPetList, ' • ') result = result..'\r\n|}' return result end return p