4,670
edits
mNo edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local Constants = require('Module:Constants') | |||
local Constants = require('Module: | |||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local | local GameData = require('Module:GameData') | ||
local SkillData = GameData.skillData | |||
local Skills = require('Module:Sandbox/Skills') | |||
local Items = require('Module:Items') | |||
local Icons = require('Module:Icons') | local Icons = require('Module:Icons') | ||
function p.getObstacleByID(obstID) | function p.getObstacleByID(obstID) | ||
return GameData.getEntityByID(SkillData.Agility.obstacles, obstID) | |||
end | end | ||
function p.getObstacle(name) | function p.getObstacle(name) | ||
return GameData.getEntityByName(SkillData.Agility.obstacles, name) | |||
end | end | ||
function p.getObstacles(checkFunc) | function p.getObstacles(checkFunc) | ||
return GameData.getEntities(SkillData.Agility.obstacles, checkFunc) | |||
end | end | ||
function p.getPillars(checkFunc) | function p.getPillars(checkFunc) | ||
local result = nil | |||
local keys = { 'pillars', 'elitePillars' } | |||
for i, key in ipairs(keys) do | |||
local pillars = GameData.getEntities(SkillData.Agility[key], checkFunc) | |||
if result == nil then | |||
result = pillars | |||
else | |||
for k, pillar in ipairs(pillars) do | |||
table.insert(result, pillar) | |||
end | |||
end | |||
end | |||
if result == nil then | |||
result = {} | |||
end | |||
return result | |||
end | end | ||
function p._getObstacleRequirements(obstacle) | function p._getObstacleRequirements(obstacle) | ||
local resultPart = {} | local resultPart = {} | ||
local level = Skills.getRecipeLevel('Agility', obstacle) | |||
if level ~= nil then | |||
table.insert(resultPart, Icons._SkillReq('Agility', level)) | |||
table.insert(resultPart, Icons._SkillReq('Agility', | |||
end | end | ||
if type(obstacle.skillRequirements) == 'table' then | if type(obstacle.skillRequirements) == 'table' then | ||
for i, skillReq in ipairs(obstacle.skillRequirements) do | for i, skillReq in ipairs(obstacle.skillRequirements) do | ||
local skillName = Constants.getSkillName(skillReq. | local skillName = Constants.getSkillName(skillReq.skillID) | ||
if skillName ~= nil then | if skillName ~= nil then | ||
table.insert(resultPart, Icons._SkillReq(skillName, skillReq.level)) | table.insert(resultPart, Icons._SkillReq(skillName, skillReq.level)) | ||
Line 66: | Line 55: | ||
end | end | ||
return table.concat(resultPart, '<br/>') | return table.concat(resultPart, '<br/>') | ||
end | |||
function p._getObstacleCosts(obstacle) | |||
local costs = {} | |||
if obstacle.gpCost > 0 then table.insert(costs, Icons.GP(obstacle.gpCost)) end | |||
if obstacle.scCost > 0 then table.insert(costs, Icons.SC(obstacle.scCost)) end | |||
for j, itemCost in ipairs(obstacle.itemCosts) do | |||
local item = Items.getItemByID(itemCost.id) | |||
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost.quantity, notext=true})) | |||
end | |||
return table.concat(costs, '<br/>') | |||
end | end | ||
function p.getObstacleCourseTable(frame) | function p.getObstacleCourseTable(frame) | ||
local result = '' | |||
result = '{| class="wikitable sortable stickyHeader"' | |||
result = result..'\r\n|- class="headerRow-0"' | |||
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time!!XP/s!!GP/s'--!!XP/s!!GP/s (left comment here for posterity) | |||
result = result..'!!Bonuses!!Requirements!!Cost' | |||
local catLog = {} | |||
local obstacles = p.getObstacles(function(obst) return true end) | |||
table.sort(obstacles, function(a, b) return a.category < b.category end) | |||
local catCounts = {} | |||
for i, obst in ipairs(obstacles) do | |||
if catCounts[obst.category] == nil then | |||
catCounts[obst.category] = 1 | |||
else | |||
catCounts[obst.category] = catCounts[obst.category] + 1 | |||
end | |||
end | |||
for i, obst in ipairs(obstacles) do | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|' | |||
if catLog[obst.category] == nil then | |||
local rowspan = catCounts[obst.category] | |||
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||' | |||
catLog[obst.category] = true | |||
end | |||
result = result .. 'id="'..string.gsub(obst.name,' ', '')..'"|'.. Icons.getExpansionIcon(obst.id) .. obst.name | |||
--After the name & category, doing XP, GP, Time, and rates | |||
local XP = obst.baseExperience | |||
local GP = obst.gpReward | |||
local Time = obst.baseInterval / 1000 | |||
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP) | |||
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true) | |||
-- Readded XP/Time and GP/Time (previously commented out) | |||
result = result..'||'..Shared.round(XP / Time, 2, 2) | |||
result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2)) | |||
local bonuses = {} | |||
--After that, adding the bonuses | |||
for bonusName, bonusValue in pairs(obst.modifiers) do | |||
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue)) | |||
end | |||
if Shared.tableIsEmpty(bonuses) then | |||
table.insert(bonuses, '<span style="color:red">None :(</span>') | |||
end | |||
result = result..'||'..table.concat(bonuses, '<br/>') | |||
--Grabbing requirements to create | |||
result = result..'|| ' .. p._getObstacleRequirements(obst) | |||
--Finally, the cost | |||
result = result..'|| data-sort-value="'..obst.gpCost..'"|'..p._getObstacleCosts(obst) | |||
end | |||
result = result..'\r\n|}' | |||
return result | |||
end | end | ||
function p.getPassivePillarTable(frame) | function p.getPassivePillarTable(frame) | ||
local result = '' | |||
result = '{| class="wikitable sortable stickyHeader"' | |||
result = result..'\r\n|- class="headerRow-0"' | |||
result = result..'\r\n!Name!!Bonuses!!Cost' | |||
local pillars = p.getPillars(function(pillar) return true end) | |||
for i, pill in ipairs(pillars) do | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|' .. 'id="'..string.gsub(pill.name,' ', '')..'"|'..Icons.getExpansionIcon(pill.id) .. pill.name | |||
--After that, adding the bonuses | |||
local bonuses = {} | |||
for bonusName, bonusValue in pairs(pill.modifiers) do | |||
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue)) | |||
end | |||
if Shared.tableIsEmpty(bonuses) then | |||
table.insert(bonuses, '<span style="color:red">None :(</span>') | |||
end | |||
result = result..'||'..table.concat(bonuses, '<br/>') | |||
--Finally, the cost | |||
result = result..'|| data-sort-value="'..pill.gpCost..'"|'..p._getObstacleCosts(pill) | |||
end | |||
result = result..'\r\n|}' | |||
return result | |||
end | end | ||
function p.getObstaclesForItem(itemID) | function p.getObstaclesForItem(itemID) | ||
local costFunc = | |||
function(obst) | |||
for i, itemCost in ipairs(obst.itemCosts) do | |||
if itemCost.id == itemID then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
local pillars = p.getPillars(costFunc) | |||
local result = p.getObstacles(costFunc) | |||
if result == nil or Shared.tableIsEmpty(result) then | |||
result = pillars | |||
else | |||
for i, pillar in ipairs(pillars) do | |||
table.insert(result, pillar) | |||
end | |||
end | |||
return result | |||
end | |||
function p._getCourseTable(obstacleNames) | |||
local result = '' | |||
local obstacles = {} | |||
for i, name in ipairs(obstacleNames) do | |||
local obst = p.getObstacle(Shared.trim(name)) | |||
if obst == nil then | |||
result = result .. Shared.printError('Invalid Obstacle Name "' .. name .. '"') .. '<br/>' | |||
else | |||
table.insert(obstacles, obst) | |||
end | |||
end | |||
result = result..'{| class="wikitable sortable stickyHeader"' | |||
result = result..'\r\n|- class="headerRow-0"' | |||
result = result..'\r\n!Slot!!Name!!Bonuses!!Requirements!!Cost' | |||
local catLog = {} | |||
table.sort(obstacles, function(a, b) return a.category < b.category end) | |||
local catCounts = {} | |||
for i, obst in ipairs(obstacles) do | |||
if catCounts[obst.category] == nil then | |||
catCounts[obst.category] = 1 | |||
else | |||
catCounts[obst.category] = catCounts[obst.category] + 1 | |||
end | |||
end | |||
for i, obst in ipairs(obstacles) do | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|' | |||
if catLog[obst.category] == nil then | |||
local rowspan = catCounts[obst.category] | |||
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||' | |||
catLog[obst.category] = true | |||
end | |||
result = result..obst.name | |||
local bonuses = {} | |||
--After that, adding the bonuses | |||
for bonusName, bonusValue in pairs(obst.modifiers) do | |||
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue)) | |||
end | |||
if Shared.tableIsEmpty(bonuses) then | |||
table.insert(bonuses, '<span style="color:red">None :(</span>') | |||
end | |||
result = result..'||'..table.concat(bonuses, '<br/>') | |||
--Grabbing requirements to create | |||
result = result..'|| ' .. p._getObstacleRequirements(obst) | |||
--Finally, the cost | |||
result = result..'|| data-sort-value="'..obst.gpCost..'"|'..p._getObstacleCosts(obst) | |||
end | |||
result = result..'\r\n|}' | |||
return result | |||
end | |||
function p.getCourseTable(frame) | |||
local obstNameStr = frame.args ~= nil and frame.args[1] or frame | |||
local obstacleNames = Shared.splitString(obstNameStr, ',') | |||
return p._getCourseTable(obstacleNames) | |||
end | end | ||
return p | return p |