918
edits
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 Common = require('Module:Common') | |||
local Number = require('Module:Number') | |||
local Icons = require('Module:Icons') | |||
local function getPurchase(itemName) | local function getPurchase(itemName) | ||
return Shop. | 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. | -- Returns all SC items that can be sold for GP, and can be bought in bulk. | ||
local | local function getSellablePurchases() | ||
return | -- 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. | function p._getSCItemProfits(amount) | ||
local | local purchases = getMostProfitablePurchases(amount) | ||
local | |||
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 |
edits