Module:CarpenterList: Difference between revisions

781 bytes removed ,  19 December 2024
offload much of the search, screen, and format functions to the new ProfessionList module, so they work the same for all table
m (ajust table headings)
(offload much of the search, screen, and format functions to the new ProfessionList module, so they work the same for all table)
Line 1:
require('strict')
require('Module:Mw.html extension')
local search = require('Module:RecipeTreeSearch')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local plist = require('Module:ProfessionList')
local rts = require('Module:RecipeTreeSearch')
 
local p = {}
Line 10 ⟶ 9:
-- non dynamic module, no inputs
function p.main()
-- returns only directly needed parameter needed for the row,
local queryString = '[[Category:Carpenter]] AND [[Category:Pages with recipes]]'
-- other parameters are determined by subqueries of chained pages
local query = {
local function screenFunction(item)
'[[-Sold item.Sold by::Timber Merchant Shop]]',
local product = (item.output and item.output[1] and item.output[1].name) or ''
'?Profession Level A = lvl',
return not (item.passive or string.find(product,'Post'))
'? #- = name',
end
'?Recipe JSON = recipeJSON',
'?Activity XP = finalXP',
local results = plist.generate_recipe_table(queryString,screenFunction)
'?Activity duration = duration',
'?Value = sell',
'sort = Profession Level A',
'limit = 500'
}
local results = mw.smw.ask(query)
 
results = p.formatResults(results)
Line 32 ⟶ 26:
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'
 
end
 
-- makes the html for the cells containing currency directly
-- Replaces nil with an "unknown" cell
local function currency_cell(amount)
if not amount then
return mw.html.create('td')
:addClass('table-bg-gray')
:css{ ['text-align'] = 'center' }
:attr{ colspan = '10' }
:wikitext("''unknown''")
:done()
end
return currency._cell(amount, { html = 'yes' })
end
 
-- do calculations and determine strings to go in cells
function p.formatResults(results)
 
--simple check for nil results
if results ==nil or results[1] == nil then
return nil
end
-- iterate through products
for _, item in ipairs(results) do
-- list of all pages to edit, if edit is needed
-- New module for recipe searching
local fullRecipeitem.allPageEdits = search.main({ item.name)pageName }
for _,intermediate in ipairs(item.intermediateMaterials) do
item.materials = fullRecipe.materials
table.insert(item.allPageEdits,intermediate.name)
item.outputQuantity = fullRecipe.output[1].quantity
end
item.buy = fullRecipe.buyPrice
item.XP = fullRecipe.xp
item.duration = fullRecipe.duration
-- poles will show as making 1 and using 0.5 log, which doesnt match the look of planks or staves
-- double them,
if item.namepageName and string.find(item.namepageName,'Pole') then
item.outputQuantityoutput[1].quantity = item.outputQuantityoutput and item.outputQuantityoutput[1] and item.output[1].quantity and item.output[1].quantity * 2
item.buybuyPrice = item.buybuyPrice and item.buybuyPrice * 2
item.XPsellPrice = item.XPsellPrice and item.XPsellPrice * 2
item.profit = item.profit and item.profit * 2
item.xp = item.xp and item.xp * 2
item.duration = item.duration and item.duration * 2
for j,jtem in ipairs(item.materials) do
jtem.quantity = jtem.quantity and jtem.quantity * 2
end
end
-- direct values
item.sell = item.sell and item.outputQuantity and item.sell * item.outputQuantity
item.profit = item.sell and item.buy and item.sell - item.buy
item.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100
 
-- profitability
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 products
item.profitPerXP = item.profit and item.xp and item.profit / item.xp
-- (without doubling up for poles, was assuming 6 logs to 12 poles per bach)
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions
local batchSize = 12
local downtime = 60
Line 88 ⟶ 70:
 
-- properties per hour
item.XPPerHourxpPerHour = item.XPxp and item.productPerHour and math.floor(item.XPxp * item.productPerHour)
item.profitPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour)
end
Line 97 ⟶ 79:
-- make the table
function p.displayTable(results)
--simple check for nil results
if results ==nil or results[1] == nil then
return 'No data found for table'
end
local out = mw.html.create('table')
:addClass('wikitable sortable')
Line 120 ⟶ 108:
:tag('th')
:attr{ colspan = '10' }
:wikitext('Profit<br>(per log)')
:done()
:tag('th')
Line 127 ⟶ 115:
:done()
:tag('th')
:wikitext('XP<br>(per log)')
:done()
:tag('th')
Line 137 ⟶ 125:
:done()
:done()
 
local unknown_value_cell = mw.html.create('td')
:addClass('table-bg-gray')
:css{ ['text-align'] = 'center' }
:wikitext("''unknown''")
 
for i, item in ipairs(results) do
local row = out:tag('tr')
:IF(item.lvl)
--level
:IF(item.level)
:tag('td')
:css{ ['text-align'] = 'center' }
:wikitext(item.lvllevel)
:done()
:ELSE()
:node(plist.unknown_value_edit_cell(item.pageName,1))
:node(unknown_value_cell)
:END()
-- recipe
:node(plist.three_column_image_text(item.product,item.output[1].quantity,'File:' .. item.product .. '.png',item.product,item.product))
-- materials
:IF(item.type=='recipe')
:node(plist.one_column_image_text(item.materials))
:node(plist.currency_cell(item.buyPrice))
:node(plist.currency_cell(item.sellPrice))
:ELSE()
:tag('td')
:addClass('table-na')
:css{ ['text-align'] = 'center' }
:attr{ colspan = '21' }
:wikitext('N/A')
:done()
:END()
:node(plist.currency_cell(item.profit))
:node(plist.currency_cell(item.profitPerHour))
 
:tag('td')-- XP
:IF(item.xp)
:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }
:attr{ ['data-sort-value'] = item.name }
:wikitext(item.outputQuantity .. ' &times;')
:done()
:tag('td')
:addClass('plinkt-image no-border')
:css{ ['border-left'] = '0', ['padding-left'] = '0' }
:wikitext('[[File:' .. item.name .. '.png|link=' .. item.name .. '|30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.name .. ']]')
:done()
 
local materialCell = row:tag('td')
 
for i, _ in ipairs(item.materials) do
materialCell:wikitext(item.materials[i].quantity .. '&times; [[File:' .. item.materials[i].name .. '.png|30px|link=' .. item.materials[i].name .. ']] [[' .. item.materials[i].name .. ']]<br>')
end
row
:node(currency_cell(item.buy))
:node(currency_cell(item.sell))
:node(currency_cell(item.profit))
:node(currency_cell(item.profitPerHour))
 
:IF(item.XP)
:tag('td')
:wikitext(item.XPxp and lang:formatNum(tonumber(item.XPxp)))
:done()
:ELSE()
:node(plist.unknown_value_edit_cell(item.allPageEdits,1))
:node(unknown_value_cell)
:END()
 
-- XP per hour
:IF(item.XPPerHour)
:IF(item.xpPerHour)
:tag('td')
:wikitext(item.XPPerHourxpPerHour and lang:formatNum(tonumber(item.XPPerHourxpPerHour)))
:done()
:ELSE()
:node(plist.unknown_value_cell(1))
:END()
 
-- XP per hour
:node(currency_cell(item.profitPerXP))
:node(plist.currency_cell(item.profitPerXP))
 
:done()
end
21,691

edits