Module:EncounterTableSandbox

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 local nothingChance = 1

for i, row in ipairs(args) do       local newrow = EncounterTable.splitEncounterTableArgs(row) result[i] = newrow totalWeight = totalWeight + tonumber(newrow.weight) if pick == 'each' and totalWeight < 100 then nothingChance = nothingChance * ((100 - totalWeight) / 100) else nothingChance = 0 end 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 local footer = {} if pick == 'each' then -- If roll each, add row that calculates chance of getting nothing footer.item = "Nothing" footer.chance = nothingChance end return EncounterTable.formatTable(finalTable, footer) end

function EncounterTable.formatTable(final, tablefooter) local TABLE_HEADER = ' Item  Quantity  Weight  Chance  ' local tableRows = {} local footer = tablefooter or {} for _, entry in ipairs(final) do       table.insert(tableRows, ('  %s  %s  %s  %s  '):format(entry.item, entry.quantity, entry.weight, entry.chance)) end if #footer > 0 then table.insert(tableRows, (' %s %s  '):format(footer.item, footer.chance)) end return (' '):format(TABLE_HEADER, table.concat(tableRows, '')) end

return EncounterTable