Module:Sandbox/User:Alsang: Difference between revisions

no edit summary
No edit summary
No edit summary
(18 intermediate revisions by the same user not shown)
Line 1:
require('strict')
p = {}
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,
local weaponsStone = {
-- other parameters are determined by subqueries of chained pages
'Hammerfist',
local query = {
'Throwing Stones',
'Stone[[Activity Slab ShieldJSON::~*]]',
'Stone? Mace= name',
'?Activity JSON = activityJSON',
'Stone Discs',
'Warlimit Hammer= 1500',
}
'Bolas',
local results = mw.smw.ask(query)
'Stone Chunk Shield',
'Double Headed Hammer',
'Throwing Clubs',
'Great Stone Mace',
' Polished Stone Shield',
'Throwing Hammers',
'Great Hammer',
'Sling'}
local weaponsMetal = {
'Rapier ',
'Throwing Twinblades',
'Metal Kite Shield',
'Flanged Mace',
'Throwing Rings',
'Shortsword',
'Metal Javelins',
'Metal Heater Shield',
'Longsword',
'Throwing Knives',
'Broadsword',
'Metal Buckler',
'Throwing Axes',
'Battleaxe',
'Metal Bow'}
local weaponsBone = {
'Truncheon',
'Blowpipe',
'Wooden Round Shield',
'Cudgel',
'Javelins',
'Club',
'Light Crossbow',
'Wooden Square Shield',
'Quarterstaff',
'Recurve Bow',
'Spear',
'Wooden Hexagon Shield',
'Longbow',
'Poleaxe',
'Heavy Crossbow'}
results = p.screenResults(results)
local out = mw.html.create('table')
 
:addClass('wikitable sortable')
return p.displayTable(results)
:tag('tr')
:tag('th')
:wikitext('Stone')
:done()
:tag('th')
:wikitext('Metal')
:done()
:tag('th')
:wikitext('Bone')
:done()
:done()
for i,item in ipairs(weaponsStone) do
local row = out:tag('tr')
:tag('td')
:wikitext('[[' .. weaponsStone[i] .. ']]')
:done()
:tag('td')
:wikitext('[[' .. weaponsMetal[i] .. ']]')
:done()
:tag('td')
:wikitext('[[' .. weaponsBone[i] .. ']]')
:done()
:done()
end
return out
--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.intermediates()
function p.screenResults(results)
local resultsScreened = {}
-- iterate through products
local allRecipes = mw.smw.ask('[[Recipe JSON::~*]]|? #- = name|?Uses facility = facility|?-Sold item.Sold by #- = seller|?Variant of = variant|limit=1200')
for _, item in ipairs(results) do
local allFacilities = {'Standard Potion Station',
'Potent Potion Station',
'Passive Potion Station',
'Workbench',
'One Handed Ranged Workbench (stonemason)',
'One Handed Melee Workbench (stonemason)',
'Two Handed Ranged Workbench (stonemason)',
'Two Handed Melee Workbench (stonemason)',
'Shield Work Rock',
'Stoneware Bench',
'One Handed Ranged Workbench (bonewright)',
'One Handed Melee Workbench (bonewright)',
'Two Handed Ranged Workbench (bonewright)',
'Two Handed Melee Workbench (bonewright)',
'Shield Vice',
'Knickknacks Workbench',
'Bone Grinder',
'Goblin Forge',
'Gnome Forge',
'Jewelry Bench'}
local allShops = {'Head Chef (shop)','Timber Merchant Shop','Leather stall','Leather Goods','Waiter'}
local intermediateRecipes = {}
for _,item in ipairs(allRecipes) do
intermediate = true
-- if theres only one activity, wrap in table
-- check facility
if type(item.activityJSON)=='string' then
for _,facility in ipairs(allFacilities) do
item.activityJSON = { item.activityJSON }
if item.facility==facility then
end
intermediate = false
end
for j,json in ipairs(item.activityJSON) do
-- check shops
for _,shop in ipairs(allShops) do
local activityJSON = mw.text.jsonDecode(json)
if item.seller==shop then
intermediate = false
if activityJSON.duration and tonumber(activityJSON.duration)==20 then
end
local itemNew = {}
if type(item.seller)=='table' then
foritemNew.name _,seller= in ipairs(item.seller) doname
itemNew.XP = activityJSON.xp
if seller==shop then
itemNew.lvl = activityJSON.level
intermediate = false
itemNew.profession = activityJSON.profession
end
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
if intermediate then
table.insert(intermediateRecipes,item)
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')
Line 151 ⟶ 103:
:done()
:tag('th')
:wikitext('VariantProduct')
: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
for i,item in ipairs(intermediateRecipes) do
local row = out:tag('trtd')
:tagwikitext('td'item.name)
:wikitext('[[' .. item.name .. ']]')
:done()
:tag('td')
:wikitext(item.variant)
:done()
:done()
:tag('td')
end
: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
 
19,555

edits