Module:ModifierTables: Difference between revisions

From Melvor Idle
mNo edit summary
No edit summary
Line 234: Line 234:
   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[3] or frame[3]
   local columnName = frame.args ~= nil and frame.args[2] or frame[2]
   local getOpposites = frame.args ~= nil and frame.args[4] or frame[4]
   local getOpposites = frame.args ~= nil and frame.args[3] or frame[3]
   getOpposites = getOpposites ~= nil and string.upper(getOpposites) == 'TRUE' or true
   getOpposites = getOpposites ~= nil and string.upper(getOpposites) == 'TRUE' or true



Revision as of 01:33, 25 April 2021

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, and Pets right now

local p = {}

local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local Pets = require('Module:Pets')
local Items = require('Module:Items')
local Agility = require('Module:Skills/Agility')
local Shop = require('Module:Shop')
local Icons = require('Module:Icons')

--First up, functions to get all the things in a category that have a given modifier:
function p.getModifierValue(modifiers, modifier, skill, getOpposites)
  --Sometimes nil modifier sets will get here, which is fine. Just return 0 immediately
  if modifiers == nil then
    return 0
  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
  --But if getOpposites is false, only look for an exact match
  local increaseMod, decreaseMod = '', ''
  if getOpposites == nil or getOpposites then
    increaseMod = 'increased'..modifier
    decreaseMod = 'decreased'..modifier
  else
    increaseMod = modifier
  end

  local increaseVal, decreaseVal = 0, 0
  if modifiers[increaseMod] ~= nil and modifiers[increaseMod] ~= nil then
    if type(modifiers[increaseMod]) == 'table' then
      for i, subVal in Shared.skpairs(modifiers[increaseMod]) do
        if subVal[1] == skill then
          increaseVal = subVal[2]
        end
      end
    else
      increaseVal = modifiers[increaseMod]
    end
  end

  if modifiers[decreaseMod] ~= nil and modifiers[decreaseMod] ~= nil then
    if type(modifiers[decreaseMod]) == 'table' then
      for i, subVal in Shared.skpairs(modifiers[decreaseMod]) do
        if subVal[1] == skill then
          decreaseVal = subVal[2]
        end
      end
    else
      decreaseVal = modifiers[decreaseMod]
    end
  end

  return increaseVal - decreaseVal
end

function p.getItemsWithModifier(modifier, skill, getOpposites)
  local itemList = Items.getItems(
        function(item)
          return p.getModifierValue(item.modifiers, modifier, skill, getOpposites) ~= 0
        end)
  return itemList
end

function p.getObstaclesWithModifier(modifier, skill, getOpposites)
  local obstList = Agility.getObstacles(
        function(obst)
          return p.getModifierValue(obst.modifiers, modifier, skill, getOpposites) ~= 0
        end)
  return obstList
end

function p.getPetsWithModifier(modifier, skill, getOpposites)
  local petList = Pets.getPets(
        function(pet)
          return p.getModifierValue(pet.modifiers, modifier, skill, getOpposites) ~= 0
        end)
  return petList
end

function p.getUpgradesWithModifier(modifier, skill, getOpposites)
  local upgradeList = Shop.getPurchases(
        function(purchase)
          return p.getModifierValue(purchase.contains.modifiers, modifier, skill, getOpposites) ~= 0
        end)
 return upgradeList
end

function p._getModifierTable(modifier, skill, columnName, getOpposites)
  local modifierNames = {}
  if getOpposites then
    table.insert(modifierNames, 'increased'..modifier)
    table.insert(modifierNames, 'decreased'..modifier)
  else
    table.insert(modifierNames, modifier)
  end
  local hasOtherModifiers = false

  if skill == '' then
    skill = nil
  elseif type(skill) == 'string' then
    skill = Constants.getSkillID(skill)
  end

  local getModText = 
    function(modifiers)
      local modTextArray = {}
      local mainModText = {}
      for modName, modValue in Shared.skpairs(modifiers) do
        if Shared.contains(modifierNames, modName) then
          if type(modValue) == table then
            for j, subVal in Shared.skpairs(modValue) do
              if subVal[1] == skill then
                table.insert(mainModText, Constants._getModifierText(modName, subVal[2]))
              else
                table.insert(modTextArray, Constants._getModifierText(modName, subVal[2]))
              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/>')
    end

  local tableArray = {}
  --Going through each type of thing to add to the array
  local itemList = p.getItemsWithModifier(modifier, 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'
    row.val = p.getModifierValue(item.modifiers, modifier, skill, getOpposites)

    row.modifierText, row.otherModifiers = getModText(item.modifiers)

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

    table.insert(tableArray, row)
  end
  local petList = p.getPetsWithModifier(modifier, 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.type = '[[Pets|Pet]]'
    row.val = p.getModifierValue(pet.modifiers, modifier, skill, getOpposites)

    row.modifierText, row.otherModifiers = getModText(pet.modifiers)

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

    table.insert(tableArray, row)
  end
  local obstList = p.getObstaclesWithModifier(modifier, 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]]'
    row.val = p.getModifierValue(obst.modifiers, modifier, skill, getOpposites)

    row.modifierText, row.otherModifiers = getModText(obst.modifiers)

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

    table.insert(tableArray, row)
  end
  local upgradeList = p.getUpgradesWithModifier(modifier, 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]]'
    row.val = p.getModifierValue(upgrade.contains.modifiers, modifier, skill, getOpposites)

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

    if 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 then result = result..'!!Other Modifiers' end

  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)
  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 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]
  getOpposites = getOpposites ~= nil and string.upper(getOpposites) == 'TRUE' or true

  return p._getModifierTable(modifier, skill, columnName, getOpposites)
end

return p