Module:ProfessionList: Difference between revisions
(p.unknown_value_edit_cell supports a list of pages, all of which will be linked) |
(in the case of co-op recipes that share a name with a non co-op recipe, the correct data will be preserved (within generate_recipe_table)) |
||
Line 155:
-- perform the full recipe tree search on the product
local fullRecipe = search.main(item.product)
-- overwrite any parameters from the original recipe with their counterparts from the full recipe▼
-- also search for the recipe and compare to the provided recipe
-- parameters which dont exist in the fullRecipe wont be overwritten,▼
--
local lastStepRecipe = search.getRecipe(item.product)
-- increase the full recice values by the difference
fullRecipe.xp = fullRecipe.xp and lastStepRecipe.xp and item.xp and fullRecipe.xp + (item.xp - lastStepRecipe.xp)
fullRecipe.kp = fullRecipe.kp and lastStepRecipe.kp and item.kp and fullRecipe.kp + (item.kp - lastStepRecipe.kp)
fullRecipe.duration = fullRecipe.duration and lastStepRecipe.duration and item.duration and fullRecipe.duration + (item.duration - lastStepRecipe.duration)
▲ -- otherwise overwrite any parameters from the original recipe with their counterparts from the full recipe
-- need to pre-nil the xp, kp, and duration so that if they are nil in the full recipe, they stay nil
item.xp = nil
item.kp = nil
Line 164 ⟶ 173:
item[key] = value
end
-- include the price of selling the product
local sell = search.getShopSellPrice(item.product)
|
Latest revision as of 17:28, 20 December 2024
This module is a helper module to be used by other modules; it may not designed to be invoked directly. See Brighter Shores:Lua/Helper modules for a full list and more information. For a full list of modules using this helper click here
Function | Type | Use |
---|---|---|
currency_cell(amount) | amount : number, or nil | Returns the HTML to create a table currency cell using module:currency._cell .If instead it is supplied with nil then a 10x1 cell is created with the text "unknown". |
unknown_value_cell(size) | size : integer | Returns the HTML to create a size x1 cell with the text "unknown".Use within :node() |
unknown_value_edit_cell(page,size) | page : string (or table of strings), names of pagessize : integer | Returns the HTML to create a size x1 cell with a link to edit the specified pages.Use within :node() |
generate_recipe_table(queryString) | queryString : string, SMW queryscreenFunction : function, table > boolean | Generates a table of recipes and activities from a Semantic MediaWiki query string and a screening function.
Module:RecipeTreeSearch |
one_column_image_text(materials) | materials : table, each entry is a name/quantity pair for an item to display | Produces 1x1 cell with multiple lines of text in a standard format to display a list of materials for a recipe. Includes the quantity of each material. |
two_column_image_text(sort,image,text,link) | sort : string, to sort the multicolumn cell by
link : string, page to link the image and text to | Produces 2 cells in a standard format to display an image and some text, which link to the same page. For example: the image and name of a skill node, but linking to the item they make. |
three_column_image_text(sort,quantity,image,text,link) | sort : string, to sort the multicolumn cell by
link : string, page to link the image and text to | Produces 3 cells in a standard format to display a quantity, an image, and some text, which link to the same page. For example: the quantity, image, and name of a recipe product. |
local currency = require('Module:Currency')
local search = require('Module:RecipeTreeSearch')
local p = {}
-- this module provides functions that are commonly used among all of the modules to greate tables of profession activities
-- such as AlchemistList, DetectivePassiveList, BlacksmithSmeltingList, and so on
-- creates the html directly for a currency cell of a table
-- will always be 10 cells wide, for currency alignment
-- if not supplied with an amount, displays "unknown"
-- use within :node()
function p.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
-- creates the html for an unknown value cell
-- use within :node()
function p.unknown_value_cell(N)
return mw.html.create('td')
:addClass('table-bg-gray')
:css{ ['text-align'] = 'center' }
:attr{ colspan = tostring(N) }
:wikitext("''unknown''")
:done()
end
-- creates the html for an unknown value cell, with a link to edit the page that has the unknown parameter
-- use within :node()
function p.unknown_value_edit_cell(page,N)
if type(page) == 'string' then
page = {page}
end
local textstring = ''
for _,p in ipairs(page) do
local url = tostring(mw.uri.fullUrl(p,'action=edit'))
local link = '['..url.." '''?''' (edit)]<br>"
textstring = textstring .. link
end
return mw.html.create('td')
:addClass('table-bg-gray')
:css{ ['text-align'] = 'center' }
:attr{ colspan = tostring(N) }
:wikitext(textstring)
:done()
end
-- generates a table of recipes and activities from a Semantic MediaWiki query string
-- the queryString is just a selection of pages, from any combination of SMW properties and categories
-- for pages with multiple recipes or activities, will make on entry into the results table for each
-- screenFunction takes a decoded recipe/activity JSON and returns true if it is to be kept
function p.generate_recipe_table(queryString,screenFunction)
-- first formulate the query to get the list of pages
local query = {
queryString,
'? #- = pageName',
'?Image #- = pageImage',
'?Activity JSON = activityJSON',
'?Recipe JSON = recipeJSON',
'limit = 500'
}
local pages = mw.smw.ask(query)
-- if no pages were found, skip the rest of this function
if pages == nil then
return nil
end
-- collate structure
local recipes = {}
-- iterate through pages found
for _, page in ipairs(pages) do
-- first iterate through activities
if page.activityJSON ~= nil then
if type(page.activityJSON)=='string' then
page.activityJSON = { page.activityJSON }
end
for _, JSON in ipairs(page.activityJSON) do
local item = mw.text.jsonDecode(JSON)
item.pageName = page.pageName
item.pageImage = page.pageImage
item.type = 'activity'
table.insert(recipes,item)
end
end
-- same iteration through recipes
if page.recipeJSON ~= nil then
if type(page.recipeJSON)=='string' then
page.recipeJSON = { page.recipeJSON }
end
for _, JSON in ipairs(page.recipeJSON) do
local item = mw.text.jsonDecode(JSON)
item.pageName = page.pageName
item.pageImage = page.pageImage
item.type = 'recipe'
table.insert(recipes,item)
end
end
end
-- if none of the pages had recipes of activities, skip the rest of this function
if recipes == nil or recipes[1] == nil then
return nil
end
-- output structure
local output = {}
-- screen using screenFunction
for _, item in ipairs(recipes) do
if screenFunction(item) then
table.insert(output,item)
end
end
-- if all of the results were screened, skip the rest of this function
if output == nil or output[1] == nil then
return nil
end
-- sort the output by the .level parameter
table.sort(output, function(item1, item2)
-- if one of the two has no leve
if (item1.level == nil) ~= (item2.level == nil) then
-- true if lvl2 is nil but not lvl1, false if lvl1 is nil but not lvl2
return item2.level == nil
end
if item1.level == nil then
-- if both are empty, treat as equivalent
return false
end
-- normal comparison
return item1.level < item2.level
end)
-- perform a number of useful calculations on the data that are widely useful
-- like cost of materials, profit of products, recipe tree search
for _,item in ipairs(output) do
item.product = item.output[1].name or ''
-- perform the full recipe tree search on the product
local fullRecipe = search.main(item.product)
-- also search for the recipe and compare to the provided recipe
-- in the case of co-op recipes the two will differ in xp, kp, and duration
local lastStepRecipe = search.getRecipe(item.product)
-- increase the full recice values by the difference
fullRecipe.xp = fullRecipe.xp and lastStepRecipe.xp and item.xp and fullRecipe.xp + (item.xp - lastStepRecipe.xp)
fullRecipe.kp = fullRecipe.kp and lastStepRecipe.kp and item.kp and fullRecipe.kp + (item.kp - lastStepRecipe.kp)
fullRecipe.duration = fullRecipe.duration and lastStepRecipe.duration and item.duration and fullRecipe.duration + (item.duration - lastStepRecipe.duration)
-- otherwise overwrite any parameters from the original recipe with their counterparts from the full recipe
-- parameters which dont exist in the fullRecipe wont be overwritten
-- need to pre-nil the xp, kp, and duration so that if they are nil in the full recipe, they stay nil
item.xp = nil
item.kp = nil
item.duration = nil
for key,value in pairs(fullRecipe) do
item[key] = value
end
-- include the price of selling the product
local sell = search.getShopSellPrice(item.product)
local qty = item.output[1].quantity
item.sellPrice = sell and qty and sell * qty
item.profit = item.buyPrice and item.sellPrice and item.sellPrice - item.buyPrice
item.profitPerXP = item.profit and item.xp and item.profit / item.xp
end
return output
end
function p.one_column_image_text(materials)
local materialCell = mw.html.create('td')
for _, mat in ipairs(materials) do
materialCell:wikitext(mat.quantity .. ' × [[File:' .. mat.name .. '.png|18px|link=' .. mat.name .. ']] [[' .. mat.name .. ']]<br>')
end
return materialCell
end
function p.two_column_image_text(sort,image,text,link)
return mw.html.create('td')
:css{ ['border-right'] = '0', ['text-align'] = 'right', ['max-width'] = '100px' }
:attr{ ['data-sort-value'] = sort }
:wikitext(' [[' .. image .. '|link=' .. link .. '|30x30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. link .. '|' .. text ..']]')
:done()
end
function p.three_column_image_text(sort,quantity,image,text,link)
return mw.html.create('td')
:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }
:attr{ ['data-sort-value'] = sort }
:wikitext(quantity .. ' ×')
:done()
:tag('td')
:addClass('plinkt-image no-border')
:css{ ['border-left'] = '0', ['padding-left'] = '0' }
:wikitext('[[' .. image .. '|link=' .. link .. '|30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. link .. '|' .. text .. ']]')
:done()
end
return p