Module:ModifierTables: Difference between revisions
From Melvor Idle
(_getModifierTable: Add equipment slot links to type column) |
(Update for v1.3) |
||
Line 7: | Line 7: | ||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local Common = require('Module:Common') | local Common = require('Module:Common') | ||
local Modifiers = require('Module:Modifiers') | |||
local Pets = require('Module:Pets') | local Pets = require('Module:Pets') | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
Line 18: | Line 19: | ||
--First up, functions to get all the things in a category that have a given modifier: | --First up, functions to get all the things in a category that have a given modifier: | ||
function p.getItemsWithModifier(modifierNames, skill) | |||
function p.getItemsWithModifier( | |||
local itemList = Items.getItems( | local itemList = Items.getItems( | ||
function(item) | function(item) | ||
Line 90: | Line 27: | ||
return false | return false | ||
end | end | ||
local mods = Modifiers.getMatchingModifiers(item.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
return | |||
end) | end) | ||
return itemList | return itemList | ||
end | end | ||
function p.getObstaclesWithModifier( | function p.getObstaclesWithModifier(modifierNames, skill) | ||
local obstList = Agility.getObstacles( | local obstList = Agility.getObstacles( | ||
function(obst) | function(obst) | ||
if obst.modifiers ~= nil then | |||
local mods = Modifiers.getMatchingModifiers(obst.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
end | end | ||
return false | return false | ||
Line 116: | Line 45: | ||
end | end | ||
function p.getConstellationsWithModifier( | function p.getConstellationsWithModifier(modifierNames, skill) | ||
local consList = Skills.getConstellations( | local consList = Skills.getConstellations( | ||
function(cons) | function(cons) | ||
local consMods = Skills. | local consMods = Skills._getConstellationModifiers(cons) | ||
for | for modType, modsForType in pairs(consMods) do | ||
local mods = Modifiers.getMatchingModifiers(modsForType, modifierNames, skill) | |||
if not Shared.tableIsEmpty(mods.matched) then | |||
return true | return true | ||
end | end | ||
Line 133: | Line 60: | ||
end | end | ||
function p.getPillarsWithModifier( | function p.getPillarsWithModifier(modifierNames, skill) | ||
local pillarList = Agility.getPillars( | local pillarList = Agility.getPillars( | ||
function(pillar) | function(pillar) | ||
if pillar.modifiers ~= nil then | |||
local mods = Modifiers.getMatchingModifiers(pillar.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
end | end | ||
return false | return false | ||
Line 149: | Line 72: | ||
end | end | ||
function p.getPetsWithModifier( | function p.getPetsWithModifier(modifierNames, skill) | ||
local petList = Pets.getPets( | local petList = Pets.getPets( | ||
function(pet) | function(pet) | ||
if pet.modifiers ~= nil then | |||
local mods = Modifiers.getMatchingModifiers(pet.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
end | end | ||
return false | return false | ||
Line 165: | Line 84: | ||
end | end | ||
function p.getPrayersWithModifier( | function p.getPrayersWithModifier(modifierNames, skill) | ||
local prayerList = Prayer.getPrayers( | local prayerList = Prayer.getPrayers( | ||
function(prayer) | function(prayer) | ||
if prayer.modifiers ~= nil then | |||
local mods = Modifiers.getMatchingModifiers(prayer.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
end | end | ||
return false | return false | ||
Line 181: | Line 96: | ||
end | end | ||
function p.getUpgradesWithModifier( | function p.getUpgradesWithModifier(modifierNames, skill) | ||
local upgradeList = Shop.getPurchases( | local upgradeList = Shop.getPurchases( | ||
function(purchase) | function(purchase) | ||
if purchase.category == 'melvorD:GolbinRaid' then | if purchase.category == 'melvorD:GolbinRaid' | ||
or purchase.contains == nil | |||
or purchase.contains.modifiers == nil | |||
or Shared.tableIsEmpty(purchase.contains.modifiers) then | |||
return false | return false | ||
end | end | ||
local mods = Modifiers.getMatchingModifiers(purchase.contains.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
return | |||
end) | end) | ||
return upgradeList | return upgradeList | ||
end | end | ||
function p.getPOIsWithModifier( | function p.getPOIsWithModifier(modifierNames, skill) | ||
local POIList = Cartography.getPointsOfInterest( | local POIList = Cartography.getPointsOfInterest( | ||
function(POI) | function(POI) | ||
Line 209: | Line 117: | ||
return false | return false | ||
end | end | ||
local mods = Modifiers.getMatchingModifiers(POI.activeModifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
return | |||
end) | end) | ||
Line 221: | Line 124: | ||
end | end | ||
function p.getCartoMasteryBonusesWithModifier( | function p.getCartoMasteryBonusesWithModifier(modifierNames, skill) | ||
local bonusList = Cartography.getMasteryBonuses( | local bonusList = Cartography.getMasteryBonuses( | ||
function(bonus) | function(bonus) | ||
Line 230: | Line 130: | ||
return false | return false | ||
end | end | ||
local mods = Modifiers.getMatchingModifiers(bonus.modifiers, modifierNames, skill) | |||
return not Shared.tableIsEmpty(mods.matched) | |||
return | |||
end) | end) | ||
return bonusList | return bonusList | ||
end | end | ||
function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort) | function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort) | ||
local | local modifierByType = { | ||
["id"] = {}, | |||
["alias"] = {} | |||
} | |||
if type(modifiers) == 'string' then | if type(modifiers) == 'string' then | ||
modifiers = {modifiers} | modifiers = {modifiers} | ||
end | end | ||
for i, modifier in pairs(modifiers) do | for i, modifier in pairs(modifiers) do | ||
if | local isNamespaced = string.find(modifier, ':') ~= nil | ||
if isNamespaced then | |||
table.insert( | -- Assume 'modifier' contains a modifier ID | ||
table.insert(modifierByType.id, modifier) | |||
else | else | ||
table.insert( | -- Assume 'modifier' contains a modifier alias | ||
if getOpposites then | |||
local incModAlias, decModAlias = 'increased' .. modifier, 'decreased' .. modifier | |||
local incMod, decMod = Modifiers.getModifierByAlias(incModAlias), Modifiers.getModifierByAlias(decModAlias) | |||
-- If neither alias resolves to a modifier, then let user know this is invalid | |||
if incMod == nil and decMod == nil then | |||
error('No such modifier alias: ' .. modifier, 2) | |||
end | |||
-- Don't include increased or decreased variants if they don't resolve to a modifier, | |||
-- as doing so will generate an error about an invalid alias later | |||
if incMod ~= nil then | |||
table.insert(modifierByType.alias, incModAlias) | |||
end | |||
if decMod ~= nil then | |||
table.insert(modifierByType.alias, decModAlias) | |||
end | |||
else | |||
table.insert(modifierByType.alias, modifier) | |||
end | |||
end | end | ||
end | end | ||
local modifierCriteria = Modifiers.getMatchCriteriaFromIDs(modifierByType.id, modifierByType.alias) | |||
local hasOtherModifiers = false | local hasOtherModifiers = false | ||
Line 273: | Line 191: | ||
local getModText = | local getModText = | ||
function(modifiers) | function(modifiers) | ||
local | local matchedMods = Modifiers.getMatchingModifiers(modifiers, modifierCriteria, skill) | ||
local mainModText = Modifiers.getModifiersText(matchedMods.matched, true, false, maxOtherMods) | |||
local otherModText = Modifiers.getModifiersText(matchedMods.unmatched, true, false, maxOtherMods) | |||
return mainModText, otherModText, matchedMods | |||
local otherModText = | |||
return | |||
end | end | ||
local tableArray = {} | local tableArray = {} | ||
--Going through each type of thing to add to the array | --Going through each type of thing to add to the array | ||
local itemList = p.getItemsWithModifier( | |||
local itemList = p.getItemsWithModifier(modifierCriteria, skill) | |||
for i, item in ipairs(itemList) do | for i, item in ipairs(itemList) do | ||
local row = {} | local row = {} | ||
Line 340: | Line 217: | ||
row.type = row.type .. ' (' .. table.concat(rowTypePart, ', ') .. ')' | row.type = row.type .. ' (' .. table.concat(rowTypePart, ', ') .. ')' | ||
end | end | ||
row.modifierText, row.otherModifiers = getModText(item.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(item.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 355: | Line 229: | ||
end | end | ||
local petList = p.getPetsWithModifier( | local petList = p.getPetsWithModifier(modifierCriteria, skill) | ||
for i, pet in Shared.skpairs(petList) do | for i, pet in Shared.skpairs(petList) do | ||
local row = {} | local row = {} | ||
Line 363: | Line 237: | ||
row.type = '[[Pets|Pet]]' | row.type = '[[Pets|Pet]]' | ||
row.typeText = 'Pet' | row.typeText = 'Pet' | ||
row.modifierText, row.otherModifiers = getModText(pet.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(pet.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 378: | Line 249: | ||
end | end | ||
local obstList = p.getObstaclesWithModifier( | local obstList = p.getObstaclesWithModifier(modifierCriteria, skill) | ||
table.sort(obstList, function(a, b) return a.category < b.category end) | table.sort(obstList, function(a, b) return a.category < b.category end) | ||
for i, obst in Shared.skpairs(obstList) do | for i, obst in Shared.skpairs(obstList) do | ||
Line 387: | Line 258: | ||
row.type = '[[Agility#Obstacles|Agility Obstacle '..tostring(tonumber(obst.category)+1)..']]' | row.type = '[[Agility#Obstacles|Agility Obstacle '..tostring(tonumber(obst.category)+1)..']]' | ||
row.typeText = 'Agility Obstacle '..string.format("%02d", (obst.category + 1)) | row.typeText = 'Agility Obstacle '..string.format("%02d", (obst.category + 1)) | ||
row.modifierText, row.otherModifiers = getModText(obst.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(obst.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 402: | Line 270: | ||
end | end | ||
local pillarList = p.getPillarsWithModifier( | local pillarList = p.getPillarsWithModifier(modifierCriteria, skill) | ||
for i, pillar in ipairs(pillarList) do | for i, pillar in ipairs(pillarList) do | ||
local row = {} | local row = {} | ||
Line 410: | Line 278: | ||
row.type = '[[Agility#Passive Pillars|Agility Pillar]]' | row.type = '[[Agility#Passive Pillars|Agility Pillar]]' | ||
row.typeText = 'Agility Pillar' | row.typeText = 'Agility Pillar' | ||
row.modifierText, row.otherModifiers = getModText(pillar.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(pillar.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 425: | Line 290: | ||
end | end | ||
local prayerList = p.getPrayersWithModifier( | local prayerList = p.getPrayersWithModifier(modifierCriteria, skill) | ||
for i, prayer in ipairs(prayerList) do | for i, prayer in ipairs(prayerList) do | ||
local row = {} | local row = {} | ||
Line 433: | Line 298: | ||
row.type = [[Prayer]] | row.type = [[Prayer]] | ||
row.typeText = 'Prayer' | row.typeText = 'Prayer' | ||
row.modifierText, row.otherModifiers = getModText(prayer.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(prayer.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 448: | Line 310: | ||
end | end | ||
local upgradeList = p.getUpgradesWithModifier( | local upgradeList = p.getUpgradesWithModifier(modifierCriteria, skill) | ||
for i, upgrade in ipairs(upgradeList) do | for i, upgrade in ipairs(upgradeList) do | ||
local row = {} | local row = {} | ||
Line 456: | Line 318: | ||
row.type = '[[Shop|Upgrade]]' | row.type = '[[Shop|Upgrade]]' | ||
row.typeText = 'Upgrade' | row.typeText = 'Upgrade' | ||
row.modifierText, row.otherModifiers = getModText(upgrade.contains.modifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(upgrade.contains.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 471: | Line 330: | ||
end | end | ||
local constellationList = p.getConstellationsWithModifier( | local constellationList = p.getConstellationsWithModifier(modifierCriteria, skill) | ||
for i, cons in ipairs(constellationList) do | for i, cons in ipairs(constellationList) do | ||
local | local modListByType = Skills._getConstellationModifiers(cons) | ||
local modList = {} | |||
-- Combine all mods into single list | |||
for modType, modsForType in pairs(modListByType) do | |||
for _, mod in ipairs(modsForType) do | |||
table.insert(modList, mod) | |||
end | |||
end | |||
local row = {} | local row = {} | ||
row.name = cons.name | row.name = cons.name | ||
Line 480: | Line 347: | ||
row.type = '[[Astrology#Constellations|Constellation]]' | row.type = '[[Astrology#Constellations|Constellation]]' | ||
row.typeText = 'Constellation' | row.typeText = 'Constellation' | ||
if not hasOtherModifiers and | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(modList) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | |||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 495: | Line 359: | ||
end | end | ||
local POIList = p.getPOIsWithModifier( | local POIList = p.getPOIsWithModifier(modifierCriteria, skill) | ||
for i, POI in ipairs(POIList) do | for i, POI in ipairs(POIList) do | ||
local row = {} | local row = {} | ||
Line 503: | Line 367: | ||
row.type = '[[Cartography|Point of Interest]]' | row.type = '[[Cartography|Point of Interest]]' | ||
row.typeText = 'Point of Interest' | row.typeText = 'Point of Interest' | ||
row.modifierText, row.otherModifiers = getModText(POI.activeModifiers) | local objMods = nil | ||
row.modifierText, row.otherModifiers, objMods = getModText(POI.activeModifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
if not hasOtherModifiers and | if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | ||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end | ||
Line 518: | Line 379: | ||
end | end | ||
local cartoBonusList = p.getCartoMasteryBonusesWithModifier( | local cartoBonusList = p.getCartoMasteryBonusesWithModifier(modifierCriteria, skill) | ||
for i, bonus in ipairs(cartoBonusList) do | for i, bonus in ipairs(cartoBonusList) do | ||
local row = {} | local row = {} | ||
Line 526: | Line 387: | ||
row.type = Icons.Icon({'Cartography', 'Mastery Bonus', section='Mastery Unlocks', type='skill', noicon=true}) | row.type = Icons.Icon({'Cartography', 'Mastery Bonus', section='Mastery Unlocks', type='skill', noicon=true}) | ||
row.typeText = 'Mastery Bonus' | row.typeText = 'Mastery Bonus' | ||
local | |||
local objMods = nil | |||
row.modifierText, row.otherModifiers, objMods = getModText(bonus.modifiers) | |||
row.val = Modifiers.getModifierValue(objMods.matched) | |||
row.val = | |||
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then | |||
if not hasOtherModifiers and | |||
hasOtherModifiers = true | hasOtherModifiers = true | ||
end | end |
Revision as of 17:55, 18 June 2024
Documentation for this module may be created at Module:ModifierTables/doc
--Module that constructs tables for all things that can affect Player Modifiers
--This includes Agility, Equipment, Pets, Prayers, and Constellations right now
local p = {}
local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local Common = require('Module:Common')
local Modifiers = require('Module:Modifiers')
local Pets = require('Module:Pets')
local Items = require('Module:Items')
local Skills = require('Module:Skills')
local Agility = require('Module:Skills/Agility')
local Prayer = require('Module:Prayer')
local Shop = require('Module:Shop')
local Icons = require('Module:Icons')
local Cartography = require('Module:Skills/Cartography')
local GameData = require('Module:GameData')
--First up, functions to get all the things in a category that have a given modifier:
function p.getItemsWithModifier(modifierNames, skill)
local itemList = Items.getItems(
function(item)
if item.golbinRaidExclusive ~= nil and item.golbinRaidExclusive then
return false
elseif item.modifiers == nil or Shared.tableIsEmpty(item.modifiers) then
return false
end
local mods = Modifiers.getMatchingModifiers(item.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end)
return itemList
end
function p.getObstaclesWithModifier(modifierNames, skill)
local obstList = Agility.getObstacles(
function(obst)
if obst.modifiers ~= nil then
local mods = Modifiers.getMatchingModifiers(obst.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end
return false
end)
return obstList
end
function p.getConstellationsWithModifier(modifierNames, skill)
local consList = Skills.getConstellations(
function(cons)
local consMods = Skills._getConstellationModifiers(cons)
for modType, modsForType in pairs(consMods) do
local mods = Modifiers.getMatchingModifiers(modsForType, modifierNames, skill)
if not Shared.tableIsEmpty(mods.matched) then
return true
end
end
return false
end)
return consList
end
function p.getPillarsWithModifier(modifierNames, skill)
local pillarList = Agility.getPillars(
function(pillar)
if pillar.modifiers ~= nil then
local mods = Modifiers.getMatchingModifiers(pillar.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end
return false
end)
return pillarList
end
function p.getPetsWithModifier(modifierNames, skill)
local petList = Pets.getPets(
function(pet)
if pet.modifiers ~= nil then
local mods = Modifiers.getMatchingModifiers(pet.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end
return false
end)
return petList
end
function p.getPrayersWithModifier(modifierNames, skill)
local prayerList = Prayer.getPrayers(
function(prayer)
if prayer.modifiers ~= nil then
local mods = Modifiers.getMatchingModifiers(prayer.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end
return false
end)
return prayerList
end
function p.getUpgradesWithModifier(modifierNames, skill)
local upgradeList = Shop.getPurchases(
function(purchase)
if purchase.category == 'melvorD:GolbinRaid'
or purchase.contains == nil
or purchase.contains.modifiers == nil
or Shared.tableIsEmpty(purchase.contains.modifiers) then
return false
end
local mods = Modifiers.getMatchingModifiers(purchase.contains.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end)
return upgradeList
end
function p.getPOIsWithModifier(modifierNames, skill)
local POIList = Cartography.getPointsOfInterest(
function(POI)
if POI.activeModifiers == nil then
return false
end
local mods = Modifiers.getMatchingModifiers(POI.activeModifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end)
return POIList
end
function p.getCartoMasteryBonusesWithModifier(modifierNames, skill)
local bonusList = Cartography.getMasteryBonuses(
function(bonus)
if bonus.modifiers == nil or Shared.tableIsEmpty(bonus.modifiers) then
return false
end
local mods = Modifiers.getMatchingModifiers(bonus.modifiers, modifierNames, skill)
return not Shared.tableIsEmpty(mods.matched)
end)
return bonusList
end
function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
local modifierByType = {
["id"] = {},
["alias"] = {}
}
if type(modifiers) == 'string' then
modifiers = {modifiers}
end
for i, modifier in pairs(modifiers) do
local isNamespaced = string.find(modifier, ':') ~= nil
if isNamespaced then
-- Assume 'modifier' contains a modifier ID
table.insert(modifierByType.id, modifier)
else
-- Assume 'modifier' contains a modifier alias
if getOpposites then
local incModAlias, decModAlias = 'increased' .. modifier, 'decreased' .. modifier
local incMod, decMod = Modifiers.getModifierByAlias(incModAlias), Modifiers.getModifierByAlias(decModAlias)
-- If neither alias resolves to a modifier, then let user know this is invalid
if incMod == nil and decMod == nil then
error('No such modifier alias: ' .. modifier, 2)
end
-- Don't include increased or decreased variants if they don't resolve to a modifier,
-- as doing so will generate an error about an invalid alias later
if incMod ~= nil then
table.insert(modifierByType.alias, incModAlias)
end
if decMod ~= nil then
table.insert(modifierByType.alias, decModAlias)
end
else
table.insert(modifierByType.alias, modifier)
end
end
end
local modifierCriteria = Modifiers.getMatchCriteriaFromIDs(modifierByType.id, modifierByType.alias)
local hasOtherModifiers = false
local modifierCount = Shared.tableCount(modifiers)
if skill ~= nil then
if skill == '' then
skill = nil
elseif Constants.getSkillID(skill) ~= nil then
-- skill is a skill name
skill = Constants.getSkillID(skill)
elseif Constants.getSkillName(skill) == nil then
-- skill is neither a skill name or ID
return Shared.printError('Failed to find a skill ID for "' .. skill .. '"')
end
end
local getModText =
function(modifiers)
local matchedMods = Modifiers.getMatchingModifiers(modifiers, modifierCriteria, skill)
local mainModText = Modifiers.getModifiersText(matchedMods.matched, true, false, maxOtherMods)
local otherModText = Modifiers.getModifiersText(matchedMods.unmatched, true, false, maxOtherMods)
return mainModText, otherModText, matchedMods
end
local tableArray = {}
--Going through each type of thing to add to the array
local itemList = p.getItemsWithModifier(modifierCriteria, skill)
for i, item in ipairs(itemList) do
local row = {}
row.name = item.name
row.icon = Icons.Icon({item.name, type='item'})
row.expIcon = Icons.getExpansionIcon(item.id)
row.type = 'Item'
row.typeText = row.type
--For equipment, show the slot they go in
if item.validSlots ~= nil and not Shared.tableIsEmpty(item.validSlots) then
local rowTypePart = {}
for j, slot in ipairs(item.validSlots) do
table.insert(rowTypePart, Common.getEquipmentSlotLink(slot))
end
row.typeText = row.typeText .. ' (' .. table.concat(item.validSlots, ', ') .. ')'
row.type = row.type .. ' (' .. table.concat(rowTypePart, ', ') .. ')'
end
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(item.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local petList = p.getPetsWithModifier(modifierCriteria, skill)
for i, pet in Shared.skpairs(petList) do
local row = {}
row.name = pet.name
row.icon = Icons.Icon({pet.name, type='pet'})
row.expIcon = Icons.getExpansionIcon(pet.id)
row.type = '[[Pets|Pet]]'
row.typeText = 'Pet'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(pet.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local obstList = p.getObstaclesWithModifier(modifierCriteria, skill)
table.sort(obstList, function(a, b) return a.category < b.category end)
for i, obst in Shared.skpairs(obstList) do
local row = {}
row.name = obst.name
row.icon = Icons.Icon({'Agility%23'..string.gsub(obst.name, ' ', ''), obst.name, type='skill', img='Agility'})
row.expIcon = Icons.getExpansionIcon(obst.id)
row.type = '[[Agility#Obstacles|Agility Obstacle '..tostring(tonumber(obst.category)+1)..']]'
row.typeText = 'Agility Obstacle '..string.format("%02d", (obst.category + 1))
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(obst.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local pillarList = p.getPillarsWithModifier(modifierCriteria, skill)
for i, pillar in ipairs(pillarList) do
local row = {}
row.name = pillar.name
row.icon = Icons.Icon({'Agility%23'..string.gsub(pillar.name, ' ', ''), pillar.name, type='skill', img='Agility'})
row.expIcon = Icons.getExpansionIcon(pillar.id)
row.type = '[[Agility#Passive Pillars|Agility Pillar]]'
row.typeText = 'Agility Pillar'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(pillar.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local prayerList = p.getPrayersWithModifier(modifierCriteria, skill)
for i, prayer in ipairs(prayerList) do
local row = {}
row.name = prayer.name
row.icon = Icons.Icon({prayer.name, type='prayer'})
row.expIcon = Icons.getExpansionIcon(prayer.id)
row.type = [[Prayer]]
row.typeText = 'Prayer'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(prayer.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local upgradeList = p.getUpgradesWithModifier(modifierCriteria, skill)
for i, upgrade in ipairs(upgradeList) do
local row = {}
row.name = Shop._getPurchaseName(upgrade)
row.icon = Icons.Icon({row.name, type='upgrade'})
row.expIcon = Icons.getExpansionIcon(upgrade.id)
row.type = '[[Shop|Upgrade]]'
row.typeText = 'Upgrade'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(upgrade.contains.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local constellationList = p.getConstellationsWithModifier(modifierCriteria, skill)
for i, cons in ipairs(constellationList) do
local modListByType = Skills._getConstellationModifiers(cons)
local modList = {}
-- Combine all mods into single list
for modType, modsForType in pairs(modListByType) do
for _, mod in ipairs(modsForType) do
table.insert(modList, mod)
end
end
local row = {}
row.name = cons.name
row.icon = Icons.Icon({cons.name, type='constellation'})
row.expIcon = Icons.getExpansionIcon(cons.id)
row.type = '[[Astrology#Constellations|Constellation]]'
row.typeText = 'Constellation'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(modList)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local POIList = p.getPOIsWithModifier(modifierCriteria, skill)
for i, POI in ipairs(POIList) do
local row = {}
row.name = POI.name
row.icon = Icons.Icon({POI.name, type='poi'})
row.expIcon = Icons.getExpansionIcon(POI.id)
row.type = '[[Cartography|Point of Interest]]'
row.typeText = 'Point of Interest'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(POI.activeModifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local cartoBonusList = p.getCartoMasteryBonusesWithModifier(modifierCriteria, skill)
for i, bonus in ipairs(cartoBonusList) do
local row = {}
row.name = Shared.formatnum(bonus.masteredHexes) .. ' Hexes Mastered'
row.icon = Icons.Icon({'Cartography', Shared.formatnum(bonus.masteredHexes) .. ' Hexes Mastered', type='skill'})
row.expIcon = Icons.getExpansionIcon(bonus.id)
row.type = Icons.Icon({'Cartography', 'Mastery Bonus', section='Mastery Unlocks', type='skill', noicon=true})
row.typeText = 'Mastery Bonus'
local objMods = nil
row.modifierText, row.otherModifiers, objMods = getModText(bonus.modifiers)
row.val = Modifiers.getModifierValue(objMods.matched)
if not hasOtherModifiers and not Shared.tableIsEmpty(objMods.unmatched) then
hasOtherModifiers = true
end
table.insert(tableArray, row)
end
local result = '{| class="wikitable sortable stickyHeader"'
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n!Source!!Type!!'..columnName
if hasOtherModifiers and displayOtherMods then result = result..'!!Other Modifiers' end
--Sort by value if only one modifier was passed in
--Otherwise sort alphabetically by type, then name
table.sort(tableArray, function(a, b)
if (modifierCount == 1 or forceMagnitudeSort) and a.val ~= b.val then
return a.val > b.val
elseif a.typeText ~= b.typeText then
return a.typeText < b.typeText
else
return a.name < b.name
end
end)
for i, row in ipairs(tableArray) do
result = result..'\r\n|-'
result = result..'\r\n|data-sort-value="'..row.name..'"|'..row.icon
result = result..'|| data-sort-value="'..row.typeText..'" | '..row.expIcon..row.type..'||data-sort-value="'..row.val..'"| '..row.modifierText
if hasOtherModifiers and displayOtherMods then
result = result..'|| '..row.otherModifiers
end
end
result = result..'\r\n|}'
return result
end
function p.getModifierTable(frame)
local modifier = frame.args ~= nil and frame.args[1] or frame[1]
local skill = frame.args ~= nil and frame.args.skill or frame.skill
local columnName = frame.args ~= nil and frame.args[2] or frame[2]
local getOpposites = frame.args ~= nil and frame.args[3] or frame[3]
local displayOtherMods = frame.args ~= nil and frame.args.displayOtherMods or frame.displayOtherMods
local maxOtherMods = frame.args ~= nil and tonumber(frame.args.maxOtherMods) or 5
local forceMagnitudeSort = frame.args ~= nil and string.upper(tostring(frame.args.forceMagnitudeSort)) == 'TRUE' or false
if Shared.contains(modifier, ',') then
modifier = Shared.splitString(modifier, ',')
end
if getOpposites ~= nil then
getOpposites = string.upper(getOpposites) ~= 'FALSE'
else
getOpposites = true
end
if displayOtherMods ~= nil then
displayOtherMods = string.upper(displayOtherMods) ~= 'FALSE'
else
displayOtherMods = true
end
return p._getModifierTable(modifier, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
end
-- Function to list all available modifiers for the relevant templates.
function p.getAllModifiers()
local tabl = mw.html.create('table')
:addClass('mw-collapsible mw-collapsed')
tabl:tag('caption')
:css('min-width', '200px')
:tag('b')
:wikitext('All Modifiers List')
-- First, sort modifiers
local modifierNames = {}
for k, _ in pairs(GameData.rawData.modifierData) do
table.insert(modifierNames, tostring(k))
end
table.sort(modifierNames)
-- Then add modifiers to output table
for _, v in pairs(modifierNames) do
tabl:tag('tr')
:tag('td')
:tag('code')
:wikitext(tostring(v)):done()
:done()
:done()
end
return tostring(tabl)
end
--Function for console testing of modifier tables
function p.getModifierTableTest()
return p.getModifierTable({args = {'MeleeMaxHit', 'GP Boosts'}})
end
return p