Anonymous

Module:Pets: Difference between revisions

From Melvor Idle
3,059 bytes added ,  25 July 2022
getPetSidebar: Use infobox class
(Added initial pass at making boss pets a thing)
(getPetSidebar: Use infobox class)
(32 intermediate revisions by 2 users not shown)
Line 4: Line 4:


local PetData = mw.loadData('Module:Pets/data')
local PetData = mw.loadData('Module:Pets/data')
local Constants = mw.loadData('Module:Constants/data')


local Shared = require( "Module:Shared" )
local Shared = require( "Module:Shared" )
local Constants = require('Module:Constants')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Skills = require('Module:Skills')
local CombatAreas = require('Module:CombatAreas')
local Zones = require('Module:CombatAreas')




function p.getPetByID(ID)
function p.getPetByID(ID)
  local result = Shared.clone(PetData.Pets[ID + 1])
local result = Shared.clone(PetData.Pets[ID + 1])
  if result ~= nil then
if result ~= nil then
    result.id = ID
result.id = ID
  end
end
  return result
return result
end
end


function p.getPet(name)
function p.getPet(name)
  local result = nil
local result = nil
  name = string.gsub(name, "%%27", "'")
name = string.gsub(name, "%%27", "'")
  name = string.gsub(name, "'", "'")
name = string.gsub(name, "'", "'")
  name = string.gsub(name, "'", "'")
name = string.gsub(name, "'", "'")
  for i, pet in pairs(PetData.Pets) do
for i, pet in pairs(PetData.Pets) do
    local PetName = string.gsub(pet.name, '#', '')
local PetName = string.gsub(pet.name, '#', '')
    if(name == PetName) then
if name == PetName then
      result = Shared.clone(pet)
result = Shared.clone(pet)
      --Make sure every pet has an id, and account for Lua being 1-index
--Make sure every pet has an id, and account for Lua being 1-index
      result.id = i - 1
result.id = i - 1
      break
result.skill = p._getPetSkill(result)
    end
break
  end
end
  return result
end
return result
end
end


function p.getPetBySkill(skillName)
function p.getPets(checkFunc)
  local result = nil
local result = {}
  local skillID = Skills.getSkillID(skillName)
for i, pet in Shared.skpairs(PetData.Pets) do
  for i, pet in pairs(PetData.Pets) do
if checkFunc(pet) then
    if(skillID == pet.skill) then
local newPet = Shared.clone(pet)
      result = Shared.clone(pet)
newPet.id = i - 1
      --Make sure every pet has an id, and account for Lua being 1-index
newPet.skill = p._getPetSkill(newPet)
      result.id = i - 1
table.insert(result, newPet)
      break
end
    end
end
  end
return result
  return result
end
end


function p.getPetTable(frame)
function p._getPetSource(pet)
  local petName = frame.args ~= nil and frame.args[1] or frame
