Anonymous

Module:ModifierTables: Difference between revisions

From Melvor Idle
_getModifierTable: Amend Agility pillar links to use anchors
m (it was html it seems)
(_getModifierTable: Amend Agility pillar links to use anchors)
(29 intermediate revisions by 3 users not shown)
Line 1: Line 1:
--Module that constructs tables for all things that can affect Player Modifiers
--Module that constructs tables for all things that can affect Player Modifiers
--This includes Agility, Equipment, and Pets right now
--This includes Agility, Equipment, Pets, Prayers, and Constellations right now


local p = {}
local p = {}
Line 8: Line 8:
local Pets = require('Module:Pets')
local Pets = require('Module:Pets')
local Items = require('Module:Items')
local Items = require('Module:Items')
local Skills = require('Module:Skills')
local Agility = require('Module:Skills/Agility')
local Agility = require('Module:Skills/Agility')
local Prayer = require('Module:Prayer')
local Prayer = require('Module:Prayer')
Line 15: Line 16:
--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.getModifierValue(modifiers, modifier, skill, getOpposites)
function p.getModifierValue(modifiers, modifier, skill, getOpposites)
  --Sometimes nil modifier sets will get here, which is fine. Just return 0 immediately
--Sometimes nil modifier sets will get here, which is fine. Just return 0 immediately
  if modifiers == nil then
if modifiers == nil then
    return 0
return 0
  end
end
 
  --Make sure we have the skillID and not the name
  if skill == '' then
    skill = nil
  elseif type(skill) == 'string' then
    skill = Constants.getSkillID(skill)
  end


  --By default, attempt to add the increased and decreased prefixes to the modifier
--Make sure we have the skillID and not the name
  --But if getOpposites is false, only look for an exact match
if skill ~= nil then
  local increaseMod, decreaseMod = '', ''
if skill == '' then
  if getOpposites == nil or getOpposites then
skill = nil
    increaseMod = 'increased'..modifier
elseif Constants.getSkillID(skill) ~= nil then
    decreaseMod = 'decreased'..modifier
-- skill is a skill name
  else
skill = Constants.getSkillID(skill)
    increaseMod = modifier
elseif Constants.getSkillName(skill) == nil then
  end
-- skill is neither a skill name or ID
return 0
end
end


  local increaseVal, decreaseVal = 0, 0
--By default, attempt to add the increased and decreased prefixes to the modifier
  if modifiers[increaseMod] ~= nil and modifiers[increaseMod] ~= nil then
--But if getOpposites is false, only look for an exact match
    if type(modifiers[increaseMod]) == 'table' then
      for i, subVal in Shared.skpairs(modifiers[increaseMod]) do
local mods = {}
        if subVal[1] == skill then
if getOpposites == nil or getOpposites then
increaseVal = subVal[2]
mods.inc = 'increased'..modifier
        elseif skill == nil or skill == '' then
mods.dec = 'decreased'..modifier
        increaseVal = increaseVal + subVal[2]
else
        end
mods.inc = modifier
      end
end
    else
      increaseVal = modifiers[increaseMod]
local magnitude = { inc = 0, dec = 0 }
    end
for modType, modName in pairs(mods) do
  end
if modifiers[modName] ~= nil then
local valueArray = nil
            if type(modifiers[modName]) ~= 'table' then
                valueArray = {modifiers[modName]}
            else
                valueArray = modifiers[modName]
            end


  if modifiers[decreaseMod] ~= nil and modifiers[decreaseMod] ~= nil then
            for i, subVal in ipairs(valueArray) do
    if type(modifiers[decreaseMod]) == 'table' then
                if type(subVal) == 'table' then
      for i, subVal in Shared.skpairs(modifiers[decreaseMod]) do
if  subVal.skillID ~= nil then
        if subVal[1] == skill then
-- Modifier value is skill specific
decreaseVal = subVal[2]
if skill == nil or skill == '' or subVal.skillID == skill then
        elseif skill == nil or skill == '' then
magnitude[modType] = magnitude[modType] + subVal.value
        decreaseVal = decreaseVal + subVal[2]
end
        end
else
      end
-- Modifier value is a table of two numbers representing a range. Take the largest value
    else
magnitude[modType] = magnitude[modType] + (subVal[2] or 0)
      decreaseVal = modifiers[decreaseMod]
end
    end
                else
  end
                    magnitude[modType] = magnitude[modType] + subVal
                end
            end
end
end


  return increaseVal - decreaseVal
    return magnitude.inc - magnitude.dec
end
end


function p.getItemsWithModifier(modifiers, skill, getOpposites)
function p.getItemsWithModifier(modifiers, skill, getOpposites)
  if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
    modifiers = {modifiers}
