Anonymous

Module:Pets: Difference between revisions

From Melvor Idle
477 bytes removed ,  15 January 2023
getPetNavbox: Migrate to Module:Navboxes
(Fix slayerArea icons)
(getPetNavbox: Migrate to Module:Navboxes)
 
(7 intermediate revisions by the same user not shown)
Line 7: Line 7:
local GameData = require('Module:GameData')
local GameData = require('Module:GameData')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Areas = require('Module:CombatAreas')


local areaDataKeys = { 'combatAreas', 'dungeons', 'slayerAreas' }
-- Compute combat pet sources once for use later
-- Compute combat pet sources once for use later
local function getCombatPetSources()
local function getCombatPetSources()
local result = {}
local result = {}
local areas = Areas.getAreas(function(area) return area.pet ~= nil end)
for _, key in ipairs(areaDataKeys) do
for i, area in ipairs(areas) do
local areas = GameData.getEntities(key, function(area) return area.pet ~= nil end)
result[area.pet.petID] = { id = area.id, name = area.name, type = area.type, weight = area.weight }
for i, area in ipairs(areas) do
result[area.pet.petID] = {
id = area.id,
name = area.name,
type = area.type,
weight = area.pet.weight,
fixedChance = (area.fixedPetClears ~= nil and area.fixedPetClears) or area.pet.weight == 1
}
end
end
end
return result
return result
Line 25: Line 33:


function p.getPet(name)
function p.getPet(name)
name = string.gsub(name, "%%27", "'")
return GameData.getEntityByName('pets', Shared.fixPagename(name))
name = string.gsub(name, "'", "'")
name = string.gsub(name, "'", "'")
return GameData.getEntityByName('pets', name)
end
end


function p.getPets(checkFunc)
function p.getPets(checkFunc)
return GameData.getEntities('pets', checkFunc)
return GameData.getEntities('pets', checkFunc)
end
--Returns the expansion icon for the pet if it has one
function p.getExpansionIcon(frame)
local petName = frame.args ~= nil and frame.args[1] or frame
local pet = p.getPet(petName)
if pet == nil then
return Shared.printError('No pet named "' .. petName .. '" exists in the data module')
end
return Icons.getExpansionIcon(pet.id)
end
end


Line 52: Line 68:
['Festive Cool Rock'] = { text = '[[Holiday Event 2021]]', useIcon = false },
['Festive Cool Rock'] = { text = '[[Holiday Event 2021]]', useIcon = false },
['Jerry the Giraffe'] = { text = '[[Golbin Raid|Golbin Raid Shop]]', useIcon = false },
['Jerry the Giraffe'] = { text = '[[Golbin Raid|Golbin Raid Shop]]', useIcon = false },
['Preston the Platypus'] = { text = '[[Golbin Raid|Golbin Raid Shop]]', useIcon = false }
['Preston the Platypus'] = { text = '[[Golbin Raid|Golbin Raid Shop]]', useIcon = false },
['Ty'] = { text = 'Mastery', useIcon = true },
['Golden Golbin'] = { text = Icons.Icon({'Golbin', type='monster'}) .. ' kills', useIcon = false},
['Saki'] = { text = 'Mastery', useIcon = true }
}
}
local petSourceText = nil
local petSourceText = nil
Line 105: Line 124:
if source ~= nil and source.weight ~= nil then
if source ~= nil and source.weight ~= nil then
-- Pet is from a dungeon or combat/slayer area
-- Pet is from a dungeon or combat/slayer area
-- Flaky logic for determining if pet is guaranteed or not
if source.fixedChance then
if source.weight <= 10 then
return 'Guaranteed after ' .. Shared.formatnum(source.weight) .. (source.weight == 1 and ' clear' or ' clears')
return 'Guaranteed after ' .. Shared.formatnum(source.weight) .. ' clears'
else
else
return '1 in ' .. Shared.formatnum(source.weight) .. ' (' .. Shared.round(100 / source.weight, 2, 2) .. '%)'
return '1 in ' .. Shared.formatnum(source.weight) .. ' (' .. Shared.round(100 / source.weight, 2, 2) .. '%)'
Line 141: Line 159:
table.insert(resultPart, '|-')
table.insert(resultPart, '|-')
table.insert(resultPart, '|style="text-align: center;"|' .. Icons.Icon({pet.name, type='pet', size=60, notext=true}))
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, '|' .. Icons.getExpansionIcon(pet.id) .. Icons.Icon({pet.name, type='pet', noicon=true}))
table.insert(resultPart, '| ' .. p._getPetEffect(pet))
table.insert(resultPart, '| ' .. p._getPetEffect(pet))
end
end
Line 171: Line 189:
local pet = p.getPet(name)
local pet = p.getPet(name)
if pet == nil then
if pet == nil then
return 'ERROR: Could not find pet with name ' .. (name or 'Unknown') .. '[[Category:Pages with script errros]]'
return Shared.printError('No pet named "' .. (name or 'Unknown') .. '" exists in the data module')
end
end
local effect = (args.effect ~= nil and args.effect ~= '') and args.effect or p._getPetEffect(pet)
local effect = (args.effect ~= nil and args.effect ~= '') and args.effect or p._getPetEffect(pet)
Line 177: Line 195:
local dropChance = p._getPetChance(pet)
local dropChance = p._getPetChance(pet)


