918
edits
(Add more parameters to output) |
(Fix styling issues with lists) |
||
(39 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
local itemdb = require('Module:Items') | local itemdb = require('Module:Items') | ||
local icons = require('Module:Icons') | local icons = require('Module:Icons') | ||
local StringBuilder = require('Module:StringBuilder') | |||
-- Constants | -- Constants | ||
Line 20: | Line 21: | ||
} | } | ||
--- | --- Possible fix to allow wikicode (especially tables) to be passed to the 'explanation' | ||
--- parameter, and get parsed by the wiki parser on return. | |||
-- Not used currently, because it might not be necessary at all. | |||
local function processMarkup(str) | |||
--return frame:preprocess(str) | |||
end | |||
return | |||
end | |||
--- Formats a given string to TitleCase. | --- Formats a given string to TitleCase. | ||
-- @param name (string) String to format. | -- @param name (string) String to format. | ||
-- @return (string) Formatted string, or the input if it's not a string. | -- @return (string) Formatted string, or the input if it's not a string. | ||
local function | local function formatItemName(name) | ||
-- Special case to correctly format GP name. | |||
if shared.compareString(name, 'Gold Pieces', true) or shared.compareString(name, 'GP', true) then | |||
return 'Gold Pieces' | |||
end | |||
-- Got to solve too many edge case swith this (like of and IV) | |||
-- Better just make the user use the correct name instead. | |||
--if type(name) == 'string' then | |||
-- return shared.titleCase(name) | |||
--end | |||
return name | |||
end | |||
local function formatSkillName(name) | |||
if type(name) == 'string' then | if type(name) == 'string' then | ||
return shared.titleCase(name) | return shared.titleCase(name) | ||
Line 41: | Line 52: | ||
return name | return name | ||
end | |||
local function getErrorDiv(message) | |||
return mw.html.create('div') | |||
:css('color', 'red') | |||
:wikitext(message) | |||
:done() | |||
end | |||
local function getItemIcon(iconName) | |||
if iconName == 'Gold Pieces' then | |||
return icons.GP() | |||
end | |||
return icons.Icon({iconName, type='item', notext=true}) | |||
end | |||
local function getSkillExpIcon(skillName, expValue) | |||
if expValue == nil then error("expValue is nil") end | |||
local icon = icons.Icon({skillName, type='skill', notext=true}) | |||
expValue = num.formatnum(expValue) | |||
return icon .. ' ' .. expValue | |||
end | |||
local function parseProfitMargin(minProfit, maxProfit) | |||
local min = tonumber(minProfit) | |||
local max = tonumber(maxProfit) | |||
if max == nil then | |||
error("maxProfit is not a valid number.") | |||
end | |||
local sb = StringBuilder:new() | |||
if min then | |||
sb :append(icons.GP(num.round2(min / 1000))) | |||
:append('k/hr Minimum ~ ') | |||
end | |||
sb :append(icons.GP(num.round2(max / 1000))) | |||
:append('k/hr Maximum') | |||
return sb:toString() | |||
end | end | ||
Line 59: | Line 115: | ||
end | end | ||
local pName = | local pName = formatItemName(args[numPrefix]) | ||
local pAmount = args[numPrefix .. AmountSuffix] | local pAmount = args[numPrefix .. AmountSuffix] | ||
local pValue = args[numPrefix .. ValueSuffix] | local pValue = args[numPrefix .. ValueSuffix] | ||
Line 78: | Line 134: | ||
local totAmt = pAmount or 0 | local totAmt = pAmount or 0 | ||
totalValue = totalValue + (totVal * totAmt) | totalValue = totalValue + (totVal * totAmt) | ||
table.insert(items, { | table.insert(items, { | ||
prmNumber = i, | prmNumber = i, | ||
Line 105: | Line 161: | ||
end | end | ||
local pSkill = | local pSkill = formatSkillName(args[skillPrefix]) | ||
local pExp = args[skillPrefix .. AmountSuffix] | local pExp = tonumber(args[skillPrefix .. AmountSuffix]) | ||
table.insert(skills, { | table.insert(skills, { | ||
prmNumber = i, | prmNumber = i, | ||
Line 118: | Line 170: | ||
end | end | ||
-- Return nil if there is no experience earned. | |||
-- Lets the parent table know to enter 'None' instead | |||
if #skills == 0 then | |||
return nil | |||
end | |||
return skills | return skills | ||
end | end | ||
Line 124: | Line 181: | ||
-- @param items (table) A table containing items | -- @param items (table) A table containing items | ||
-- @return (string) The HTML representation of the item table section. | -- @return (string) The HTML representation of the item table section. | ||
local function buildItemTable(items) | local function buildItemTable(itemSet) | ||
if itemSet == nil or itemSet.Items == nil or #itemSet.Items == 0 then | |||
return nil | |||
end | |||
-- Create table with header for items | |||
local tbl = mw.html.create('table') | |||
tbl:addClass('wikitable sortable text-align-center') | |||
:attr('style', 'font-size: 1em; width: calc(100% + 2px); margin: -1px') | |||
:tag('tr') | |||
:tag('th') | |||
:addClass('unsortable') | |||
:tag('th'):wikitext('Item') | |||
:tag('th'):wikitext('Quantity') | |||
:tag('th'):wikitext('Value') | |||
:done() | |||
-- Create individual rows for items | |||
for _, i in pairs(itemSet.Items) do | |||
local row = mw.html.create('tr') | |||
local imgCell = mw.html.create('td') | |||
:wikitext(getItemIcon(i.name)) | |||
:css('height', '28px') | |||
:done() | |||
local itemCell = mw.html.create('td') | |||
:css('text-align','left') | |||
:wikitext(string.format('[[%s]]', i.name)) | |||
:done() | |||
local qtyCell = mw.html.create('td') | |||
if i.amount == nil then | |||
qtyCell:node(getErrorDiv("Unable to parse quantity for item: " .. i.name)) | |||
else | |||
local qty = num.autoround(i.amount) | |||
qtyCell:wikitext(num.formatnum(qty)) | |||
end | |||
qtyCell:done() | |||
local valCell = mw.html.create('td') | |||
if i.value == nil then | |||
valCell:node(getErrorDiv("Unable to get value for item: " .. i.name)) | |||
else | |||
local tot = i.value * (i.amount or 0) | |||
valCell | |||
:css('text-align','right') | |||
:wikitext(icons.GP(num.round2(tot))) | |||
:attr("data-sort-value", tot) | |||
end | |||
valCell:done() | |||
-- Add all cells to row, and row to table. | |||
row:node(imgCell):node(itemCell):node(qtyCell):node(valCell):done() | |||
tbl:node(row) | |||
end | |||
return tbl:done() | |||
end | end | ||
Line 130: | Line 244: | ||
-- @param items (table) A table containing skills and experience values. | -- @param items (table) A table containing skills and experience values. | ||
-- @return (string) The HTML representation of the item table section. | -- @return (string) The HTML representation of the item table section. | ||
local function | local function buildExpLayout(skills) | ||
local layoutLines = {} | |||
for _, skillLine in pairs(skills) do | |||
local hasInvalidExp = false | |||
local span = nil | |||
if skillLine.exp == nil or skillLine.exp <= 0 then | |||
hasInvalidExp = true | |||
end | |||
local skillExp = num.round2(skillLine.exp or 0) | |||
local skillIcon = getSkillExpIcon(skillLine.name, skillExp) | |||
if hasInvalidExp then | |||
span = getErrorDiv("Skill in parameter " .. skillLine.prmNumber .. " has an invalid experience value.") | |||
else | |||
span = mw.html.create('div') | |||
:wikitext(skillIcon) | |||
:done() | |||
end | |||
table.insert(layoutLines, span) | |||
end | |||
return layoutLines | |||
end | end | ||
function p._buildMMGTable(args) | |||
if args['guideName'] == nil then | |||
error("Money Making Guide must have a valid guideName parameter.") | |||
end | |||
-- Parse arguments. | -- Parse arguments. | ||
local pSkills = parseExp(args) | local pSkills = parseExp(args) | ||
Line 139: | Line 281: | ||
local pOutputs = parseItemInOut(args, 'output') | local pOutputs = parseItemInOut(args, 'output') | ||
local dlcIcons = p.getDLCIcons(args['dlc'], ' ') | local dlcIcons = p.getDLCIcons(args['dlc'], ' ') | ||
local minProfit = args['minimumProfit'] | |||
local maxProfit = pOutputs.TotalValue - pInputs.TotalValue | |||
local tbl = mw.html.create() | local tbl = mw.html.create() | ||
Line 148: | Line 292: | ||
:tag("td") | :tag("td") | ||
:attr("colspan", 2) | :attr("colspan", 2) | ||
:css('font-weight', 'bold') | |||
:wikitext(table.concat(dlcIcons) .. ' ') | :wikitext(table.concat(dlcIcons) .. ' ') | ||
:wikitext(args['guideName']) | :wikitext(args['guideName'] or '{{{guideName}}}') | ||
:tag("tr") | |||
:tag("td") | |||
:attr("colspan", 2) | |||
:wikitext(parseProfitMargin(minProfit, maxProfit)) | |||
:tag("tr") | :tag("tr") | ||
:tag("th") | :tag("th") | ||
:attr("colspan", 2) | :attr("colspan", 2) | ||
:wikitext("Requirements") | :wikitext("Requirements") | ||
:tag( | :tag('tr') | ||
:tag( | :tag('th') | ||
:wikitext( | :wikitext('Skills') | ||
:tag( | :tag('th') | ||
:wikitext( | :wikitext('Other') | ||
:done() | |||
:tag("tr") | :tag("tr") | ||
:tag("td") | :tag("td") | ||
:addClass('mmg-no-list') | |||
:newline() | |||
:wikitext(paramtest.default_to(args['skills'], 'None')) | |||
:tag("td") | :tag("td") | ||
:addClass('mmg-no-list') | |||
:newline() | |||
:tag( | :wikitext(paramtest.default_to(args['other'], 'None')) | ||
:tag( | :tag('tr') | ||
:wikitext( | :tag('th') | ||
:tag( | :wikitext('Items') | ||
:tag( | :tag('th') | ||
:wikitext('Recommended') | |||
:tag('tr') | |||
:tag('td') | |||
:addClass('mmg-no-list') | |||
:newline() | |||
:wikitext(paramtest.default_to(args['items'], 'None')) | :wikitext(paramtest.default_to(args['items'], 'None')) | ||
:tag('td') | |||
:addClass('mmg-no-list') | |||
:newline() | |||
:wikitext(paramtest.default_to(args['recommended'], 'None')) | |||
:tag("tr") | :tag("tr") | ||
:tag("th") | :tag("th") | ||
Line 183: | Line 344: | ||
:tag("td") | :tag("td") | ||
if args['profit'] then | if args['profit'] then | ||
html:wikitext(icons.GP(args['profit'])) | html:wikitext(icons.GP(num.round2(args['profit']))) | ||
else | else | ||
html:wikitext(icons.GP( | html:wikitext(icons.GP(num.round2(maxProfit))) | ||
end | end | ||
html = html | html = html | ||
:done() | :done() | ||
:tag("td") | :tag("td") | ||
if pSkills ~= nil then | |||
for _, v in ipairs(buildExpLayout(pSkills)) do | |||
html:node(v) | |||
end | |||
else | |||
html:wikitext("None") | |||
end | |||
html = html | |||
:tag("tr") | :tag("tr") | ||
:tag("th") | :tag("th") | ||
:wikitext("Inputs") | :wikitext("Inputs") | ||
if pInputs.TotalValue ~= 0 then | |||
html:wikitext(" (" .. icons.GP(num.round2(pInputs.TotalValue)) .. ")") | |||
end | |||
html = html | |||
:tag("th") | :tag("th") | ||
:wikitext("Outputs") | :wikitext("Outputs") | ||
if pOutputs.TotalValue ~= 0 then | |||
html:wikitext(" (" .. icons.GP(num.round2(pOutputs.TotalValue)) .. ")") | |||
end | |||
html = html | |||
:tag("tr") | :tag("tr") | ||
:tag("td") | :tag("td") | ||
local inputsTable = buildItemTable(pInputs) | |||
if inputsTable ~= nil then | |||
html:css('padding', '0') | |||
:css('vertical-align', 'top') | |||
:node(inputsTable) | |||
else | |||
html:wikitext("None") | |||
end | |||
html = html | |||
:tag("td") | :tag("td") | ||
local outputsTable = buildItemTable(pOutputs) | |||
if outputsTable ~= nil then | |||
html:css('padding', '0') | |||
:css('vertical-align', 'top') | |||
:node(outputsTable) | |||
else | |||
html:wikitext("None") | |||
end | |||
html = html | |||
:done() | |||
:done() | |||
return tbl:done() | |||
:newline() | |||
end | |||
return | function p.buildMMGTable(frame) | ||
local args = frame:getParent().args | |||
return p._buildMMGTable(args) | |||
end | end | ||
Line 221: | Line 422: | ||
function p.main(frame) | function p.main(frame) | ||
error("Call a specific function rather than main.") | |||
end | end | ||
function p.test() | function p.test() | ||
local args = { | local args = { | ||
guideName = | guideName ='Mining Pure Crystal', | ||
category ='Non-combat', | |||
dlc ='aod, toth', | |||
skills =[[ | |||
*{{SkillReq|Mining|85}} | |||
*{{SkillReq|Herblore|53}}]], | |||
items =[=[ | |||
*{{ItemIcon|Mining Gloves}} | |||
*{{ItemIcon|Perfect Swing Potion IV}}]=], | |||
other =[=[ | |||
*{{ItemIcon|Pure Crystal|notext=true}}{{Icon|Mastery|notext=true}} Level 99 | |||
*{{UpgradeIcon|Dragon Pickaxe}} | |||
*[[Mining#Mastery Pool Checkpoints|95% Mining Mastery Pool Checkpoint]]]=], | |||
recommended =[=[ | |||
[[Money_Making/Mining_Pure_Crystal#Improves_GP_Rate|Bonusses that improve profit]]]=], | |||
} | } | ||
local t = p._buildMMGTable(args) | |||
mw.log(t) | |||
end | end | ||
-- function p.test() | |||
-- local args = { | |||
-- guideName = "", | |||
-- interval = "", | |||
-- skills = "", | |||
-- items = "", | |||
-- other = "", | |||
-- recommended = "", | |||
-- skillExp1 = "Maagic", | |||
-- skillExp1amount = "-1000", | |||
-- skillExp2 = "Mining", | |||
-- skillExp2amount = "420", | |||
-- input1 = "nature rune", | |||
-- input1amount = "5", | |||
-- input1value = "69", | |||
-- input2 = "Fire Rune", | |||
-- input2amount = "20", | |||
-- output1 = "gp", | |||
-- output1amount = "1050", | |||
-- category = "", | |||
-- dlc = "aod, toth", | |||
-- intensity = "", | |||
-- explanation = "" | |||
-- } | |||
-- | |||
-- mw.log(p._buildMMGTable(args)) | |||
-- end | |||
return p | return p |
edits