modifiers = {modifiers}
  end
end
  local itemList = Items.getItems(
local itemList = Items.getItems(
        function(item)
function(item)
          local result = false
if item.golbinRaidExclusive ~= nil and item.golbinRaidExclusive then
          for i, mod in Shared.skpairs(modifiers) do
return false
            if p.getModifierValue(item.modifiers, mod, skill, getOpposites) ~= 0 then
elseif item.modifiers == nil or Shared.tableIsEmpty(item.modifiers) then
              result = true
return false
              break
end
            end
for i, mod in ipairs(modifiers) do
          end
if p.getModifierValue(item.modifiers, mod, skill, getOpposites) ~= 0 then
          return result
return true
        end)
end
  return itemList  
end
return false
end)
return itemList
end
end


function p.getObstaclesWithModifier(modifiers, skill, getOpposites)
function p.getObstaclesWithModifier(modifiers, skill, getOpposites)
  if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
    modifiers = {modifiers}
modifiers = {modifiers}
  end
end
  local obstList = Agility.getObstacles(
local obstList = Agility.getObstacles(
        function(obst)
function(obst)
          local result = false
for i, mod in ipairs(modifiers) do
          for i, mod in Shared.skpairs(modifiers) do
if p.getModifierValue(obst.modifiers, mod, skill, getOpposites) ~= 0 then
            if p.getModifierValue(obst.modifiers, mod, skill, getOpposites) ~= 0 then
return true
              result = true
end
              break
end
            end
return false
          end
end)
          return result
return obstList
        end)
end
  return obstList
 
function p.getConstellationsWithModifier(modifiers, skill, getOpposites)
if type(modifiers) == 'string' then
modifiers = {modifiers}
end
local consList = Skills.getConstellations(
function(cons)
local consMods = Skills._buildAstrologyModifierArray(cons, 1, true, true, true, true)
for i, modifier in ipairs(modifiers) do
if p.getModifierValue(consMods, modifier, skill, getOpposites) ~= 0 then
return true
end
end
return false
end)
return consList
end
end


function p.getPillarsWithModifier(modifiers, skill, getOpposites)
function p.getPillarsWithModifier(modifiers, skill, getOpposites)
  if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
    modifiers = {modifiers}
modifiers = {modifiers}
  end
end
  local pillarList = Agility.getPillars(
local pillarList = Agility.getPillars(
        function(pillar)
function(pillar)
          local result = false
for i, mod in ipairs(modifiers) do
          for i, mod in Shared.skpairs(modifiers) do
if p.getModifierValue(pillar.modifiers, mod, skill, getOpposites) ~= 0 then
            if p.getModifierValue(pillar.modifiers, mod, skill, getOpposites) ~= 0 then
return true
              result = true
end
              break
end
            end
return false
          end
end)
          return result
return pillarList
        end)
  return pillarList
end
end


function p.getPetsWithModifier(modifiers, skill, getOpposites)
function p.getPetsWithModifier(modifiers, skill, getOpposites)
  if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
    modifiers = {modifiers}
modifiers = {modifiers}
  end
end
  local petList = Pets.getPets(
local petList = Pets.getPets(
        function(pet)
function(pet)
          local result = false
for i, mod in ipairs(modifiers) do
          for i, mod in Shared.skpairs(modifiers) do
if p.getModifierValue(pet.modifiers, mod, skill, getOpposites) ~= 0 then
            if p.getModifierValue(pet.modifiers, mod, skill, getOpposites) ~= 0 then
return true
              result = true
end
              break
end
            end
return false
          end
end)
          return result
return petList
        end)
  return petList
end
end


Line 158: Line 179:


function p.getUpgradesWithModifier(modifiers, skill, getOpposites)
function p.getUpgradesWithModifier(modifiers, skill, getOpposites)
  if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
    modifiers = {modifiers}
modifiers = {modifiers}
  end
end
  local upgradeList = Shop.getPurchases(
local upgradeList = Shop.getPurchases(
        function(category, purchase)
function(purchase)
          local result = false
if purchase.category == 'melvorD:GolbinRaid' then
          for i, mod in Shared.skpairs(modifiers) do
return false
            if p.getModifierValue(purchase.contains.modifiers, mod, skill, getOpposites) ~= 0 then
end
              result = true
for i, mod in ipairs(modifiers) do
              break
if p.getModifierValue(purchase.contains.modifiers, mod, skill, getOpposites) ~= 0 then
            end
return true
          end
end
          return result
end
        end)
return false
return upgradeList
end)
return upgradeList
end
end


function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods)
function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
  local modifierNames = {}
