Editing Module:Sandbox/User:Alsang
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
require('strict') |
require('strict') |
||
require('Module:Mw.html extension') |
require('Module:Mw.html extension') |
||
local |
local editbutton = require('Module:Edit button') |
||
local edit = editbutton("'''?''' (edit)") |
|||
local hc = require('Module:Param Parse').has_content |
|||
local yn = require('Module:Yesno') |
|||
local qty = require('Module:Quantity box')._main |
|||
local pcp = require('Module:Profession clickpic')._main |
|||
local currency = require('Module:Currency') |
local currency = require('Module:Currency') |
||
local album_xp_data = mw.loadData('Module:Experience/data').album |
|||
local lang = mw.getContentLanguage() |
|||
local lang = mw.language.getContentLanguage() |
|||
local xpdata = mw.loadData('Module:Experience/data') |
|||
local tooltip = require('Module:Tooltip') |
|||
local p = {} |
local p = {} |
||
function p.main(frame) |
|||
-- non dynamic module, no inputs |
|||
local args = frame:getParent().args |
|||
function p.main() |
|||
local albumxp = album_xp_data[tonumber(args.level)] |
|||
-- 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) |
|||
if albumxp then |
|||
return p.displayTable(results) |
|||
albumxp = lang:formatNum(albumxp)..' xp' |
|||
end |
|||
--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 = {} |
|||
--Checks if the recipe has been flagged as passive, defaults to no. |
|||
-- iterate through products |
|||
local passive = yn(args.passive or 'no', false) |
|||
for _, item in ipairs(results) do |
|||
local quant = 1 |
|||
if passive then |
|||
quant = 0.005 |
|||
end |
|||
-- if theres only one activity, wrap in table |
|||
local function exparg(xp) |
|||
if type(item.activityJSON)=='string' then |
|||
if hc(xp) then |
|||
item.activityJSON = { item.activityJSON } |
|||
return qty(xp) |
|||
else |
|||
return qty(0)..edit..'[[Category:Needs experience info]]' |
|||
end |
end |
||
end |
|||
for j,json in ipairs(item.activityJSON) do |
|||
local function levelarg(profession, level) |
|||
if hc(profession) and hc(level) then |
|||
local activityJSON = mw.text.jsonDecode(json) |
|||
return pcp(profession, level) |
|||
else |
|||
if activityJSON.duration and tonumber(activityJSON.duration)==20 then |
|||
return edit..'[[Category:Needs level info]]' |
|||
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 |
||
end |
end |
||
local function durationarg(duration) |
|||
-- sort the results by recipe level |
|||
if hc(duration) then |
|||
table.sort(resultsScreened, function(item1, item2) |
|||
return duration..' seconds' |
|||
local lvl1 = item1.lvl |
|||
else |
|||
local lvl2 = item2.lvl |
|||
return edit..'[[Category:Needs duration info]]' |
|||
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 |
end |
||
end |
|||
if lvl1 == nil then |
|||
return false -- Both empty, equivalent |
|||
local smw_properties = { |
|||
end |
|||
['Skill node name'] = args.name, |
|||
return lvl1 < lvl2 -- normal comparison |
|||
['Uses profession'] = args.profession, |
|||
end) |
|||
['Profession level'] = args.level, |
|||
['Activity XP'] = args.xp, |
|||
return resultsScreened |
|||
['Activity album XP'] = album_xp_data[tonumber(args.level)], |
|||
['Activity KP'] = args.kp, |
|||
end |
|||
['Activity duration'] = args.duration, |
|||
['Activity coins'] = args.coins, |
|||
-- make the table |
|||
['Activity input'] = args.input, |
|||
function p.displayTable(results) |
|||
['Activity container'] = args.container, |
|||
-- straight copy from Infobox Recipe, its good to have a standard format |
|||
['Activity JSON'] = mw.text.jsonEncode({ |
|||
xp = args.xp and tonumber(args.xp), |
|||
kp = args.kp and tonumber(args.kp), |
|||
duration = args.duration, |
|||
tool = args.tool, |
|||
materials = { |
|||
{ name = args.input, quantity = quant }, |
|||
{ name = args.container, quantity = quant }, |
|||
}, |
|||
profession = args.profession, |
|||
level = args.level and tonumber(args.level), |
|||
-- Make sure to update this when multiple outputs are supported |
|||
output = { |
|||
{ name = args.name, quantity = quant }, |
|||
} |
|||
}), |
|||
} |
|||
mw.smw.set(smw_properties) |
|||
local out = mw.html.create('table') |
local out = mw.html.create('table') |
||
:addClass('wikitable |
:addClass('wikitable') |
||
:tag('tr') |
:tag('tr') |
||
:tag('th') |
:tag('th') |
||
: |
:attr{ colspan = '2' } |
||
:wikitext(args.name) |
|||
:done() |
:done() |
||
:done() |
|||
:tag('tr') |
|||
:tag('th') |
:tag('th') |
||
:wikitext(' |
:wikitext('Level required') |
||
:done() |
:done() |
||
:tag(' |
:tag('td') |
||
:wikitext( |
:wikitext(levelarg(args.profession, args.level)) |
||
:done() |
:done() |
||
:done() |
|||
:tag('tr') |
|||
:tag('th') |
:tag('th') |
||
: |
:IF(passive) |
||
:wikitext('[[File:Passive small icon.png|20x20px|link=Passive Activity]] [['..args.profession..'|'..args.profession..' XP]] ') |
|||
:node(tooltip._span{ 'passive' }) |
|||
:node(tooltip._div{ name = 'passive', content = 'Passive activities give reduced experience when a players level is high enough to perform a new passive activity for that profession. The number shown here is the full experience.' }) |
|||
:ELSE() |
|||
:wikitext('[['..args.profession..'|'..args.profession..' XP]]') |
|||
:END() |
|||
:done() |
:done() |
||
:tag(' |
:tag('td') |
||
:wikitext( |
:wikitext(exparg(args.xp)) |
||
:done() |
:done() |
||
:done() |
|||
:tag('tr') |
|||
:tag('th') |
:tag('th') |
||
:wikitext(' |
:wikitext('[[Album|Album XP]]') |
||
:done() |
:done() |
||
:tag(' |
:tag('td') |
||
:wikitext( |
:wikitext(albumxp or 'Unknown') |
||
:done() |
:done() |
||
-- :tag('th') |
|||
-- :wikitext('Duration') |
|||
-- :done() |
|||
-- :tag('th') |
|||
-- :wikitext('XP/hr') |
|||
-- :done() |
|||
:done() |
:done() |
||
:tag('tr') |
|||
:tag('th') |
|||
for i, item in ipairs(results) do |
|||
:wikitext('Duration') |
|||
local row = out:tag('tr') |
|||
--level |
|||
:tag('td') |
|||
:wikitext(item.name) |
|||
:done() |
:done() |
||
:tag('td') |
:tag('td') |
||
:wikitext( |
:wikitext(durationarg(args.duration)) |
||
:done() |
:done() |
||
:done() |
|||
:wikitext('[[' .. item.profession .. ']]') |
|||
if hc(args.respawn) then |
|||
out |
|||
:tag('tr') |
|||
:tag('th') |
|||
:wikitext('Respawn time') |
|||
:done() |
|||
:tag('td') |
|||
:wikitext(durationarg(args.respawn)) |
|||
:done() |
|||
:done() |
:done() |
||
end |
|||
:tag('td') |
|||
:wikitext(item.lvl) |
|||
if hc(args.tool) then |
|||
out |
|||
:tag('tr') |
|||
:tag('th') |
|||
:wikitext('Required tool') |
|||
:done() |
|||
:tag('td') |
|||
:wikitext(args.tool) |
|||
:done() |
|||
:done() |
:done() |
||
end |
|||
:tag('td') |
|||
:wikitext(item.XP) |
|||
if hc(args.input) then |
|||
out |
|||
:tag('tr') |
|||
:tag('th') |
|||
:wikitext('Required input') |
|||
:done() |
|||
:tag('td') |
|||
:wikitext(args.input) |
|||
:done() |
|||
:done() |
:done() |
||
end |
|||
:tag('td') |
|||
:wikitext(item.fitXP) |
|||
if hc(args.container) then |
|||
out |
|||
:tag('tr') |
|||
:tag('th') |
|||
:wikitext('Required container') |
|||
:done() |
|||
:tag('td') |
|||
:wikitext(args.container) |
|||
:done() |
|||
:done() |
:done() |
||
end |
|||
:tag('td') |
|||
:wikitext(item.productSellPrice) |
|||
if hc(args.coins) then |
|||
out |
|||
:tag('tr') |
|||
:tag('th') |
|||
:wikitext('Coins') |
|||
:done() |
|||
:tag('td') |
|||
:wikitext(currency.parse(args.coins)) |
|||
:done() |
|||
:done() |
:done() |
||
-- :tag('td') |
|||
-- :wikitext(item.duration) |
|||
-- :done() |
|||
-- :tag('td') |
|||
-- :wikitext(item.XPperHour) |
|||
-- :done() |
|||
:done() |
|||
end |
end |
||
return out |
return out |
||
end |
end |