4,951
edits
(Use Module:Skills instead of Module:Skills/Gathering) |
Falterfire (talk | contribs) (Attempting to add Points of Interest to Modifier tables) |
||
(20 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 | ||
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 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 | |||
local mods = {} | |||
if getOpposites == nil or getOpposites then | if getOpposites == nil or getOpposites then | ||
mods.inc = 'increased'..modifier | |||
mods.dec = 'decreased'..modifier | |||
else | else | ||
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 | |||
for i, subVal in ipairs(valueArray) do | |||
if type(subVal) == 'table' then | |||
if subVal.skillID ~= nil then | |||
-- Modifier value is skill specific | |||
if skill == nil or skill == '' or subVal.skillID == skill then | |||
magnitude[modType] = magnitude[modType] + subVal.value | |||
end | |||
else | |||
-- Modifier value is a table of two numbers representing a range. Take the largest value | |||
magnitude[modType] = magnitude[modType] + (subVal[2] or 0) | |||
end | |||
else | |||
magnitude[modType] = magnitude[modType] + subVal | |||
end | |||
end | |||
end | end | ||
end | end | ||
return magnitude.inc - magnitude.dec | |||
end | end | ||
Line 77: | Line 84: | ||
function(item) | function(item) | ||
if item.golbinRaidExclusive ~= nil and item.golbinRaidExclusive then | if item.golbinRaidExclusive ~= nil and item.golbinRaidExclusive then | ||
return false | |||
elseif item.modifiers == nil or Shared.tableIsEmpty(item.modifiers) then | |||
return false | return false | ||
end | end | ||
for i, mod in | for i, mod in ipairs(modifiers) do | ||
if p.getModifierValue(item.modifiers, mod, skill, getOpposites) ~= 0 then | if p.getModifierValue(item.modifiers, mod, skill, getOpposites) ~= 0 then | ||
return true | return true | ||
Line 95: | Line 104: | ||
local obstList = Agility.getObstacles( | local obstList = Agility.getObstacles( | ||
function(obst) | function(obst) | ||
for i, mod in | for i, mod in ipairs(modifiers) do | ||
if p.getModifierValue(obst.modifiers, mod, skill, getOpposites) ~= 0 then | if p.getModifierValue(obst.modifiers, mod, skill, getOpposites) ~= 0 then | ||
return true | return true | ||
Line 128: | Line 137: | ||
local pillarList = Agility.getPillars( | local pillarList = Agility.getPillars( | ||
function(pillar) | function(pillar) | ||
for i, mod in | for i, mod in ipairs(modifiers) do | ||
if p.getModifierValue(pillar.modifiers, mod, skill, getOpposites) ~= 0 then | if p.getModifierValue(pillar.modifiers, mod, skill, getOpposites) ~= 0 then | ||
return true | return true | ||
Line 144: | Line 153: | ||
local petList = Pets.getPets( | local petList = Pets.getPets( | ||
function(pet) | function(pet) | ||
for i, mod in | for i, mod in ipairs(modifiers) do | ||
if p.getModifierValue(pet.modifiers, mod, skill, getOpposites) ~= 0 then | if p.getModifierValue(pet.modifiers, mod, skill, getOpposites) ~= 0 then | ||
return true | return true | ||
Line 175: | Line 184: | ||
end | end | ||
local upgradeList = Shop.getPurchases( | local upgradeList = Shop.getPurchases( | ||
function( | function(purchase) | ||
if category == 'GolbinRaid' then | if purchase.category == 'melvorD:GolbinRaid' then | ||
return false | return false | ||
end | end | ||
for i, mod in | for i, mod in ipairs(modifiers) do | ||
if p.getModifierValue(purchase.contains.modifiers, mod, skill, getOpposites) ~= 0 then | if p.getModifierValue(purchase.contains.modifiers, mod, skill, getOpposites) ~= 0 then | ||
return true | return true | ||
Line 189: | 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 206: | Line 236: | ||
local modifierCount = Shared.tableCount(modifiers) | local modifierCount = Shared.tableCount(modifiers) | ||
if skill == '' then | 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 | end | ||
Line 218: | Line 254: | ||
local mainModText = {} | local mainModText = {} | ||
for modName, modValue in Shared.skpairs(modifiers) do | 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 | |||
for j, subVal in ipairs(valueArray) do | |||
local includeInMainText = includedMod | |||
if type(subVal) == 'table' and subVal.skillID ~= nil then | |||
-- Modifier value is skill specific | |||
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 | |||
if includeInMainText then | |||
table.insert(mainModText, Constants._getModifierText(modName, subVal)) | |||
else | |||
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 260: | 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 | 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 289: | 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 306: | 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 327: | Line 375: | ||
local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites) | local pillarList = p.getPillarsWithModifier(modifiers, skill, getOpposites) | ||
for i, pillar in | 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 352: | 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 369: | Line 421: | ||
local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites) | local upgradeList = p.getUpgradesWithModifier(modifiers, skill, getOpposites) | ||
for i, upgrade in | for i, upgrade in ipairs(upgradeList) do | ||
local row = {} | local row = {} | ||
row.name = upgrade | row.name = Shop._getPurchaseName(upgrade) | ||
row.icon = Icons.Icon({ | 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 391: | 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 = | 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 | |||
local | table.insert(tableArray, row) | ||
row.modifierText, row.otherModifiers = getModText( | 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 415: | 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. | elseif a.typeText ~= b.typeText then | ||
return a. | 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 | 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 443: | 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 460: | 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 |