local modifierNames = {}
  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 getOpposites then
if getOpposites then
      table.insert(modifierNames, 'increased'..modifier)
table.insert(modifierNames, 'increased'..modifier)
      table.insert(modifierNames, 'decreased'..modifier)
table.insert(modifierNames, 'decreased'..modifier)
    else
else
      table.insert(modifierNames, modifier)
table.insert(modifierNames, modifier)
    end
end
  end
end
 
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 hasOtherModifiers = false
local getModText =
  local modifierCount = Shared.tableCount(modifiers)
function(modifiers)
local modTextArray = { ["visible"] = {}, ["overflow"] = {} }
local otherModCount = 0
local mainModText = {}
for modName, modValue in Shared.skpairs(modifiers) do
                local includedMod = Shared.contains(modifierNames, modName)
                local valueArray = nil
                if type(modValue) ~= 'table' then
                    valueArray = {modValue}
                else
                    valueArray = modValue
                end


  if skill == '' then
                for j, subVal in ipairs(valueArray) do
    skill = nil
                    local includeInMainText = includedMod
  elseif type(skill) == 'string' then
                    if type(subVal) == 'table' and subVal.skillID ~= nil then
    skill = Constants.getSkillID(skill)
                        -- Modifier value is skill specific
  end
                        if includeInMainText then
                            -- If the skill doesn't match then don't include in the main text
                            includeInMainText = skill == nil or skill == '' or subVal.skillID == skill
                        end
                        subVal = {subVal}
                    end


  local getModText =
                    if includeInMainText then
    function(modifiers)
                        table.insert(mainModText, Constants._getModifierText(modName, subVal))
      local modTextArray = {}
                    else
      local mainModText = {}
                        otherModCount = otherModCount + 1
      for modName, modValue in Shared.skpairs(modifiers) do
                        local key = ((maxOtherMods == nil or otherModCount <= maxOtherMods) and 'visible') or 'overflow'
        if Shared.contains(modifierNames, modName) then
                        table.insert(modTextArray[key], Constants._getModifierText(modName, subVal))
          if type(modValue) == 'table' then
                    end
            for j, subVal in Shared.skpairs(modValue) do
                 end
              if subVal[1] == skill or skill == nil or skill == '' then
                table.insert(mainModText, Constants._getModifierText(modName, subVal))
              else
                 table.insert(modTextArray, Constants._getModifierText(modName, subVal))
              end
             end
             end
          else
            table.insert(mainModText, Constants._getModifierText(modName, modValue))
          end
        else
          table.insert(modTextArray, Constants._getModifierText(modName, modValue))
        end
      end


      return table.concat(mainModText, '<br/>'), table.concat(modTextArray, '<br/>')
local overflowModCount = Shared.tableCount(modTextArray['overflow'])
    end
if overflowModCount == 1 then
table.insert(modTextArray['visible'], modTextArray['overflow'][1])
end
local otherModText = {table.concat(modTextArray['visible'], '<br/>')}
 
if overflowModCount > 1 then
-- Number of other modifiers for the object exceed the specified maximum
table.insert(otherModText, '<br/><span class="mw-collapsible mw-collapsed" ')
table.insert(otherModText, 'data-expandtext="Show ' .. Shared.formatnum(overflowModCount) .. ' more modifiers", data-collapsetext="Hide">')
table.insert(otherModText, table.concat(modTextArray['overflow'], '<br/>') .. '</span>')
end
return table.concat(mainModText, '<br/>'), table.concat(otherModText)
end
 
local tableArray = {}
--Going through each type of thing to add to the array
local itemList = p.getItemsWithModifier(modifiers, skill, getOpposites)
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'
--For equipment, show the slot they go in
if item.validSlots ~= nil then
row.type = row.type..' ('..table.concat(Shared.clone(item.validSlots), ', ')..')'
end
row.typeText = row.type
local totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(item.modifiers, mod, skill, getOpposites)
end
row.val = totalVal
 
row.modifierText, row.otherModifiers = getModText(item.modifiers)
 
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
hasOtherModifiers = true
end


  local tableArray = {}
table.insert(tableArray, row)
  --Going through each type of thing to add to the array
  local itemList = p.getItemsWithModifier(modifiers, skill, getOpposites)
  for i, item in Shared.skpairs(itemList) do
    local row = {}
    row.name = item.name
    row.icon = Icons.Icon({item.name, type='item'})
    row.type = 'Item'--For equipment, show the slot they go in
    --For equipment, show the slot they go in
if item.validSlots ~= nil then
  row.type = row.type..' ('..table.concat(item.validSlots, ', ')..')'
