Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
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('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

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