local sourceOverrides = {
  local pet = p.getPet(petName)
-- Format: ['PetName'] = {'Source', UseIcon}
  local result = '{| class="wikitable"\r\n'
-- UseIcon = true if Source has an associated icon, false otherwise
  result = result..'!Pet!!Name!!Effect'
['Asura'] = {'Slayer', true},
  result = result..'\r\n|-\r\n|'..Icons.Icon({pet.name, type='pet', size='60', notext=true})
['Ripper the Reindeer'] = {'[[Events#Christmas_Event_2020|Christmas Event 2020]]', false},
  result = result..'||[['..pet.name..']]||'..pet.description
['Festive Chio'] = {'[[Holiday Event 2021]]'},
  result = result..'\r\n|}'
['Festive Cool Rock'] = {'[[Holiday Event 2021]]'},
  return result
['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
end


function p.getPetTableBySkill(frame)
function p._getPetSkill(pet)
  local result = nil
local skillOverrides = {
  local skillName = frame.args ~= nil and frame.args[1] or frame
['Ty'] = -1,
['Mark'] = 21
}


  return p.getPetTable(p.getPetBySkill(skillName).name)
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
end


function p.getPetSidebar(frame)
function p._getPetTable(pets)
  local args = frame.args ~= nil and frame.args or frame
if pets == nil or Shared.tableCount(pets) == 0 then return nil end
  local result = nil
  local name = (args.name ~= nil and args.name ~= '') and args.name or args[1]
  local pet = p.getPet(name)


  local source = nil
local resultPart = {}
  if (args.skill ~= nil and args.skill ~= '') then
table.insert(resultPart, '{| class="wikitable"\r\n!Pet!!Name!!Effect')
    source = args.skill
  elseif pet.skill ~= nil and pet.skill >= 0 then
    source = Icons.Icon({Skills.getSkillName(pet.skill), type='skill'})
  else
    local combatArea = Zones.getArea(pet.acquiredBy)
    if combatArea ~= nil then
      source = Icons.Icon({combatArea.name, type=combatArea.type})
    end
  end


  local effect = (args.effect ~= nil and args.effect ~= '') and args.effect or pet.description
for i, pet in pairs(pets) do
 
table.insert(resultPart, '|-')
  result = '{| class="wikitable" style="float:right; clear:right;"\r\n|-\r\n'
table.insert(resultPart, '|style="text-align: center;"|' .. Icons.Icon({pet.name, type='pet', size=60, notext=true}))
  result = result..'! '..name..'\r\n|-\r\n| '
table.insert(resultPart, '|' .. Icons.Icon({pet.name, type='pet', noicon=true}))
  result = result..Icons.Icon({name, type='pet', size='250', notext=true})
table.insert(resultPart, '| ' .. p._getPetEffect(pet))
  result = result..'\r\n|-\r\n| Pet ID: '..pet.id
end
table.insert(resultPart, '|}')


  result = result..'\r\n|-\r\n| Source: '..source
return table.concat(resultPart, '\r\n')
end


  result = result..'\r\n|-\r\n| style ="width: 250px;"|Effect: '..effect..'\r\n|}'
function p.getPetTableBySkill(frame)
local skillName = frame.args ~= nil and frame.args[1] or frame
local skillID = Constants.getSkillID(skillName)


  return result
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
end


function p.getPetPageTable()
function p.getPetSidebar(frame)
  local result = ''
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 infobox" 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|}"


  local petList = {}
return result
  local acquiredOverrides = {
end
    ['Ripper the Reindeer'] = '[[Events#Christmas_Event_2020|Christmas Event 2020]]',
  }
  local effectOverrides = {
    ['Ripper the Reindeer'] = 'None',
  }
  local acquired = nil
  local temp = nil
  for i, pet in pairs(PetData.Pets) do
    temp = Shared.clone(pet)


    if(effectOverrides[temp.name] ~= nil) then
function p.getPetPageTable()
      temp.description = effectOverrides[temp.name]
local result = ''
    end
local petList = Shared.clone(PetData.Pets)
    if(temp.name == 'Asura') then temp.acquiredBy = 'Slayer' end


    acquired = ''
result = '{|class="wikitable sortable lighttable stickyHeader"'
    if(Skills.getSkillID(temp.acquiredBy) ~= nil) then
result = result..'\r\n|- class="headerRow-0"\r\n! Name !! Image !! Acquired From !! Effect'
      acquired = 'skill'
    elseif Zones.getAreaFilterType('slayer', temp.acquiredBy) ~= nil then
      acquired = 'slayer'
    elseif Zones.getAreaFilterType('dungeon', temp.acquiredBy) ~= nil then
      acquired = 'dungeon'
    end
    temp.type = acquired


    table.insert(petList, temp)
table.sort(petList, function(a, b)
  end
return p.getPet(a.name).id < p.getPet(b.name).id
end)


  result = result..'{|class="wikitable lighttable"'
for i, thisPet in pairs(petList) do
  result = result..'\r\n|-\r\n! Name !! Image !! Acquired From !! Effect'
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|}'


  table.sort(petList, function(a, b)
return result
                        return p.getPet(a.name).id < p.getPet(b.name).id
end
                      end)


  for i, thisPet in pairs(petList) do
function p.getDungeonBoxPetText(frame)
    result = result..'\r\n|-\r\n|[['..thisPet.name..']]'
local dungeonName = frame.args ~= nil and frame.args[1] or frame
    result = result..'||'..Icons.Icon({thisPet.name, size='60', type='pet', notext=true})
local dung = CombatAreas.getArea(dungeonName)
if dung == nil then
return 'ERROR: Invalid dungeon name '..dungeonName..'[[Category:Pages with script errors]]'
end


    if acquiredOverrides[thisPet.name] ~= nil then
local result = ''
      result = result..'||'..acquiredOverrides[thisPet.name]
local pet = p.getPetByID(dung.petID)
    else
if pet ~= nil then
      result = result..'||'..Icons.Icon({thisPet.acquiredBy, type=thisPet.type})
result = "\r\n|-\r\n|'''[[Pets#Boss Pets|Pet]]:'''<br/>"
    end
result = result..Icons.Icon({pet.name, type='pet'})
    result = result..'||'..thisPet.description
result = result.."\r\n|-\r\n|'''Pet Drop Chance:'''<br/>"..p._getPetChance(pet)
  end
end
  result = result..'\r\n|}'


  return result
return result
end
end


function p.getPetNavbox(frame)
function p.getPetNavbox()
  --•
--•
  local result = '{| class="wikitable" style="margin:auto; text-align:center; clear:both; width: 100%"'
local result = '{| class="wikitable" style="margin:auto; text-align:center; clear:both; width: 100%"'
  result = result..'\r\n|-\r\n!colspan="2"|[[Pets]]'
result = result..'\r\n|-\r\n!colspan="2"|[[Pets]]'


  local skillPetList = {}
local skillPetList = {}
  local bossPetList = {}
local bossPetList = {}
  local otherPetList = {}
local otherPetList = {}
  for i, petData in Shared.skpairs(PetData.Pets) do
for i, petData in Shared.skpairs(PetData.Pets) do
    if petData.skill ~= nil and petData.skill >= 0 and petData.name ~= "Ty" then
if p._getPetSkill(petData) ~= nil then
      table.insert(skillPetList, Icons.Icon({petData.name, type='pet'}))
table.insert(skillPetList, Icons.Icon({petData.name, type='pet'}))
    elseif petData.obtained ~= nil and petData.obtained.dungeonCompletion ~= nil then
elseif petData.obtained ~= nil and petData.obtained.dungeonCompletion ~= nil then
      table.insert(bossPetList, Icons.Icon({petData.name, type='pet'}))
table.insert(bossPetList, Icons.Icon({petData.name, type='pet'}))
    else
else
      table.insert(otherPetList, Icons.Icon({petData.name, type='pet'}))
table.insert(otherPetList, Icons.Icon({petData.name, type='pet'}))
    end
end
  end
end
  table.sort(skillPetList, function(a, b) return a < b end)
table.sort(skillPetList, function(a, b) return a < b end)
  table.sort(bossPetList, 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)
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!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!Boss Pets\r\n|'..table.concat(bossPetList, ' • ')
  result = result..'\r\n|-\r\n!Other Pets\r\n|'..table.concat(otherPetList, ' • ')
result = result..'\r\n|-\r\n!Other Pets\r\n|'..table.concat(otherPetList, ' • ')
  result = result..'\r\n|}'
result = result..'\r\n|}'
  return result
return result
end
end


return p
return p