Module:WoodcutterList: Difference between revisions

m
profit per xp not used
(correctly parses coop and solo activities separately)
m (profit per xp not used)
 
(One intermediate revision by the same user not shown)
Line 1:
require('strict')
require('Module:Mw.html extension')
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:
function p.main()
local queryString = '[[Category:Woodcutter]] AND [[Category:Pages with activities]]'
-- returns only directly needed parameter needed for the row,
-- other parameters are determined by subqueries of chained pages
local queryfunction = {screenFunction(item)
return not item.passive
'[[Variant of::~*Tree||Brambles]]',
end
'?Variant of #- = variant',
'?Profession Level A = lvl',
local results = plist.generate_recipe_table(queryString,screenFunction)
'? #- = name',
'?Image #- = Image',
'?Activity XP = XP',
'?Activity duration = duration',
'?Activity coins = coins',
'?Skill node name = product',
'?Activity input #- = material',
'?Activity JSON = activityJSON',
'sort = Profession Level A',
'limit = 500'
}
local results = mw.smw.ask(query)
results = p.screenResults(results)
 
results = p.formatResults(results)
 
Line 40 ⟶ 27:
end
 
-- do calculations and determine strings to go in cells
-- makes the html for the cells containing currency directly
function p.formatResults(results)
-- 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
 
-- goes through a list of results and culls the ones which are not needed for this table
function p.screenResults(results)
local resultsScreened = {}
--simple check for nil results
-- iterate through products
forif _, itemresults==nil inor ipairs(results)[1]==nil dothen
return nil
-- if theres only one activity, wrap in table
if type(item.activityJSON)=='string' then
item.activityJSON = { item.activityJSON }
end
if item.activityJSON ~= nil then -- TEMPORARY LINE WHILE PAGES DONT ALL HAVE PROFESSION INFO
for j,json in ipairs(item.activityJSON) do
if string.find(json,'Log') or string.find(json,'Brambles') then
local itemNew = {}
itemNew.name = item.name
itemNew.Image = item.Image
local activityJSON = mw.text.jsonDecode(json)
itemNew.XP = activityJSON.xp
itemNew.lvl = activityJSON.level
itemNew.coop = activityJSON.coop
itemNew.duration = activityJSON.duration and tonumber(activityJSON.duration)
itemNew.product = activityJSON.output[1].name
table.insert(resultsScreened,itemNew)
end
end
end
end
-- sort the results by recipe level
table.sort(resultsScreened, function(item1, item2)
local lvl1 = item1.lvl
local lvl2 = item2.lvl
if (lvl1 == nil) ~= (lvl2 == nil) then --one of two are empty
return lvl2 == nil -- true if lvl2 is nil but not lvl1, false if lvl1 is nil but not lvl2
end
if lvl1 == nil then
return false -- Both empty, equivalent
end
return lvl1 < lvl2 -- normal comparison
end)
 
return resultsScreened
 
end
 
-- do calculations and determine strings to go in cells
function p.formatResults(results)
-- iterate through products
for _, item in ipairs(results) do
 
--catch badly submitted data
item.material = item.material or ''
item.product = item.product or ''
-- price of resource
-- query is: there is a shop object page that has this item AND has buy price cannot be "N/A"
local query = mw.smw.ask('[[Sold item::' .. item.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
if type(query)=='table' then
-- price is returned as a number
item.profit = tonumber(query[1].data) or 0
else
-- will return nil if the item is not in a shop, or if it is in a shop but can only be sold to the shop
item.profit = nil
end
-- detect brambles
item.isBrambleshideCells = string.find(item.namepageName,'Brambles')
-- profitability
item.profitPerXPprofit = item.profit and item.XP and item.profit / item.XPsellPrice
-- DOWNTIME VERY IMPORTANT FOR GATHERING TYPE PROFESSIONS
Line 138 ⟶ 50:
 
-- 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 147 ⟶ 59:
-- 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 179 ⟶ 97:
: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
Line 189 ⟶ 102:
--level
:IF(item.lvllevel)
: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()
-- gathering node
:node(plist.two_column_image_text(item.pageName,item.pageImage,item.pageName,item.pageName))
:tag('td')
 
:css{ ['border-right'] = '0', ['text-align'] = 'right', ['max-width'] = '100px' }
:attr{ ['data-sort-value'] = item.name }
:wikitext(' [[' .. item.Image .. '|link=' .. item.name .. '|30x30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.name .. '|' .. item.name ..']]')
:done()
-- resource
:IF(item.isBrambleshideCells)
:tag('td')
:addClass('table-na')
Line 217 ⟶ 122:
:done()
:ELSE()
:tagIF('td'item.coop)
:node(plist.two_column_image_text(item.product,'File:' .. item.product .. '.png',item.product .. ' (co-op)',item.product))
:css{ ['border-right'] = '0', ['text-align'] = 'right', ['max-width'] = '100px' }
:ELSE()
:attr{ ['data-sort-value'] = item.product }
:wikitextnode(plist.two_column_image_text(item.product,'[[File:' .. item.product .. '.png|link=' ,item.. product,item.product .. '|30x30px]]'))
:doneEND()
 
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.product .. ']]')
:IF(item.coop)
:wikitext(' (Co-op)')
:END()
:done()
-- resource/hr
:IF(item.productPerHour)
Line 236 ⟶ 134:
:done()
:ELSE()
:node(unknown_value_cellplist.unknown_value_edit_cell(item.pageName,1))
:END()
-- economics
:node(plist.currency_cell(item.profit))
:node(plist.currency_cell(item.profitPerHour))
:END()
 
-- XP
:IF(item.XPxp)
:tag('td')
:wikitext(item.XPxp and lang:formatNum(tonumber(item.XPxp)))
:done()
:ELSE()
:node(plist.unknown_value_edit_cell(item.pageName,1))
:node(unknown_value_cell)
:END()
-- XP per hour
:IF(item.XPPerHourxpPerHour)
:tag('td')
:wikitext(item.XPPerHourxpPerHour and lang:formatNum(tonumber(item.XPPerHourxpPerHour)))
:done()
:ELSE()
:node(plist.unknown_value_cell(1))
:END()
 
11,291

edits