Module:EncounterTable: Difference between revisions
Jump to navigation
Jump to search
(tables are sortable now) |
(new option: roll which can be "once" (default, calculates weights against all) or "each" (weight/100)) |
||
Line 10: | Line 10: | ||
function p.start(frame) | function p.start(frame) | ||
args = process_args.merge(true) | |||
local tblName = args['name'] or '' | |||
local pick = args['roll'] or 'each' | |||
local result = {} | |||
local totalWeight = 0 | |||
for i, row in ipairs(args) do | |||
local newrow = p.splitEncounterTableArgs(row) | |||
result[i] = newrow | |||
totalWeight = totalWeight + tonumber(newrow['weight']) | |||
end | |||
--format table. | --format table. | ||
local finalTable = {} | |||
local str = '' | |||
for i, row in ipairs(result) do | |||
finalTable[i]={} | |||
if row["table"] == 'none' then | |||
if row["item"] == 'none' then | |||
error('A table or item must be specified!') | |||
else | |||
finalTable[i]['item'] = '[[' .. row['item'] .. ']]' | |||
end | |||
elseif row["item"] == 'none' then | |||
linkstr = "" | |||
maintable = row['table']:match('^(.+)%s+%w*$') | |||
if maintable ~= nil and maintable ~= '' then | |||
linkstr = maintable .. '#' .. row['table'] | |||
else | |||
linkstr = row['table'] | |||
end | |||
finalTable[i]['item'] = 'Item from [[Data:' .. linkstr .. '|' .. row['table'] .. ']]' | |||
else | |||
error('A table and item cannot be specified at the same time!') | |||
end | |||
-- dice tooltip quantity | -- dice tooltip quantity | ||
finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}} | |||
--finalTable[i]['quantity'] = row['quantity'] | --finalTable[i]['quantity'] = row['quantity'] | ||
finalTable[i]['weight'] = row['weight'] | |||
-- calculate final chance | -- calculate final chance | ||
if pick == 'once' then | |||
finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight) | |||
elseif pick == 'each' then | |||
finalTable[i]['chance'] = string.format("%.2f%%",row['weight']/100) | |||
else | |||
error('"roll" parameter takes only "once" or "each"!') | |||
end | |||
end | |||
return (p.formatTable(finalTable)) | |||
end | end | ||
function p.formatTable(final) | function p.formatTable(final) | ||
local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>' | |||
local tr = '' | |||
for _, v in ipairs(final) do | |||
tr = tr .. ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>' | tr = tr .. ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>' | ||
end | |||
return '<table class="wikitable sortable">' .. tblheader .. tr .. '</table>' | return '<table class="wikitable sortable">' .. tblheader .. tr .. '</table>' | ||
end | end | ||
return p | return p |
Revision as of 01:43, 26 April 2020
local p = {}
local process_args = require('Module:ProcessArgs')
local text_util = require('Module:Text Utility')
function p.splitEncounterTableArgs(row)
local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' }
return text_util.splitArgs(row, TABLE_ARGS)
end
function p.start(frame)
args = process_args.merge(true)
local tblName = args['name'] or ''
local pick = args['roll'] or 'each'
local result = {}
local totalWeight = 0
for i, row in ipairs(args) do
local newrow = p.splitEncounterTableArgs(row)
result[i] = newrow
totalWeight = totalWeight + tonumber(newrow['weight'])
end
--format table.
local finalTable = {}
local str = ''
for i, row in ipairs(result) do
finalTable[i]={}
if row["table"] == 'none' then
if row["item"] == 'none' then
error('A table or item must be specified!')
else
finalTable[i]['item'] = '[[' .. row['item'] .. ']]'
end
elseif row["item"] == 'none' then
linkstr = ""
maintable = row['table']:match('^(.+)%s+%w*$')
if maintable ~= nil and maintable ~= '' then
linkstr = maintable .. '#' .. row['table']
else
linkstr = row['table']
end
finalTable[i]['item'] = 'Item from [[Data:' .. linkstr .. '|' .. row['table'] .. ']]'
else
error('A table and item cannot be specified at the same time!')
end
-- dice tooltip quantity
finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}}
--finalTable[i]['quantity'] = row['quantity']
finalTable[i]['weight'] = row['weight']
-- calculate final chance
if pick == 'once' then
finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
elseif pick == 'each' then
finalTable[i]['chance'] = string.format("%.2f%%",row['weight']/100)
else
error('"roll" parameter takes only "once" or "each"!')
end
end
return (p.formatTable(finalTable))
end
function p.formatTable(final)
local tblheader = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
local tr = ''
for _, v in ipairs(final) do
tr = tr .. ' <tr><td>' .. v['item'] .. '</td><td>' .. v['quantity'] .. '</td><td>' .. v['weight'] .. '</td><td>' .. v['chance'] .. '</td></tr>'
end
return '<table class="wikitable sortable">' .. tblheader .. tr .. '</table>'
end
return p