Anonymous

Module:ModifierTables: Difference between revisions

From Melvor Idle
Attempting to add Points of Interest to Modifier tables
(Update for v1.1)
(Attempting to add Points of Interest to Modifier tables)
(17 intermediate revisions by 2 users not shown)
Line 13: Line 13:
local Shop = require('Module:Shop')
local Shop = require('Module:Shop')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Cartography = require('Module:Skills/Cartography')


--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:
Line 22: Line 23:


--Make sure we have the skillID and not the name
--Make sure we have the skillID and not the name
if skill == '' then
if skill ~= nil then
skill = nil
if skill == '' then
elseif type(skill) == 'string' then
skill = nil
skill = Constants.getSkillID(skill)
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 0
end
end
end


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


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


if modifiers[decreaseMod] ~= nil and modifiers[decreaseMod] ~= nil then
    return magnitude.inc - magnitude.dec
if type(modifiers[decreaseMod]) == 'table' then
for i, subVal in Shared.skpairs(modifiers[decreaseMod]) do
if subVal[1] == skill then
decreaseVal = subVal[2]
elseif skill == nil or skill == '' then
decreaseVal = decreaseVal + subVal[2]
end
end
else
decreaseVal = modifiers[decreaseMod]
end
end
 
return increaseVal - decreaseVal
end
end


