Module:Sandbox/User:Alsang: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 4: Line 4:
local currency = require('Module:Currency')
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local lang = mw.getContentLanguage()
local xpdata = mw.loadData('Module:Experience/data')


local p = {}
local p = {}
Line 13: Line 14:
-- other parameters are determined by subqueries of chained pages
-- other parameters are determined by subqueries of chained pages
local query = {
local query = {
'[[Activity JSON::~*]]',
'[[Rotten Tree Stump||Rotting Log (Hopeport)||Rock Pool||Scrap Metal Bin]]',
'? = name',
'?Activity JSON = activityJSON',
'?Activity JSON = activityJSON',
'?#- = name',
'limit = 1500'
'limit = 500'
}
}
local results = mw.smw.ask(query)
local results = mw.smw.ask(query)
results = p.screenResults(results)
results = p.screenResults(results)

results = p.formatResults(results)


return p.displayTable(results)
return p.displayTable(results)
Line 29: Line 28:
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'
--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
end


Line 59: Line 44:
for j,json in ipairs(item.activityJSON) do
for j,json in ipairs(item.activityJSON) do
local activityJSON = mw.text.jsonDecode(json)
-- if string.find(json,'Branches') or string.find(json,'Split') then
local activityJSON = mw.text.jsonDecode(json)
if activityJSON.duration and tonumber(activityJSON.duration)==20 then
local itemNew = {}
local itemNew = {}
itemNew.name = item.name
itemNew.name = item.name
itemNew.XP = activityJSON.xp
itemNew.XP = activityJSON.xp
itemNew.lvl = activityJSON.level
itemNew.lvl = activityJSON.level
itemNew.duration = activityJSON.duration and tonumber(activityJSON.duration)
itemNew.profession = activityJSON.profession
itemNew.duration = activityJSON.duration
itemNew.product = activityJSON.output[1].name
itemNew.product = activityJSON.output[1].name
itemNew.activityJSON = json
itemNew.XPperHour = itemNew.XP and tonumber(itemNew.XP) and itemNew.duration and tonumber(itemNew.duration) and tonumber(itemNew.XP) * 3600 / tonumber(itemNew.duration)
itemNew.fitXP = xpdata.knowledge[itemNew.lvl]*4*0.0005
if itemNew.lvl>=200 then
itemNew.fitXP = itemNew.fitXP * 4
end
itemNew.fitXP = math.floor(itemNew.fitXP * 100 ) / 100
local query = mw.smw.ask('[[Sold item::' .. itemNew.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
if type(query)=='table' then
-- price is returned as a number
itemNew.productSellPrice = tonumber(query[1].data)*0.005
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
itemNew.productSellPrice = nil
end
table.insert(resultsScreened,itemNew)
table.insert(resultsScreened,itemNew)
-- end
end
end
end
end
end
Line 89: Line 92:
return resultsScreened
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
item.givesCoins = string.find(item.product,'Split')

-- profit from selling the items
if not item.givesCoins then
-- protection against missing parameters
item.product = item.product or ''
-- 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.coins = tonumber(query[1].data)*0.005 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.coins = 0
end
end
-- no downtime for passives
item.productPerHour = item.duration and 1 / item.duration * 3600

-- properties per hour
item.XPPerHour = item.XP and item.productPerHour and math.floor(item.XP * item.productPerHour)
item.coinsPerHour = item.coins and item.productPerHour and math.floor(item.coins * item.productPerHour)
end

return results
end
end


Line 134: Line 100:
:tag('tr')
:tag('tr')
:tag('th')
:tag('th')
:wikitext('[[File:Forager small icon.png|15px]] Level')
:wikitext('Page')
:done()
:done()
:tag('th')
:tag('th')
:attr{ colspan = '2' }
:wikitext('Forager node')
:done()
:tag('th')
:attr{ colspan = '3' }
:wikitext('Product')
:wikitext('Product')
:done()
:done()
:tag('th')
:tag('th')
:wikitext('Quantity/hr')
:wikitext('Profession')
:done()
:done()
:tag('th')
:tag('th')
:attr{ colspan = '10' }
:wikitext('Level')
:wikitext('Profit/hr')
:done()
:done()
:tag('th')
:tag('th')
Line 155: Line 115:
:done()
:done()
:tag('th')
:tag('th')
:wikitext('XP/hr')
:wikitext('0.0005 of levelup XP')
:done()
:done()
:tag('th')
:wikitext('sell price<br>per action')
:done()
-- :tag('th')
-- :wikitext('Duration')
-- :done()
-- :tag('th')
-- :wikitext('XP/hr')
-- :done()
: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
for i, item in ipairs(results) do
Line 168: Line 132:
--level
--level
:IF(item.lvl)
:tag('td')
:css{ ['text-align'] = 'center' }
:wikitext(item.lvl)
:done()
:ELSE()
:node(unknown_value_cell)
:END()
-- activity
:tag('td')
:tag('td')
:wikitext(item.name)
:css{ ['border-right'] = '0', ['text-align'] = 'right', ['max-width'] = '100px' }
:attr{ ['data-sort-value'] = item.name }
:wikitext(' [[File:' .. item.name .. '.png|link=' .. item.name .. '|30x30px]]')
:done()
:done()
:tag('td')
:tag('td')
:wikitext('[[' .. item.product .. ']]')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.name .. ']]')
:done()
:done()

