Module:EncounterTable: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
m (quick reformat pass)
m (further reformatting)
Line 1: Line 1:
local p = {}
local EncounterTable = {}
local process_args = require'Module:ProcessArgs'
local text_util = require'Module:Text Utility'


function p.splitEncounterTableArgs(row)
--# Requires
 
local ProcessArgs = require'Module:ProcessArgs'
local TextUtility = require'Module:Text Utility'
 
--# Interface
 
function EncounterTable.splitEncounterTableArgs(row)
     local TABLE_ARGS = {'table', 'item', 'quantity', 'weight'}
     local TABLE_ARGS = {'table', 'item', 'quantity', 'weight'}
     return text_util.splitArgs(row, TABLE_ARGS)
     return TextUtility.splitArgs(row, TABLE_ARGS)
end
end




function p.start(frame)
function EncounterTable.start(frame)
     local args = process_args.merge(true)
     local args = ProcessArgs.merge(true)
     local tblName = args.name or ''
     local tblName = args.name or ''
     local pick = args.roll or 'once'
     local pick = args.roll or 'once'
Line 17: Line 22:


     for i, row in ipairs(args) do
     for i, row in ipairs(args) do
         local newrow = p.splitEncounterTableArgs(row)
         local newrow = EncounterTable.splitEncounterTableArgs(row)
         result[i] = newrow
         result[i] = newrow
         totalWeight = totalWeight + tonumber(newrow.weight)
         totalWeight = totalWeight + tonumber(newrow.weight)
Line 72: Line 77:
     end
     end


     return p.formatTable(finalTable)
     return EncounterTable.formatTable(finalTable)
end
end


function p.formatTable(final)
function EncounterTable.formatTable(final)
     local TABLE_HEADER = '<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 tableRows = ''


     for _, v in ipairs(final) do
     for _, entry in ipairs(final) do
         tr = tr .. ' <tr><td>' .. v.item .. '</td><td>' .. v.quantity .. '</td><td>' .. v.weight .. '</td><td>' .. v.chance .. '</td></tr>'
         tableRows = tableRows .. ('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'):format(entry.item, entry.quantity, entry.weight, entry.chance)
     end
     end


     return '<table class="wikitable sortable">' .. TABLE_HEADER  .. tr .. '</table>'
     return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, tableRows)
end
end


return p
return EncounterTable

Revision as of 23:51, 5 October 2020


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 [[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 EncounterTable.formatTable(finalTable)
end

function EncounterTable.formatTable(final)
    local TABLE_HEADER = '<tr><th>Item</th><th>Quantity</th><th>Weight</th><th>Chance</th></tr>'
    local tableRows = ''

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

    return ('<table class="wikitable sortable">%s%s</table>'):format(TABLE_HEADER, tableRows)
end

return EncounterTable