Module:EncounterTable: Difference between revisions
Jump to navigation
Jump to search
(process args attempt) |
(reformatted chance to be a percent) |
||
Line 95: | Line 95: | ||
finalTable[i]['weight'] = row['weight'] | finalTable[i]['weight'] = row['weight'] | ||
-- calculate final chance | -- calculate final chance | ||
finalTable[i]['chance'] = row['weight']/totalWeight | finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight) | ||
end | end | ||
return (p.formatTable(finalTable)) | return (p.formatTable(finalTable)) |
Revision as of 19:19, 12 November 2019
local p = {}
local process_args = require('Module:ProcessArgs')
--a lot taken from lol gamepedia
function p.gsplit( text, pattern, plain )
if not pattern then pattern = '%s*,%s*' end
local s, l = 1, text:len()
return function ()
if s then
local e, n = text:find( pattern, s, plain )
local ret
if not e then
ret = text:sub( s )
s = nil
elseif n < e then
-- Empty separator!
ret = text:sub( s, e )
if e < l then
s = e + 1
else
s = nil
end
else
ret = e > s and text:sub( s, e - 1 ) or ''
s = n + 1
end
return ret
end
end, nil, nil
end
function p.split(text, pattern, plain)
if not text then
return {}
end
local ret = {}
for m in p.gsplit(text, pattern, plain) do
ret[#ret+1] = m
end
return ret
end
function p.splitArgs(input, fieldlist, sep)
if not input or input == '' then return end
sep = sep or '%s*;;;%s*'
local result = {}
local inputTbl = p.split(input,sep)
for i, v in ipairs(fieldlist) do
if not inputTbl[i] then
error(('Missing parameter %s - maybe wrong child template?'):format(v))
end
if inputTbl[i] ~= '' then
result[v] = inputTbl[i]
end
end
return result
end
function p.splitEncounterTableArgs(row)
local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' }
return p.splitArgs(row, TABLE_ARGS)
end
function p.start(frame)
args = process_args.merge(true)
local tblName = args['name'] or ''
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
finalTable[i]['item'] = 'Item from [[EncounterTable:' .. row['table'] .. '|' .. 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
finalTable[i]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
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">' .. tblheader .. tr .. '</table>'
end
return p