Module:EncounterTable

local EncounterTable = {}

--# Requires

local ProcessArgs = require'Module:ProcessArgs' local TextUtility = require'Module:Text Utility'

--# Interface

function EncounterTable.splitEncounterTableArgs(row) local TABLE_ARGS = {'table', 'item', 'quantity', 'weight'} return TextUtility.splitArgs(row, TABLE_ARGS) end

function EncounterTable.start(frame) local args = ProcessArgs.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 = EncounterTable.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 ' .. 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 EncounterTable.formatTable(finalTable) end

function EncounterTable.formatTable(final) local TABLE_HEADER = ' Item  Quantity  Weight  Chance  ' local tableRows = ''

for _, entry in ipairs(final) do       tableRows = tableRows .. (' %s  %s  %s  %s  '):format(entry.item, entry.quantity, entry.weight, entry.chance) end

return (' '):format(TABLE_HEADER, tableRows) end

return EncounterTable