result = '{| class="wikitable infobox" style="float:right; clear:right;"\r\n|-\r\n'
result = '{| class="wikitable infobox"\r\n|-\r\n'
result = result..'! '..name..'\r\n|-\r\n| '
result = result..'! ' .. Icons.getExpansionIcon(pet.id) .. name .. '\r\n|-\r\n| '
result = result..'style="text-align: center;"|' .. Icons.Icon({name, type='pet', size='250', notext=true})
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|'''Pet ID:''' "..pet.id
Line 195: Line 213:


result = '{|class="wikitable sortable lighttable stickyHeader"'
result = '{|class="wikitable sortable lighttable stickyHeader"'
result = result..'\r\n|- class="headerRow-0"\r\n! Name !! Image !! Acquired From !! Effect'
result = result..'\r\n|- class="headerRow-0"\r\n! colspan="2"| Pet !! Acquired From !! Effect'


for i, thisPet in ipairs(GameData.rawData.pets) do
for i, thisPet in ipairs(GameData.rawData.pets) do
result = result..'\r\n|-\r\n|'..Icons.Icon({thisPet.name, type='pet', noicon=true})
result = result..'\r\n|-\r\n|class="table-img" data-sort-value="' .. thisPet.name .. '"| ' .. Icons.Icon({thisPet.name, size='60', type='pet', notext=true})
result = result..'||style="text-align: center;"|'..Icons.Icon({thisPet.name, size='60', type='pet', notext=true})
result = result..'||' .. Icons.getExpansionIcon(thisPet.id) ..Icons.Icon({thisPet.name, type='pet', noicon=true})
result = result..'||'..p._getPetSourceText(thisPet)
result = result..'||'..p._getPetSourceText(thisPet)
result = result..'||'..p._getPetEffect(thisPet)
result = result..'||'..p._getPetEffect(thisPet)
Line 210: Line 228:
function p.getDungeonBoxPetText(frame)
function p.getDungeonBoxPetText(frame)
local dungeonName = frame.args ~= nil and frame.args[1] or frame
local dungeonName = frame.args ~= nil and frame.args[1] or frame
local dung = Areas.getArea(dungeonName)
local dung = nil
for i, key in ipairs(areaDataKeys) do
dung = GameData.getEntityByName(key, dungeonName)
if dung ~= nil then
break
end
end
if dung == nil then
if dung == nil then
return 'ERROR: Invalid dungeon name '..dungeonName..'[[Category:Pages with script errors]]'
return Shared.printError('No dungeon named "' .. dungeonName .. '" exists in the data module')
end
end


Line 224: Line 248:
end
end
end
end
end
-- TODO Move to Module:Navboxes
function p.getPetNavbox()
local resultPart = {}
table.insert(resultPart, '{| class="wikitable" style="margin:auto; text-align:center; clear:both; width: 100%"')
table.insert(resultPart, '\r\n|-\r\n!colspan="2"|[[Pets]]')
local petList = {
["skill"] = {},
["boss"] = {},
["other"] = {}
}
local skillPetList = {}
local bossPetList = {}
local otherPetList = {}
for i, petData in ipairs(GameData.rawData.pets) do
local source = p._getPetSource(petData)
local listCat = 'other'
if type(source) == 'table' and source.type ~= nil then
if source.type == 'skill' then
listCat = 'skill'
elseif source.type == 'dungeon' or source.type == 'slayerArea' then
listCat = 'boss'
else
listCat = 'other'
end
end
table.insert(petList[listCat], petData.name)
end
local getIconList =
function(pets)
local result = {}
for i, pet in ipairs(pets) do
table.insert(result, Icons.Icon({pet, type='pet'}))
end
return table.concat(result, ' • ')
end
for cat, catData in pairs(petList) do
table.sort(catData, function(a, b) return a < b end)
table.insert(resultPart, '\r\n|-\r\n!' .. Shared.titleCase(cat) .. ' Pets\r\n|' .. getIconList(catData))
end
table.insert(resultPart, '\r\n|}')
return table.concat(resultPart)
end
end


return p
return p