Module:Skills/Agility

From Melvor Idle
< Module:Skills
Revision as of 20:14, 8 March 2021 by Falterfire (talk | contribs) (Added p.getObstaclesForItem (which will be needed for Items/UseTables)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Documentation for this module may be created at Module:Skills/Agility/doc

local p = {}

local ItemData = mw.loadData('Module:Items/data')
local SkillData = mw.loadData('Module:Skills/data')

local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local Items = require('Module:Items')
local ItemSourceTables = require('Module:Items/SourceTables')
local Icons = require('Module:Icons')

function p.getObstacleByID(obstID)
  local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])
  return result
end

function p.getObstacle(name)
  for i, obst in Shared.skpairs(SkillData.Agility.Obstacles) do
    if obst.name == name then
      local result = Shared.clone(obst)
      result.id = i - 1
      return result
    end
  end
  return nil
end

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
  result = result..'!!Bonuses!!Requirements!!Cost'

  local catLog = {}

  for i, obst in Shared.skpairs(SkillData.Agility.Obstacles) do
    result = result..'\r\n|-'
    result = result..'\r\n|'
    if catLog[obst.category] == nil then
      local rowspan = obst.category > 1 and 5 or 3
      result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'
      catLog[obst.category] = true
    end
    result = result..obst.name

    --After the name & category, doing XP, GP, Time, and rates
    local XP = obst.completionBonuses.xp
    local GP = obst.completionBonuses.gp
    local Time = obst.interval / 1000
    result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)
    result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)
    --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
      if type(bonusValue) == 'table' then
        for j, trueBonus in pairs(bonusValue) do
          table.insert(bonuses, Constants.getModifierText(bonusName, trueBonus))
        end
      else
        table.insert(bonuses, Constants.getModifierText(bonusName, bonusValue))
      end
    end
    if Shared.tableCount(bonuses) == 0 then
      table.insert(bonuses, '<span style="color:red">None :(</span>')
    end
    result = result..'||'..table.concat(bonuses, '<br/>')

    --Grabbing requirements to create
    result = result..'||'
    if obst.category > 0 then
      result = result..Icons._SkillReq('Agility', obst.category * 10)
    end
    if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then
      for j, skillReq in Shared.skpairs(obst.requirements.skillLevel) do
        result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])
      end
    end

    --Finally, the cost
    local costs = {}
    if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end
    if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end
    for j, itemCost in Shared.skpairs(obst.cost.items) do
      local item = Items.getItemByID(itemCost[1])
      table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))
    end
    result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')
  end

  result = result..'\r\n|}'

  return result
end

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'

  for i, pill in Shared.skpairs(SkillData.Agility.Pillars) do
    result = result..'\r\n|-'
    result = result..'\r\n|'..pill.name

    --After that, adding the bonuses
    local bonuses = {}
    for bonusName, bonusValue in pairs(pill.modifiers) do
      if type(bonusValue) == 'table' then
        for j, trueBonus in pairs(bonusValue) do
          table.insert(bonuses, Constants.getModifierText(bonusName, trueBonus))
        end
      else
        table.insert(bonuses, Constants.getModifierText(bonusName, bonusValue))
      end
    end
    if Shared.tableCount(bonuses) == 0 then
      table.insert(bonuses, '<span style="color:red">None :(</span>')
    end
    result = result..'||'..table.concat(bonuses, '<br/>')

    --Finally, the cost
    local costs = {}
    if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end
    if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end
    for j, itemCost in Shared.skpairs(pill.cost.items) do
      local item = Items.getItemByID(itemCost[1])
      table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))
    end
    result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')
  end

  result = result..'\r\n|}'

  return result
end

function p.getObstaclesForItem(itemID)
  local result = {}
  for i, obst in Shared.skpairs(SkillData.Agility.Obstacles) do
    for j, costLine in Shared.skpairs(obst.cost.items) do
      if costLine[1] == itemID then
        table.insert(result, obst)
      end
    end
  end

  for i, obst in Shared.skpairs(SkillData.Agility.Pillars) do
    for j, costLine in Shared.skpairs(obst.cost.items) do
      if costLine[1] == itemID then
        table.insert(result, obst)
      end
    end
  end

  return result
end

return p