Line 177: Line 184:
end
end
local upgradeList = Shop.getPurchases(
local upgradeList = Shop.getPurchases(
function(category, purchase)
function(purchase)
if category == 'melvorD:GolbinRaid' then
if purchase.category == 'melvorD:GolbinRaid' then
return false
return false
end
end
Line 191: Line 198:
end
end


function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods)
function p.getPOIsWithModifier(modifiers, skill, getOpposites)
if type(modifiers) == 'string' then
modifiers = {modifiers}
end
local POIList = Cartography.getPointsOfInterest(
function(POI)
if POI.activeModifiers == nil then
return false
end
for i, mod in ipairs(modifiers) do
if p.getModifierValue(POI.activeModifiers, mod, skill, getOpposites) ~= 0 then
return true
end
end
return false
end)
return POIList
end
 
function p._getModifierTable(modifiers, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
local modifierNames = {}
local modifierNames = {}
if type(modifiers) == 'string' then
if type(modifiers) == 'string' then
Line 208: Line 236:
local modifierCount = Shared.tableCount(modifiers)
local modifierCount = Shared.tableCount(modifiers)


if skill == '' then
if skill ~= nil then
skill = nil
if skill == '' then
elseif type(skill) == 'string' then
skill = nil
local skillID = Constants.getSkillID(skill)
elseif Constants.getSkillID(skill) ~= nil then
if skillID == nil then
-- skill is a skill name
return 'ERROR: Failed to find a skill ID for ' .. skill .. '[[Category:Pages with script errors]]'
skill = Constants.getSkillID(skill)
else
elseif Constants.getSkillName(skill) == nil then
skill = skillID
-- skill is neither a skill name or ID
return Shared.printError('Failed to find a skill ID for "' .. skill .. '"')
end
end
end
end
Line 225: Line 254:
local mainModText = {}
local mainModText = {}
for modName, modValue in Shared.skpairs(modifiers) do
for modName, modValue in Shared.skpairs(modifiers) do
if Shared.contains(modifierNames, modName) then
                local includedMod = Shared.contains(modifierNames, modName)
if type(modValue) == 'table' and type(modValue[1]) == 'table' then
                local valueArray = nil
for j, subVal in ipairs(modValue) do
                if type(modValue) ~= 'table' then
if subVal[1] == skill or skill == nil or skill == '' then
                    valueArray = {modValue}
table.insert(mainModText, Constants._getModifierText(modName, subVal))
                else
else
                    valueArray = modValue
otherModCount = otherModCount + 1
                end
local key = ((maxOtherMods == nil or otherModCount <= maxOtherMods) and 'visible') or 'overflow'
 
table.insert(modTextArray[key], Constants._getModifierText(modName, subVal))
                for j, subVal in ipairs(valueArray) do
end
                    local includeInMainText = includedMod
end
                    if type(subVal) == 'table' and subVal.skillID ~= nil then
else
                        -- Modifier value is skill specific
table.insert(mainModText, Constants._getModifierText(modName, modValue))
                        if includeInMainText then
end
                            -- If the skill doesn't match then don't include in the main text
else
                            includeInMainText = skill == nil or skill == '' or subVal.skillID == skill
modValue = (type(modValue) == 'table' and type(modValue[1]) == 'table' and modValue or {modValue})
                        end
for j, subValue in ipairs(modValue) do
                        subVal = {subVal}
otherModCount = otherModCount + 1
                    end
local key = ((maxOtherMods == nil or otherModCount <= maxOtherMods) and 'visible') or 'overflow'
 
table.insert(modTextArray[key], Constants._getModifierText(modName, subValue))
                    if includeInMainText then
end
                        table.insert(mainModText, Constants._getModifierText(modName, subVal))
end
                    else
end
                        otherModCount = otherModCount + 1
                        local key = ((maxOtherMods == nil or otherModCount <= maxOtherMods) and 'visible') or 'overflow'
                        table.insert(modTextArray[key], Constants._getModifierText(modName, subVal))
                    end
                end
            end


local overflowModCount = Shared.tableCount(modTextArray['overflow'])
local overflowModCount = Shared.tableCount(modTextArray['overflow'])
Line 267: Line 301:
--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(modifiers, skill, getOpposites)
local itemList = p.getItemsWithModifier(modifiers, skill, getOpposites)
for i, item in Shared.skpairs(itemList) do
for i, item in ipairs(itemList) do
local row = {}
local row = {}
row.name = item.name
row.name = item.name
row.icon = Icons.Icon({item.name, type='item'})
row.icon = Icons.Icon({item.name, type='item'})
row.expIcon = Icons.getExpansionIcon(item.id)
row.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
if item.validSlots ~= nil then
row.type = row.type..' ('..table.concat(item.validSlots, ', ')..')'
row.type = row.type..' ('..table.concat(Shared.clone(item.validSlots), ', ')..')'
end
end
row.typeText = row.type
local totalVal = 0
local totalVal = 0
for i, mod in pairs(modifiers) do
for i, mod in pairs(modifiers) do
Line 296: Line 332:
row.name = pet.name
row.name = pet.name
row.icon = Icons.Icon({pet.name, type='pet'})
row.icon = Icons.Icon({pet.name, type='pet'})
row.expIcon = Icons.getExpansionIcon(pet.id)
row.type = '[[Pets|Pet]]'
row.type = '[[Pets|Pet]]'
row.typeText = 'Pet'
local totalVal = 0
local totalVal = 0
for i, mod in pairs(modifiers) do
for i, mod in pairs(modifiers) do
Line 313: Line 351:


local obstList = p.getObstaclesWithModifier(modifiers, skill, getOpposites)
local obstList = p.getObstaclesWithModifier(modifiers, skill, getOpposites)
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
local row = {}
local row = {}
row.name = obst.name
row.name = obst.name
row.icon = Icons.Icon({'Agility', obst.name, type='skill'})
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.type = '[[Agility#Obstacles|Agility Obstacle '..tostring(tonumber(obst.category)+1)..']]'
row.typeText = 'Agility Obstacle '..string.format("%02d", (obst.category + 1))
local totalVal = 0
local totalVal = 0
for i, mod in pairs(modifiers) do
for i, mod in pairs(modifiers) do
Line 334: Line 375:


local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites)
local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites)
for i, pillar in Shared.skpairs(pillarList) do
for i, pillar in ipairs(pillarList) do
local row = {}
local row = {}
row.name = pillar.name
row.name = pillar.name
row.icon = Icons.Icon({'Agility', pillar.name, type='skill'})
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.type = '[[Agility#Passive Pillars|Agility Pillar]]'
row.typeText = 'Agility Pillar'
local totalVal = 0
local totalVal = 0
for i, mod in pairs(modifiers) do
for i, mod in pairs(modifiers) do
Line 359: Line 402:
row.name = prayer.name
row.name = prayer.name
row.icon = Icons.Icon({prayer.name, type='prayer'})
row.icon = Icons.Icon({prayer.name, type='prayer'})
row.expIcon = Icons.getExpansionIcon(prayer.id)
row.type = [[Prayer]]
row.type = [[Prayer]]
row.typeText = 'Prayer'
local totalVal = 0
local totalVal = 0
for i, mod in ipairs(modifiers) do
for i, mod in ipairs(modifiers) do
Line 376: Line 421:


