Module:EncounterTable: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
m (quick reformat pass) |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local process_args = require | local process_args = require'Module:ProcessArgs' | ||
local text_util = require | local text_util = require'Module:Text Utility' | ||
function p.splitEncounterTableArgs(row) | function p.splitEncounterTableArgs(row) | ||
local TABLE_ARGS = { 'table', 'item', 'quantity', 'weight' } | local TABLE_ARGS = {'table', 'item', 'quantity', 'weight'} | ||
return text_util.splitArgs(row, TABLE_ARGS) | return text_util.splitArgs(row, TABLE_ARGS) | ||
end | end | ||
Line 10: | Line 10: | ||
function p.start(frame) | function p.start(frame) | ||
args = process_args.merge(true) | local args = process_args.merge(true) | ||
local tblName = args | local tblName = args.name or '' | ||
local pick = args | local pick = args.roll or 'once' | ||
local result = {} | local result = {} | ||
local totalWeight = 0 | local totalWeight = 0 | ||
for i, row in ipairs(args) do | for i, row in ipairs(args) do | ||
local newrow = p.splitEncounterTableArgs(row) | local newrow = p.splitEncounterTableArgs(row) | ||
result[i] = newrow | result[i] = newrow | ||
totalWeight = totalWeight + tonumber(newrow | totalWeight = totalWeight + tonumber(newrow.weight) | ||
end | end | ||
--format table. | -- format table. | ||
local finalTable = {} | local finalTable = {} | ||
local str = '' | local str = '' | ||
for i, row in ipairs(result) do | for i, row in ipairs(result) do | ||
finalTable[i]={} | finalTable[i] = {} | ||
if row | |||
if row | if row.table == 'none' then | ||
error | if row.item == 'none' then | ||
error'A table or item must be specified!' | |||
else | else | ||
finalTable[i] | finalTable[i].item = '[[' .. row.item .. ']]' | ||
end | end | ||
elseif row | elseif row.item == 'none' then | ||
linkstr = | local linkstr = '' | ||
maintable = row | maintable = row.table:match'^(.+)%s+%w*$' | ||
if maintable ~= nil and maintable ~= '' then | if maintable ~= nil and maintable ~= '' then | ||
linkstr = maintable .. '#' .. row | linkstr = maintable .. '#' .. row.table | ||
else | else | ||
linkstr = row | linkstr = row.table | ||
end | end | ||
finalTable[i] | |||
finalTable[i].item = 'Item from [[Data:' .. linkstr .. '|' .. row.table .. ']]' | |||
else | else | ||
error | error'A table and item cannot be specified at the same time!' | ||
end | end | ||
finalTable[i] | -- dice tooltip quantity | ||
finalTable[i] | 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 | if pick == 'once' then | ||
finalTable[i] | finalTable[i].chance = ('%.2f%%'):format(row.weight * 100 / totalWeight) | ||
elseif pick == 'each' then | elseif pick == 'each' then | ||
finalTable[i] | finalTable[i].chance = ('%.2f%%'):format(row.weight) | ||
else | else | ||
error | error'"roll" parameter takes only "once" or "each"!' | ||
end | end | ||
end | end | ||
return | |||
return p.formatTable(finalTable) | |||
end | end | ||
function p.formatTable(final) | function p.formatTable(final) | ||
local | local TABLE_HEADER = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>' | ||
local tr = '' | local tr = '' | ||
for _, v in ipairs(final) do | for _, v in ipairs(final) do | ||
tr = tr .. ' <tr><td>' .. v | tr = tr .. ' <tr><td>' .. v.item .. '</td><td>' .. v.quantity .. '</td><td>' .. v.weight .. '</td><td>' .. v.chance .. '</td></tr>' | ||
end | end | ||
return '<table class="wikitable sortable">' .. | |||
return '<table class="wikitable sortable">' .. TABLE_HEADER .. tr .. '</table>' | |||
end | end | ||
return p | return p |
Revision as of 23:19, 5 October 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)
local args = process_args.merge(true)
local tblName = args.name or ''
local pick = args.roll or 'once'
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
local 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 = ('%.2f%%'):format(row.weight * 100 / totalWeight)
elseif pick == 'each' then
finalTable[i].chance = ('%.2f%%'):format(row.weight)
else
error'"roll" parameter takes only "once" or "each"!'
end
end
return p.formatTable(finalTable)
end
function p.formatTable(final)
local TABLE_HEADER = '<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">' .. TABLE_HEADER .. tr .. '</table>'
end
return p