Module:EncounterTable: Difference between revisions

14 bytes removed ,  23:19, 5 October 2020
m
quick reformat pass
mNo edit summary
m (quick reformat pass)
Line 1: Line 1:
local p = {}
local p = {}
local process_args = require('Module:ProcessArgs')
local process_args = require'Module:ProcessArgs'
local text_util = require('Module:Text Utility')
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['name'] or ''
     local tblName = args.name or ''
     local pick = args['roll'] or 'once'
     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['weight'])
         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["table"] == 'none' then
 
             if row["item"] == 'none' then
         if row.table == 'none' then
                 error('A table or item must be specified!')
             if row.item == 'none' then
                 error'A table or item must be specified!'
             else
             else
                 finalTable[i]['item'] = '[[' .. row['item'] .. ']]'
                 finalTable[i].item = '[[' .. row.item .. ']]'
             end
             end
         elseif row["item"] == 'none' then  
         elseif row.item == 'none' then  
             linkstr = ""
             local linkstr = ''
             maintable = row['table']:match('^(.+)%s+%w*$')
             maintable = row.table:match'^(.+)%s+%w*$'
 
             if maintable ~= nil and maintable ~= '' then
             if maintable ~= nil and maintable ~= '' then
                 linkstr = maintable .. '#' .. row['table']
                 linkstr = maintable .. '#' .. row.table
             else
             else
                 linkstr = row['table']
                 linkstr = row.table
             end
             end
             finalTable[i]['item'] = 'Item from [[Data:' .. linkstr  .. '|' .. row['table'] .. ']]'
 
             finalTable[i].item = 'Item from [[Data:' .. linkstr  .. '|' .. row.table .. ']]'
         else
         else
             error('A table and item cannot be specified at the same time!')
             error'A table and item cannot be specified at the same time!'
         end
         end
    -- dice tooltip quantity
 
         finalTable[i]['quantity'] = frame:expandTemplate{title='Dice tooltip', args={row['quantity']}}
        -- dice tooltip quantity
    --finalTable[i]['quantity'] = row['quantity']
 
         finalTable[i]['weight'] = row['weight']
         finalTable[i].quantity = frame:expandTemplate{
  -- calculate final chance
            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]['chance'] = string.format("%.2f%%",row['weight']*100/totalWeight)
             finalTable[i].chance = ('%.2f%%'):format(row.weight * 100 / totalWeight)
         elseif pick == 'each' then
         elseif pick == 'each' then
             finalTable[i]['chance'] = string.format("%.2f%%",row['weight'])
             finalTable[i].chance = ('%.2f%%'):format(row.weight)
         else
         else
             error('"roll" parameter takes only "once" or "each"!')
             error'"roll" parameter takes only "once" or "each"!'
         end
         end
     end
     end
     return (p.formatTable(finalTable))
 
     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 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['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
     end
     return '<table class="wikitable sortable">' .. tblheader .. tr .. '</table>'
 
     return '<table class="wikitable sortable">' .. TABLE_HEADER .. tr .. '</table>'
end
end


return p
return p