local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites)
local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites)
for i, upgrade in Shared.skpairs(upgradeList) do
for i, upgrade in ipairs(upgradeList) do
local row = {}
local row = {}
row.name = upgrade.name
row.name = Shop._getPurchaseName(upgrade)
row.icon = Icons.Icon({upgrade.name, type='upgrade'})
row.icon = Icons.Icon({row.name, type='upgrade'})
row.expIcon = Icons.getExpansionIcon(upgrade.id)
row.type = '[[Shop|Upgrade]]'
row.type = '[[Shop|Upgrade]]'
row.typeText = 'Upgrade'
local totalVal = 0
local totalVal = 0
for i, mod in pairs(modifiers) do
for i, mod in pairs(modifiers) do
Line 398: Line 445:
local constellationList = p.getConstellationsWithModifier(modifiers, skill, getOpposites)
local constellationList = p.getConstellationsWithModifier(modifiers, skill, getOpposites)
for i, cons in ipairs(constellationList) do
for i, cons in ipairs(constellationList) do
local modList = Skills._buildAstrologyModifierArray(cons, nil, true, true, true, true)
local row = {}
local row = {}
row.name = cons.name
row.name = cons.name
row.icon = Icons.Icon({cons.name, type='constellation'})
row.icon = Icons.Icon({cons.name, type='constellation'})
row.expIcon = Icons.getExpansionIcon(cons.id)
row.type = '[[Astrology#Constellations|Constellation]]'
row.type = '[[Astrology#Constellations|Constellation]]'
row.val = 15 -- Assume highest possible, the range is 1 to 15 inclusive
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


local modList = Skills._buildAstrologyModifierArray(cons, {1, 15}, true, true, true, true)
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
row.modifierText, row.otherModifiers = getModText(modList)
hasOtherModifiers = true
end
 
table.insert(tableArray, row)
end
local POIList = p.getPOIsWithModifier(modifiers, skill, getOpposites)
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 totalVal = 0
for i, mod in ipairs(modifiers) do
totalVal = totalVal + p.getModifierValue(POI.activeModifiers, mod, skill, getOpposites)
end
row.val = totalVal
 
row.modifierText, row.otherModifiers = getModText(POI.activeModifiers)


if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
if not hasOtherModifiers and string.len(row.otherModifiers) > 0 then
Line 422: Line 498:
--Otherwise sort alphabetically by type, then name
--Otherwise sort alphabetically by type, then name
table.sort(tableArray, function(a, b)
table.sort(tableArray, function(a, b)
if modifierCount == 1 and a.val ~= b.val then
if (modifierCount == 1 or forceMagnitudeSort) and a.val ~= b.val then
return a.val > b.val
return a.val > b.val
elseif a.type ~= b.type then
elseif a.typeText ~= b.typeText then
return a.type < b.type
return a.typeText < b.typeText
else
else
return a.name < b.name
return a.name < b.name
end
end
end)
end)
for i, row in Shared.skpairs(tableArray) do
for i, row in ipairs(tableArray) do
result = result..'\r\n|-'
result = result..'\r\n|-'
result = result..'\r\n|data-sort-value="'..row.name..'"|'..row.icon
result = result..'\r\n|data-sort-value="'..row.name..'"|'..row.icon
result = result..'||'..row.type..'||data-sort-value="'..row.val..'"|'..row.modifierText
result = result..'|| data-sort-value="'..row.typeText..'" | '..row.expIcon..row.type..'||data-sort-value="'..row.val..'"| '..row.modifierText
if hasOtherModifiers and displayOtherMods then
if hasOtherModifiers and displayOtherMods then
result = result..'||'..row.otherModifiers
result = result..'|| '..row.otherModifiers
end
end
end
end
Line 450: Line 526:
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 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
if Shared.contains(modifier, ',') then
Line 467: Line 544:
end
end


return p._getModifierTable(modifier, skill, columnName, getOpposites, displayOtherMods, maxOtherMods)
return p._getModifierTable(modifier, skill, columnName, getOpposites, displayOtherMods, maxOtherMods, forceMagnitudeSort)
end
 
--Function for console testing of modifier tables
function p.getModifierTableTest()
return p.getModifierTable({args = {'MeleeMaxHit', 'GP Boosts'}})
end
end


return p
return p