Module:Shop: Difference between revisions

2,120 bytes added ,  10 December 2021
getPurchaseBuyLimit: Initial implementation; _getShopTable: Support "Buy Limit" column
(getShopMiscUpgradeTable: Include requirements column)
(getPurchaseBuyLimit: Initial implementation; _getShopTable: Support "Buy Limit" column)
Line 2: Line 2:


local ShopData = mw.loadData('Module:Shop/data')
local ShopData = mw.loadData('Module:Shop/data')
local ConstantData = mw.loadData('Module:Constants/data')
-- Data instead of Module:CombatAreas to avoid loop whne that module attempts to require Module:Shop
-- Data instead of Module:CombatAreas to avoid loop whne that module attempts to require Module:Shop
local AreaData = require('Module:CombatAreas/data')
local AreaData = require('Module:CombatAreas/data')
Line 213: Line 214:
   local args = frame.args ~= nil and frame.args or frame
   local args = frame.args ~= nil and frame.args or frame
   local purchaseName = args[1]
   local purchaseName = args[1]
   local asList = ((args[2] ~= nil and args[2] == 'true') or false)
   local asList = (args[2] ~= nil and string.upper(args[2]) == 'TRUE')
   local purchase = p.getPurchase(purchaseName)
   local purchase = p.getPurchase(purchaseName)


Line 221: Line 222:
     return p._getPurchaseContents(purchase, asList)
     return p._getPurchaseContents(purchase, asList)
   end
   end
end
function p._getPurchaseBuyLimit(purchase, asList)
if asList == nil then asList = true end
if type(purchase.buyLimit) == 'table' then
local limitTable = {}
local gamemodeHasIcon = { 1, 2 }
-- Populate limitTable for each game mode to be included
for id, modeName in pairs(ConstantData.gamemode) do
if tonumber(id) ~= nil and string.upper(modeName) ~= 'CHAOS' then
local buyLimit = tostring(purchase.buyLimit[id + 1])
if limitTable[buyLimit] == nil then
limitTable[buyLimit] = {}
end
local gamemodeText = '[[Game Mode#' .. modeName .. '|' .. modeName .. ']]'
if Shared.contains(gamemodeHasIcon, id) then
gamemodeText = Icons.Icon({modeName, notext=(not asList or nil)})
end
table.insert(limitTable[buyLimit], gamemodeText)
end
end
local numLimits = Shared.tableCount(limitTable)
local resultPart = {}
for buyLimit, gameModes in Shared.skpairs(limitTable, true) do
local limitText = (buyLimit == '0' and 'Unlimited' or tostring(buyLimit))
if numLimits == 1 then
-- Buy limit is the same for all game modes
return limitText
else
table.insert(resultPart, limitText .. (asList and ' for ' or ' ') .. mw.text.listToText(gameModes, ', ', (asList and ' and ' or ', ')))
end
end
return table.concat(resultPart, (asList and ' or ' or '<br/>'))
end
end
function p.getPurchaseBuyLimit(frame)
local args = frame.args ~= nil and frame.args or frame
local purchaseName = args[1]
local asList = (args[2] ~= nil and string.upper(args[2]) == 'TRUE')
local purchase = p.getPurchase(purchaseName)
if purchase == nil then
return "ERROR: Couldn't find purchase with name '" .. purchaseName .. "'[[Category:Pages with script errors]]"
else
return p._getPurchaseBuyLimit(purchase, asList)
end
end
end


Line 266: Line 315:


function p._getShopTable(Purchases, options)
function p._getShopTable(Purchases, options)
   local availableColumns = { 'Purchase', 'Type', 'Description', 'Cost', 'Requirements' }
   local availableColumns = { 'Purchase', 'Type', 'Description', 'Cost', 'Requirements', 'Buy Limit' }
   local headerPropsDefault = {
   local headerPropsDefault = {
     ["Purchase"] = 'colspan="2"',
     ["Purchase"] = 'colspan="2"',
Line 360: Line 409:
       elseif column == 'Requirements' then
       elseif column == 'Requirements' then
         table.insert(resultPart, '| ' .. p.getRequirementString(purchase.unlockRequirements))
         table.insert(resultPart, '| ' .. p.getRequirementString(purchase.unlockRequirements))
      elseif column == 'Buy Limit' then
      local buyLimit = p._getPurchaseBuyLimit(purchase, false)
      local sortValue = (tonumber(buyLimit) == nil and -1 or buyLimit)
      table.insert(resultPart, '| data-sort-value="' .. sortValue .. '"| ' .. buyLimit)
       else
       else
         -- Shouldn't be reached, but will prevent the resulting table becoming horribly mis-aligned if it ever happens
         -- Shouldn't be reached, but will prevent the resulting table becoming horribly mis-aligned if it ever happens