end
end
    local totalVal = 0
    for i, mod in pairs(modifiers) do
      totalVal = totalVal + p.getModifierValue(item.modifiers, mod, skill, getOpposites)
    end
    row.val = totalVal


    row.modifierText, row.otherModifiers = getModText(item.modifiers)
local petList = p.getPetsWithModifier(modifiers, skill, getOpposites)
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 totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(pet.modifiers, mod, skill, getOpposites)
end
row.val = totalVal


    if string.len(row.otherModifiers) > 0 then
row.modifierText, row.otherModifiers = getModText(pet.modifiers)
      hasOtherModifiers = true
    end


    table.insert(tableArray, row)
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
  end
hasOtherModifiers = true
  local petList = p.getPetsWithModifier(modifiers, skill, getOpposites)
end
  for i, pet in Shared.skpairs(petList) do
    local row = {}
    row.name = pet.name
    row.icon = Icons.Icon({pet.name, type='pet'})
    row.type = '[[Pets|Pet]]'
    local totalVal = 0
    for i, mod in pairs(modifiers) do
      totalVal = totalVal + p.getModifierValue(pet.modifiers, mod, skill, getOpposites)
    end
    row.val = totalVal


    row.modifierText, row.otherModifiers = getModText(pet.modifiers)
table.insert(tableArray, row)
end


    if string.len(row.otherModifiers) > 0 then
local obstList = p.getObstaclesWithModifier(modifiers, skill, getOpposites)
      hasOtherModifiers = true
table.sort(obstList, function(a, b) return a.category < b.category end)
    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 totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(obst.modifiers, mod, skill, getOpposites)
end
row.val = totalVal


    table.insert(tableArray, row)
row.modifierText, row.otherModifiers = getModText(obst.modifiers)
  end
  local obstList = p.getObstaclesWithModifier(modifiers, skill, getOpposites)
  for i, obst in Shared.skpairs(obstList) do
    local row = {}
    row.name = obst.name
    row.icon = Icons.Icon({'Agility', obst.name, type='skill'})
    row.type = '[[Agility#Obstacles|Agility Obstacle '..tostring(tonumber(obst.category)+1)..']]'
    local totalVal = 0
    for i, mod in pairs(modifiers) do
      totalVal = totalVal + p.getModifierValue(obst.modifiers, mod, skill, getOpposites)
    end
    row.val = totalVal


    row.modifierText, row.otherModifiers = getModText(obst.modifiers)
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
hasOtherModifiers = true
end


    if string.len(row.otherModifiers) > 0 then
table.insert(tableArray, row)
      hasOtherModifiers = true
end
    end


    table.insert(tableArray, row)
local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites)
  end
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 totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(pillar.modifiers, mod, skill, getOpposites)
end
row.val = totalVal


  local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites)
row.modifierText, row.otherModifiers = getModText(pillar.modifiers)
  for i, pillar in Shared.skpairs(pillarList) do
    local row = {}
    row.name = pillar.name
    row.icon = Icons.Icon({'Agility', pillar.name, type='skill'})
    row.type = '[[Agility#Passive Pillars|Agility Pillar]]'
    local totalVal = 0
    for i, mod in pairs(modifiers) do
      totalVal = totalVal + p.getModifierValue(pillar.modifiers, mod, skill, getOpposites)
    end
    row.val = totalVal


    row.modifierText, row.otherModifiers = getModText(pillar.modifiers)
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
hasOtherModifiers = true
end


    if string.len(row.otherModifiers) > 0 then
table.insert(tableArray, row)
      hasOtherModifiers = true
end
    end


    table.insert(tableArray, row)
local prayerList = p.getPrayersWithModifier(modifiers, skill, getOpposites)
  end
for i, prayer in ipairs(prayerList) do
 
local row = {}
  local prayerList = p.getPrayersWithModifier(modifiers, skill, getOpposites)
row.name = prayer.name
  for i, prayer in ipairs(prayerList) do
row.icon = Icons.Icon({prayer.name, type='prayer'})
  local row = {}
row.expIcon = Icons.getExpansionIcon(prayer.id)
  row.name = prayer.name
row.type = [[Prayer]]
  row.icon = Icons.Icon({prayer.name, type='prayer'})
row.typeText = 'Prayer'
  row.type = [[Prayer]]
local totalVal = 0
  local totalVal = 0
for i, mod in ipairs(modifiers) do
  for i, mod in ipairs(modifiers) do
totalVal = totalVal + p.getModifierValue(prayer.modifiers, mod, skill, getOpposites)
  totalVal = totalVal + p.getModifierValue(prayer.modifiers, mod, skill, getOpposites)
