Module:SCValue: Difference between revisions

no edit summary
mNo edit summary
No edit summary
(2 intermediate revisions by the same user not shown)
Line 4: Line 4:
local Shop = require('Module:Shop')
local Shop = require('Module:Shop')
local Items = require('Module:Items')
local Items = require('Module:Items')
--local Debug = require('Module:Debug')
local Common = require('Module:Common')
local Number = require('Module:Number')
local Icons = require('Module:Icons')


local function getPurchase(itemName)
local function getPurchase(itemName)
return Shop.getPurchase(itemName)
local func =
function(purchase, name)
return name == itemName
end
 
local purchList = Shop.getCategoryPurchases(func, 'Slayer')
if purchList ~= nil and not Shared.tableIsEmpty(purchList) then
return purchList[1]
end
end
end


Line 39: Line 49:
end
end


function p.getSCValue(item)
-- Returns all SC items that can be sold for GP, and can be bought in bulk.
local purchase = getPurchase(item)
local function getSellablePurchases()
return getPurchaseValue(purchase)
-- We need something to sell!
-- We also want to buy/sell massive quantities for profit!
local func =
function(purchase, name)
local items = purchase.contains.items
return purchase.allowQuantityPurchase and
items ~= nil and
not Shared.tableIsEmpty(items)
end
return Shop.getCategoryPurchases(func, 'Slayer')
end
 
local function getMostProfitablePurchases(amount)
amount = tonumber(amount)
amount = math.max(amount, 1)
local data = {}
-- Gather value data about SC Shop Items
for _, v in pairs(getSellablePurchases()) do
local gpValue = getPurchaseValue(v)
local scCost = (v.cost.slayerCoins or {}).cost or 0
local gpPersc = (scCost ~= 0) and (gpValue / scCost) or (gpValue == 0 and 0 or 0)
table.insert(data, {
Purchase = v,
SCCost = scCost,
GPValue = gpValue,
GPPerSC = gpPersc,
})
end
-- Sort by most profitable to least profitable
table.sort(data, function(a, b) return a.GPPerSC > b.GPPerSC end)
 
-- Keep top x most profitable entries only
if amount ~= nil then
local entries = {}
for i = 1, math.min(#data, amount) do table.insert(entries, data[i]) end
return entries
end
return data
end
 
function p.getSCItemProfits(frame)
local args = frame:getParent().args
return p._getSCItemProfits(args[1])
end
end


function p.test()
function p._getSCItemProfits(amount)
local item = 'Necromancer Hat'
local purchases = getMostProfitablePurchases(amount)
local s = getPurchase(item)
 
mw.log(getPurchaseValue(s))
local html = mw.html.create('table')
:addClass('wikitable sortable stickyHeader')
html:tag('tr')
:tag('th'):attr('colspan', 2)
  :wikitext('Purchase')
:tag('th'):wikitext('Cost')
:tag('th'):wikitext('Requirements')
:tag('th'):wikitext('GP Value')
:tag('th'):wikitext('GP per SC')
for _, v in pairs(purchases) do
local purchase =  v.Purchase
local name = Common.getPurchaseName(purchase)
local expansionIcon = Shop._getPurchaseExpansionIcon(purchase)
local costs = Shop.getCostString(purchase.cost, false)
html:tag('tr')
:tag('td'):addClass('table-img')
  :wikitext(Common.getPurchaseIcon({purchase, notext=true, size='50'}))
:tag('td'):attr('data-sort-value', name)
  :wikitext(expansionIcon)
  :wikitext(Common.getPurchaseIcon({purchase, noicon=true}))
:tag('td'):attr('data-sort-value', v.SCCost)
  :css('text-align', 'right')
  :wikitext(costs)
:tag('td'):wikitext(Common.getRequirementString(purchase.purchaseRequirements, 'None'))
:tag('td'):attr('data-sort-value', v.GPValue)
  :css('text-align', 'right')
  :wikitext(Icons.GP(v.GPValue))
:tag('td'):attr('data-sort-value', v.GPPerSC)
  :css('text-align', 'right')
  :wikitext(Icons.GP(Number.autoround(v.GPPerSC)))
end
return tostring(html)
end
 
function p.getSCValue(frame)
local args = frame:getParent().args
return p._getItemSellsFor(args[1], args[2], args.round)
end
 
function p._getSCValue(itemName, multiplier, rounding)
local purchase = getPurchase(itemName)
if purchase == nil then
return Shared.printError("No Slayer Shop item exists with the name: " .. itemName)
end
local itemValue = getPurchaseValue(purchase)
multiplier = tonumber(multiplier) or 1
rounding = tonumber(rounding) or 0
return Number.round2(itemValue * multiplier, rounding)
end
end


return p
return p
918

edits