:tag('td')
:tag('td')
:wikitext('[[' .. item.profession .. ']]')
:css{ ['border-right'] = '0', ['text-align'] = 'right' }
:attr{ ['data-sort-value'] = item.product }
:wikitext('0.005 &times; ')
:done()
:done()
:tag('td')
:tag('td')
:wikitext(item.lvl)
:css{ ['border-right'] = '0', ['text-align'] = 'center', ['max-width'] = '100px' }
:addClass('plinkt-link no-border')
:wikitext('[[File:' .. item.product .. '.png|link=' .. item.product .. '|30x30px]]')
:done()
:done()
:tag('td')
:tag('td')
:wikitext(item.XP)
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.product .. ']]')
:done()
:done()

-- products per hour (items)
:tag('td')
:tag('td')
:wikitext(item.fitXP)
:css{ ['text-align'] = 'right' }
:wikitext('0.9 &times; [[File:' .. item.product .. '.png|link=' .. item.product .. '|30x30px]]')
:done()
:done()
:tag('td')

:wikitext(item.productSellPrice)
-- profit per hour (coins)
:done()
:node(currency_cell(item.coinsPerHour))
-- :tag('td')

-- :wikitext(item.duration)
-- XP
:IF(item.XP)
-- :done()
:tag('td')
-- :tag('td')
:wikitext(item.XP and lang:formatNum(tonumber(item.XP)))
-- :wikitext(item.XPperHour)
:done()
-- :done()
:ELSE()
:node(unknown_value_cell)
:END()
-- XP per hour
:IF(item.XPPerHour)
:tag('td')
:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour)))
:done()
:ELSE()
:node(unknown_value_cell)
:END()


:done()
:done()

Latest revision as of 00:51, 18 December 2024

Module documentation
This documentation is transcluded from Module:Sandbox/User:Alsang/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Sandbox/User:Alsang/doc. [edit]
Module:Sandbox/User:Alsang's function main is invoked by Template:Sandbox/User:Alsang.
Module:Sandbox/User:Alsang requires Module:Currency.
Module:Sandbox/User:Alsang requires Module:Mw.html extension.
Module:Sandbox/User:Alsang requires Module:Paramtest.
Module:Sandbox/User:Alsang requires strict.
Module:Sandbox/User:Alsang loads data from Module:Experience/data.

require('strict')
require('Module:Mw.html extension')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local xpdata = mw.loadData('Module:Experience/data')

local p = {}

-- non dynamic module, no inputs
function p.main()
	
	-- returns only directly needed parameter needed for the row,
	-- other parameters are determined by subqueries of chained pages
	local query = {
		'[[Activity JSON::~*]]',
		'? = name',
		'?Activity JSON = activityJSON',
		'limit = 1500'
	}
	local results = mw.smw.ask(query)
	
	results = p.screenResults(results)

	return p.displayTable(results)
	
	--for debugging
	--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'

end

-- goes through a list of results and culls the ones which are not needed for this table
function p.screenResults(results)
	local resultsScreened = {}
	
	-- iterate through products
	for _, item in ipairs(results) do
		
		-- if theres only one activity, wrap in table
		if type(item.activityJSON)=='string' then
			item.activityJSON = { item.activityJSON }
		end
		
		for j,json in ipairs(item.activityJSON) do
		
			local activityJSON = mw.text.jsonDecode(json)
			
			if activityJSON.duration and tonumber(activityJSON.duration)==20 then
				local itemNew = {}
				itemNew.name = item.name
				itemNew.XP = activityJSON.xp
				itemNew.lvl = activityJSON.level
				itemNew.profession = activityJSON.profession
				itemNew.duration = activityJSON.duration
				itemNew.product = activityJSON.output[1].name
				
				itemNew.XPperHour = itemNew.XP and tonumber(itemNew.XP) and itemNew.duration and tonumber(itemNew.duration) and tonumber(itemNew.XP) * 3600 / tonumber(itemNew.duration)
				
				itemNew.fitXP = xpdata.knowledge[itemNew.lvl]*4*0.0005
				if itemNew.lvl>=200 then
					itemNew.fitXP = itemNew.fitXP * 4
				end
				itemNew.fitXP = math.floor(itemNew.fitXP * 100 ) / 100
				
				local query = mw.smw.ask('[[Sold item::' .. itemNew.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
					if type(query)=='table' then
					-- price is returned as a number
					itemNew.productSellPrice = tonumber(query[1].data)*0.005
				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
					itemNew.productSellPrice = nil
				end
				
				table.insert(resultsScreened,itemNew)
			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

-- make the table
function p.displayTable(results)
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('Page')
			:done()
			:tag('th')
				:wikitext('Product')
			:done()
			:tag('th')
				:wikitext('Profession')
			:done()
			:tag('th')
				:wikitext('Level')
			:done()
			:tag('th')
				:wikitext('XP')
			:done()
			:tag('th')
				:wikitext('0.0005 of levelup XP')
			:done()
			:tag('th')
				:wikitext('sell price<br>per action')
			:done()
--			:tag('th')
--				:wikitext('Duration')
--			:done()
--			:tag('th')
--				:wikitext('XP/hr')
--			:done()
		:done()

	for i, item in ipairs(results) do
		local row = out:tag('tr')
		
			--level
			:tag('td')
				:wikitext(item.name)
			:done()
			:tag('td')
				:wikitext('[[' .. item.product .. ']]')
			:done()
			:tag('td')
				:wikitext('[[' .. item.profession .. ']]')
			:done()
			:tag('td')
				:wikitext(item.lvl)
			:done()
			:tag('td')
				:wikitext(item.XP)
			:done()
			:tag('td')
				:wikitext(item.fitXP)
			:done()
			:tag('td')
				:wikitext(item.productSellPrice)
			:done()
--			:tag('td')
--				:wikitext(item.duration)
--			:done()
--			:tag('td')
--				:wikitext(item.XPperHour)
--			:done()

		:done()
	end

	return out
end

return p