end
  end
row.val = totalVal
  row.val = totalVal
 
  row.modifierText, row.otherModifiers = getModText(prayer.modifiers)
 
  if string.len(row.otherModifiers) > 0 then
  hasOtherModifiers = true
  end
 
  table.insert(tableArray, row)
  end
 
  local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites)
  for i, upgrade in Shared.skpairs(upgradeList) do
    local row = {}
    row.name = upgrade.name
    row.icon = Icons.Icon({upgrade.name, type='upgrade'})
    row.type = '[[Shop|Upgrade]]'
    local totalVal = 0
    for i, mod in pairs(modifiers) do
      totalVal = totalVal + p.getModifierValue(upgrade.contains.modifiers, mod, skill, getOpposites)
    end
    row.val = totalVal


    row.modifierText, row.otherModifiers = getModText(upgrade.contains.modifiers)
row.modifierText, row.otherModifiers = getModText(prayer.modifiers)


    if string.len(row.otherModifiers) > 0 then
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
      hasOtherModifiers = true
hasOtherModifiers = true
    end
end


    table.insert(tableArray, row)
table.insert(tableArray, row)
  end
end


  local result = '{| class="wikitable sortable stickyHeader"'
local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites)
  result = result..'\r\n|- class="headerRow-0"'
for i, upgrade in ipairs(upgradeList) do
  result = result..'\r\n!Source!!Type!!'..columnName
local row = {}
  if hasOtherModifiers and displayOtherMods then result = result..'!!Other Modifiers' end
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 totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(upgrade.contains.modifiers, mod, skill, getOpposites)
end
row.val = totalVal


  --Sort by value if only one modifier was passed in
row.modifierText, row.otherModifiers = getModText(upgrade.contains.modifiers)
  --Otherwise sort alphabetically by name
  if modifierCount == 1 then
    table.sort(tableArray, function(a, b)
                            if a.val ~= b.val then
                              return a.val > b.val
                            elseif a.name ~= b.name then
                              return a.name < b.name
                            else
                              return a.type < b.type
                            end
                          end)
  else
    table.sort(tableArray, function(a, b) return a.name < b.name end)
  end
  for i, row in Shared.skpairs(tableArray) do
    result = result..'\r\n|-'
    result = result..'\r\n|data-sort-value="'..row.name..'"|'..row.icon
    result = result..'||'..row.type..'||data-sort-value="'..row.val..'"|'..row.modifierText
    if hasOtherModifiers and displayOtherMods then
    local _, nummodifiers = string.gsub(row.otherModifiers, '<br>', '<br>')
    if nummodifiers < 5 then
    result = result..'||'..nummodifiers..' modifiers: '..row.otherModifiers
    else
    result = result..'|| many modifiers'
    end
    end
  end


  result = result..'\r\n|}'
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
  return result
hasOtherModifiers = true
end
 
table.insert(tableArray, row)
end
 
local constellationList = p.getConstellationsWithModifier(modifiers, skill, getOpposites)
for i, cons in ipairs(constellationList) do
local modList = Skills._buildAstrologyModifierArray(cons, nil, true, true, true, true)
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'
row.modifierText, row.otherModifiers = getModText(modList)
local totalVal = 0
for i, mod in pairs(modifiers) do
totalVal = totalVal + p.getModifierValue(modList, mod, skill, getOpposites)
end
row.val = totalVal
 
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 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
end


function p.getModifierTable(frame)
function p.getModifierTable(frame)
  local modifier = frame.args ~= nil and frame.args[1] or frame[1]
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 skill = frame.args ~= nil and frame.args.skill or frame.skill
  local columnName = frame.args ~= nil and frame.args[2] or frame[2]
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 getOpposites = frame.args ~= nil and frame.args[3] or frame[3]
  local displayOtherMods = frame.args ~= nil and frame.args.displayOtherMods or frame.displayOtherMods
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


  if Shared.contains(modifier, ',') then
return p._getModifierTable(modifier, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
    modifier = Shared.splitString(modifier, ',')
end
  end


  if getOpposites ~= nil then
--Function for console testing of modifier tables
    getOpposites = string.upper(getOpposites) ~= 'FALSE'
function p.getModifierTableTest()
  else
return p.getModifierTable({args = {'MeleeMaxHit', 'GP Boosts'}})
    getOpposites = true
  end
 
  if displayOtherMods ~= nil then
  displayOtherMods = string.upper(displayOtherMods) ~= 'FALSE'
  else
  displayOtherMods = true
  end
 
  return p._getModifierTable(modifier, skill, columnName, getOpposites, displayOtherMods)
end
end


return p
return p